LINUX.ORG.RU

Как в wayland добиться изменения курсора во время перемещения в режиме Drag & Drop?

 , ,


0

1

Здравствуйте,

Пытаюсь заставить свою программу работать под wayland. Добрался до реализации Drag & Drop (буфер обмена уже заработал). Когда происходит Drag & Drop над моим окном, я получаю обратные вызовы enter (мышь заходит в окно) и motion (мышь двигается по окну). На них я реагирую через

wl_data_offer_accept(data_offer, serial, mime);

И если в mime я передаю NULL, то я ожидаю, что курсор станет disabled. И так и есть, но только в момент enter, а в момент motion курсор уже не меняется. Выглядит это очень нелепо, потому что получается так, что смена курсора возможна только когда мышь впервые попадает в окно.

Я вижу, что моя функция обратного вызова motion не имеет параметра serial (я его сейчас беру из функции enter), но вроде бы в новых версиях wayland этот serial уже должен быть. Попытки обновить wayland натыкаются на сообщение типа «у вас и так всё прекрасно». При этом я вижу, что, например, Code::Blocks, которым я пользуюсь, запросто меняет курсор во время Drag & Drop, когда этот курсор над его окном. Может я что-то не понимаю ? Просто у меня особых идей уже нет. Ну, неужели разработчики wayland могли сделать так, чтобы во время перемещения курсор в Drag & Drop не менялся ? Там же даже своих компонентов нет, т.е. GUI целиком пользовательский, а значит пользователь должен этот курсор менять как ему нужно.

Fedora/Gnome/Wayland



Последнее исправление: Dimez (всего исправлений: 2)
Ответ на: комментарий от u-235

Если в Code::Blocks работает, может быть имеет смысл заглянуть в их исходники?

Может быть тяжело из-за объема. Примеры, например, из Qt не проще подебажить, может что и увидишь, ну, и код там подсмотреть тоже можно.

blex ★★★★
()

Ты свой фреймворк пишешь? В кутях оно как-то сделано, так, что accept можешь поставить при движении мыши по конкретному контролу. И курсор меняется в зависимости от того может принять контрол дроп или нет. Что-то вроде такого:

void dragEnterEvent(QDragEnterEvent *event) override
    {
        if(data->GetDataType() == m_drop_datatype_accepted)
            event->acceptProposedAction();
    }
Loki13 ★★★★★
()
Ответ на: комментарий от Loki13

Удалось решить проблему. Оказывается нужно вызывать ещё и wl_data_offer_set_actions помимо wl_data_offer_accept. Всем спасибо за помощь!

Odin_KG
() автор топика
Для того чтобы оставить комментарий войдите или зарегистрируйтесь.