Вопрос или проблема
Я разрабатываю приложение, которое включает функцию, позволяющую пользователям рисовать на экране (в частности, для сенсорных экранов). Я заметил, что когда окно развернуто на полный экран и пользователь щелкает и перетаскивает вниз с верхней панели, окно изменяет размер и начинает двигаться вместе с курсором.
Это поведение становится проблематичным, когда пользователи пытаются рисовать поверх окна, так как это мешает их рисованию. Я хотел бы отключить эту функцию перетаскивания.
Я просматривал настройки GNOME и пытался использовать gsettings, но не нашел способа конкретно отключить эту функцию. Есть ли метод, чтобы предотвратить перетаскивание развернутых окон через верхнюю панель? Любые предложения будут очень полезны!
На случай, если это имеет значение, это единственный пост, который я нашел по той же проблеме, с которой я сталкивался с опытом развернутого окна. Я не смог найти настройки, чтобы изменить это поведение, поэтому в конечном итоге создал расширение для GNOME, чтобы это исправить, и решил поделиться.
Как только вы настроите скелет расширения, магические части, чтобы это работало (или не работало), следующие:
Поместите это вверху, чтобы импортировать необходимые ресурсы.
const Clutter = import.gi;
const Panel = imports.ui.panel;
Затем вы хотите переопределить функцию, ответственную за это:
Panel.Panel.prototype._tryDragWindow = function(event) {
return Clutter.EVENT_PROPOGATE;
}
Надеюсь, это будет вам полезно.
Ответ или решение
Для отключения перетаскивания окон по верхней панели в среде GNOME, особенно в случае, если ваше приложение предназначено для рисования на экране (что критично для сенсорных устройств), можно использовать подход с созданием расширения для GNOME. Это позволяет избежать стандартного поведения, из-за которого окно начинает перемещаться при нажатии и перетаскивании по верхней панели.
Шаги для создания расширения GNOME
-
Подготовка окружения: Убедитесь, что у вас установлены необходимые инструменты для разработки расширений для GNOME. Вам потребуется
gnome-shell-extension-tool
, а также возможность редактирования JavaScript-кода. -
Создание каркаса расширения: Сначала создайте папку для вашего расширения. Внутри создайте файл
metadata.json
с метаданными вашего расширения, например:{ "uuid": "my-window-drag-disabler@example.com", "name": "Disable Window Dragging", "description": "Disables window dragging via the top panel.", "shell-version": ["3.38", "40", "41"], // Укажите версии, которые вы поддерживаете "version": 1 }
-
Редактирование скрипта: Создайте файл
extension.js
, в который вы добавите код для отключения перетаскивания. Вот пример кода, который вам понадобится:const Clutter = imports.gi.Clutter; const Panel = imports.ui.panel; Panel.Panel.prototype._tryDragWindow = function(event) { return Clutter.EVENT_PROPAGATE; // Отключение перетаскивания }
-
Установка и активация расширения: Скомпилируйте расширение и переместите его в директорию
~/.local/share/gnome-shell/extensions/
. Затем перезапустите GNOME Shell (нажмитеAlt + F2
, введитеr
и нажмитеEnter
) или перезагрузите компьютер. -
Тестирование: Откройте ваше приложение и проверьте, исчезла ли возможность перетаскивания окон при нажатии и перемещении курсора по верхней панели.
Важные замечания
- Совместимость: Убедитесь, что ваше расширение совместимо с версиями GNOME, которые вы планируете поддерживать. Некоторые изменения в API могут привести к неработоспособности кода.
- Обновления: Следите за обновлениями GNOME и его API, чтобы предотвратить сбои в работе вашего расширения после обновлений системы.
- Отладка: Если ваш код не работает как ожидалось, используйте консоль GNOME для отладки.
Создание такого расширения позволяет вашим пользователям отключить нежелательное поведение перетаскивания, что значительно улучшит функциональность вашего приложения для рисования, особенно на сенсорных устройствах.