Появилась возможность перетаскивать ярлыки в Избранном в mate-menu, как это было в mint-menu много лет назад. Патч ниже. Проверил, работает. Прошу применить патч https://www.riksoft.it/wikiriks/linux/advanced-mate-menu-favourites-cant-be-rearranged https://github.com/ubuntu-mate/mate-menu/issues/81 --- /root/applications.py.orig 2023-01-02 14:50:55.071567632 +0500 +++ /usr/lib/python3/site-packages/mate_menu/plugins/applications.py 2023-01-02 14:54:12.748555410 +0500 @@ -192,8 +192,12 @@ TARGET_TYPE_TEXT = 80 toButton = ( Gtk.TargetEntry.new( "text/uri-list", 0, TARGET_TYPE_TEXT ), Gtk.TargetEntry.new( "text/uri-list", 0, TARGET_TYPE_TEXT ) ) TARGET_TYPE_FAV = 81 - toFav = ( Gtk.TargetEntry.new( "FAVORITES", Gtk.TargetFlags.SAME_APP, 81 ), Gtk.TargetEntry.new( "text/plain", 0, 100 ), Gtk.TargetEntry.new( "text/uri-list", 0, 101 ) ) - fromFav = ( Gtk.TargetEntry.new( "FAVORITES", Gtk.TargetFlags.SAME_APP, 81 ), Gtk.TargetEntry.new( "FAVORITES", Gtk.TargetFlags.SAME_APP, 81 ) ) +# toFav = ( Gtk.TargetEntry.new( "FAVORITES", Gtk.TargetFlags.SAME_APP, 81 ), Gtk.TargetEntry.new( "text/plain", 0, 100 ), Gtk.TargetEntry.new( "text/uri-list", 0, 101 ) ) +# fromFav = ( Gtk.TargetEntry.new( "FAVORITES", Gtk.TargetFlags.SAME_APP, 81 ), Gtk.TargetEntry.new( "FAVORITES", Gtk.TargetFlags.SAME_APP, 81 ) ) +# ----- ADDED (Rik) + toFav = (Gtk.TargetEntry.new("text/plain", Gtk.TargetFlags.SAME_APP, 81), Gtk.TargetEntry.new("text/plain", 0, 100), Gtk.TargetEntry.new("text/uri-list", 0, 101)) + fromFav = (Gtk.TargetEntry.new("text/plain", Gtk.TargetFlags.SAME_APP, 81), Gtk.TargetEntry.new("text/plain", Gtk.TargetFlags.SAME_APP, 81)) +#------------------- def __init__(self, mateMenuWin, toggleButton): self.mateMenuWin = mateMenuWin @@ -1369,11 +1373,13 @@ def on_drag_data_received( self, widget, context, x, y, selection, info, time ): if info == self.TARGET_TYPE_FAV: - self.favoritesReorder( int(selection.get_data()), widget.position ) +# self.favoritesReorder( int(selection.get_data()), widget.position ) + self.favoritesReorder(int(selection.get_data().decode()), widget.position) def on_drag_data_get( self, widget, context, selection, targetType, time ): if targetType == self.TARGET_TYPE_FAV: - selection.set(Gdk.SELECTION_CLIPBOARD, 8, str(widget.position)) + # selection.set(Gdk.SELECTION_CLIPBOARD, 8, str(widget.position)) + selection.set_text(str(widget.position), -1) def on_icon_theme_changed(self, theme): self.menuChanged (0, 0)
Результат проверки актуальности Состояние: Запрос функции (DnD порядка Избранного), не дефект. p10/Sisyphus/p11: один mate-menu 22.04.2-alt10. Патч репортёра не влит, ubuntu-mate#81 открыт. Рекомендация: оставить открытым, перенести в Sisyphus
Это ошибка. В 26.10.1-alt1 уже исправлена, а вот в p10/p11 исправление ещё не дошло. ## Суть В главном меню MATE (меню «Приложения») элементы раздела «Избранное» можно переупорядочивать перетаскиванием (drag-and-drop): кнопки избранного являются и источником, и целью DnD. Обработчик `on_drag_data_get()` передаёт в `Gtk.SelectionData.set()` аргумент `str(widget.position)`, однако в интроспекции GTK3 параметр `data` этого метода — байтовый массив (uint8, без завершающего нуля), и PyGObject принимает там только `bytes`: `str` трактуется как последовательность элементов, и каждый односимвольный элемент не проходит проверку числа (UINT8) — исключение: TypeError: Item 0: Must be number, not str Код написан в стиле Python 2, где `str` и были байты. Исключение возникает в обработчике `drag-data-get`, поэтому данные перетаскивания не устанавливаются и сбрасывание на целевую кнопку просто не срабатывает: переупорядочивание избранного молча не работает, сам процесс панели продолжает жить (PyGObject печатает traceback в журнал). ## Где `mate_menu/plugins/applications.py`, строки 1365–1371 (нумерация по 22.04.2; в установленном файле той же серии исключение было на строке 1376 — как в журнале ниже): ```python def on_drag_data_received( self, widget, context, x, y, selection, info, time ): if info == self.TARGET_TYPE_FAV: self.favoritesReorder( int(selection.get_data()), widget.position ) def on_drag_data_get( self, widget, context, selection, targetType, time ): if targetType == self.TARGET_TYPE_FAV: selection.set(Gdk.SELECTION_CLIPBOARD, 8, str(widget.position)) ``` Исключение поднимает `on_drag_data_get()`. Приёмник `on_drag_data_received()` в Python 3 случайно работает (`int()` принимает `bytes`), но апстрим дополнительно укрепил его явным `.decode()` и `try/except`. ALT-патчей в этом коде нет — код базового 22.04.2. ## Воспроизведение 1. Среда MATE, в главном меню (меню «Приложения») раздел «Избранное» содержит не менее двух программ. 2. Перетащить иконку одной избранной программы на иконку другой. Результат: переупорядочивание не происходит; в журнале от процесса `org.mate.panel.applet.MateMenuAppletFactory`: ``` окт 15 13:28:07 org.mate.panel.applet.MateMenuAppletFactory[4023]: Traceback (most recent call last): окт 15 13:28:07 org.mate.panel.applet.MateMenuAppletFactory[4023]: File "/usr/lib/python3/site-packages/mate_menu/plugins/applications.py", line 1376, in on_drag_data_get окт 15 13:28:07 org.mate.panel.applet.MateMenuAppletFactory[4023]: selection.set(Gdk.SELECTION_CLIPBOARD, 8, str(widget.position)) окт 15 13:28:07 org.mate.panel.applet.MateMenuAppletFactory[4023]: TypeError: Item 0: Must be number, not str ``` ## Апстрим Исправлено коммитом `b73f7e288a70f056081197df9852c285fbd93cb` (2026-09-11, «applications: Fix drag-and-drop reordering of favourites», закрывает https://github.com/ubuntu-mate/mate-menu/issues/81): в `on_drag_data_get()` — `str(widget.position).encode()`, в `on_drag_data_received()` — `int(selection.get_data().decode())` с `try/except (UnicodeDecodeError, ValueError)`. Коммит включён в апстримный 26.10.1. ## Затронутость - p10 22.04.2-alt10: **затронут** - p11 22.04.2-alt10: **затронут** (та же версия исходников, та же ревизия gear) - Sisyphus 26.10.1-alt1: не затронут (фикс `b73f7e2` уже включён, релиз 2026-10-02)