exposay: properly go away when the modifier is pressed
We no longer receive an exposay_binding() call while exposay is in-flight as we have grabbed the keyboard, so we need to listen on the modifiers callback for the modifier press and release.
This commit is contained in:
committed by
Kristian Høgsberg
parent
1539ea2f74
commit
eed9344430
+26
-3
@@ -220,6 +220,9 @@ struct desktop_shell {
|
|||||||
|
|
||||||
int row_current;
|
int row_current;
|
||||||
int column_current;
|
int column_current;
|
||||||
|
|
||||||
|
bool mod_pressed;
|
||||||
|
bool mod_invalid;
|
||||||
} exposay;
|
} exposay;
|
||||||
|
|
||||||
uint32_t binding_modifier;
|
uint32_t binding_modifier;
|
||||||
@@ -5367,6 +5370,29 @@ exposay_modifier(struct weston_keyboard_grab *grab, uint32_t serial,
|
|||||||
uint32_t mods_depressed, uint32_t mods_latched,
|
uint32_t mods_depressed, uint32_t mods_latched,
|
||||||
uint32_t mods_locked, uint32_t group)
|
uint32_t mods_locked, uint32_t group)
|
||||||
{
|
{
|
||||||
|
struct desktop_shell *shell =
|
||||||
|
container_of(grab, struct desktop_shell, exposay.grab_kbd);
|
||||||
|
struct weston_seat *seat = (struct weston_seat *) grab->keyboard->seat;
|
||||||
|
|
||||||
|
/* We want to know when mod has been pressed and released.
|
||||||
|
* FIXME: There is a problem here: if mod is pressed, then a key
|
||||||
|
* is pressed and released, then mod is released, we will treat that
|
||||||
|
* as if only mod had been pressed and released. */
|
||||||
|
if (seat->modifier_state) {
|
||||||
|
if (seat->modifier_state == shell->binding_modifier) {
|
||||||
|
shell->exposay.mod_pressed = true;
|
||||||
|
} else {
|
||||||
|
shell->exposay.mod_invalid = true;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
if (shell->exposay.mod_pressed && !shell->exposay.mod_invalid)
|
||||||
|
exposay_set_state(shell, EXPOSAY_TARGET_CANCEL, seat);
|
||||||
|
|
||||||
|
shell->exposay.mod_invalid = false;
|
||||||
|
shell->exposay.mod_pressed = false;
|
||||||
|
}
|
||||||
|
|
||||||
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
@@ -5512,9 +5538,6 @@ exposay_binding(struct weston_seat *seat, enum weston_keyboard_modifier modifier
|
|||||||
{
|
{
|
||||||
struct desktop_shell *shell = data;
|
struct desktop_shell *shell = data;
|
||||||
|
|
||||||
if (shell->exposay.state_target == EXPOSAY_TARGET_OVERVIEW)
|
|
||||||
exposay_set_state(shell, EXPOSAY_TARGET_CANCEL, seat);
|
|
||||||
else
|
|
||||||
exposay_set_state(shell, EXPOSAY_TARGET_OVERVIEW, seat);
|
exposay_set_state(shell, EXPOSAY_TARGET_OVERVIEW, seat);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user