Glfw: Ignorer les événements de la souris / transparent pour les entrées / désactiver les tests d'impact

Créé le 20 mars 2018  ·  3Commentaires  ·  Source: glfw/glfw

Bonjour,

Utiliser une longue ligne d'objet car je ne sais pas quelle est la terminologie multiplateforme la plus appropriée et les gens pourraient la rechercher sous différents noms

Il s'agit d'une demande de fonctionnalité pour un indice de fenêtre, appelons-le provisoirement GLFW_MOUSE_PASSTHRU (nom exact à déterminer). Je l'utilise dans le cadre du même travail que j'ai mentionné dans #1166 (GIF à la fin de cet article).

(Notez que cela n'a aucun rapport avec la transparence d'un point de vue visuel, déjà discuté à plusieurs reprises ici : https://github.com/glfw/glfw/issues?utf8=%E2%9C%93&q=transparent)


les fenêtres
Le gestionnaire WndProc ferait :

if (msg == WM_NCHITTEST)
    return HTTRANSPARENT;

Mac
Je pense que nous pouvons utiliser la propriété 'ignoresMouseEvents' de 'NSWindow' (non testé)
https://developer.apple.com/documentation/appkit/nswindow/1419354-ignoresmouseevents?language=objc

Valeur booléenne qui indique si la fenêtre est transparente aux événements de souris.

Wayland
Peut-être 'wl_surface::set_input_region' (non testé)
https://wayland.freedesktop.org/docs/html/apa.html#protocol -spec-wl_surface

Les événements d'entrée se produisant en dehors de cette région essaieront la surface suivante dans la pile de surface du serveur. Le compositeur ignore les parties de la région d'entrée qui tombent à l'extérieur de la surface. [...] La valeur initiale d'une région d'entrée est infinie. Cela signifie que toute la surface acceptera les entrées. La définition de la région d'entrée en attente a une sémantique de copie et l'objet wl_region peut être détruit immédiatement. Une wl_region NULL fait que la région d'entrée est définie sur infinie.

X11
Je ne sais pas comment fonctionne X11. Pour référence, Qt utilise 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


Contexte (gif) : je fais glisser une fenêtre glfw (qui se trouve juste sous le curseur de ma souris) et je dois détecter la fenêtre en dessous pour pouvoir y accéder. De la même manière que #1166, je peux fournir une approximation approximative (mais utilisable) côté client en utilisant la taille/position du bureau de toutes mes fenêtres, mais bien sûr, cela contournerait le gestionnaire de fenêtres et ignorerait l'ordre z approprié des fenêtres (y compris fenêtres d'une application étrangère).

EDIT Pour clarifier, pour le moment, je teste cela en utilisant un code spécifique à win32 et en installant un hook WndProc.

viewport_20180318


Le nommage et mon cas d'utilisation sont un peu délicats car je bascule cette fonctionnalité sur une fenêtre GLFW existante, et pour le moment je reçois toujours la position de la souris actuellement capturée pour cette fenêtre, ce qui est idéal et souhaitable dans mon cas d'utilisation, et je pense plus souple. C'est pourquoi je n'ai pas suggéré de nom comme GLFW_IGNORE_MOUSE_INPUTS , car CursorPosCallback et glfwGetCursorPos() fonctionnent toujours correctement.

Merci pour votre considération,
Omar

Wayland Windows X11 enhancement macOS

Commentaire le plus utile

Cette fonctionnalité a été ajoutée en tant que GLFW_MOUSE_PASSTHROUGH avec #1568 par @rokups et sera incluse dans 3.4.

Tous les 3 commentaires

Bonjour,
Y a-t-il un mot à ce sujet ? Je pense que l'idée est géniale et j'adorerais la voir dans GLFW.

aimerait voir quelque chose de cette façon aussi, ayant le problème que je dois créer une superposition au-dessus d'une autre fenêtre d'application sur Linux mais que je veux toujours cliquer sur des éléments derrière la superposition

Cette fonctionnalité a été ajoutée en tant que GLFW_MOUSE_PASSTHROUGH avec #1568 par @rokups et sera incluse dans 3.4.

Cette page vous a été utile?
0 / 5 - 0 notes