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