Bug 44789
| Summary: | mate-menu: TypeError в on_drag_data_get при перетаскивании избранного в главном меню MATE — DnD-переупорядочивание не работает | ||
|---|---|---|---|
| Product: | Branch p11 | Reporter: | Anton Shevtsov <shevtsov.anton> |
| Component: | mate-menu | Assignee: | Andrey Cherepanov <cas> |
| Status: | NEW --- | QA Contact: | qa-p11 <qa-p11> |
| Severity: | normal | ||
| Priority: | P5 | CC: | antohami, cas, snowmix, varaksaaa |
| Version: | unspecified | ||
| Hardware: | x86_64 | ||
| OS: | Linux | ||
Результат проверки актуальности Состояние: Запрос функции (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)
|

Description
Anton Shevtsov 2023-01-02 13:03:50 MSK