status icon menu items open the right device window

This commit is contained in:
Daniel Pavel 2013-05-17 19:55:07 +03:00
parent f6eb90bd2d
commit 1764633bc5
4 changed files with 26 additions and 12 deletions

View File

@ -44,7 +44,7 @@ def _run(args):
ui.notify.init() ui.notify.init()
status_icon = ui.status_icon.create(ui.main_window.toggle_all) status_icon = ui.status_icon.create(ui.main_window.toggle_all, ui.main_window.popup)
assert status_icon assert status_icon
listeners = {} listeners = {}

View File

@ -56,7 +56,7 @@ def device_icon_set(name='_', kind=None):
elif str(kind) == 'trackball': elif str(kind) == 'trackball':
names += ('input-mouse',) names += ('input-mouse',)
names += ('input-' + str(kind),) names += ('input-' + str(kind),)
names += (name,) # names += (name,)
source = Gtk.IconSource.new() source = Gtk.IconSource.new()
for n in names: for n in names:

View File

@ -254,12 +254,12 @@ def _hide(w, _=None):
return True return True
def _show(w, status_icon=None): def _show(w, trigger=None):
if not w.get_visible(): if not w.get_visible():
w.present() w.present()
if not w._was_shown: if not w._was_shown:
w._was_shown = True w._was_shown = True
if isinstance(status_icon, Gtk.StatusIcon): if isinstance(trigger, Gtk.StatusIcon):
# if the window hasn't been shown yet, position it relative to # if the window hasn't been shown yet, position it relative to
# an other window (if it was shown before) or the status icon. # an other window (if it was shown before) or the status icon.
# TODO: need a more clever positioning algorithm like finding # TODO: need a more clever positioning algorithm like finding
@ -274,8 +274,10 @@ def _show(w, status_icon=None):
# w.move(x, y) # w.move(x, y)
# break # break
# else: # else:
x, y, _ = Gtk.StatusIcon.position_menu(Gtk.Menu(), status_icon) x, y, _ = Gtk.StatusIcon.position_menu(trigger._menu, trigger)
w.move(x, y) w.move(x, y)
elif isinstance(trigger, Gtk.MenuItem):
x, y = trigger
return True return True
@ -308,7 +310,7 @@ def _create(receiver):
window.add(vbox) window.add(vbox)
geometry = Gdk.Geometry() geometry = Gdk.Geometry()
geometry.min_width = 320 geometry.min_width = 340
geometry.min_height = 32 geometry.min_height = 32
window.set_geometry_hints(vbox, geometry, Gdk.WindowHints.MIN_SIZE) window.set_geometry_hints(vbox, geometry, Gdk.WindowHints.MIN_SIZE)
@ -330,6 +332,16 @@ def _destroy(receiver):
w.destroy() w.destroy()
def popup(trigger_widget, receiver_path, status_icon=None):
if receiver_path is not None:
w = _windows.get(receiver_path)
if w:
_show(w, status_icon)
return
toggle_all(status_icon)
def toggle_all(status_icon): def toggle_all(status_icon):
if not _windows: if not _windows:
return return

View File

@ -14,8 +14,9 @@ from logitech.unifying_receiver import status as _status
# #
# #
def create(activate_callback): def create(activate_callback, menu_activate_callback):
assert activate_callback assert activate_callback
assert menu_activate_callback
icon = Gtk.StatusIcon() icon = Gtk.StatusIcon()
icon.set_title(NAME) icon.set_title(NAME)
@ -26,8 +27,9 @@ def create(activate_callback):
icon.set_tooltip_text(NAME) icon.set_tooltip_text(NAME)
icon.connect('activate', activate_callback) icon.connect('activate', activate_callback)
icon._menu_activate_callback = menu_activate_callback
menu = Gtk.Menu() menu = icon._menu = Gtk.Menu()
# per-device menu entries will be generated as-needed # per-device menu entries will be generated as-needed
@ -36,8 +38,6 @@ def create(activate_callback):
menu.append(_action.make('application-exit', 'Quit', Gtk.main_quit).create_menu_item()) menu.append(_action.make('application-exit', 'Quit', Gtk.main_quit).create_menu_item())
menu.show_all() menu.show_all()
icon._menu = menu
icon.connect('popup_menu', icon.connect('popup_menu',
lambda icon, button, time, menu: lambda icon, button, time, menu:
menu.popup(None, None, icon.position_menu, icon, button, time), menu.popup(None, None, icon.position_menu, icon, button, time),
@ -132,6 +132,7 @@ def _add_device(icon, device):
icon._menu.insert(menu_item, index) icon._menu.insert(menu_item, index)
menu_item.set_image(Gtk.Image()) menu_item.set_image(Gtk.Image())
menu_item.show_all() menu_item.show_all()
menu_item.connect('activate', icon._menu_activate_callback, device.receiver.path, icon)
return index return index
@ -162,8 +163,9 @@ def _update_menu_item(icon, index, device_status):
image = menu_item.get_image() image = menu_item.get_image()
battery_level = device_status.get(_status.BATTERY_LEVEL) if device_status else None battery_level = device_status.get(_status.BATTERY_LEVEL) if device_status else None
image.set_from_icon_name(_icons.battery(battery_level), Gtk.IconSize.MENU) image.set_from_icon_name(_icons.battery(battery_level), Gtk.IconSize.LARGE_TOOLBAR)
image.set_sensitive(battery_level is not None) image.set_sensitive(bool(device_status))
# menu_item.set_sensitive(bool(device_status))
# #
# #