class Dumon::GtkTrayUi

This class represents a user interface represented by system tray icon and its context menu.

Public Instance Methods

create_menu() click to toggle source

Reads info about currently usable outputs and construct corresponding structure of context menu.

# File lib/dumon/ui.rb, line 119
def create_menu
  begin
    outputs = self.omanager.read
    if outputs.empty?
      md = Gtk::MessageDialog.new(nil,
        Gtk::Dialog::DESTROY_WITH_PARENT, Gtk::MessageDialog::WARNING, Gtk::MessageDialog::BUTTONS_YES_NO,
        "Failed to load display information.\nDo you want to reload?\n(Hit 'no' to terminate application)")
      md.set_window_position :mouse
      md.run do |r|
        raise 'failed to load display information' if r == Gtk::Dialog::RESPONSE_NO
      end
      md.destroy
    end
  end while outputs.empty?

  rslt = Gtk::Menu.new

  # resolutions (submenu)
  outputs.keys.each do |o|
    item = Gtk::MenuItem.new(o)
    submenu = Gtk::Menu.new
    item.set_submenu(submenu)

    # to be marked with '*'
    defres = self.omanager.default_resolution(o)

    # radio buttons group
    radios = []

    outputs[o][:resolutions].each do |res|
      si = Gtk::RadioMenuItem.new(radios, defres === res ? "#{res} [*]" : res)
      si.active = (@selected_resolution[o] === res or (@selected_resolution[o].nil? and outputs[o][:current] === res))
      radios << si
      si.signal_connect('activate') do
        # only store your preferred resolution for next rendering
        @selected_resolution[o] = res if si.active? # only activation, ignore deactivation
      end
      submenu.append(si)
    end
    rslt.append(item)
  end

  # separator
  item = Gtk::SeparatorMenuItem.new
  rslt.append(item)

  # single outputs
  outputs.keys.each do |o|
    item = Gtk::MenuItem.new("only #{o}")
    item.signal_connect('activate') do
      self.omanager.switch({:mode=>:single, :out=>o, :resolution=>@selected_resolution[o]})
      # clear preferred resolution, by next rendering will be read from real state
      @selected_resolution.clear
    end
    rslt.append(item)
  end

  # mirror
  item = Gtk::MenuItem.new('mirror')
  if outputs.keys.size >= 2
    submenu = Gtk::Menu.new
    item.set_submenu(submenu)
  else
    item.sensitive = false
  end

  self.omanager.common_resolutions.each do |res|
    si = Gtk::MenuItem.new(res)
    si.signal_connect('activate') { self.omanager.switch({:mode=>:mirror, :resolution=>res}) }
    submenu.append(si)
  end
  rslt.append(item)

  # separator
  item = Gtk::SeparatorMenuItem.new
  rslt.append(item)

  # primary output
  item = Gtk::MenuItem.new('Primary output')
  submenu = Gtk::Menu.new
  item.set_submenu(submenu)
  item.sensitive = (outputs.keys.size >= 2)

  radios = []
  prims = outputs.keys.clone << :none
  prims.each do |o|
    si = Gtk::RadioMenuItem.new(radios, o.to_s)
    si.active = (@primary_output.to_s == o.to_s)
    radios << si
    si.signal_connect('activate') { @primary_output = o.to_s if si.active? }
    submenu.append(si)
  end
  rslt.append(item)

  # sequence
  if outputs.keys.size >= 2
    o0 = outputs.keys[0]
    o1 = outputs.keys[1]
    item = Gtk::MenuItem.new("#{o0} left of #{o1}")
    item.signal_connect('activate') do
      omanager.switch({:mode=>:hsequence, :outs=>[o0, o1], :resolutions=>[@selected_resolution[o0], @selected_resolution[o1]], :primary=>@primary_output})
      # clear preferred resolution, by next rendering will be read from real state
      @selected_resolution.clear
    end
    rslt.append(item)
    item = Gtk::MenuItem.new("#{o1} left of #{o0}")
    item.signal_connect('activate') do
      omanager.switch({:mode=>:hsequence, :outs=>[o1, o0], :resolutions=>[@selected_resolution[o1], @selected_resolution[o0]], :primary=>@primary_output})
      @selected_resolution.clear
    end
    rslt.append(item)
    item = Gtk::MenuItem.new("#{o0} above #{o1}")
    item.signal_connect('activate') do
      omanager.switch({:mode=>:vsequence, :outs=>[o0, o1], :resolutions=>[@selected_resolution[o0], @selected_resolution[o1]], :primary=>@primary_output})
      @selected_resolution.clear
    end
    rslt.append(item)
    item = Gtk::MenuItem.new("#{o1} above #{o0}")
    item.signal_connect('activate') do
      omanager.switch({:mode=>:vsequence, :outs=>[o1, o0], :resolutions=>[@selected_resolution[o1], @selected_resolution[o0]], :primary=>@primary_output})
      @selected_resolution.clear
    end
    rslt.append(item)
  end

  # separator
  rslt.append(Gtk::SeparatorMenuItem.new)

  # Profiles
  item = Gtk::MenuItem.new('Profiles...')
  item.signal_connect('activate') { self.profile_management_dialog }
  rslt.append(item)

  # About
  item = Gtk::ImageMenuItem.new(Gtk::Stock::ABOUT)
  item.signal_connect('activate') { self.about }
  rslt.append(item)
  # Quit
  item = Gtk::ImageMenuItem.new(Gtk::Stock::QUIT)
  item.signal_connect('activate') { Dumon::App.instance.quit }
  rslt.append(item)

  rslt
end
profile_management_dialog() click to toggle source

Function to open a dialog box for profile management.

# File lib/dumon/ui.rb, line 266
def profile_management_dialog
  dialog = Dumon::GtkProfileDlg.new
  dialog.show
end