Skip to content

Commit 1cb88bd

Browse files
committed
Add missing multi-level ID support for menu items
1297d88 requires this to be available but it is not as it is part of #1652. This backports the relevant changes.
1 parent 06b4ce4 commit 1cb88bd

File tree

5 files changed

+30
-19
lines changed

5 files changed

+30
-19
lines changed

CHANGELOG.md

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,11 @@
11
# Changelog
22

3+
## 2.3.4
4+
5+
### Bugs fixed
6+
7+
* Errors when connected to a device with the DisconnectItems plugin enabled
8+
39
## 2.3.3
410

511
### Changes

blueman/main/indicators/StatusNotifierItem.py

Lines changed: 9 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -45,16 +45,17 @@ def _advertise_revision(self) -> bool:
4545
def _get_layout(self, parent_id: int, _recursion_depth: int, _property_names: List[str]
4646
) -> Tuple[int, Tuple[int, Dict[str, GLib.Variant], List[GLib.Variant]]]:
4747
if parent_id == 0:
48-
return self._revision, (0, {}, self._render_menu(self._items.items(), self._render_submenu))
48+
return self._revision, (0, {}, self._render_menu(((item["id"] << 8, item) for item in self._items.values()),
49+
self._render_submenu))
4950
else:
50-
item = self._items[parent_id]
51+
item = self._items[parent_id >> 8]
5152
if "submenu" in item and _recursion_depth != 0:
5253
return self._revision, (parent_id, self._render_item(item), self._render_submenu(item, parent_id))
5354
return self._revision, (parent_id, self._render_item(item), [])
5455

5556
def _render_submenu(self, item: "MenuItemDict", idx: int) -> List[GLib.Variant]:
5657
if "submenu" in item:
57-
return self._render_menu(enumerate(item["submenu"], idx * 100 + 1), lambda _item, _isx: [])
58+
return self._render_menu(enumerate(item["submenu"], idx + 1), lambda _item, _isx: [])
5859
else:
5960
return []
6061

@@ -67,9 +68,9 @@ def _render_menu(self, items: Iterable[Tuple[int, _T]], submenu_callback: Callab
6768

6869
def _iterate_items(self) -> Iterable[Tuple[int, "SubmenuItemDict"]]:
6970
for item in self._items.values():
70-
yield item["id"], item
71+
yield item["id"] << 8, item
7172
if "submenu" in item:
72-
yield from enumerate(item["submenu"], item["id"] * 100 + 1)
73+
yield from enumerate(item["submenu"], (item["id"] << 8) + 1)
7374

7475
def _render_item(self, item: Union["MenuItemDict", "SubmenuItemDict"]) -> Dict[str, GLib.Variant]:
7576
if "text" in item and "icon_name" in item:
@@ -87,10 +88,10 @@ def _render_item(self, item: Union["MenuItemDict", "SubmenuItemDict"]) -> Dict[s
8788

8889
def _on_event(self, idx: int, event_id: str, _data: GLib.Variant, _timestamp: int) -> None:
8990
if event_id == "clicked":
90-
if idx < 100:
91-
self._on_activate(idx)
91+
if idx % (1 << 8) == 0:
92+
self._on_activate(idx >> 8)
9293
else:
93-
self._on_activate(int(idx / 100), idx % 100 - 1)
94+
self._on_activate(idx >> 8, idx % (1 << 8) - 1)
9495

9596

9697
class StatusNotifierItemService(DbusService):

blueman/plugins/applet/Menu.py

Lines changed: 13 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -25,8 +25,8 @@ class MenuItemDict(MenuItemDictBase, total=False):
2525

2626

2727
class MenuItem:
28-
def __init__(self, menu_plugin: "Menu", owner: AppletPlugin, priority: int, text: Optional[str], markup: bool,
29-
icon_name: Optional[str], tooltip: Optional[str], callback: Optional[Callable[[], None]],
28+
def __init__(self, menu_plugin: "Menu", owner: AppletPlugin, priority: Tuple[int, int], text: Optional[str],
29+
markup: bool, icon_name: Optional[str], tooltip: Optional[str], callback: Optional[Callable[[], None]],
3030
submenu_function: Optional[Callable[[], Iterable["SubmenuItemDict"]]], visible: bool, sensitive: bool):
3131
self._menu_plugin = menu_plugin
3232
self._owner = owner
@@ -48,7 +48,7 @@ def owner(self) -> AppletPlugin:
4848
return self._owner
4949

5050
@property
51-
def priority(self) -> int:
51+
def priority(self) -> Tuple[int, int]:
5252
return self._priority
5353

5454
@property
@@ -66,7 +66,7 @@ def _iter_base(self) -> Iterator[Tuple[str, Union[str, bool]]]:
6666
yield key, value
6767

6868
def __iter__(self) -> Iterator[Tuple[str, Union[int, str, bool, List[Dict[str, Union[str, bool]]]]]]:
69-
yield "id", self.priority
69+
yield "id", (self._priority[0] << 8) + self._priority[1]
7070
yield from self._iter_base()
7171
submenu = self.submenu_items
7272
if submenu:
@@ -79,7 +79,7 @@ def submenu_items(self) -> List["SubmenuItem"]:
7979
submenu_items = self._submenu_function()
8080
if not submenu_items:
8181
return []
82-
return [SubmenuItem(self._menu_plugin, self._owner, 0, item.get('text'), item.get('markup', False),
82+
return [SubmenuItem(self._menu_plugin, self._owner, (0, 0), item.get('text'), item.get('markup', False),
8383
item.get('icon_name'), item.get('tooltip'), item.get('callback'), None, True,
8484
item.get('sensitive', True))
8585
for item in submenu_items]
@@ -118,17 +118,21 @@ class Menu(AppletPlugin):
118118
__unloadable__ = False
119119

120120
def on_load(self) -> None:
121-
self.__menuitems: Dict[int, MenuItem] = {}
121+
self.__menuitems: Dict[Tuple[int, int], MenuItem] = {}
122122

123123
self._add_dbus_signal("MenuChanged", "aa{sv}")
124124
self._add_dbus_method("GetMenu", (), "aa{sv}", self._get_menu)
125125
self._add_dbus_method("ActivateMenuItem", ("ai",), "", self._activate_menu_item)
126126

127-
def add(self, owner: AppletPlugin, priority: int, text: Optional[str] = None, markup: bool = False,
128-
icon_name: Optional[str] = None, tooltip: Optional[str] = None,
127+
def add(self, owner: AppletPlugin, priority: Union[int, Tuple[int, int]], text: Optional[str] = None,
128+
markup: bool = False, icon_name: Optional[str] = None, tooltip: Optional[str] = None,
129129
callback: Optional[Callable[[], None]] = None,
130130
submenu_function: Optional[Callable[[], Iterable["SubmenuItemDict"]]] = None,
131131
visible: bool = True, sensitive: bool = True) -> MenuItem:
132+
133+
if isinstance(priority, int):
134+
priority = (priority, 0)
135+
132136
item = MenuItem(self, owner, priority, text, markup, icon_name, tooltip, callback, submenu_function, visible,
133137
sensitive)
134138
self.__menuitems[item.priority] = item
@@ -164,7 +168,7 @@ def _build_variant(self, value: Union[int, str, bool, Iterable[Mapping[str, Unio
164168
return GLib.Variant("aa{sv}", self._prepare_menu(value))
165169

166170
def _activate_menu_item(self, indexes: Sequence[int]) -> None:
167-
node = self.__menuitems[indexes[0]]
171+
node = self.__menuitems[(indexes[0] >> 8, indexes[0] % (1 << 8))]
168172
for index in list(indexes)[1:]:
169173
node = node.submenu_items[index]
170174
if node.callback:

configure.ac

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
AC_PREREQ(2.61)
22

3-
AC_INIT([blueman], [2.3.3], [https://github.com/blueman-project/blueman/issues])
3+
AC_INIT([blueman], [2.3.4], [https://github.com/blueman-project/blueman/issues])
44
AC_CONFIG_HEADERS(config.h)
55
AC_CONFIG_MACRO_DIRS([m4])
66
AM_INIT_AUTOMAKE([1.16.3 foreign dist-xz])

meson.build

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
project(
22
'blueman', 'c',
3-
version: '2.3.3',
3+
version: '2.3.4',
44
license: 'GPL3',
55
meson_version: '>=0.50.0',
66
default_options: 'b_lundef=false'

0 commit comments

Comments
 (0)