Glfw: Mengabaikan peristiwa mouse / transparan untuk input / menonaktifkan pengujian hit

Dibuat pada 20 Mar 2018  ·  3Komentar  ·  Sumber: glfw/glfw

Halo,

Menggunakan baris subjek yang panjang karena saya tidak tahu apa terminologi lintas platform yang paling tepat dan orang mungkin mencari ini dengan nama yang berbeda

Ini adalah permintaan fitur untuk petunjuk jendela, mari kita sebut saja GLFW_MOUSE_PASSTHRU (penamaan pasti akan ditentukan). Saya menggunakannya sebagai bagian dari pekerjaan yang sama yang saya sebutkan di #1166 (GIF di akhir posting ini).

(Catatan, ini tidak terkait dengan transparansi dari sudut pandang visual, sudah dibahas berkali-kali di sini: https://github.com/glfw/glfw/issues?utf8=%E2%9C%93&q=transparent)


jendela
Penangan WndProc akan melakukan:

if (msg == WM_NCHITTEST)
    return HTTRANSPARENT;

Mac
Saya pikir kita dapat menggunakan properti 'ignoresMouseEvents' dari 'NSWindow' (belum diuji)
https://developer.apple.com/documentation/appkit/nswindow/1419354-ignoresmouseevents?language=objc

Nilai Boolean yang menunjukkan apakah jendela transparan untuk peristiwa mouse.

Wayland
Mungkin 'wl_surface::set_input_region' (belum diuji)
https://wayland.freedesktop.org/docs/html/apa.html#protocol -spec-wl_surface

Peristiwa input yang terjadi di luar wilayah ini akan mencoba permukaan berikutnya di tumpukan permukaan server. Kompositor mengabaikan bagian-bagian dari wilayah input yang berada di luar permukaan. [...] Nilai awal untuk wilayah input tidak terbatas. Itu berarti seluruh permukaan akan menerima masukan. Menyetel wilayah input yang tertunda memiliki semantik salinan, dan objek wl_region dapat segera dimusnahkan. NULL wl_region menyebabkan wilayah input disetel ke tak terbatas.

X11
Saya tidak yakin bagaimana X11 bekerja. Untuk referensi, Qt menggunakan xcb_xfixes_create_region() + xcb_xfixes_set_window_shape_region_checked :
https://git.merproject.org/mer-core/qtbase/blob/master/qtbase/src/plugins/platforms/xcb/qxcbwindow.cpp#L1151


Konteks (gif): Saya menyeret jendela glfw (yang tepat di bawah kursor mouse saya) dan perlu mendeteksi jendela di bawah sehingga saya bisa masuk ke dalamnya. Serupa dengan #1166, saya dapat memberikan perkiraan kasar (tetapi dapat digunakan) di sisi klien dengan menggunakan ukuran/posisi desktop semua jendela saya, tetapi tentu saja ini akan melewati pengelola jendela dan mengabaikan urutan-z jendela yang tepat (termasuk jendela dari aplikasi asing).

EDIT Untuk memperjelas, saat ini saya sedang menguji ini dengan menggunakan kode khusus win32 dan memasang kait WndProc.

viewport_20180318


Penamaan dan kasus penggunaan saya sedikit rumit karena saya mengaktifkan fitur ini pada jendela GLFW yang ada, dan saat ini saya masih menerima posisi mouse yang diambil saat ini untuk jendela itu, yang ideal dan diinginkan dalam kasus penggunaan saya, dan saya pikir lebih fleksibel. Inilah mengapa saya tidak menyarankan nama seperti GLFW_IGNORE_MOUSE_INPUTS , karena CursorPosCallback dan glfwGetCursorPos() masih berfungsi dengan baik.

Terimakasih atas pertimbangan anda,
Umar

Wayland Windows X11 enhancement macOS

Komentar yang paling membantu

Fitur ini telah ditambahkan sebagai GLFW_MOUSE_PASSTHROUGH dengan #1568 oleh @rokups dan akan disertakan dalam 3.4.

Semua 3 komentar

Halo,
Apakah ada kata tentang ini? Saya pikir idenya bagus dan akan senang melihatnya di GLFW.

ingin melihat sesuatu seperti itu juga, memiliki masalah bahwa saya perlu membuat overlay di atas beberapa jendela aplikasi lain di linux tetapi masih ingin mengklik hal-hal di belakang overlay

Fitur ini telah ditambahkan sebagai GLFW_MOUSE_PASSTHROUGH dengan #1568 oleh @rokups dan akan disertakan dalam 3.4.

Apakah halaman ini membantu?
0 / 5 - 0 peringkat