class Nyle::Frame

Frame

Attributes

current_screen[R]

Public Class Methods

new(width = DEFAULT_WIDTH, height = DEFAULT_HEIGHT) click to toggle source

include Gdk::Keyval # Include key definication to omit 'Gdk::Keyval::' for subclass

Calls superclass method
# File lib/nyle/frame.rb, line 18
def initialize(width = DEFAULT_WIDTH, height = DEFAULT_HEIGHT)
  super()
  self.set_size_request(width, height)
  self.resizable = false
  self.title     = DEFAULT_TITLE
  @transition    = []                            # Screen transition table
  @interval_time = DEFAULT_INTERVAL              # milli seconds

  # Nyle main frame
  me = self
  Nyle.module_eval {
    _set_frame(me)
  }

  # Mouse events
  self.add_events([:button_press_mask,
                   :button_release_mask])

  # Signal handler for mouse pressed
  self.signal_connect(:button_press_event) do |widget, event|
    Nyle.module_eval {
      _set_mouse_down(event.button, true)
    }
    false
  end

  # Signal handler for mouse released
  self.signal_connect(:button_release_event) do |widget, event|
    Nyle.module_eval {
      _set_mouse_down(event.button, false)
    }
    false
  end

  # Signal handler for key pressed
  self.signal_connect(:key_press_event) do |widget, event|
    Nyle.module_eval {
      _set_key_down(event.keyval, true)
    }
    # [debug]
    # puts "keyname: [#{Gdk::Keyval.to_name(event.keyval)}]"
    false
  end

  # Signal handler for key released
  self.signal_connect(:key_release_event) do |widget, event|
    Nyle.module_eval {
      _set_key_down(event.keyval, false)
    }
    false
  end

  self.signal_connect(:destroy) do
    _quit
  end
end

Public Instance Methods

close() click to toggle source
# File lib/nyle/frame.rb, line 111
def close
  _quit
end
set_current(screen) click to toggle source
# File lib/nyle/frame.rb, line 115
def set_current(screen)
  _set_current(screen)
end
show_all(title: nil, interval: nil) click to toggle source
Calls superclass method
# File lib/nyle/frame.rb, line 75
    def show_all(title: nil, interval: nil)
      super()
      self.title = title if title
      if ENV['NYLE_INTERVAL']
        @interval_time = ENV['NYLE_INTERVAL'].to_i
      elsif interval
        @interval_time = interval.to_i
      end
      @interval_time = MIN_INTERVAL if @interval_time < MIN_INTERVAL
      @interval_time = MAX_INTERVAL if @interval_time > MAX_INTERVAL

      @timer = GLib::Timer.new
      @timer.start

      GLib::Idle.add do   # to improve performance ...(for macOS)
        true
      end

      GLib::Timeout.add(@interval_time, GLib::PRIORITY_HIGH) do
#        puts "#{@timer.elapsed[0]}" if @timer
        if @timer
          elapsed = (@timer.elapsed[0] * 1000).round
          Nyle.module_eval {
            _set_running_time(elapsed)
          }
          if @current_screen
            update
            @current_screen.queue_draw unless @current_screen.destroyed?
          end
          true
        else
          false
        end
      end
    end

Private Instance Methods

_quit() click to toggle source
# File lib/nyle/frame.rb, line 145
        def _quit
  @timer.stop
  @timer = nil                    # as block returns false by this, GLib::Timeout will remove and not be called
  Nyle.module_eval{
    _clear_mouse_state
    _clear_key_state
    _clear_running_time
    _clear_layer
  }
  self.hide
  Gtk.main_quit
end
_set_current(widget) click to toggle source
# File lib/nyle/frame.rb, line 119
        def _set_current(widget)
  if widget.is_a?(Nyle::Screen)
    self.remove(@current_screen) if @current_screen
    @current_screen = widget
    self.add(@current_screen)     # add instance which is kind of Nyle::Screen
  else
    screen = nil
    widget.each do |child|
      if child.is_a?(Nyle::Screen)
        screen = child            # get instance which is kind of Nyle::Screen from container
        break
      end
    end
    if screen
      self.remove(@current_screen) if @current_screen
      @current_screen = screen
      self.add(widget)            # add container
    end
  end
  w = @current_screen.width
  h = @current_screen.height
  Nyle.module_eval {
    _set_screen_size(w, h)
  }
end
update() click to toggle source
# File lib/nyle/frame.rb, line 158
        def update
  @transition.each do |tr|
    if tr[:current] == @current_screen and tr[:status] == @current_screen.status
      tr[:current].instance_eval { suspend }                  # Suspend for current screen
      tr[:next].instance_eval    { resume  }                  # Resume for next screen
      _set_current(tr[:next])                                 # Change screen
      self.show_all
    end
  end
end