Closed Bug 1857289 Opened 1 year ago Closed 1 year ago

[Linux][Wayland][Firefox] Unable to use Meta/Super key for ui.key.accelkey

Categories

(Core :: Widget: Gtk, defect, P3)

Firefox 118
defect

Tracking

()

RESOLVED FIXED
123 Branch
Tracking Status
firefox123 --- fixed

People

(Reporter: richard, Assigned: stransky)

References

(Blocks 1 open bug)

Details

Attachments

(4 files)

User Agent: Mozilla/5.0 (X11; Linux x86_64; rv:109.0) Gecko/20100101 Firefox/118.0

Steps to reproduce:

Hello, I tried to use Meta/Super as ui.key.accelkey instead of Ctrl by replacing the default value which is 17 for 91.
This workflow is perfectly working under Xorg/XWayland but not under Wayland (the easiest way to test is to use the MOZ_ENABLE_WAYLAND env var).

You can find the original issue here: https://github.com/hyprwm/Hyprland/issues/3499
All the credit should be attributed to https://github.com/vaxerski

Actual results:

Ctrl was still the accelKey even after changing the value and rebooted Firefox.

Expected results:

Should be able to use Meta/Super as accelKey.

The Bugbug bot thinks this bug should belong to the 'Core::Widget: Gtk' component, and is moving the bug to that component. Please correct in case you think the bot is wrong.

Component: Untriaged → Widget: Gtk
Product: Firefox → Core

I can confirm this with KWin on 120.0.1.

--MOZ_LOG=KeyboardHandler:5 reveals some differences in detection of Meta, e.g. when pressing Meta+t

On XWayland:

[Parent 895479: Main Thread]: I/KeyboardHandler HandleKeyPressEvent(aWindow=7fd8651fae00, aGdkKeyEvent={ type=GDK_KEY_PRESS, keyval=Super_L(0xFFEB), state=0x00000000, hardware_keycode=0x00000085, time=84578210, is_modifier=TRUE })
[Parent 895479: Main Thread]: D/KeyboardHandler 7fd8341d1f60 InitInputEvent, aModifierState=0x00000040, aInputEvent={ mMessage=eKeyDown, mModifiers=0x0040 (Shift: FALSE, Control: FALSE, Alt: FALSE, Meta: TRUE, AltGr: FALSE, CapsLock: FALSE, NumLock: FALSE, ScrollLock: FALSE })
[Parent 895479: Main Thread]: I/KeyboardHandler 7fd8341d1f60 InitKeyEvent, modifierState=0x00000040 aKeyEvent={ mMessage=eKeyDown, isShift=FALSE, isControl=FALSE, isAlt=FALSE, isMeta=TRUE , mKeyCode=0x5B, mCharCode=NULL (0x0000), mKeyNameIndex=Meta, mKeyValue="", mCodeNameIndex=MetaLeft, mCodeValue="", mLocation=KEY_LOCATION_LEFT, mIsRepeat=FALSE }
[Parent 895479: Main Thread]: I/KeyboardHandler   HandleKeyPressEvent(), dispatched eKeyDown event and it wasn't consumed
[Parent 895479: Main Thread]: D/KeyboardHandler 7fd8341d1f60 InitInputEvent, aModifierState=0x00000040, aInputEvent={ mMessage=eKeyPress, mModifiers=0x0040 (Shift: FALSE, Control: FALSE, Alt: FALSE, Meta: TRUE, AltGr: FALSE, CapsLock: FALSE, NumLock: FALSE, ScrollLock: FALSE })
[Parent 895479: Main Thread]: I/KeyboardHandler 7fd8341d1f60 InitKeyEvent, modifierState=0x00000040 aKeyEvent={ mMessage=eKeyPress, isShift=FALSE, isControl=FALSE, isAlt=FALSE, isMeta=TRUE , mKeyCode=0x5B, mCharCode=NULL (0x0000), mKeyNameIndex=Meta, mKeyValue="", mCodeNameIndex=MetaLeft, mCodeValue="", mLocation=KEY_LOCATION_LEFT, mIsRepeat=FALSE }
[Parent 895479: Main Thread]: I/KeyboardHandler   HandleKeyPressEvent(), didn't dispatch eKeyPress event (status=nsEventStatus_eIgnore)
[Parent 895479: Main Thread]: I/KeyboardHandler FilterEvents(aXEvent={ type=KeyPress, xkey={ keycode=0x0000001C, state=0x00000040, time=84578994 } }, aGdkEvent={ state=0x00000000 }), detected first keypress
[Parent 895479: Main Thread]: I/KeyboardHandler HandleKeyPressEvent(aWindow=7fd8651fae00, aGdkKeyEvent={ type=GDK_KEY_PRESS, keyval=t(0x74), state=0x04000040, hardware_keycode=0x0000001C, time=84578994, is_modifier=FALSE })
[Parent 895479: Main Thread]: D/KeyboardHandler 7fd8341d1f60 InitInputEvent, aModifierState=0x04000040, aInputEvent={ mMessage=eKeyDown, mModifiers=0x0040 (Shift: FALSE, Control: FALSE, Alt: FALSE, Meta: TRUE, AltGr: FALSE, CapsLock: FALSE, NumLock: FALSE, ScrollLock: FALSE })
[Parent 895479: Main Thread]: I/KeyboardHandler 7fd8341d1f60 InitKeyEvent, modifierState=0x04000040 aKeyEvent={ mMessage=eKeyDown, isShift=FALSE, isControl=FALSE, isAlt=FALSE, isMeta=TRUE , mKeyCode=0x54, mCharCode=NULL (0x0000), mKeyNameIndex=USE_STRING, mKeyValue="'t' (0x0074)", mCodeNameIndex=KeyT, mCodeValue="", mLocation=KEY_LOCATION_STANDARD, mIsRepeat=FALSE }
[Parent 895479: Main Thread]: I/KeyboardHandler   HandleKeyPressEvent(), dispatched eKeyDown event and it wasn't consumed
[Parent 895479: Main Thread]: D/KeyboardHandler 7fd8341d1f60 InitInputEvent, aModifierState=0x04000040, aInputEvent={ mMessage=eKeyPress, mModifiers=0x0040 (Shift: FALSE, Control: FALSE, Alt: FALSE, Meta: TRUE, AltGr: FALSE, CapsLock: FALSE, NumLock: FALSE, ScrollLock: FALSE })
[Parent 895479: Main Thread]: I/KeyboardHandler 7fd8341d1f60 InitKeyEvent, modifierState=0x04000040 aKeyEvent={ mMessage=eKeyPress, isShift=FALSE, isControl=FALSE, isAlt=FALSE, isMeta=TRUE , mKeyCode=0x00, mCharCode=NULL (0x0000), mKeyNameIndex=USE_STRING, mKeyValue="'t' (0x0074)", mCodeNameIndex=KeyT, mCodeValue="", mLocation=KEY_LOCATION_STANDARD, mIsRepeat=FALSE }
[Parent 895479: Main Thread]: I/KeyboardHandler 7fd8341d1f60 WillDispatchKeyboardEventInternal, mKeyCode=0x00, mCharCode=0x00000074, level=0, altCharCodes={ mUnshiftedCharCode=0x00000074, mShiftedCharCode=0x00000054 }
[Parent 895479: Main Thread]: I/KeyboardHandler   HandleKeyPressEvent(), dispatched eKeyPress event (status=nsEventStatus_eConsumeNoDefault)
[Parent 895479: Main Thread]: I/KeyboardHandler FilterEvents(aXEvent={ type=KeyRelease, xkey={ keycode=0x0000001C, state=0x00000040, time=84579137 } }, aGdkEvent={ state=0x00000000 }), detected key release
[Parent 895479: Main Thread]: I/KeyboardHandler HandleKeyReleaseEvent(aWindow=7fd8651fae00, aGdkKeyEvent={ type=GDK_KEY_RELEASE, keyval=t(0x74), state=0x04000040, hardware_keycode=0x0000001C, time=84579137, is_modifier=FALSE })
[Parent 895479: Main Thread]: D/KeyboardHandler 7fd8341d1f60 InitInputEvent, aModifierState=0x04000040, aInputEvent={ mMessage=eKeyUp, mModifiers=0x0040 (Shift: FALSE, Control: FALSE, Alt: FALSE, Meta: TRUE, AltGr: FALSE, CapsLock: FALSE, NumLock: FALSE, ScrollLock: FALSE })
[Parent 895479: Main Thread]: I/KeyboardHandler 7fd8341d1f60 InitKeyEvent, modifierState=0x04000040 aKeyEvent={ mMessage=eKeyUp, isShift=FALSE, isControl=FALSE, isAlt=FALSE, isMeta=TRUE , mKeyCode=0x54, mCharCode=NULL (0x0000), mKeyNameIndex=USE_STRING, mKeyValue="'t' (0x0074)", mCodeNameIndex=KeyT, mCodeValue="", mLocation=KEY_LOCATION_STANDARD, mIsRepeat=FALSE }
[Parent 895479: Main Thread]: I/KeyboardHandler   HandleKeyReleaseEvent(), dispatched eKeyUp event (isCancelled=FALSE)
[Parent 895479: Main Thread]: I/KeyboardHandler HandleKeyReleaseEvent(aWindow=7fd8651fae00, aGdkKeyEvent={ type=GDK_KEY_RELEASE, keyval=Super_L(0xFFEB), state=0x04000040, hardware_keycode=0x00000085, time=84579266, is_modifier=TRUE })
[Parent 895479: Main Thread]: D/KeyboardHandler 7fd8341d1f60 InitInputEvent, aModifierState=0x04000000, aInputEvent={ mMessage=eKeyUp, mModifiers=0x0000 (Shift: FALSE, Control: FALSE, Alt: FALSE, Meta: FALSE, AltGr: FALSE, CapsLock: FALSE, NumLock: FALSE, ScrollLock: FALSE })
[Parent 895479: Main Thread]: I/KeyboardHandler 7fd8341d1f60 InitKeyEvent, modifierState=0x04000000 aKeyEvent={ mMessage=eKeyUp, isShift=FALSE, isControl=FALSE, isAlt=FALSE, isMeta=FALSE , mKeyCode=0x5B, mCharCode=NULL (0x0000), mKeyNameIndex=Meta, mKeyValue="", mCodeNameIndex=MetaLeft, mCodeValue="", mLocation=KEY_LOCATION_LEFT, mIsRepeat=FALSE }
[Parent 895479: Main Thread]: I/KeyboardHandler   HandleKeyReleaseEvent(), dispatched eKeyUp event (isCancelled=FALSE)
[Parent 895479: Main Thread]: I/KeyboardHandler HandleKeyPressEvent(aWindow=7fd8651fae00, aGdkKeyEvent={ type=GDK_KEY_PRESS, keyval=Super_L(0xFFEB), state=0x00000000, hardware_keycode=0x00000085, time=84595794, is_modifier=TRUE })
[Parent 895479: Main Thread]: D/KeyboardHandler 7fd8341d1f60 InitInputEvent, aModifierState=0x00000040, aInputEvent={ mMessage=eKeyDown, mModifiers=0x0040 (Shift: FALSE, Control: FALSE, Alt: FALSE, Meta: TRUE, AltGr: FALSE, CapsLock: FALSE, NumLock: FALSE, ScrollLock: FALSE })
[Parent 895479: Main Thread]: I/KeyboardHandler 7fd8341d1f60 InitKeyEvent, modifierState=0x00000040 aKeyEvent={ mMessage=eKeyDown, isShift=FALSE, isControl=FALSE, isAlt=FALSE, isMeta=TRUE , mKeyCode=0x5B, mCharCode=NULL (0x0000), mKeyNameIndex=Meta, mKeyValue="", mCodeNameIndex=MetaLeft, mCodeValue="", mLocation=KEY_LOCATION_LEFT, mIsRepeat=FALSE }
[Parent 895479: Main Thread]: I/KeyboardHandler   HandleKeyPressEvent(), dispatched eKeyDown event and it wasn't consumed
[Parent 895479: Main Thread]: D/KeyboardHandler 7fd8341d1f60 InitInputEvent, aModifierState=0x00000040, aInputEvent={ mMessage=eKeyPress, mModifiers=0x0040 (Shift: FALSE, Control: FALSE, Alt: FALSE, Meta: TRUE, AltGr: FALSE, CapsLock: FALSE, NumLock: FALSE, ScrollLock: FALSE })
[Parent 895479: Main Thread]: I/KeyboardHandler 7fd8341d1f60 InitKeyEvent, modifierState=0x00000040 aKeyEvent={ mMessage=eKeyPress, isShift=FALSE, isControl=FALSE, isAlt=FALSE, isMeta=TRUE , mKeyCode=0x5B, mCharCode=NULL (0x0000), mKeyNameIndex=Meta, mKeyValue="", mCodeNameIndex=MetaLeft, mCodeValue="", mLocation=KEY_LOCATION_LEFT, mIsRepeat=FALSE }
[Parent 895479: Main Thread]: I/KeyboardHandler   HandleKeyPressEvent(), didn't dispatch eKeyPress event (status=nsEventStatus_eIgnore)

On Wayland

[Parent 895969: Main Thread]: I/KeyboardHandler HandleKeyPressEvent(aWindow=7fd792892e00, aGdkKeyEvent={ type=GDK_KEY_PRESS, keyval=Super_L(0xFFEB), state=0x00000000, hardware_keycode=0x00000085, time=84676011, is_modifier=TRUE })
[Parent 895969: Main Thread]: D/KeyboardHandler 7fd794a1dd80 InitInputEvent, aModifierState=0x00002000, aInputEvent={ mMessage=eKeyDown, mModifiers=0x0040 (Shift: FALSE, Control: FALSE, Alt: FALSE, Meta: TRUE, AltGr: FALSE, CapsLock: FALSE, NumLock: FALSE, ScrollLock: FALSE })
[Parent 895969: Main Thread]: I/KeyboardHandler 7fd794a1dd80 InitKeyEvent, modifierState=0x00002000 aKeyEvent={ mMessage=eKeyDown, isShift=FALSE, isControl=FALSE, isAlt=FALSE, isMeta=TRUE , mKeyCode=0x5B, mCharCode=NULL (0x0000), mKeyNameIndex=Meta, mKeyValue="", mCodeNameIndex=MetaLeft, mCodeValue="", mLocation=KEY_LOCATION_LEFT, mIsRepeat=FALSE }
[Parent 895969: Main Thread]: I/KeyboardHandler   HandleKeyPressEvent(), dispatched eKeyDown event and it wasn't consumed
[Parent 895969: Main Thread]: D/KeyboardHandler 7fd794a1dd80 InitInputEvent, aModifierState=0x00002000, aInputEvent={ mMessage=eKeyPress, mModifiers=0x0040 (Shift: FALSE, Control: FALSE, Alt: FALSE, Meta: TRUE, AltGr: FALSE, CapsLock: FALSE, NumLock: FALSE, ScrollLock: FALSE })
[Parent 895969: Main Thread]: I/KeyboardHandler 7fd794a1dd80 InitKeyEvent, modifierState=0x00002000 aKeyEvent={ mMessage=eKeyPress, isShift=FALSE, isControl=FALSE, isAlt=FALSE, isMeta=TRUE , mKeyCode=0x5B, mCharCode=NULL (0x0000), mKeyNameIndex=Meta, mKeyValue="", mCodeNameIndex=MetaLeft, mCodeValue="", mLocation=KEY_LOCATION_LEFT, mIsRepeat=FALSE }
[Parent 895969: Main Thread]: I/KeyboardHandler   HandleKeyPressEvent(), didn't dispatch eKeyPress event (status=nsEventStatus_eIgnore)
[Parent 895969: Main Thread]: I/KeyboardHandler HandleKeyPressEvent(aWindow=7fd792892e00, aGdkKeyEvent={ type=GDK_KEY_PRESS, keyval=t(0x74), state=0x04000040, hardware_keycode=0x0000001C, time=84676667, is_modifier=FALSE })
[Parent 895969: Main Thread]: D/KeyboardHandler 7fd794a1dd80 InitInputEvent, aModifierState=0x04000040, aInputEvent={ mMessage=eKeyDown, mModifiers=0x0000 (Shift: FALSE, Control: FALSE, Alt: FALSE, Meta: FALSE, AltGr: FALSE, CapsLock: FALSE, NumLock: FALSE, ScrollLock: FALSE })
[Parent 895969: Main Thread]: I/KeyboardHandler 7fd794a1dd80 InitKeyEvent, modifierState=0x04000040 aKeyEvent={ mMessage=eKeyDown, isShift=FALSE, isControl=FALSE, isAlt=FALSE, isMeta=FALSE , mKeyCode=0x54, mCharCode=NULL (0x0000), mKeyNameIndex=USE_STRING, mKeyValue="'t' (0x0074)", mCodeNameIndex=KeyT, mCodeValue="", mLocation=KEY_LOCATION_STANDARD, mIsRepeat=FALSE }
[Parent 895969: Main Thread]: I/KeyboardHandler   HandleKeyPressEvent(), dispatched eKeyDown event and it wasn't consumed
[Parent 895969: Main Thread]: D/KeyboardHandler 7fd794a1dd80 InitInputEvent, aModifierState=0x04000040, aInputEvent={ mMessage=eKeyPress, mModifiers=0x0000 (Shift: FALSE, Control: FALSE, Alt: FALSE, Meta: FALSE, AltGr: FALSE, CapsLock: FALSE, NumLock: FALSE, ScrollLock: FALSE })
[Parent 895969: Main Thread]: I/KeyboardHandler 7fd794a1dd80 InitKeyEvent, modifierState=0x04000040 aKeyEvent={ mMessage=eKeyPress, isShift=FALSE, isControl=FALSE, isAlt=FALSE, isMeta=FALSE , mKeyCode=0x00, mCharCode=NULL (0x0000), mKeyNameIndex=USE_STRING, mKeyValue="'t' (0x0074)", mCodeNameIndex=KeyT, mCodeValue="", mLocation=KEY_LOCATION_STANDARD, mIsRepeat=FALSE }
[Parent 895969: Main Thread]: I/KeyboardHandler   HandleKeyPressEvent(), dispatched eKeyPress event (status=nsEventStatus_eIgnore)
[Parent 895969: Main Thread]: I/KeyboardHandler HandleKeyReleaseEvent(aWindow=7fd792892e00, aGdkKeyEvent={ type=GDK_KEY_RELEASE, keyval=t(0x74), state=0x04000040, hardware_keycode=0x0000001C, time=84676803, is_modifier=FALSE })
[Parent 895969: Main Thread]: D/KeyboardHandler 7fd794a1dd80 InitInputEvent, aModifierState=0x04000040, aInputEvent={ mMessage=eKeyUp, mModifiers=0x0000 (Shift: FALSE, Control: FALSE, Alt: FALSE, Meta: FALSE, AltGr: FALSE, CapsLock: FALSE, NumLock: FALSE, ScrollLock: FALSE })
[Parent 895969: Main Thread]: I/KeyboardHandler 7fd794a1dd80 InitKeyEvent, modifierState=0x04000040 aKeyEvent={ mMessage=eKeyUp, isShift=FALSE, isControl=FALSE, isAlt=FALSE, isMeta=FALSE , mKeyCode=0x54, mCharCode=NULL (0x0000), mKeyNameIndex=USE_STRING, mKeyValue="'t' (0x0074)", mCodeNameIndex=KeyT, mCodeValue="", mLocation=KEY_LOCATION_STANDARD, mIsRepeat=FALSE }
[Parent 895969: Main Thread]: I/KeyboardHandler   HandleKeyReleaseEvent(), dispatched eKeyUp event (isCancelled=FALSE)
[Parent 895969: Main Thread]: I/KeyboardHandler HandleKeyReleaseEvent(aWindow=7fd792892e00, aGdkKeyEvent={ type=GDK_KEY_RELEASE, keyval=Super_L(0xFFEB), state=0x04000040, hardware_keycode=0x00000085, time=84676883, is_modifier=TRUE })
[Parent 895969: Main Thread]: D/KeyboardHandler 7fd794a1dd80 InitInputEvent, aModifierState=0x04000040, aInputEvent={ mMessage=eKeyUp, mModifiers=0x0000 (Shift: FALSE, Control: FALSE, Alt: FALSE, Meta: FALSE, AltGr: FALSE, CapsLock: FALSE, NumLock: FALSE, ScrollLock: FALSE })
[Parent 895969: Main Thread]: I/KeyboardHandler 7fd794a1dd80 InitKeyEvent, modifierState=0x04000040 aKeyEvent={ mMessage=eKeyUp, isShift=FALSE, isControl=FALSE, isAlt=FALSE, isMeta=FALSE , mKeyCode=0x5B, mCharCode=NULL (0x0000), mKeyNameIndex=Meta, mKeyValue="", mCodeNameIndex=MetaLeft, mCodeValue="", mLocation=KEY_LOCATION_LEFT, mIsRepeat=FALSE }
[Parent 895969: Main Thread]: I/KeyboardHandler   HandleKeyReleaseEvent(), dispatched eKeyUp event (isCancelled=FALSE)

Notice how on Wayland the first event sees Meta: TRUE with aModifierState=0x00002000 (for press of Meta itself, I assume), but then fails on the press of "t" with Meta: FALSE and aModifierState=0x04000040 (latter modifier state actually matches one seen from XWayland/X11).

So I find that something must be wrong with implementation https://hg.mozilla.org/mozilla-central/rev/5e46c8d0ed58491ddfc7ee6d95754b226f743436

Looking at definition of https://docs.gtk.org/gdk3/struct.EventKey.html the state field is a GdkModifierType enum and needs to be interpreted as such. I'm a bit puzzled about how Xkb enters the picture on Firefox side.

This fixes the issue for me.

Attachment #9370098 - Flags: review?(stransky)

It's a bug in keyevent handling where we mix GDK and Wayland provided modificator masks.

What we see here it actually 'Super' modifier mapped as Meta in modificator mask. We need to fix that on X11 too to use GDK mask to map state provided by GtkEvent. It's pure luck it works on X11. Not sure how it's tied to ui.key.accelkey but that may be a different issue.

Comment on attachment 9370098 [details] [diff] [review]
backout_5e46c8d0_use_GDK_ModifierType.patch

We need to use a bit different approach here but thanks for the pointers.

Attachment #9370098 - Flags: review?(stransky) → review-

Rename KeymapWrapper::Modifier to KeymapWrapper::MappedModifier to make clear it keeps a list of modifiers we map between Gdk and Gecko.
Rename aModifierState method params to aGdkModifierState to make clear where Gdk modifiers are used.

Assignee: nobody → stransky
Status: UNCONFIRMED → ASSIGNED
Ever confirmed: true

(In reply to Martin Stránský [:stransky] (ni? me) from comment #8)

Comment on attachment 9370098 [details] [diff] [review]
backout_5e46c8d0_use_GDK_ModifierType.patch

We need to use a bit different approach here but thanks for the pointers.

The approach here it actually correct, we need to use direct mapping for Super key. Meta/Hyper may be emulated so we should get them from xkb.

Pushed by stransky@redhat.com: https://hg.mozilla.org/integration/autoland/rev/e3cd9edd180e [Linux] Rename Modifier to MappedModifier and make clear where Gdk modifiers are used r=emilio https://hg.mozilla.org/integration/autoland/rev/f249e6626207 [Linux] Use Gdk mask directly for Super key modifier r=emilio https://hg.mozilla.org/integration/autoland/rev/c55aa8ce113d [Linux] Return early from ComputeKeyModifiers() if no modifier is set r=emilio
Status: ASSIGNED → RESOLVED
Closed: 1 year ago
Resolution: --- → FIXED
Target Milestone: --- → 123 Branch
QA Whiteboard: [qa-123b-p2]
You need to log in before you can comment on or make changes to this bug.

Attachment

General

Created:
Updated:
Size: