[Linux][Wayland][Firefox] Unable to use Meta/Super key for ui.key.accelkey
Categories
(Core :: Widget: Gtk, defect, P3)
Tracking
()
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.
Comment 1•1 year ago
|
||
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.
Comment 2•1 year ago
|
||
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).
Comment 3•1 year ago
|
||
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.
Assignee | ||
Comment 6•1 year ago
|
||
It's a bug in keyevent handling where we mix GDK and Wayland provided modificator masks.
Assignee | ||
Comment 7•1 year ago
|
||
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.
Assignee | ||
Comment 8•1 year ago
|
||
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.
Assignee | ||
Comment 9•1 year ago
|
||
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.
Updated•1 year ago
|
Assignee | ||
Comment 10•1 year ago
|
||
Depends on D198012
Assignee | ||
Comment 11•1 year ago
|
||
Depends on D198013
Assignee | ||
Comment 12•1 year ago
|
||
(In reply to Martin Stránský [:stransky] (ni? me) from comment #8)
Comment on attachment 9370098 [details] [diff] [review]
backout_5e46c8d0_use_GDK_ModifierType.patchWe 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.
Assignee | ||
Updated•1 year ago
|
Comment 13•1 year ago
|
||
Comment 14•1 year ago
|
||
bugherder |
https://hg.mozilla.org/mozilla-central/rev/e3cd9edd180e
https://hg.mozilla.org/mozilla-central/rev/f249e6626207
https://hg.mozilla.org/mozilla-central/rev/c55aa8ce113d
Updated•1 year ago
|
Description
•