status icon menu items open the right device window
This commit is contained in:
parent
f6eb90bd2d
commit
1764633bc5
|
@ -44,7 +44,7 @@ def _run(args):
|
|||
|
||||
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
|
||||
|
||||
listeners = {}
|
||||
|
|
|
@ -56,7 +56,7 @@ def device_icon_set(name='_', kind=None):
|
|||
elif str(kind) == 'trackball':
|
||||
names += ('input-mouse',)
|
||||
names += ('input-' + str(kind),)
|
||||
names += (name,)
|
||||
# names += (name,)
|
||||
|
||||
source = Gtk.IconSource.new()
|
||||
for n in names:
|
||||
|
|
|
@ -254,12 +254,12 @@ def _hide(w, _=None):
|
|||
return True
|
||||
|
||||
|
||||
def _show(w, status_icon=None):
|
||||
def _show(w, trigger=None):
|
||||
if not w.get_visible():
|
||||
w.present()
|
||||
if not w._was_shown:
|
||||
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
|
||||
# an other window (if it was shown before) or the status icon.
|
||||
# TODO: need a more clever positioning algorithm like finding
|
||||
|
@ -274,8 +274,10 @@ def _show(w, status_icon=None):
|
|||
# w.move(x, y)
|
||||
# break
|
||||
# else:
|
||||
x, y, _ = Gtk.StatusIcon.position_menu(Gtk.Menu(), status_icon)
|
||||
x, y, _ = Gtk.StatusIcon.position_menu(trigger._menu, trigger)
|
||||
w.move(x, y)
|
||||
elif isinstance(trigger, Gtk.MenuItem):
|
||||
x, y = trigger
|
||||
return True
|
||||
|
||||
|
||||
|
@ -308,7 +310,7 @@ def _create(receiver):
|
|||
window.add(vbox)
|
||||
|
||||
geometry = Gdk.Geometry()
|
||||
geometry.min_width = 320
|
||||
geometry.min_width = 340
|
||||
geometry.min_height = 32
|
||||
window.set_geometry_hints(vbox, geometry, Gdk.WindowHints.MIN_SIZE)
|
||||
|
||||
|
@ -330,6 +332,16 @@ def _destroy(receiver):
|
|||
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):
|
||||
if not _windows:
|
||||
return
|
||||
|
|
|
@ -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 menu_activate_callback
|
||||
|
||||
icon = Gtk.StatusIcon()
|
||||
icon.set_title(NAME)
|
||||
|
@ -26,8 +27,9 @@ def create(activate_callback):
|
|||
|
||||
icon.set_tooltip_text(NAME)
|
||||
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
|
||||
|
||||
|
@ -36,8 +38,6 @@ def create(activate_callback):
|
|||
menu.append(_action.make('application-exit', 'Quit', Gtk.main_quit).create_menu_item())
|
||||
menu.show_all()
|
||||
|
||||
icon._menu = menu
|
||||
|
||||
icon.connect('popup_menu',
|
||||
lambda icon, button, time, menu:
|
||||
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)
|
||||
menu_item.set_image(Gtk.Image())
|
||||
menu_item.show_all()
|
||||
menu_item.connect('activate', icon._menu_activate_callback, device.receiver.path, icon)
|
||||
|
||||
return index
|
||||
|
||||
|
@ -162,8 +163,9 @@ def _update_menu_item(icon, index, device_status):
|
|||
|
||||
image = menu_item.get_image()
|
||||
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_sensitive(battery_level is not None)
|
||||
image.set_from_icon_name(_icons.battery(battery_level), Gtk.IconSize.LARGE_TOOLBAR)
|
||||
image.set_sensitive(bool(device_status))
|
||||
# menu_item.set_sensitive(bool(device_status))
|
||||
|
||||
#
|
||||
#
|
||||
|
|
Loading…
Reference in New Issue