unofficial mirror of emacs-devel@gnu.org 
 help / color / mirror / code / Atom feed
* PGTK-related misconceptions
       [not found] <DM5PR03MB3163BBCF9626AD3B88900011C5EE9@DM5PR03MB3163.namprd03.prod.outlook.com>
@ 2022-04-15  2:29 ` Po Lu
  2022-04-15  7:11   ` Byung-Hee HWANG
                     ` (3 more replies)
  0 siblings, 4 replies; 48+ messages in thread
From: Po Lu @ 2022-04-15  2:29 UTC (permalink / raw)
  To: Morgan Smith; +Cc: emacs-devel

Morgan Smith <morgan.j.smith@outlook.com> writes:

> I'd like to report that my super key stopped registering.  I suspected
> commit 1404e16975 caused it so I did a quick `git revert 1404e16975`
> ontop of 807682de1e and that fixed it.

Crystal ball says you are using X Windows, and have to put

  remove mod4 = Hyper_L

in your ~/.Xmodmap file, because GTK doesn't try as hard as regular X11
Emacs to work around the common kind of virtual modifier
misconfiguration.

People using X should _never_ use PGTK.  The regular X build does a much
better job at supporting that than PGTK ever will.

It is completely pointless to put up with half-working child frames,
random keyboard-related lossage, random frame placement/resizing
failures, so the actual fix is to delete `--with-pgtk' from your calls
to configure.

Similarly, people building packages with PGTK enabled that are labeled
"enhanced" are doing their users a disservice.  No packager should
enable PGTK by default, and every package should ideally come with a big
disclaimer warning against using PGTK on window systems otherwise
supported by Emacs, since time and experience shows that Emacs generally
does a much better job at their support than GTK.

Many people are also being mislead by articles on the internet claiming
that PGTK leads to faster redisplay, such as this one:
http://www.cesarolea.com/posts/emacs-native-compile

That is not true, since regular Emacs with cairo uses more-or-less the
same rendering path as PGTK, except when PGTK runs on Wayland, where it
uses software rendering and does image compositing in software, and is
thus slower than everything else.  Scrolling on PGTK is also not as
efficient as XCopyArea requests.

But the difference in speed even on Wayland is negligible, not easy to
benchmark, and not at all visible to the human eye.



^ permalink raw reply	[flat|nested] 48+ messages in thread

* Re: PGTK-related misconceptions
  2022-04-15  2:29 ` Po Lu
@ 2022-04-15  7:11   ` Byung-Hee HWANG
  2022-04-15 16:24   ` Eric Abrahamsen
                     ` (2 subsequent siblings)
  3 siblings, 0 replies; 48+ messages in thread
From: Byung-Hee HWANG @ 2022-04-15  7:11 UTC (permalink / raw)
  To: emacs-devel

Po Lu <luangruo@yahoo.com> writes:

> (...thanks...)
> People using X should _never_ use PGTK.  ...

+9999; REALLY, i am of the same opinion!

Sincerely, Gnus fan Byung-Hee

-- 
^고맙습니다 _救濟蒼生_ 감사합니다_^))//

^ permalink raw reply	[flat|nested] 48+ messages in thread

* Re: PGTK-related misconceptions
  2022-04-15  2:29 ` Po Lu
  2022-04-15  7:11   ` Byung-Hee HWANG
@ 2022-04-15 16:24   ` Eric Abrahamsen
  2022-04-18  5:18   ` Sean Whitton
  2022-04-19  9:10   ` Dirk-Jan C. Binnema
  3 siblings, 0 replies; 48+ messages in thread
From: Eric Abrahamsen @ 2022-04-15 16:24 UTC (permalink / raw)
  To: emacs-devel

Po Lu <luangruo@yahoo.com> writes:

> Morgan Smith <morgan.j.smith@outlook.com> writes:
>
>> I'd like to report that my super key stopped registering.  I suspected
>> commit 1404e16975 caused it so I did a quick `git revert 1404e16975`
>> ontop of 807682de1e and that fixed it.
>
> Crystal ball says you are using X Windows, and have to put
>
>   remove mod4 = Hyper_L
>
> in your ~/.Xmodmap file, because GTK doesn't try as hard as regular X11
> Emacs to work around the common kind of virtual modifier
> misconfiguration.
>
> People using X should _never_ use PGTK.  The regular X build does a much
> better job at supporting that than PGTK ever will.

Hey, thanks for this! I'd set --with-pgtk on my X11 machine ages ago,
not even knowing why, and reconfiguring without that flag solved my
problems with "C-;" being received as plain ";" (and some other funky
key misreadings). This is why we don't copy-n-paste config!

Thanks again,
Eric




^ permalink raw reply	[flat|nested] 48+ messages in thread

* Re: PGTK-related misconceptions
  2022-04-15  2:29 ` Po Lu
  2022-04-15  7:11   ` Byung-Hee HWANG
  2022-04-15 16:24   ` Eric Abrahamsen
@ 2022-04-18  5:18   ` Sean Whitton
  2022-04-18  5:31     ` Po Lu
  2022-04-19  9:10   ` Dirk-Jan C. Binnema
  3 siblings, 1 reply; 48+ messages in thread
From: Sean Whitton @ 2022-04-18  5:18 UTC (permalink / raw)
  To: Po Lu; +Cc: emacs-devel

Hello,

On Fri 15 Apr 2022 at 10:29am +08, Po Lu wrote:

> People using X should _never_ use PGTK.  The regular X build does a much
> better job at supporting that than PGTK ever will.

The discussion of pgtk in INSTALL doesn't say this.  If I was packaging
Emacs for a distro I think I could be misled into thinking I should
replace my gtk package with pgtk.  But in fact I should supply both.

Here is a very simple suggested addition:

> diff --git a/INSTALL b/INSTALL
> index b1e3c72c4b..6cbd74ed55 100644
> --- a/INSTALL
> +++ b/INSTALL
> @@ -253,6 +253,10 @@ to force GTK+ to run under Broadway, start Emacs like this:
>
>  (where '...' denotes any further options you may want to pass to Emacs).
>
> +If you use X exclusively, do not use the PGTK port.  There are a
> +number of respects in which the regular --with-x-toolkit=gtk build
> +works better.
> +
>  The GNUstep build also supports the Wayland window system.  If that is
>  what you want, see nextstep/INSTALL.

-- 
Sean Whitton



^ permalink raw reply	[flat|nested] 48+ messages in thread

* Re: PGTK-related misconceptions
  2022-04-18  5:18   ` Sean Whitton
@ 2022-04-18  5:31     ` Po Lu
  2022-04-18  5:43       ` Sean Whitton
  0 siblings, 1 reply; 48+ messages in thread
From: Po Lu @ 2022-04-18  5:31 UTC (permalink / raw)
  To: Sean Whitton; +Cc: emacs-devel

Sean Whitton <spwhitton@spwhitton.name> writes:

> Hello,
>
> On Fri 15 Apr 2022 at 10:29am +08, Po Lu wrote:
>
>> People using X should _never_ use PGTK.  The regular X build does a much
>> better job at supporting that than PGTK ever will.
>
> The discussion of pgtk in INSTALL doesn't say this.  If I was packaging
> Emacs for a distro I think I could be misled into thinking I should
> replace my gtk package with pgtk.  But in fact I should supply both.

INSTALL already recommends PGTK only for using alternative window
systems, not X, which is explained first.

Thanks.




^ permalink raw reply	[flat|nested] 48+ messages in thread

* Re: PGTK-related misconceptions
  2022-04-18  5:31     ` Po Lu
@ 2022-04-18  5:43       ` Sean Whitton
  2022-04-18  5:57         ` Po Lu
  0 siblings, 1 reply; 48+ messages in thread
From: Sean Whitton @ 2022-04-18  5:43 UTC (permalink / raw)
  To: Po Lu; +Cc: emacs-devel

Hello,

On Mon 18 Apr 2022 at 01:31pm +08, Po Lu wrote:

> Sean Whitton <spwhitton@spwhitton.name> writes:
>
>> Hello,
>>
>> On Fri 15 Apr 2022 at 10:29am +08, Po Lu wrote:
>>
>>> People using X should _never_ use PGTK.  The regular X build does a much
>>> better job at supporting that than PGTK ever will.
>>
>> The discussion of pgtk in INSTALL doesn't say this.  If I was packaging
>> Emacs for a distro I think I could be misled into thinking I should
>> replace my gtk package with pgtk.  But in fact I should supply both.
>
> INSTALL already recommends PGTK only for using alternative window
> systems, not X, which is explained first.

It recommends it /for/ using alternative window systems, not /only for/
using alternative window systems, so far as I can tell.  For example

    With the PGTK build, you will be able to switch between running
    Emacs on X, Wayland and Broadway using the 'GDK_BACKEND' environment
    variable.

really makes it sound like it's find to use it if you're using only X.

-- 
Sean Whitton



^ permalink raw reply	[flat|nested] 48+ messages in thread

* Re: PGTK-related misconceptions
  2022-04-18  5:43       ` Sean Whitton
@ 2022-04-18  5:57         ` Po Lu
  2022-04-18 18:27           ` Sean Whitton
  2022-04-18 19:49           ` Jim Porter
  0 siblings, 2 replies; 48+ messages in thread
From: Po Lu @ 2022-04-18  5:57 UTC (permalink / raw)
  To: Sean Whitton; +Cc: emacs-devel

Sean Whitton <spwhitton@spwhitton.name> writes:

> It recommends it /for/ using alternative window systems, not /only for/
> using alternative window systems, so far as I can tell.  For example
>
>     With the PGTK build, you will be able to switch between running
>     Emacs on X, Wayland and Broadway using the 'GDK_BACKEND' environment
>     variable.
>
> really makes it sound like it's find to use it if you're using only X.

I don't see a difference between "for" and "only for" in this case,
because above the section talking about PGTK (and also in the details
below) is a large amount of commentary discussing the regular X build.



^ permalink raw reply	[flat|nested] 48+ messages in thread

* Re: PGTK-related misconceptions
  2022-04-18  5:57         ` Po Lu
@ 2022-04-18 18:27           ` Sean Whitton
  2022-04-18 19:49           ` Jim Porter
  1 sibling, 0 replies; 48+ messages in thread
From: Sean Whitton @ 2022-04-18 18:27 UTC (permalink / raw)
  To: Po Lu; +Cc: emacs-devel

Hello,

On Mon 18 Apr 2022 at 01:57PM +08, Po Lu wrote:

> Sean Whitton <spwhitton@spwhitton.name> writes:
>
>> It recommends it /for/ using alternative window systems, not /only for/
>> using alternative window systems, so far as I can tell.  For example
>>
>>     With the PGTK build, you will be able to switch between running
>>     Emacs on X, Wayland and Broadway using the 'GDK_BACKEND' environment
>>     variable.
>>
>> really makes it sound like it's find to use it if you're using only X.
>
> I don't see a difference between "for" and "only for" in this case,
> because above the section talking about PGTK (and also in the details
> below) is a large amount of commentary discussing the regular X build.

Well, I can only reiterate that on my reading the file does not clearly
express the idea that PGTK should be avoided if you don't absolutely
require it.  And I'm someone relatively familiar with PGTK.  I can
easily imagine us seeing distros replacing the package emacs-gtk with
emacs-pgtk on the assumption that it is a straight upgrade.  It will be
hard to undo that.

You mentioned that various blog posts give people the wrong idea.  We
could decide to make the point extra clearly in INSTALL for the sake of
counteracting a misconception that is continuing to spread, and is
showing no signs of stopping.

-- 
Sean Whitton



^ permalink raw reply	[flat|nested] 48+ messages in thread

* Re: PGTK-related misconceptions
  2022-04-18  5:57         ` Po Lu
  2022-04-18 18:27           ` Sean Whitton
@ 2022-04-18 19:49           ` Jim Porter
  2022-04-19  1:02             ` Po Lu
  2022-04-19  2:18             ` Tim Cross
  1 sibling, 2 replies; 48+ messages in thread
From: Jim Porter @ 2022-04-18 19:49 UTC (permalink / raw)
  To: Po Lu, Sean Whitton; +Cc: emacs-devel

On 4/17/2022 10:57 PM, Po Lu wrote:
> Sean Whitton <spwhitton@spwhitton.name> writes:
> 
>> It recommends it /for/ using alternative window systems, not /only for/
>> using alternative window systems, so far as I can tell.  For example
>>
>>      With the PGTK build, you will be able to switch between running
>>      Emacs on X, Wayland and Broadway using the 'GDK_BACKEND' environment
>>      variable.
>>
>> really makes it sound like it's find to use it if you're using only X.
> 
> I don't see a difference between "for" and "only for" in this case,
> because above the section talking about PGTK (and also in the details
> below) is a large amount of commentary discussing the regular X build.

Reading through these sections of INSTALL, I found it very easy to 
assume that PGTK was a direct upgrade that would just let me "switch 
between running Emacs on X, Wayland and Broadway". An extremely-careful 
reader might then wonder why "--with-pgtk" isn't enabled by default on 
systems with the necessary dependencies, but that only *implies* that 
there are downsides to PGTK rather than stating it.

I think it would be best to state explicitly that there are problems 
with the PGTK build, though INSTALL probably doesn't need to go into any 
more detail than that. In practice, a lot of people will probably just 
skim the documentation, so they might miss some of the more subtle 
points unless they're very clearly called out.



^ permalink raw reply	[flat|nested] 48+ messages in thread

* Re: PGTK-related misconceptions
@ 2022-04-18 21:50 Trey
  2022-04-19  0:59 ` Po Lu
  0 siblings, 1 reply; 48+ messages in thread
From: Trey @ 2022-04-18 21:50 UTC (permalink / raw)
  To: Po Lu; +Cc: Morgan Smith, emacs-devel


[-- Attachment #1.1: Type: text/plain, Size: 925 bytes --]

Po Lu <luangruo@yahoo.com> writes:

> Morgan Smith <morgan.j.smith@outlook.com> writes:
>
>> I'd like to report that my super key stopped registering.  I suspected
>> commit 1404e16975 caused it so I did a quick `git revert 1404e16975`
>> ontop of 807682de1e and that fixed it.
>
> Crystal ball says you are using X Windows, and have to put
>
>   remove mod4 = Hyper_L
>
> in your ~/.Xmodmap file, because GTK doesn't try as hard as regular X11
> Emacs to work around the common kind of virtual modifier
> misconfiguration.
>

I'm experiencing the same issue here. My super key no longer registers,
even using emacs -Q. However, I find it begins from the commit changing
to GDK modifier masks 1c1ae6ba802cc5813fa6f8f90f21050aae6bb459. I've
tested this with the following specs:

WMs: River & Sway
Emacs Version: Emacs 29.0.50 (build 2, x86_64-pc-linux-gnu, GTK+ Version
3.24.33, cairo version 1.17.6) of 2022-04-18


--
Trey

[-- Attachment #1.2: publickey - gpg@treypeacock.com - da008078.asc --]
[-- Type: application/pgp-keys, Size: 1339 bytes --]

[-- Attachment #2: OpenPGP digital signature --]
[-- Type: application/pgp-signature, Size: 249 bytes --]

^ permalink raw reply	[flat|nested] 48+ messages in thread

* Re: PGTK-related misconceptions
  2022-04-18 21:50 PGTK-related misconceptions Trey
@ 2022-04-19  0:59 ` Po Lu
  2022-04-19  3:28   ` Trey Peacock
  0 siblings, 1 reply; 48+ messages in thread
From: Po Lu @ 2022-04-19  0:59 UTC (permalink / raw)
  To: Trey; +Cc: Morgan Smith, emacs-devel

Trey <gpg@treypeacock.com> writes:

> Po Lu <luangruo@yahoo.com> writes:
>
>> Morgan Smith <morgan.j.smith@outlook.com> writes:
>>
>>> I'd like to report that my super key stopped registering.  I suspected
>>> commit 1404e16975 caused it so I did a quick `git revert 1404e16975`
>>> ontop of 807682de1e and that fixed it.
>>
>> Crystal ball says you are using X Windows, and have to put
>>
>>   remove mod4 = Hyper_L
>>
>> in your ~/.Xmodmap file, because GTK doesn't try as hard as regular X11
>> Emacs to work around the common kind of virtual modifier
>> misconfiguration.
>>
>
> I'm experiencing the same issue here. My super key no longer registers,
> even using emacs -Q. However, I find it begins from the commit changing
> to GDK modifier masks 1c1ae6ba802cc5813fa6f8f90f21050aae6bb459. I've
> tested this with the following specs:
>
> WMs: River & Sway
> Emacs Version: Emacs 29.0.50 (build 2, x86_64-pc-linux-gnu, GTK+ Version
> 3.24.33, cairo version 1.17.6) of 2022-04-18

What about GNOME Shell, which this change was tested on?

Anyway, if GTK is not setting the GDK_SUPER_MASK on Wayland, it is a bug
in GDK, and should be reported to its developers.



^ permalink raw reply	[flat|nested] 48+ messages in thread

* Re: PGTK-related misconceptions
  2022-04-18 19:49           ` Jim Porter
@ 2022-04-19  1:02             ` Po Lu
  2022-04-19  2:46               ` Sean Whitton
  2022-04-19  2:18             ` Tim Cross
  1 sibling, 1 reply; 48+ messages in thread
From: Po Lu @ 2022-04-19  1:02 UTC (permalink / raw)
  To: Jim Porter; +Cc: Sean Whitton, emacs-devel

Jim Porter <jporterbugs@gmail.com> writes:

> Reading through these sections of INSTALL, I found it very easy to
> assume that PGTK was a direct upgrade that would just let me "switch
> between running Emacs on X, Wayland and Broadway". An
> extremely-careful reader might then wonder why "--with-pgtk" isn't
> enabled by default on systems with the necessary dependencies, but
> that only *implies* that there are downsides to PGTK rather than
> stating it.
>
> I think it would be best to state explicitly that there are problems
> with the PGTK build, though INSTALL probably doesn't need to go into
> any more detail than that. In practice, a lot of people will probably
> just skim the documentation, so they might miss some of the more
> subtle points unless they're very clearly called out.

Sure, I won't insist if everyone else seems to agree this should be
mentioned (again) in INSTALL.

Feel free to install changes to that effect.




^ permalink raw reply	[flat|nested] 48+ messages in thread

* Re: PGTK-related misconceptions
  2022-04-18 19:49           ` Jim Porter
  2022-04-19  1:02             ` Po Lu
@ 2022-04-19  2:18             ` Tim Cross
  2022-04-19  5:56               ` Eli Zaretskii
  1 sibling, 1 reply; 48+ messages in thread
From: Tim Cross @ 2022-04-19  2:18 UTC (permalink / raw)
  To: Jim Porter; +Cc: Po Lu, emacs-devel, Sean Whitton


Jim Porter <jporterbugs@gmail.com> writes:

>
> I think it would be best to state explicitly that there are problems with the
> PGTK build, though INSTALL probably doesn't need to go into any more detail than
> that. In practice, a lot of people will probably just skim the documentation, so
> they might miss some of the more subtle points unless they're very clearly
> called out.

I agree. I think this is the main point being missed by others who have
argued the existing documentation is clear enough. Like it or not,
people often don't read the documentation or NEWS file carefully. There
is also a tendency for people to believe any new feature is an
improvement and I suspect many people will think a pure GTK build is
going to be better than a hybrid X/GTK one. 

We should just add a very explicit and clear warning not to use
--with-pgtk if your running under X and put this statement right at the
beginning of the section in the NEWS file about this new option. 

It might even be worthwhile adding a warning in configure as well (like
the one we have about pop support). Like others, I expect many
distributions are going to bundle emacs-gtk believing it is an
improvement. I suspect it is going to be a bigger issue given that some
popular distributions, like fedora, will be shipping with wayland as
their default but there will likely be many who will choose to switch
back to X, but then be faced with an Emacs built with pgtk to better
support the default wayland setup. 



^ permalink raw reply	[flat|nested] 48+ messages in thread

* Re: PGTK-related misconceptions
  2022-04-19  1:02             ` Po Lu
@ 2022-04-19  2:46               ` Sean Whitton
  0 siblings, 0 replies; 48+ messages in thread
From: Sean Whitton @ 2022-04-19  2:46 UTC (permalink / raw)
  To: Po Lu, Jim Porter; +Cc: emacs-devel

Hello,

On Tue 19 Apr 2022 at 09:02AM +08, Po Lu wrote:

> Jim Porter <jporterbugs@gmail.com> writes:
>
>> Reading through these sections of INSTALL, I found it very easy to
>> assume that PGTK was a direct upgrade that would just let me "switch
>> between running Emacs on X, Wayland and Broadway". An
>> extremely-careful reader might then wonder why "--with-pgtk" isn't
>> enabled by default on systems with the necessary dependencies, but
>> that only *implies* that there are downsides to PGTK rather than
>> stating it.
>>
>> I think it would be best to state explicitly that there are problems
>> with the PGTK build, though INSTALL probably doesn't need to go into
>> any more detail than that. In practice, a lot of people will probably
>> just skim the documentation, so they might miss some of the more
>> subtle points unless they're very clearly called out.
>
> Sure, I won't insist if everyone else seems to agree this should be
> mentioned (again) in INSTALL.
>
> Feel free to install changes to that effect.

Cool, now done.

-- 
Sean Whitton



^ permalink raw reply	[flat|nested] 48+ messages in thread

* Re: PGTK-related misconceptions
  2022-04-19  0:59 ` Po Lu
@ 2022-04-19  3:28   ` Trey Peacock
  2022-04-19  4:27     ` Po Lu
  2022-07-25 21:18     ` Akira Kyle
  0 siblings, 2 replies; 48+ messages in thread
From: Trey Peacock @ 2022-04-19  3:28 UTC (permalink / raw)
  To: Po Lu; +Cc: Morgan Smith, emacs-devel


[-- Attachment #1.1: Type: text/plain, Size: 2631 bytes --]

"Po Lu" <luangruo@yahoo.com> writes:

> Trey <gpg@treypeacock.com> writes:
>
>> Po Lu <luangruo@yahoo.com> writes:
>>
>>> Morgan Smith <morgan.j.smith@outlook.com> writes:
>>>
>>>> I'd like to report that my super key stopped registering.  I suspected
>>>> commit 1404e16975 caused it so I did a quick `git revert 1404e16975`
>>>> ontop of 807682de1e and that fixed it.
>>>
>>> Crystal ball says you are using X Windows, and have to put
>>>
>>>   remove mod4 = Hyper_L
>>>
>>> in your ~/.Xmodmap file, because GTK doesn't try as hard as regular X11
>>> Emacs to work around the common kind of virtual modifier
>>> misconfiguration.
>>>
>>
>> I'm experiencing the same issue here. My super key no longer registers,
>> even using emacs -Q. However, I find it begins from the commit changing
>> to GDK modifier masks 1c1ae6ba802cc5813fa6f8f90f21050aae6bb459. I've
>> tested this with the following specs:
>>
>> WMs: River & Sway
>> Emacs Version: Emacs 29.0.50 (build 2, x86_64-pc-linux-gnu, GTK+ Version
>> 3.24.33, cairo version 1.17.6) of 2022-04-18
>
> What about GNOME Shell, which this change was tested on?
>
> Anyway, if GTK is not setting the GDK_SUPER_MASK on Wayland, it is a bug
> in GDK, and should be reported to its developers.

Neither of the WMs I mentioned use GNOME Shell, but they do both use
wlroots. Looking into this, it seems that any wlroots based Wayland
compositor will use GDK_MOD4_MASK as Super. However, mutter (GNOME's WM)
uses GDK_SUPER_MASK. Rebuilding emacs with the below patch seems to have
fixed the issue. I'm not sure if there could be further implications for
pgtk_emacs_to_gtk_modifiers.


diff --git a/src/pgtkterm.c b/src/pgtkterm.c
index 2b04699fb3..d8ca89bbc0 100644
--- a/src/pgtkterm.c
+++ b/src/pgtkterm.c
@@ -5152,7 +5152,7 @@ pgtk_gtk_to_emacs_modifiers (struct pgtk_display_info *dpyinfo, int state)
     mod |= mod_ctrl;
   if (state & GDK_META_MASK || state & GDK_MOD1_MASK)
     mod |= mod_meta;
-  if (state & GDK_SUPER_MASK)
+  if (state & GDK_SUPER_MASK || state & GDK_MOD4_MASK)
     mod |= mod_super;
   if (state & GDK_HYPER_MASK)
     mod |= mod_hyper;
@@ -5285,7 +5285,7 @@ key_press_event (GtkWidget *widget, GdkEvent *event, gpointer *user_data)
       /* While super is pressed, the input method will always always
     resend the key events ignoring super.  As a workaround, don't
     filter key events with super or hyper pressed.  */
-      if (!(event->key.state & (GDK_SUPER_MASK | GDK_HYPER_MASK)))
+      if (!(event->key.state & (GDK_SUPER_MASK | GDK_HYPER_MASK | GDK_MOD4_MASK)))
    {
      if (pgtk_im_filter_keypress (f, &event->key))
        return TRUE;

[-- Attachment #1.2: publickey - gpg@treypeacock.com - da008078.asc --]
[-- Type: application/pgp-keys, Size: 1339 bytes --]

[-- Attachment #2: OpenPGP digital signature --]
[-- Type: application/pgp-signature, Size: 249 bytes --]

^ permalink raw reply related	[flat|nested] 48+ messages in thread

* Re: PGTK-related misconceptions
  2022-04-19  3:28   ` Trey Peacock
@ 2022-04-19  4:27     ` Po Lu
  2022-04-19 23:02       ` Trey Peacock
  2022-07-25 21:18     ` Akira Kyle
  1 sibling, 1 reply; 48+ messages in thread
From: Po Lu @ 2022-04-19  4:27 UTC (permalink / raw)
  To: Trey Peacock; +Cc: Morgan Smith, emacs-devel

Trey Peacock <gpg@treypeacock.com> writes:

> Neither of the WMs I mentioned use GNOME Shell, but they do both use
> wlroots. Looking into this, it seems that any wlroots based Wayland
> compositor will use GDK_MOD4_MASK as Super. However, mutter (GNOME's
> WM) uses GDK_SUPER_MASK. Rebuilding emacs with the below patch seems
> to have fixed the issue. I'm not sure if there could be further
> implications for pgtk_emacs_to_gtk_modifiers.

GDK_MOD4_MASK is a real modifier.  GDK_SUPER_MASK is a "virtual
modifier" mask.

The entire point of that change was to rely on GDK to compute the
correspondence between real modifiers and virtual modifiers instead of
doing it ourselves, since a real modifier can mean any number of virtual
modifiers and vice versa.

Hard-coding the meaning of GDK_MOD4_MASK would be a step backwards.

This seems to either be a bug in wlroots or GDK, so I suggest that a bug
be filed with their developers.



^ permalink raw reply	[flat|nested] 48+ messages in thread

* Re: PGTK-related misconceptions
  2022-04-19  2:18             ` Tim Cross
@ 2022-04-19  5:56               ` Eli Zaretskii
  2022-04-19  8:13                 ` Tim Cross
  0 siblings, 1 reply; 48+ messages in thread
From: Eli Zaretskii @ 2022-04-19  5:56 UTC (permalink / raw)
  To: Tim Cross; +Cc: luangruo, jporterbugs, spwhitton, emacs-devel

> From: Tim Cross <theophilusx@gmail.com>
> Date: Tue, 19 Apr 2022 12:18:07 +1000
> Cc: Po Lu <luangruo@yahoo.com>, emacs-devel@gnu.org,
>  Sean Whitton <spwhitton@spwhitton.name>
> 
> I agree. I think this is the main point being missed by others who have
> argued the existing documentation is clear enough. Like it or not,
> people often don't read the documentation or NEWS file carefully. There
> is also a tendency for people to believe any new feature is an
> improvement and I suspect many people will think a pure GTK build is
> going to be better than a hybrid X/GTK one. 
> 
> We should just add a very explicit and clear warning not to use
> --with-pgtk if your running under X and put this statement right at the
> beginning of the section in the NEWS file about this new option. 

Aren't you contradicting yourself here?  If people don't read
documentation, how can any addition to the documentation solve this
issue?  (Of course, I don't object to saying something in INSTALL
about that, just pointing out that it's hard to have it both ways.)

> It might even be worthwhile adding a warning in configure as well (like
> the one we have about pop support).

I object to annoying people who build Emacs with such warnings.
Besides, warnings (as opposed to errors) in the configure script are
easily overlooked, because people tend to leave the build run
unattended, and do other useful things while it runs.

> Like others, I expect many distributions are going to bundle
> emacs-gtk believing it is an improvement. I suspect it is going to
> be a bigger issue given that some popular distributions, like
> fedora, will be shipping with wayland as their default but there
> will likely be many who will choose to switch back to X, but then be
> faced with an Emacs built with pgtk to better support the default
> wayland setup.

IME, there's nothing we can do against such misconceptions.  We will
get bug reports and will respond by pointing people to NEWS and
INSTALL.  Eventually, enough people will bump into this to realize the
truth, and the issue will go away.  No catastrophe that I could spot,
and no need to get too excited.



^ permalink raw reply	[flat|nested] 48+ messages in thread

* Re: PGTK-related misconceptions
  2022-04-19  5:56               ` Eli Zaretskii
@ 2022-04-19  8:13                 ` Tim Cross
  2022-04-19 10:32                   ` Eli Zaretskii
  0 siblings, 1 reply; 48+ messages in thread
From: Tim Cross @ 2022-04-19  8:13 UTC (permalink / raw)
  To: Eli Zaretskii; +Cc: luangruo, jporterbugs, spwhitton, emacs-devel


Eli Zaretskii <eliz@gnu.org> writes:

>> From: Tim Cross <theophilusx@gmail.com>
>> Date: Tue, 19 Apr 2022 12:18:07 +1000
>> Cc: Po Lu <luangruo@yahoo.com>, emacs-devel@gnu.org,
>>  Sean Whitton <spwhitton@spwhitton.name>
>> 
>> I agree. I think this is the main point being missed by others who have
>> argued the existing documentation is clear enough. Like it or not,
>> people often don't read the documentation or NEWS file carefully. There
>> is also a tendency for people to believe any new feature is an
>> improvement and I suspect many people will think a pure GTK build is
>> going to be better than a hybrid X/GTK one. 
>> 
>> We should just add a very explicit and clear warning not to use
>> --with-pgtk if your running under X and put this statement right at the
>> beginning of the section in the NEWS file about this new option. 
>
> Aren't you contradicting yourself here?  If people don't read
> documentation, how can any addition to the documentation solve this
> issue?  (Of course, I don't object to saying something in INSTALL
> about that, just pointing out that it's hard to have it both ways.)
>

Eli, rather ironically you just proved my point. I didn't say they
didn't read the documentation, I said they didn't read it carefully.
Just like you did with my post, they skim read it and can easily miss
crucial points. The fact people are building with pgtk when only running
under X would tend to indicate the messaging is not adequate. Making a
clear concise statement not to use pgtk when using X early, even at the
start, would increase the likelihood skim readers see it.

>> It might even be worthwhile adding a warning in configure as well (like
>> the one we have about pop support).
>
> I object to annoying people who build Emacs with such warnings.
> Besides, warnings (as opposed to errors) in the configure script are
> easily overlooked, because people tend to leave the build run
> unattended, and do other useful things while it runs.
>

I guess there not terribly annoying if they are easily overlooked!

Just like the warning about removal of pop support and pointer
to mail utils, this warning could be at the end of the build. At any
rate, seems like a more important warning than one about no longer
supporting pop3, which few mail providers support anymore anyway. 

>> Like others, I expect many distributions are going to bundle
>> emacs-gtk believing it is an improvement. I suspect it is going to
>> be a bigger issue given that some popular distributions, like
>> fedora, will be shipping with wayland as their default but there
>> will likely be many who will choose to switch back to X, but then be
>> faced with an Emacs built with pgtk to better support the default
>> wayland setup.
>
> IME, there's nothing we can do against such misconceptions.  We will
> get bug reports and will respond by pointing people to NEWS and
> INSTALL.  Eventually, enough people will bump into this to realize the
> truth, and the issue will go away.  No catastrophe that I could spot,
> and no need to get too excited.

You do seem to like jumping to extremes. I don't think anyone has been
screaming catastrophe. All I've seen is people asking to make this more
obvious and explicit. Maybe it won't make a big difference, but then
again, maybe it will. The cost of making the limitations of pgtk more
explicit in NEWS and INSTALL is very low and even if it only stops a few
people from doing the wrorng build, reporting a 'non-bug' and getting
directed back to NEW/INSTALL and having to rebuild, I think the cost has
been justified.



^ permalink raw reply	[flat|nested] 48+ messages in thread

* Re: PGTK-related misconceptions
  2022-04-15  2:29 ` Po Lu
                     ` (2 preceding siblings ...)
  2022-04-18  5:18   ` Sean Whitton
@ 2022-04-19  9:10   ` Dirk-Jan C. Binnema
  2022-04-19 10:42     ` Po Lu
  2022-04-19 11:53     ` Phil Sainty
  3 siblings, 2 replies; 48+ messages in thread
From: Dirk-Jan C. Binnema @ 2022-04-19  9:10 UTC (permalink / raw)
  To: emacs-devel


On Friday Apr 15 2022, Po Lu wrote:

> Morgan Smith <morgan.j.smith@outlook.com> writes:
>
>> I'd like to report that my super key stopped registering.  I suspected
>> commit 1404e16975 caused it so I did a quick `git revert 1404e16975`
>> ontop of 807682de1e and that fixed it.
>
> Crystal ball says you are using X Windows, and have to put
>
>   remove mod4 = Hyper_L
>
> in your ~/.Xmodmap file, because GTK doesn't try as hard as regular X11
> Emacs to work around the common kind of virtual modifier
> misconfiguration.
>
> People using X should _never_ use PGTK.  The regular X build does a much
> better job at supporting that than PGTK ever will.
>
> It is completely pointless to put up with half-working child frames,
> random keyboard-related lossage, random frame placement/resizing
> failures, so the actual fix is to delete `--with-pgtk' from your calls
> to configure.
>
> Similarly, people building packages with PGTK enabled that are labeled
> "enhanced" are doing their users a disservice.  No packager should
> enable PGTK by default, and every package should ideally come with a big
> disclaimer warning against using PGTK on window systems otherwise
> supported by Emacs, since time and experience shows that Emacs generally
> does a much better job at their support than GTK.
>
> Many people are also being mislead by articles on the internet claiming
> that PGTK leads to faster redisplay, such as this one:
> http://www.cesarolea.com/posts/emacs-native-compile
>
> That is not true, since regular Emacs with cairo uses more-or-less the
> same rendering path as PGTK, except when PGTK runs on Wayland, where it
> uses software rendering and does image compositing in software, and is
> thus slower than everything else.  Scrolling on PGTK is also not as
> efficient as XCopyArea requests.
>
> But the difference in speed even on Wayland is negligible, not easy to
> benchmark, and not at all visible to the human eye.

Appreciate the efforts on this, but the outcome seems somewhat
unsatisfactory, if I understand correctly:

- we have the "non-pure" gtk build which supports X (although gtk has a
  wayland backend, non-pure gtk assumes X)
- we have "pure" gtk, which supports X and Wayland, but now it turns
  out there's a bunch of limitations on X.

From the the time before pgtk got merged, I can't remember any wide
discussion of it being wayland-only. Perhaps I misremember.

I regularly use both X and Wayland, and having to have two emacsen (and
remember to use the right one) just for that seems sub-optimal. Wouldn't
it be better to have a single gtk3 backend? For users and developers and
distributors?

But maybe the problems is small, i.e. perhaps pgtk works fine on X, but
doesn't currently implement a handful of things, which we can document?
Then users can decide if they can live with that.

Kind regards,
Dirk.

-- 
Dirk-Jan C. Binnema                  Helsinki, Finland
e:djcb@djcbsoftware.nl                                
gpg: 6987 9CED 1745 9375 0F14 DA98 11DD FEA9 DCC4 A036



^ permalink raw reply	[flat|nested] 48+ messages in thread

* Re: PGTK-related misconceptions
  2022-04-19  8:13                 ` Tim Cross
@ 2022-04-19 10:32                   ` Eli Zaretskii
  0 siblings, 0 replies; 48+ messages in thread
From: Eli Zaretskii @ 2022-04-19 10:32 UTC (permalink / raw)
  To: Tim Cross; +Cc: luangruo, jporterbugs, spwhitton, emacs-devel

> From: Tim Cross <theophilusx@gmail.com>
> Cc: jporterbugs@gmail.com, luangruo@yahoo.com, emacs-devel@gnu.org,
>  spwhitton@spwhitton.name
> Date: Tue, 19 Apr 2022 18:13:03 +1000
> 
> Eli Zaretskii <eliz@gnu.org> writes:
> 
> >> I agree. I think this is the main point being missed by others who have
> >> argued the existing documentation is clear enough. Like it or not,
> >> people often don't read the documentation or NEWS file carefully. There
> >> is also a tendency for people to believe any new feature is an
> >> improvement and I suspect many people will think a pure GTK build is
> >> going to be better than a hybrid X/GTK one. 
> >> 
> >> We should just add a very explicit and clear warning not to use
> >> --with-pgtk if your running under X and put this statement right at the
> >> beginning of the section in the NEWS file about this new option. 
> >
> > Aren't you contradicting yourself here?  If people don't read
> > documentation, how can any addition to the documentation solve this
> > issue?  (Of course, I don't object to saying something in INSTALL
> > about that, just pointing out that it's hard to have it both ways.)
> >
> 
> Eli, rather ironically you just proved my point. I didn't say they
> didn't read the documentation, I said they didn't read it carefully.

If there's a significant difference, for the purposes of this
discussion, between "don't read" and "don't read carefully", then I'm
afraid I don't understand what you wanted to say.  Either people will
miss what we say or they won't.  In the latter case, what we already
say is enough; in the former case it doesn't matter what we will say
or add to what we did already, because both INSTALL and NEWS are large
files and contain a lot of stuff.  So I fail to see how the fine point
of "carefully" is relevant here.

> > I object to annoying people who build Emacs with such warnings.
> > Besides, warnings (as opposed to errors) in the configure script are
> > easily overlooked, because people tend to leave the build run
> > unattended, and do other useful things while it runs.
> >
> 
> I guess there not terribly annoying if they are easily overlooked!

They are easily overlooked by one part of the people (usually, those
who don't read the documentation "carefully" enough), and are annoying
to the other part, those who don't overlook the warnings (because they
usually already read the documentation and did TRT).

> Just like the warning about removal of pop support and pointer
> to mail utils, this warning could be at the end of the build.

The warning about pop support and Mailutils is at the end of the
configure script, not the end of the build.  If you build by saying
just "make" (which is the normal way of building Emacs these days),
then you won't see the warning "at the end" because Make runs the
Makefiles immediately after the configure script finishes.

> At any
> rate, seems like a more important warning than one about no longer
> supporting pop3, which few mail providers support anymore anyway. 

That's not what that warning is about, not at all.  I guess you didn't
read it "carefully" enough.

> > IME, there's nothing we can do against such misconceptions.  We will
> > get bug reports and will respond by pointing people to NEWS and
> > INSTALL.  Eventually, enough people will bump into this to realize the
> > truth, and the issue will go away.  No catastrophe that I could spot,
> > and no need to get too excited.
> 
> You do seem to like jumping to extremes. I don't think anyone has been
> screaming catastrophe.

This thread amassed 2 dozen messages already, so I think there are
some who do think it's a big deal.

> All I've seen is people asking to make this more obvious and
> explicit. Maybe it won't make a big difference, but then again,
> maybe it will. The cost of making the limitations of pgtk more
> explicit in NEWS and INSTALL is very low and even if it only stops a
> few people from doing the wrorng build, reporting a 'non-bug' and
> getting directed back to NEW/INSTALL and having to rebuild, I think
> the cost has been justified.

If you read what I wrote, I explicitly said I didn't object to adding
this stuff to INSTALL.  But I don't think it will solve the problem of
people who don't read the documentation "carefully" enough to pay
attention.



^ permalink raw reply	[flat|nested] 48+ messages in thread

* Re: PGTK-related misconceptions
  2022-04-19  9:10   ` Dirk-Jan C. Binnema
@ 2022-04-19 10:42     ` Po Lu
  2022-04-19 11:53     ` Phil Sainty
  1 sibling, 0 replies; 48+ messages in thread
From: Po Lu @ 2022-04-19 10:42 UTC (permalink / raw)
  To: Dirk-Jan C. Binnema; +Cc: emacs-devel

"Dirk-Jan C. Binnema" <djcb.bulk@gmail.com> writes:

> Appreciate the efforts on this, but the outcome seems somewhat
> unsatisfactory, if I understand correctly:
>
> - we have the "non-pure" gtk build which supports X (although gtk has a
>   wayland backend, non-pure gtk assumes X)

"Non-pure GTK" uses GTK for widgets, but directly uses X Windows APIs
for input and display, and some other features too.

> - we have "pure" gtk, which supports X and Wayland, but now it turns
>   out there's a bunch of limitations on X.

Yes.

> From the the time before pgtk got merged, I can't remember any wide
> discussion of it being wayland-only. Perhaps I misremember.

I looked over those discussions not too long ago, and it seems that
nobody really used the PGTK build on X Windows.  Those who did
immediately ran into resizing glitches, keyboard input issues, and some
features just not being implemented, such as responding to configure
events.

> I regularly use both X and Wayland, and having to have two emacsen (and
> remember to use the right one) just for that seems sub-optimal. Wouldn't
> it be better to have a single gtk3 backend? For users and developers and
> distributors?

That isn't possible, at least not without a lot of work.

> But maybe the problems is small, i.e. perhaps pgtk works fine on X, but
> doesn't currently implement a handful of things, which we can document?
> Then users can decide if they can live with that.

That list would be very long, would include serious types of
misbehavior, be liable to change at the whim of the GTK developers, so
the truth is that users should simply stay away from PGTK on X.



^ permalink raw reply	[flat|nested] 48+ messages in thread

* Re: PGTK-related misconceptions
  2022-04-19  9:10   ` Dirk-Jan C. Binnema
  2022-04-19 10:42     ` Po Lu
@ 2022-04-19 11:53     ` Phil Sainty
  2022-04-19 13:58       ` Sean Whitton
  2022-04-19 16:51       ` Yuri Khan
  1 sibling, 2 replies; 48+ messages in thread
From: Phil Sainty @ 2022-04-19 11:53 UTC (permalink / raw)
  To: Dirk-Jan C. Binnema; +Cc: emacs-devel

On 2022-04-19 21:10, Dirk-Jan C. Binnema wrote:
> I regularly use both X and Wayland, and having to have two emacsen
> (and remember to use the right one) just for that seems sub-optimal.

I believe there's something called "X-Wayland" for running X programs
under Wayland, in case that's the missing piece of the puzzle?

IIUC you can use that to run the same (single) X build of emacs when
you're using Wayland that you use when you're not, which avoids the
problem you've described.


-Phil




^ permalink raw reply	[flat|nested] 48+ messages in thread

* Re: PGTK-related misconceptions
  2022-04-19 11:53     ` Phil Sainty
@ 2022-04-19 13:58       ` Sean Whitton
  2022-04-20  3:29         ` Phil Sainty
  2022-04-19 16:51       ` Yuri Khan
  1 sibling, 1 reply; 48+ messages in thread
From: Sean Whitton @ 2022-04-19 13:58 UTC (permalink / raw)
  To: Phil Sainty, Dirk-Jan C. Binnema; +Cc: emacs-devel

Hello,

On Tue 19 Apr 2022 at 11:53pm +12, Phil Sainty wrote:

> On 2022-04-19 21:10, Dirk-Jan C. Binnema wrote:
>> I regularly use both X and Wayland, and having to have two emacsen
>> (and remember to use the right one) just for that seems sub-optimal.
>
> I believe there's something called "X-Wayland" for running X programs
> under Wayland, in case that's the missing piece of the puzzle?
>
> IIUC you can use that to run the same (single) X build of emacs when
> you're using Wayland that you use when you're not, which avoids the
> problem you've described.

It's a compatibility layer, basically, and not a great one.  I was
having various basic focus and clipboard problems when running Lucid
Emacs under Xwayland.

-- 
Sean Whitton



^ permalink raw reply	[flat|nested] 48+ messages in thread

* Re: PGTK-related misconceptions
  2022-04-19 11:53     ` Phil Sainty
  2022-04-19 13:58       ` Sean Whitton
@ 2022-04-19 16:51       ` Yuri Khan
  2022-04-22  5:44         ` Pankaj Jangid
  1 sibling, 1 reply; 48+ messages in thread
From: Yuri Khan @ 2022-04-19 16:51 UTC (permalink / raw)
  To: Phil Sainty; +Cc: Dirk-Jan C. Binnema, Emacs developers

On Tue, 19 Apr 2022 at 18:54, Phil Sainty <psainty@orcon.net.nz> wrote:

> I believe there's something called "X-Wayland" for running X programs
> under Wayland, in case that's the missing piece of the puzzle?
>
> IIUC you can use that to run the same (single) X build of emacs when
> you're using Wayland that you use when you're not, which avoids the
> problem you've described.

If you have a HiDPI monitor, an X application on an X server gets full
resolution, a Wayland application on a Wayland compositor gets full
resolution, but an X application via Xwayland on a Wayland compositor
gets rendered at low resolution and then upscaled. It’s a non-starter.



^ permalink raw reply	[flat|nested] 48+ messages in thread

* Re: PGTK-related misconceptions
  2022-04-19  4:27     ` Po Lu
@ 2022-04-19 23:02       ` Trey Peacock
  2022-04-20  0:48         ` Po Lu
  0 siblings, 1 reply; 48+ messages in thread
From: Trey Peacock @ 2022-04-19 23:02 UTC (permalink / raw)
  To: Po Lu; +Cc: Morgan Smith, emacs-devel


[-- Attachment #1.1: Type: text/plain, Size: 1854 bytes --]

"Po Lu" <luangruo@yahoo.com> writes:

> Trey Peacock <gpg@treypeacock.com> writes:
>
>> Neither of the WMs I mentioned use GNOME Shell, but they do both use
>> wlroots. Looking into this, it seems that any wlroots based Wayland
>> compositor will use GDK_MOD4_MASK as Super. However, mutter (GNOME's
>> WM) uses GDK_SUPER_MASK. Rebuilding emacs with the below patch seems
>> to have fixed the issue. I'm not sure if there could be further
>> implications for pgtk_emacs_to_gtk_modifiers.
>
> GDK_MOD4_MASK is a real modifier.  GDK_SUPER_MASK is a "virtual
> modifier" mask.
>
> The entire point of that change was to rely on GDK to compute the
> correspondence between real modifiers and virtual modifiers instead of
> doing it ourselves, since a real modifier can mean any number of virtual
> modifiers and vice versa.

It does not seem to be a requirement of GTK 3.2 or XKB to send virtual
modifiers. The only compositor I have come across that actually sends a
virtual modifier is mutter/GNOME. Neither wlroots nor Weston, the
Wayland reference implementation, send them. I'm unsure about Plasma,
but I believe this highlights an issue with the development of pgtk, if
it is meant to be targeted towards wayland users it should be tested
against more than just one compositor.

> Hard-coding the meaning of GDK_MOD4_MASK would be a step backwards.

The experience of a user updating Emacs and realizing a key is no longer
recognized, without any notification or justification would also be a
step backwards.

> This seems to either be a bug in wlroots or GDK, so I suggest that a bug
> be filed with their developers.

I have spoken with devs of wlroots & wayland over IRC and they seem to
agree that it is not necessary. I don't mean to be adversarial but would
be happy to see this change amended to incorporate the entirety of
wayland compositors.

[-- Attachment #1.2: publickey - gpg@treypeacock.com - da008078.asc --]
[-- Type: application/pgp-keys, Size: 1339 bytes --]

[-- Attachment #2: OpenPGP digital signature --]
[-- Type: application/pgp-signature, Size: 249 bytes --]

^ permalink raw reply	[flat|nested] 48+ messages in thread

* Re: PGTK-related misconceptions
  2022-04-19 23:02       ` Trey Peacock
@ 2022-04-20  0:48         ` Po Lu
  2022-04-20  2:33           ` Trey Peacock
  0 siblings, 1 reply; 48+ messages in thread
From: Po Lu @ 2022-04-20  0:48 UTC (permalink / raw)
  To: Trey Peacock; +Cc: Morgan Smith, emacs-devel

Trey Peacock <gpg@treypeacock.com> writes:

> It does not seem to be a requirement of GTK 3.2 or XKB to send virtual
> modifiers.

See https://docs.gtk.org/gdk3/flags.ModifierType.html, which says:

  Since 2.10, GDK recognizes which of the Meta, Super or Hyper keys are
  mapped to Mod2 - Mod5, and indicates this by setting GDK_SUPER_MASK,
  GDK_HYPER_MASK or GDK_META_MASK in the state field of key events.

> The only compositor I have come across that actually sends a virtual
> modifier is mutter/GNOME. Neither wlroots nor Weston, the Wayland
> reference implementation, send them. I'm unsure about Plasma, but I
> believe this highlights an issue with the development of pgtk, if it
> is meant to be targeted towards wayland users it should be tested
> against more than just one compositor.

I don't have any other compositor installed that I can actually start.
Users, such as you, are supposed to do that part of the job.

> The experience of a user updating Emacs and realizing a key is no longer
> recognized, without any notification or justification would also be a
> step backwards.

That is the price you pay when using the development version of Emacs.
The key wasn't intentionally disabled, so I cannot know those problems
exist until users like you report them.

Hopefully, those problems will no longer exist when Emacs 29.1 is
released.

> I have spoken with devs of wlroots & wayland over IRC and they seem to
> agree that it is not necessary. I don't mean to be adversarial but would
> be happy to see this change amended to incorporate the entirety of
> wayland compositors.

Wayland compositors do not send those virtual modifier masks.  GDK is
supposed to, and does it correctly when running on GNOME Shell, so the
bug either lies in GTK or the other Wayland compositors.



^ permalink raw reply	[flat|nested] 48+ messages in thread

* Re: PGTK-related misconceptions
  2022-04-20  0:48         ` Po Lu
@ 2022-04-20  2:33           ` Trey Peacock
  2022-04-20  4:05             ` Po Lu
  0 siblings, 1 reply; 48+ messages in thread
From: Trey Peacock @ 2022-04-20  2:33 UTC (permalink / raw)
  To: Po Lu; +Cc: Morgan Smith, emacs-devel


[-- Attachment #1.1: Type: text/plain, Size: 3921 bytes --]

"Po Lu" <luangruo@yahoo.com> writes:

> Trey Peacock <gpg@treypeacock.com> writes:
>
>> It does not seem to be a requirement of GTK 3.2 or XKB to send virtual
>> modifiers.
>
> See https://docs.gtk.org/gdk3/flags.ModifierType.html, which says:
>
>   Since 2.10, GDK recognizes which of the Meta, Super or Hyper keys are
>   mapped to Mod2 - Mod5, and indicates this by setting GDK_SUPER_MASK,
>   GDK_HYPER_MASK or GDK_META_MASK in the state field of key events.

The capability to do something is not the same as a requirement.

>> The only compositor I have come across that actually sends a virtual
>> modifier is mutter/GNOME. Neither wlroots nor Weston, the Wayland
>> reference implementation, send them. I'm unsure about Plasma, but I
>> believe this highlights an issue with the development of pgtk, if it
>> is meant to be targeted towards wayland users it should be tested
>> against more than just one compositor.
>
> I don't have any other compositor installed that I can actually start.
> Users, such as you, are supposed to do that part of the job.

I would be happy to help. Granted, this is only my second interaction on
the mailing list, but I do want to contribute how I can.

>> The experience of a user updating Emacs and realizing a key is no longer
>> recognized, without any notification or justification would also be a
>> step backwards.
>
> That is the price you pay when using the development version of Emacs.
> The key wasn't intentionally disabled, so I cannot know those problems
> exist until users like you report them.
>
> Hopefully, those problems will no longer exist when Emacs 29.1 is
> released.

100% agree about the risks and responsibilities of users of dev
versions. That's why I wanted to bring this to attention.

>> I have spoken with devs of wlroots & wayland over IRC and they seem to
>> agree that it is not necessary. I don't mean to be adversarial but would
>> be happy to see this change amended to incorporate the entirety of
>> wayland compositors.
>
> Wayland compositors do not send those virtual modifier masks.  GDK is
> supposed to, and does it correctly when running on GNOME Shell, so the
> bug either lies in GTK or the other Wayland compositors.

The reason this works is because mutter sends additional virtual
modifiers. You can see more here:
https://gitlab.gnome.org/GNOME/mutter/-/commit/0fa9751b3144aef5faaca1ad381b6f86b5f30994.
It is not GDK that is responsible for this. Further, since this is not
required, I don't think its proper to deem it a bug.

Now, if we were building this against Gtk 4 then I would agree with you
it seems to be the direction it's going. Though still not fully
explicit.
https://gitlab.gnome.org/GNOME/gtk/-/blob/main/docs/reference/gtk/migrating-3to4.md#adapt-to-changes-in-keyboard-modifier-handling.

Your change seems to have removed a fallback in case there were no
virtual modifiers and reverses the previous logic:

previously: if a virtual modifier exists equal to GDK_SUPER_MASK then
super_mod_mask = GDK_MOD4_MASK, if it does not equal GDK_SUPER_MASK then
it just passes the state & current value. Lastly, if a virtual modifier
does not exist super_mod_mask=GDK_MOD4_MASK.

current: only if a virtual modifier exists does super_mod_mask =
GDK_SUPER_MASK.

x_find_modifier_meanings (struct pgtk_display_info *dpyinfo)
{...
-  state = GDK_SUPER_MASK;
-  r = gdk_keymap_map_virtual_modifiers (keymap, &state);
-  if (r)
-    {
-      /* Super key exists. */
-      if (state == GDK_SUPER_MASK)
-	{
-	  dpyinfo->super_mod_mask = GDK_MOD4_MASK;	/* maybe this is super. */
-	}
-      else
-	{
-	  dpyinfo->super_mod_mask = state & ~GDK_SUPER_MASK;
-	}
-    }
-  else
-    {
-      dpyinfo->super_mod_mask = GDK_MOD4_MASK;
-    }
...
}
...
pgtk_gtk_to_emacs_modifiers (struct pgtk_display_info *dpyinfo, int state)
{...
-  if (state & dpyinfo->super_mod_mask)
+  if (state & GDK_SUPER_MASK)
     mod |= mod_super;
...
}

[-- Attachment #1.2: publickey - gpg@treypeacock.com - da008078.asc --]
[-- Type: application/pgp-keys, Size: 1339 bytes --]

[-- Attachment #2: OpenPGP digital signature --]
[-- Type: application/pgp-signature, Size: 249 bytes --]

^ permalink raw reply	[flat|nested] 48+ messages in thread

* Re: PGTK-related misconceptions
  2022-04-19 13:58       ` Sean Whitton
@ 2022-04-20  3:29         ` Phil Sainty
  2022-04-20  4:48           ` Stefan Monnier
  0 siblings, 1 reply; 48+ messages in thread
From: Phil Sainty @ 2022-04-20  3:29 UTC (permalink / raw)
  To: Sean Whitton; +Cc: Dirk-Jan C. Binnema, emacs-devel

On 2022-04-20 01:58, Sean Whitton wrote:
>> On 2022-04-19 21:10, Dirk-Jan C. Binnema wrote:
>>> I regularly use both X and Wayland, and having to have two emacsen
>>> (and remember to use the right one) just for that seems sub-optimal.
>> 
>> I believe there's something called "X-Wayland" for running X programs
>> under Wayland
> 
> It's a compatibility layer, basically, and not a great one.  I was
> having various basic focus and clipboard problems when running Lucid
> Emacs under Xwayland.

Ah, ok.  In that case I guess one really would prefer to install both
builds, if using both Wayland and X at different times.

I imagine one could mostly circumvent the "remember to use the right 
one"
issue by automatically setting PATH based on which system you were using
at that time, so that "emacs" was always going to be the correct emacs.


-Phil




^ permalink raw reply	[flat|nested] 48+ messages in thread

* Re: PGTK-related misconceptions
  2022-04-20  2:33           ` Trey Peacock
@ 2022-04-20  4:05             ` Po Lu
  0 siblings, 0 replies; 48+ messages in thread
From: Po Lu @ 2022-04-20  4:05 UTC (permalink / raw)
  To: Trey Peacock; +Cc: Morgan Smith, emacs-devel

Trey Peacock <gpg@treypeacock.com> writes:

>> See https://docs.gtk.org/gdk3/flags.ModifierType.html, which says:
>>
>>   Since 2.10, GDK recognizes which of the Meta, Super or Hyper keys are
>>   mapped to Mod2 - Mod5, and indicates this by setting GDK_SUPER_MASK,
>>   GDK_HYPER_MASK or GDK_META_MASK in the state field of key events.
>
> The capability to do something is not the same as a requirement.

It's the documented behavior of GDK, and Emacs holds GDK to its
documentation.  Nowhere does the documentation say this is a
"capability", "recognizes" is in the third-person present tense, which
makes it a requirement.

> I would be happy to help. Granted, this is only my second interaction on
> the mailing list, but I do want to contribute how I can.

Great, one step forward would be to bring up the issue with either the
GTK or Wayland compositor developers.  Since you've already talked with
the latter, and they say it's not their problem, please contact the
former.

> It is not GDK that is responsible for this. Further, since this is not
> required, I don't think its proper to deem it a bug.

It is, as specified in its documentation.

> Your change seems to have removed a fallback in case there were no
> virtual modifiers and reverses the previous logic:

As you can see by the name of the function, it was directly ported over
from X (the current version is in xterm.c), and is yet another example
of the PGTK port translating X Windows code to GDK verbatim, duplicating
what GDK is supposed to do itself.

I will not change Emacs because the GTK developers, yet again, forgot to
follow their own documentation when implementing some feature.  It just
makes Emacs code bloated, hard-to-follow and liable to break at the
slightest whim of the GTK developers, who then respond that we're not
using GTK "properly", because we try to work around their problems.



^ permalink raw reply	[flat|nested] 48+ messages in thread

* Re: PGTK-related misconceptions
  2022-04-20  3:29         ` Phil Sainty
@ 2022-04-20  4:48           ` Stefan Monnier
  0 siblings, 0 replies; 48+ messages in thread
From: Stefan Monnier @ 2022-04-20  4:48 UTC (permalink / raw)
  To: Phil Sainty; +Cc: Sean Whitton, Dirk-Jan C. Binnema, emacs-devel

> I imagine one could mostly circumvent the "remember to use the right one"
> issue by automatically setting PATH based on which system you were using
> at that time, so that "emacs" was always going to be the correct emacs.

Ideally, it should be possible to build a single Emacs executable that
can simultaneously open frames on a tty, on an X server (some using
GNUstep and others using Lucid), and on a Wayland server.

It would/will require a fair bit of code changes, but AFAIK almost all
of it should be "simple/repetitive": it shouldn't require any
fundamental change.


        Stefan




^ permalink raw reply	[flat|nested] 48+ messages in thread

* Re: PGTK-related misconceptions
@ 2022-04-20  7:52 Trey Peacock
  2022-04-20  8:25 ` Po Lu
  0 siblings, 1 reply; 48+ messages in thread
From: Trey Peacock @ 2022-04-20  7:52 UTC (permalink / raw)
  To: Po Lu; +Cc: Morgan Smith, emacs-devel


[-- Attachment #1.1: Type: text/plain, Size: 3202 bytes --]

"Po Lu" <luangruo@yahoo.com> writes:

> Trey Peacock <gpg@treypeacock.com> writes:
>
>>> See https://docs.gtk.org/gdk3/flags.ModifierType.html, which says:
>>>
>>>   Since 2.10, GDK recognizes which of the Meta, Super or Hyper keys are
>>>   mapped to Mod2 - Mod5, and indicates this by setting GDK_SUPER_MASK,
>>>   GDK_HYPER_MASK or GDK_META_MASK in the state field of key events.
>>
>> The capability to do something is not the same as a requirement.
>
> It's the documented behavior of GDK, and Emacs holds GDK to its
> documentation.  Nowhere does the documentation say this is a
> "capability", "recognizes" is in the third-person present tense, which
> makes it a requirement.
>
>> I would be happy to help. Granted, this is only my second interaction on
>> the mailing list, but I do want to contribute how I can.
>
> Great, one step forward would be to bring up the issue with either the
> GTK or Wayland compositor developers.  Since you've already talked with
> the latter, and they say it's not their problem, please contact the
> former.
>
>> It is not GDK that is responsible for this. Further, since this is not
>> required, I don't think its proper to deem it a bug.
>
> It is, as specified in its documentation.
>
>> Your change seems to have removed a fallback in case there were no
>> virtual modifiers and reverses the previous logic:
>
> As you can see by the name of the function, it was directly ported over
> from X (the current version is in xterm.c), and is yet another example
> of the PGTK port translating X Windows code to GDK verbatim, duplicating
> what GDK is supposed to do itself.
>
> I will not change Emacs because the GTK developers, yet again, forgot to
> follow their own documentation when implementing some feature.  It just
> makes Emacs code bloated, hard-to-follow and liable to break at the
> slightest whim of the GTK developers, who then respond that we're not
> using GTK "properly", because we try to work around their problems.

You have already changed Emacs from accepting both MOD4 and SUPER_MASK
as its Super key modifiers to only accepting SUPER_MASK. I imagine this
response is born of more than just this issue but I would not let it
cloud an easy solution.

GTK 3.24.33 still accepts Mod2-5 masks, recognizes them separately from
the virtual modifier masks, and unlike the x11 implementation does not
contain the logic to set convert Super_L or Super_R to GDK_SUPER_MASK.
So what you have done is actually held Emacs to GDK's x11
implementation and documentation rather than looking at the code itself.

https://gitlab.gnome.org/GNOME/gtk/-/blob/3.24.33/gdk/wayland/gdkkeys-wayland.c#L249-316
https://gitlab.gnome.org/GNOME/gtk/-/blob/3.24.33/gdk/x11/gdkkeys-x11.c#L396-398

If the PGTK branch is meant for "alternative window systems available on
GNU/Linux and some Unix systems, such as Wayland" then I do think there
should be more consideration taken compositors that do not share
Mutter's workaround. Had you been using any other compositor, surely you
would not have made this change. Perhaps even filing a bug yourself.

This will be my last comment on the matter as I don't think its
productive for either of us to belabor our points.

[-- Attachment #1.2: publickey - gpg@treypeacock.com - da008078.asc --]
[-- Type: application/pgp-keys, Size: 1339 bytes --]

[-- Attachment #2: OpenPGP digital signature --]
[-- Type: application/pgp-signature, Size: 249 bytes --]

^ permalink raw reply	[flat|nested] 48+ messages in thread

* Re: PGTK-related misconceptions
  2022-04-20  7:52 Trey Peacock
@ 2022-04-20  8:25 ` Po Lu
  2022-04-20 13:13   ` Brian Cully
  0 siblings, 1 reply; 48+ messages in thread
From: Po Lu @ 2022-04-20  8:25 UTC (permalink / raw)
  To: Trey Peacock; +Cc: Morgan Smith, emacs-devel

Trey Peacock <gpg@treypeacock.com> writes:

> You have already changed Emacs from accepting both MOD4 and SUPER_MASK
> as its Super key modifiers to only accepting SUPER_MASK. I imagine
> this response is born of more than just this issue but I would not let
> it cloud an easy solution.

First of all, the GDK_MODN_MASKs (aside from GDK_MOD1_MASK) are simply
not set on Broadway, the other GDK backend that we try to support.

Secondly, nothing is guaranteed about the behavior of the real modifier
masks after GDK_MOD1_MASK.  We cannot assume it means Super at all,
since it is not documented to mean that.  What if GDK changes its
meaning in the future?  Or the Wayland compositor developers?

I am not going to settle for non-solutions (or half-solutions) like what
you proposed, at least unless the GTK developers still haven't fixed
this by the time Emacs 29.1 is released.

> GTK 3.24.33 still accepts Mod2-5 masks, recognizes them separately
> from the virtual modifier masks, and unlike the x11 implementation
> does not contain the logic to set convert Super_L or Super_R to
> GDK_SUPER_MASK.  So what you have done is actually held Emacs to GDK's
> x11 implementation and documentation rather than looking at the code
> itself.

Nowhere in the documentation for GdkModifierType does it say that the
automatic mapping from real modifiers to virtual modifiers is
X11-specific, so this is clearly a GTK bug.  I'm pretty sure GTK
accelerators that specify <Super> as a modifier will not work on those
other Wayland compositors either, if what you say is true.

> If the PGTK branch is meant for "alternative window systems available
> on GNU/Linux and some Unix systems, such as Wayland" then I do think
> there should be more consideration taken compositors that do not share
> Mutter's workaround. Had you been using any other compositor, surely
> you would not have made this change. Perhaps even filing a bug
> yourself.

I would still have made this change and then proceeded to ask someone
else to report a GTK bug.  I can't do that myself, since GNOME has been
persistently been making it more and more difficult to report bugs
without registering an account on whatever platform they currently use
for bug reports, and putting up with the associated e-mail spam.

But I don't use any other Wayland compositors, so that point is moot.



^ permalink raw reply	[flat|nested] 48+ messages in thread

* Re: PGTK-related misconceptions
  2022-04-20  8:25 ` Po Lu
@ 2022-04-20 13:13   ` Brian Cully
  0 siblings, 0 replies; 48+ messages in thread
From: Brian Cully @ 2022-04-20 13:13 UTC (permalink / raw)
  To: Po Lu; +Cc: Morgan Smith, Trey Peacock, emacs-devel


Po Lu <luangruo@yahoo.com> writes:
> Nowhere in the documentation for GdkModifierType does it say that the
> automatic mapping from real modifiers to virtual modifiers is
> X11-specific, so this is clearly a GTK bug.  I'm pretty sure GTK
> accelerators that specify <Super> as a modifier will not work on those
> other Wayland compositors either, if what you say is true.

	FWIW, using the PGTK branch under Wayland, the <Super> modifier
works correctly with KDE Plasma, but not Sway.

-bjc



^ permalink raw reply	[flat|nested] 48+ messages in thread

* Re: PGTK-related misconceptions
  2022-04-19 16:51       ` Yuri Khan
@ 2022-04-22  5:44         ` Pankaj Jangid
  0 siblings, 0 replies; 48+ messages in thread
From: Pankaj Jangid @ 2022-04-22  5:44 UTC (permalink / raw)
  To: emacs-devel

Yuri Khan <yuri.v.khan@gmail.com> writes:

> On Tue, 19 Apr 2022 at 18:54, Phil Sainty <psainty@orcon.net.nz> wrote:
>
>> I believe there's something called "X-Wayland" for running X programs
>> under Wayland, in case that's the missing piece of the puzzle?
>>
>> IIUC you can use that to run the same (single) X build of emacs when
>> you're using Wayland that you use when you're not, which avoids the
>> problem you've described.
>
> If you have a HiDPI monitor, an X application on an X server gets full
> resolution, a Wayland application on a Wayland compositor gets full
> resolution, but an X application via Xwayland on a Wayland compositor
> gets rendered at low resolution and then upscaled. It’s a non-starter.

Yup. I had a very hard time without-pgtk on a HiDPI monitor. Tried all
sorts of scaling and font-sizing. Nothing worked. I am using
xwayland. Because that is now default in Debian desktop environment
(Gnome). So I started using PGTK build. And for my use-case, I have not
faced any issues till now. It has been two months. Fonts look awesome.




^ permalink raw reply	[flat|nested] 48+ messages in thread

* Re: PGTK-related misconceptions
  2022-04-19  3:28   ` Trey Peacock
  2022-04-19  4:27     ` Po Lu
@ 2022-07-25 21:18     ` Akira Kyle
  2022-07-26  2:08       ` Po Lu
  1 sibling, 1 reply; 48+ messages in thread
From: Akira Kyle @ 2022-07-25 21:18 UTC (permalink / raw)
  To: Trey Peacock; +Cc: Po Lu, Morgan Smith, emacs-devel


On Tue, Apr 19, 2022 at 03:28 AM, Trey Peacock 
<gpg@treypeacock.com> wrote:

> Neither of the WMs I mentioned use GNOME Shell, but they do both 
> use
> wlroots. Looking into this, it seems that any wlroots based 
> Wayland
> compositor will use GDK_MOD4_MASK as Super. However, mutter 
> (GNOME's WM)
> uses GDK_SUPER_MASK. Rebuilding emacs with the below patch seems 
> to have
> fixed the issue. I'm not sure if there could be further 
> implications for
> pgtk_emacs_to_gtk_modifiers.
>
>
> diff --git a/src/pgtkterm.c b/src/pgtkterm.c
> index 2b04699fb3..d8ca89bbc0 100644
> --- a/src/pgtkterm.c
> +++ b/src/pgtkterm.c
> @@ -5152,7 +5152,7 @@ pgtk_gtk_to_emacs_modifiers (struct 
> pgtk_display_info *dpyinfo, int state)
>      mod |= mod_ctrl;
>    if (state & GDK_META_MASK || state & GDK_MOD1_MASK)
>      mod |= mod_meta;
> -  if (state & GDK_SUPER_MASK)
> +  if (state & GDK_SUPER_MASK || state & GDK_MOD4_MASK)
>      mod |= mod_super;
>    if (state & GDK_HYPER_MASK)
>      mod |= mod_hyper;
> @@ -5285,7 +5285,7 @@ key_press_event (GtkWidget *widget, 
> GdkEvent *event, gpointer *user_data)
>        /* While super is pressed, the input method will always 
>        always
>      resend the key events ignoring super.  As a workaround, 
>      don't
>      filter key events with super or hyper pressed.  */
> -      if (!(event->key.state & (GDK_SUPER_MASK | 
> GDK_HYPER_MASK)))
> +      if (!(event->key.state & (GDK_SUPER_MASK | GDK_HYPER_MASK 
> | GDK_MOD4_MASK)))
>     {
>       if (pgtk_im_filter_keypress (f, &event->key))
>         return TRUE;


Thank you for this patch! I recently updated and ran into this 
issue. From the discussion in this thread, I really don't 
understand why this change was made. Is this fixing some issue for 
some other non-wlroots based compositor?

If it isn't, but was just made "to comply with the GDK docs" this 
would seem to be just be making life more difficult for those of 
use on wlroots based compositors. Emacs has many other places 
where it tries to work around quirks and other issues with GTK for 
the benefit of the user, so why would this be any different?



^ permalink raw reply	[flat|nested] 48+ messages in thread

* Re: PGTK-related misconceptions
  2022-07-25 21:18     ` Akira Kyle
@ 2022-07-26  2:08       ` Po Lu
  2022-07-26 12:10         ` Lars Ingebrigtsen
  2022-07-26 21:36         ` Akira Kyle
  0 siblings, 2 replies; 48+ messages in thread
From: Po Lu @ 2022-07-26  2:08 UTC (permalink / raw)
  To: Akira Kyle; +Cc: Trey Peacock, Morgan Smith, emacs-devel

Akira Kyle <akira@akirakyle.com> writes:

> Thank you for this patch! I recently updated and ran into this
> issue. From the discussion in this thread, I really don't understand
> why this change was made. Is this fixing some issue for some other
> non-wlroots based compositor?

Yes, see below.

> If it isn't, but was just made "to comply with the GDK docs" this
> would seem to be just be making life more difficult for those of use
> on wlroots based compositors. Emacs has many other places where it
> tries to work around quirks and other issues with GTK for the benefit
> of the user, so why would this be any different?

It is to prevent errors when Mod4 is _not_ the super key.  Very common
on X (where Mod4 is commonly Hyper), and in fact it is caused by Mod4
not being part of the Super virtual modifier in the compositor's XKB
configuration.

The conclusion I eventually came to is that the problem lies in the XKB
configuration of the Wayland compositor in question (namely, Sway), and
not Emacs nor GDK.  It works with GNOME Shell and kwin because they set
up their keyboards with the correct virtual modifiers by default.  So
what I'd recommend is to start an X server where the Super key does
work, run:

  xkbcomp $DISPLAY name/of/xkb/file.xkb

and then use that file with Sway.



^ permalink raw reply	[flat|nested] 48+ messages in thread

* Re: PGTK-related misconceptions
  2022-07-26  2:08       ` Po Lu
@ 2022-07-26 12:10         ` Lars Ingebrigtsen
  2022-07-26 12:35           ` Po Lu
  2022-07-26 21:36         ` Akira Kyle
  1 sibling, 1 reply; 48+ messages in thread
From: Lars Ingebrigtsen @ 2022-07-26 12:10 UTC (permalink / raw)
  To: Po Lu; +Cc: Akira Kyle, Trey Peacock, Morgan Smith, emacs-devel

Po Lu <luangruo@yahoo.com> writes:

> It is to prevent errors when Mod4 is _not_ the super key.  Very common
> on X (where Mod4 is commonly Hyper), and in fact it is caused by Mod4
> not being part of the Super virtual modifier in the compositor's XKB
> configuration.

But in this case, Emacs is running under wlroots, so there's no X, is
there?

Adding a workaround for what is apparently a really common problem here
sounds like something we just have to do.




^ permalink raw reply	[flat|nested] 48+ messages in thread

* Re: PGTK-related misconceptions
  2022-07-26 12:10         ` Lars Ingebrigtsen
@ 2022-07-26 12:35           ` Po Lu
  2022-07-29 14:26             ` Stefan Monnier
  0 siblings, 1 reply; 48+ messages in thread
From: Po Lu @ 2022-07-26 12:35 UTC (permalink / raw)
  To: Lars Ingebrigtsen; +Cc: Akira Kyle, Trey Peacock, Morgan Smith, emacs-devel

Lars Ingebrigtsen <larsi@gnus.org> writes:

> But in this case, Emacs is running under wlroots, so there's no X, is
> there?

Wayland uses the same system of virtual modifiers as well.

> Adding a workaround for what is apparently a really common problem here
> sounds like something we just have to do.

I'd rather document the workaround here in etc/PROBLEMS, once Akira
confirms that it works.



^ permalink raw reply	[flat|nested] 48+ messages in thread

* Re: PGTK-related misconceptions
  2022-07-26  2:08       ` Po Lu
  2022-07-26 12:10         ` Lars Ingebrigtsen
@ 2022-07-26 21:36         ` Akira Kyle
  2022-07-27  2:48           ` Po Lu
  1 sibling, 1 reply; 48+ messages in thread
From: Akira Kyle @ 2022-07-26 21:36 UTC (permalink / raw)
  To: Po Lu; +Cc: Trey Peacock, Morgan Smith, emacs-devel


On Tue, Jul 26, 2022 at 10:08 AM, Po Lu <luangruo@yahoo.com> 
wrote:

> It is to prevent errors when Mod4 is _not_ the super key.  Very 
> common
> on X (where Mod4 is commonly Hyper), and in fact it is caused by 
> Mod4
> not being part of the Super virtual modifier in the compositor's 
> XKB
> configuration.
>
> The conclusion I eventually came to is that the problem lies in 
> the XKB
> configuration of the Wayland compositor in question (namely, 
> Sway), and
> not Emacs nor GDK.  It works with GNOME Shell and kwin because 
> they set
> up their keyboards with the correct virtual modifiers by 
> default.  So
> what I'd recommend is to start an X server where the Super key 
> does
> work, run:
>
>   xkbcomp $DISPLAY name/of/xkb/file.xkb
>
> and then use that file with Sway.

This does not appear to work. I can attach the full .xkb file that 
xkbcomp generated if you like, but it's the default which you get 
from the following under the v2.34 xkeyboad-config files.

xkb_keymap "my_dvorak_super" {
    xkb_keycodes        { include "evdev" };
    xkb_compatibility   { include "complete" };
    xkb_types           { include "complete" };
    xkb_symbols         { include "us(dvorak)+pc(pc105)" };
};

Specifically, when I use the same .xkb file under X I get that 
emacs interprets the physical keycode <RWIN> as Super whereas 
under wayland with sway, emacs does not respond to <RWIN>. The 
relevant lines from the xkb_symbols section are

    key <RWIN> {         [         Super_R ] };
    modifier_map Mod4 { <RWIN> };

Reading through the links that Trey sent in previous emails to the 
gtk source which handles modifier keys in x11 versus wayland, I'm 
pretty convinced his diagnosis is correct. Namely gtk behaves 
differently in stetting GDK_SUPER_MASK on x11 versus wayland where 
on the former seeing the "Super_R" symbol will set the mask while 
on the latter, only the virtual modifier "Super" will set 
GDK_SUPER_MASK.

Although it seems like in principle, one should be able to get xkb 
to set the "Super" virtual modifier so that GTK correctly picks it 
up in it's wayland code. However thus far I have been unable to 
make a set of xkb rules which will trigger the "Super" virtual 
modifier for the <RWIN> keycode despite much effort. Perhaps this 
is possible and I just don't understand xkb's rules sufficiently, 
or perhaps there is some issue in xkb which is preventing from GTK 
to picking up the "Super" virtual modifier. Thus far I have tried 
many variations on some configuration like the following

default partial modifier_keys xkb_symbols "basic" {
    include "us(dvorak)"
    name[Group1] = "super";
    key <RWIN>  {
        symbols[Group1]= [ Super_R ],
        virtualMods= Super
        };
    key <LWIN>  {
        symbols[Group1]= [ Super_L ],
        virtualMods= Super
        };
};

What is also puzzling to me is that my .xkb file also includes the 
"misc" xkb_compatibility rules which look like the following

    interpret Super_R+Any {
	virtualModifier= Super;
	action = SetMods(modifiers=modMapMods);
    };

    interpret Super_R {
	action = SetMods(modifiers=Super);
    };



^ permalink raw reply	[flat|nested] 48+ messages in thread

* Re: PGTK-related misconceptions
  2022-07-26 21:36         ` Akira Kyle
@ 2022-07-27  2:48           ` Po Lu
  2022-07-27  8:34             ` Trey Peacock
  2022-07-28  1:39             ` Akira Kyle
  0 siblings, 2 replies; 48+ messages in thread
From: Po Lu @ 2022-07-27  2:48 UTC (permalink / raw)
  To: Akira Kyle; +Cc: Trey Peacock, Morgan Smith, emacs-devel

Akira Kyle <akira@akirakyle.com> writes:

> This does not appear to work. I can attach the full .xkb file that
> xkbcomp generated if you like, but it's the default which you get from
> the following under the v2.34 xkeyboad-config files.
>
> xkb_keymap "my_dvorak_super" {
>    xkb_keycodes        { include "evdev" };
>    xkb_compatibility   { include "complete" };
>    xkb_types           { include "complete" };
>    xkb_symbols         { include "us(dvorak)+pc(pc105)" };
> };
>
> Specifically, when I use the same .xkb file under X I get that emacs
> interprets the physical keycode <RWIN> as Super whereas under wayland
> with sway, emacs does not respond to <RWIN>. The relevant lines from
> the xkb_symbols section are
>
>    key <RWIN> {         [         Super_R ] };
>    modifier_map Mod4 { <RWIN> };
>
> Reading through the links that Trey sent in previous emails to the gtk
> source which handles modifier keys in x11 versus wayland, I'm pretty
> convinced his diagnosis is correct.

> Namely gtk behaves differently in stetting GDK_SUPER_MASK on x11
> versus wayland where on the former seeing the "Super_R" symbol will
> set the mask while on the latter, only the virtual modifier "Super"
> will set GDK_SUPER_MASK.

That's because the Wayland compositor isn't sending a keymap that makes
libxkbcommon assign Mod4 to Super.  See this bit of gdkkeys-wayland.c:

  if (mods & (1 << xkb_keymap_mod_get_index (xkb_keymap, "Super")))
    state |= GDK_SUPER_MASK;

which is called from deliver_key_event and keyboard_handle_modifiers in
gdkdevice-wayland.c:

  seat->key_modifiers = gdk_keymap_get_modifier_state (keymap);

and uses an XKB keymap created in _gdk_wayland_keymap_update_from_fd.
It is not a bug in GTK, but a bug in the default configuration of the
Wayland compositor (regardless of what their developers say.)

> Although it seems like in principle, one should be able to get xkb to
> set the "Super" virtual modifier so that GTK correctly picks it up in
> it's wayland code. However thus far I have been unable to make a set
> of xkb rules which will trigger the "Super" virtual modifier for the
> <RWIN> keycode despite much effort. Perhaps this is possible and I
> just don't understand xkb's rules sufficiently, or perhaps there is
> some issue in xkb which is preventing from GTK to picking up the
> "Super" virtual modifier. Thus far I have tried many variations on

Could you please send the entire XKB file generated?  Thanks.



^ permalink raw reply	[flat|nested] 48+ messages in thread

* Re: PGTK-related misconceptions
  2022-07-27  2:48           ` Po Lu
@ 2022-07-27  8:34             ` Trey Peacock
  2022-07-27  9:10               ` Po Lu
  2022-07-28  1:39             ` Akira Kyle
  1 sibling, 1 reply; 48+ messages in thread
From: Trey Peacock @ 2022-07-27  8:34 UTC (permalink / raw)
  To: Po Lu, Akira Kyle; +Cc: Morgan Smith, emacs-devel

"Po Lu" <luangruo@yahoo.com> writes:

> That's because the Wayland compositor isn't sending a keymap that makes
> libxkbcommon assign Mod4 to Super.  See this bit of gdkkeys-wayland.c:
>
>   if (mods & (1 << xkb_keymap_mod_get_index (xkb_keymap, "Super")))
>     state |= GDK_SUPER_MASK;
>
> which is called from deliver_key_event and keyboard_handle_modifiers in
> gdkdevice-wayland.c:
>
>   seat->key_modifiers = gdk_keymap_get_modifier_state (keymap);
>
> and uses an XKB keymap created in _gdk_wayland_keymap_update_from_fd.
> It is not a bug in GTK, but a bug in the default configuration of the
> Wayland compositor (regardless of what their developers say.)

This section of code is in gdkkeys-x11.c and called from update_keymaps:

          mask = 0;
          for (j = 0; j < keymap_x11->keysyms_per_keycode; j++)
            {
              if (syms[j] == GDK_KEY_Meta_L ||
                  syms[j] == GDK_KEY_Meta_R)
                mask |= GDK_META_MASK;
              else if (syms[j] == GDK_KEY_Hyper_L ||
                       syms[j] == GDK_KEY_Hyper_R)
                mask |= GDK_HYPER_MASK;
              else if (syms[j] == GDK_KEY_Super_L ||
                       syms[j] == GDK_KEY_Super_R)
                mask |= GDK_SUPER_MASK;
            }

Which seems like it accepts the GDK_KEY_Super_L/R and subsequently sets
the mask, right? I believe this is the reason why the virtual mask is
recognized when using Xwayland on wlroots based compositors.




^ permalink raw reply	[flat|nested] 48+ messages in thread

* Re: PGTK-related misconceptions
  2022-07-27  8:34             ` Trey Peacock
@ 2022-07-27  9:10               ` Po Lu
  2022-07-27 13:45                 ` Trey Peacock
  0 siblings, 1 reply; 48+ messages in thread
From: Po Lu @ 2022-07-27  9:10 UTC (permalink / raw)
  To: Trey Peacock; +Cc: Akira Kyle, Morgan Smith, emacs-devel

Trey Peacock <gpg@treypeacock.com> writes:

> This section of code is in gdkkeys-x11.c and called from update_keymaps:
>
>           mask = 0;
>           for (j = 0; j < keymap_x11->keysyms_per_keycode; j++)
>             {
>               if (syms[j] == GDK_KEY_Meta_L ||
>                   syms[j] == GDK_KEY_Meta_R)
>                 mask |= GDK_META_MASK;
>               else if (syms[j] == GDK_KEY_Hyper_L ||
>                        syms[j] == GDK_KEY_Hyper_R)
>                 mask |= GDK_HYPER_MASK;
>               else if (syms[j] == GDK_KEY_Super_L ||
>                        syms[j] == GDK_KEY_Super_R)
>                 mask |= GDK_SUPER_MASK;
>             }
>
> Which seems like it accepts the GDK_KEY_Super_L/R and subsequently sets
> the mask, right? I believe this is the reason why the virtual mask is
> recognized when using Xwayland on wlroots based compositors.

Why is Xwayland related in any way?

And that code is only used when the XKB extension is _NOT_ present on
the X server.  Otherwise, the code under update_modmap is used.  The
exact analog in Emacs is x_find_modifier_meanings in xterm.c.



^ permalink raw reply	[flat|nested] 48+ messages in thread

* Re: PGTK-related misconceptions
  2022-07-27  9:10               ` Po Lu
@ 2022-07-27 13:45                 ` Trey Peacock
  2022-07-27 13:52                   ` Po Lu
  0 siblings, 1 reply; 48+ messages in thread
From: Trey Peacock @ 2022-07-27 13:45 UTC (permalink / raw)
  To: Po Lu; +Cc: Akira Kyle, Morgan Smith, emacs-devel

"Po Lu" <luangruo@yahoo.com> writes:

> Why is Xwayland related in any way?
>
> And that code is only used when the XKB extension is _NOT_ present on
> the X server.  Otherwise, the code under update_modmap is used.  The
> exact analog in Emacs is x_find_modifier_meanings in xterm.c.

I was trying to determine why the attached script in python will
recognize the virtual mod mask when run under Xwayland but not when run
normally.




^ permalink raw reply	[flat|nested] 48+ messages in thread

* Re: PGTK-related misconceptions
  2022-07-27 13:45                 ` Trey Peacock
@ 2022-07-27 13:52                   ` Po Lu
  0 siblings, 0 replies; 48+ messages in thread
From: Po Lu @ 2022-07-27 13:52 UTC (permalink / raw)
  To: Trey Peacock; +Cc: Akira Kyle, Morgan Smith, emacs-devel

Trey Peacock <gpg@treypeacock.com> writes:

> I was trying to determine why the attached script in python will
> recognize the virtual mod mask when run under Xwayland but not when run
> normally.

I think that's because Xwayland uses the regular keyboard configuration
also used by a "bare-metal" X server by default.

Thanks.



^ permalink raw reply	[flat|nested] 48+ messages in thread

* Re: PGTK-related misconceptions
  2022-07-27  2:48           ` Po Lu
  2022-07-27  8:34             ` Trey Peacock
@ 2022-07-28  1:39             ` Akira Kyle
  2022-07-28  2:50               ` Po Lu
  1 sibling, 1 reply; 48+ messages in thread
From: Akira Kyle @ 2022-07-28  1:39 UTC (permalink / raw)
  To: Po Lu; +Cc: Trey Peacock, Morgan Smith, emacs-devel

[-- Attachment #1: Type: text/plain, Size: 2246 bytes --]


On Wed, Jul 27, 2022 at 10:48 AM, Po Lu <luangruo@yahoo.com> 
wrote:

>> Namely gtk behaves differently in stetting GDK_SUPER_MASK on 
>> x11
>> versus wayland where on the former seeing the "Super_R" symbol 
>> will
>> set the mask while on the latter, only the virtual modifier 
>> "Super"
>> will set GDK_SUPER_MASK.
>
> That's because the Wayland compositor isn't sending a keymap 
> that makes
> libxkbcommon assign Mod4 to Super.  See this bit of 
> gdkkeys-wayland.c:
>
>   if (mods & (1 << xkb_keymap_mod_get_index (xkb_keymap, 
>   "Super")))
>     state |= GDK_SUPER_MASK;
>
> which is called from deliver_key_event and 
> keyboard_handle_modifiers in
> gdkdevice-wayland.c:
>
>   seat->key_modifiers = gdk_keymap_get_modifier_state (keymap);
>
> and uses an XKB keymap created in 
> _gdk_wayland_keymap_update_from_fd.
> It is not a bug in GTK, but a bug in the default configuration 
> of the
> Wayland compositor (regardless of what their developers say.)

I'm not totally convinced, since sway should just be using the 
.xkb file I specify. The relevant code is in sway/input/keyboard.c 
where it uses the .xkb file in sway_keyboard_compile_keymap which 
then sway sets using wlr_keyboard_set_keymap inside
sway_keyboard_configure. So this should be the same keymap that 
GTK is using.

Perhaps the bug isn't in GTK but its that mutter is doing 
something special, but I don't immediately see how the function 
add_virtual_mods in src/wayland/meta-wayland-keyboard.c would 
cause this bug and I don't see anything else obviously related to 
this bug.

>> Although it seems like in principle, one should be able to get 
>> xkb to
>> set the "Super" virtual modifier so that GTK correctly picks it 
>> up in
>> it's wayland code. However thus far I have been unable to make 
>> a set
>> of xkb rules which will trigger the "Super" virtual modifier 
>> for the
>> <RWIN> keycode despite much effort. Perhaps this is possible 
>> and I
>> just don't understand xkb's rules sufficiently, or perhaps 
>> there is
>> some issue in xkb which is preventing from GTK to picking up 
>> the
>> "Super" virtual modifier. Thus far I have tried many variations 
>> on
>
> Could you please send the entire XKB file generated?  Thanks.

Attached.


[-- Attachment #2: dvorak_super_compiled.xkb --]
[-- Type: text/plain, Size: 46916 bytes --]

xkb_keymap {
xkb_keycodes "evdev" {
    minimum = 8;
    maximum = 255;
     <ESC> = 9;
    <AE01> = 10;
    <AE02> = 11;
    <AE03> = 12;
    <AE04> = 13;
    <AE05> = 14;
    <AE06> = 15;
    <AE07> = 16;
    <AE08> = 17;
    <AE09> = 18;
    <AE10> = 19;
    <AE11> = 20;
    <AE12> = 21;
    <BKSP> = 22;
     <TAB> = 23;
    <AD01> = 24;
    <AD02> = 25;
    <AD03> = 26;
    <AD04> = 27;
    <AD05> = 28;
    <AD06> = 29;
    <AD07> = 30;
    <AD08> = 31;
    <AD09> = 32;
    <AD10> = 33;
    <AD11> = 34;
    <AD12> = 35;
    <RTRN> = 36;
    <LCTL> = 37;
    <AC01> = 38;
    <AC02> = 39;
    <AC03> = 40;
    <AC04> = 41;
    <AC05> = 42;
    <AC06> = 43;
    <AC07> = 44;
    <AC08> = 45;
    <AC09> = 46;
    <AC10> = 47;
    <AC11> = 48;
    <TLDE> = 49;
    <LFSH> = 50;
    <BKSL> = 51;
    <AB01> = 52;
    <AB02> = 53;
    <AB03> = 54;
    <AB04> = 55;
    <AB05> = 56;
    <AB06> = 57;
    <AB07> = 58;
    <AB08> = 59;
    <AB09> = 60;
    <AB10> = 61;
    <RTSH> = 62;
    <KPMU> = 63;
    <LALT> = 64;
    <SPCE> = 65;
    <CAPS> = 66;
    <FK01> = 67;
    <FK02> = 68;
    <FK03> = 69;
    <FK04> = 70;
    <FK05> = 71;
    <FK06> = 72;
    <FK07> = 73;
    <FK08> = 74;
    <FK09> = 75;
    <FK10> = 76;
    <NMLK> = 77;
    <SCLK> = 78;
     <KP7> = 79;
     <KP8> = 80;
     <KP9> = 81;
    <KPSU> = 82;
     <KP4> = 83;
     <KP5> = 84;
     <KP6> = 85;
    <KPAD> = 86;
     <KP1> = 87;
     <KP2> = 88;
     <KP3> = 89;
     <KP0> = 90;
    <KPDL> = 91;
    <LVL3> = 92;
    <LSGT> = 94;
    <FK11> = 95;
    <FK12> = 96;
    <AB11> = 97;
    <KATA> = 98;
    <HIRA> = 99;
    <HENK> = 100;
    <HKTG> = 101;
    <MUHE> = 102;
    <JPCM> = 103;
    <KPEN> = 104;
    <RCTL> = 105;
    <KPDV> = 106;
    <PRSC> = 107;
    <RALT> = 108;
    <LNFD> = 109;
    <HOME> = 110;
      <UP> = 111;
    <PGUP> = 112;
    <LEFT> = 113;
    <RGHT> = 114;
     <END> = 115;
    <DOWN> = 116;
    <PGDN> = 117;
     <INS> = 118;
    <DELE> = 119;
    <I120> = 120;
    <MUTE> = 121;
    <VOL-> = 122;
    <VOL+> = 123;
    <POWR> = 124;
    <KPEQ> = 125;
    <I126> = 126;
    <PAUS> = 127;
    <I128> = 128;
    <I129> = 129;
    <HNGL> = 130;
    <HJCV> = 131;
    <AE13> = 132;
    <LWIN> = 133;
    <RWIN> = 134;
    <COMP> = 135;
    <STOP> = 136;
    <AGAI> = 137;
    <PROP> = 138;
    <UNDO> = 139;
    <FRNT> = 140;
    <COPY> = 141;
    <OPEN> = 142;
    <PAST> = 143;
    <FIND> = 144;
     <CUT> = 145;
    <HELP> = 146;
    <I147> = 147;
    <I148> = 148;
    <I149> = 149;
    <I150> = 150;
    <I151> = 151;
    <I152> = 152;
    <I153> = 153;
    <I154> = 154;
    <I155> = 155;
    <I156> = 156;
    <I157> = 157;
    <I158> = 158;
    <I159> = 159;
    <I160> = 160;
    <I161> = 161;
    <I162> = 162;
    <I163> = 163;
    <I164> = 164;
    <I165> = 165;
    <I166> = 166;
    <I167> = 167;
    <I168> = 168;
    <I169> = 169;
    <I170> = 170;
    <I171> = 171;
    <I172> = 172;
    <I173> = 173;
    <I174> = 174;
    <I175> = 175;
    <I176> = 176;
    <I177> = 177;
    <I178> = 178;
    <I179> = 179;
    <I180> = 180;
    <I181> = 181;
    <I182> = 182;
    <I183> = 183;
    <I184> = 184;
    <I185> = 185;
    <I186> = 186;
    <I187> = 187;
    <I188> = 188;
    <I189> = 189;
    <I190> = 190;
    <FK13> = 191;
    <FK14> = 192;
    <FK15> = 193;
    <FK16> = 194;
    <FK17> = 195;
    <FK18> = 196;
    <FK19> = 197;
    <FK20> = 198;
    <FK21> = 199;
    <FK22> = 200;
    <FK23> = 201;
    <FK24> = 202;
    <MDSW> = 203;
     <ALT> = 204;
    <META> = 205;
    <SUPR> = 206;
    <HYPR> = 207;
    <I208> = 208;
    <I209> = 209;
    <I210> = 210;
    <I211> = 211;
    <I212> = 212;
    <I213> = 213;
    <I214> = 214;
    <I215> = 215;
    <I216> = 216;
    <I217> = 217;
    <I218> = 218;
    <I219> = 219;
    <I220> = 220;
    <I221> = 221;
    <I222> = 222;
    <I223> = 223;
    <I224> = 224;
    <I225> = 225;
    <I226> = 226;
    <I227> = 227;
    <I228> = 228;
    <I229> = 229;
    <I230> = 230;
    <I231> = 231;
    <I232> = 232;
    <I233> = 233;
    <I234> = 234;
    <I235> = 235;
    <I236> = 236;
    <I237> = 237;
    <I238> = 238;
    <I239> = 239;
    <I240> = 240;
    <I241> = 241;
    <I242> = 242;
    <I243> = 243;
    <I244> = 244;
    <I245> = 245;
    <I246> = 246;
    <I247> = 247;
    <I248> = 248;
    <I249> = 249;
    <I250> = 250;
    <I251> = 251;
    <I252> = 252;
    <I253> = 253;
    <I254> = 254;
    <I255> = 255;
    indicator 1 = "Caps Lock";
    indicator 2 = "Num Lock";
    indicator 3 = "Scroll Lock";
    indicator 4 = "Compose";
    indicator 5 = "Kana";
    indicator 6 = "Sleep";
    indicator 7 = "Suspend";
    indicator 8 = "Mute";
    indicator 9 = "Misc";
    indicator 10 = "Mail";
    indicator 11 = "Charging";
    virtual indicator 12 = "Shift Lock";
    virtual indicator 13 = "Group 2";
    virtual indicator 14 = "Mouse Keys";
    alias <AC12> = <BKSL>;
    alias <MENU> = <COMP>;
    alias <HZTG> = <TLDE>;
    alias <LMTA> = <LWIN>;
    alias <RMTA> = <RWIN>;
    alias <OUTP> = <I235>;
    alias <KITG> = <I236>;
    alias <KIDN> = <I237>;
    alias <KIUP> = <I238>;
    alias <I121> = <MUTE>;
    alias <I122> = <VOL->;
    alias <I123> = <VOL+>;
    alias <I124> = <POWR>;
    alias <I125> = <KPEQ>;
    alias <I127> = <PAUS>;
    alias <I130> = <HNGL>;
    alias <I131> = <HJCV>;
    alias <I132> = <AE13>;
    alias <I133> = <LWIN>;
    alias <I134> = <RWIN>;
    alias <I135> = <COMP>;
    alias <I136> = <STOP>;
    alias <I137> = <AGAI>;
    alias <I138> = <PROP>;
    alias <I139> = <UNDO>;
    alias <I140> = <FRNT>;
    alias <I141> = <COPY>;
    alias <I142> = <OPEN>;
    alias <I143> = <PAST>;
    alias <I144> = <FIND>;
    alias <I145> =  <CUT>;
    alias <I146> = <HELP>;
    alias <I191> = <FK13>;
    alias <I192> = <FK14>;
    alias <I193> = <FK15>;
    alias <I194> = <FK16>;
    alias <I195> = <FK17>;
    alias <I196> = <FK18>;
    alias <I197> = <FK19>;
    alias <I198> = <FK20>;
    alias <I199> = <FK21>;
    alias <I200> = <FK22>;
    alias <I201> = <FK23>;
    alias <I202> = <FK24>;
    alias <ALGR> = <RALT>;
    alias <KPPT> = <I129>;
};

xkb_types "complete" {

    virtual_modifiers NumLock,Alt,LevelThree,LAlt,RAlt,RControl,LControl,ScrollLock,LevelFive,AltGr,Meta,Super,Hyper;

    type "ONE_LEVEL" {
        modifiers= none;
        level_name[Level1]= "Any";
    };
    type "TWO_LEVEL" {
        modifiers= Shift;
        map[Shift]= Level2;
        level_name[Level1]= "Base";
        level_name[Level2]= "Shift";
    };
    type "ALPHABETIC" {
        modifiers= Shift+Lock;
        map[Shift]= Level2;
        map[Lock]= Level2;
        level_name[Level1]= "Base";
        level_name[Level2]= "Caps";
    };
    type "KEYPAD" {
        modifiers= Shift+NumLock;
        map[NumLock]= Level2;
        level_name[Level1]= "Base";
        level_name[Level2]= "Number";
    };
    type "SHIFT+ALT" {
        modifiers= Shift+Alt;
        map[Shift+Alt]= Level2;
        level_name[Level1]= "Base";
        level_name[Level2]= "Shift+Alt";
    };
    type "PC_SUPER_LEVEL2" {
        modifiers= Mod4;
        map[Mod4]= Level2;
        level_name[Level1]= "Base";
        level_name[Level2]= "Super";
    };
    type "PC_CONTROL_LEVEL2" {
        modifiers= Control;
        map[Control]= Level2;
        level_name[Level1]= "Base";
        level_name[Level2]= "Control";
    };
    type "PC_LCONTROL_LEVEL2" {
        modifiers= LControl;
        map[LControl]= Level2;
        level_name[Level1]= "Base";
        level_name[Level2]= "LControl";
    };
    type "PC_RCONTROL_LEVEL2" {
        modifiers= RControl;
        map[RControl]= Level2;
        level_name[Level1]= "Base";
        level_name[Level2]= "RControl";
    };
    type "PC_ALT_LEVEL2" {
        modifiers= Alt;
        map[Alt]= Level2;
        level_name[Level1]= "Base";
        level_name[Level2]= "Alt";
    };
    type "PC_LALT_LEVEL2" {
        modifiers= LAlt;
        map[LAlt]= Level2;
        level_name[Level1]= "Base";
        level_name[Level2]= "LAlt";
    };
    type "PC_RALT_LEVEL2" {
        modifiers= RAlt;
        map[RAlt]= Level2;
        level_name[Level1]= "Base";
        level_name[Level2]= "RAlt";
    };
    type "CTRL+ALT" {
        modifiers= Shift+Control+Alt+LevelThree;
        map[Shift]= Level2;
        preserve[Shift]= Shift;
        map[LevelThree]= Level3;
        map[Shift+LevelThree]= Level4;
        preserve[Shift+LevelThree]= Shift;
        map[Control+Alt]= Level5;
        level_name[Level1]= "Base";
        level_name[Level2]= "Shift";
        level_name[Level3]= "Alt Base";
        level_name[Level4]= "Shift Alt";
        level_name[Level5]= "Ctrl+Alt";
    };
    type "LOCAL_EIGHT_LEVEL" {
        modifiers= Shift+Lock+Control+LevelThree;
        map[Shift+Lock]= Level1;
        map[Shift]= Level2;
        map[Lock]= Level2;
        map[LevelThree]= Level3;
        map[Shift+Lock+LevelThree]= Level3;
        map[Shift+LevelThree]= Level4;
        map[Lock+LevelThree]= Level4;
        map[Control]= Level5;
        map[Shift+Lock+Control]= Level5;
        map[Shift+Control]= Level6;
        map[Lock+Control]= Level6;
        map[Control+LevelThree]= Level7;
        map[Shift+Lock+Control+LevelThree]= Level7;
        map[Shift+Control+LevelThree]= Level8;
        map[Lock+Control+LevelThree]= Level8;
        level_name[Level1]= "Base";
        level_name[Level2]= "Shift";
        level_name[Level3]= "Level3";
        level_name[Level4]= "Shift Level3";
        level_name[Level5]= "Ctrl";
        level_name[Level6]= "Shift Ctrl";
        level_name[Level7]= "Level3 Ctrl";
        level_name[Level8]= "Shift Level3 Ctrl";
    };
    type "THREE_LEVEL" {
        modifiers= Shift+LevelThree;
        map[Shift]= Level2;
        map[LevelThree]= Level3;
        map[Shift+LevelThree]= Level3;
        level_name[Level1]= "Base";
        level_name[Level2]= "Shift";
        level_name[Level3]= "Level3";
    };
    type "EIGHT_LEVEL" {
        modifiers= Shift+LevelThree+LevelFive;
        map[Shift]= Level2;
        map[LevelThree]= Level3;
        map[Shift+LevelThree]= Level4;
        map[LevelFive]= Level5;
        map[Shift+LevelFive]= Level6;
        map[LevelThree+LevelFive]= Level7;
        map[Shift+LevelThree+LevelFive]= Level8;
        level_name[Level1]= "Base";
        level_name[Level2]= "Shift";
        level_name[Level3]= "Alt Base";
        level_name[Level4]= "Shift Alt";
        level_name[Level5]= "X";
        level_name[Level6]= "X Shift";
        level_name[Level7]= "X Alt Base";
        level_name[Level8]= "X Shift Alt";
    };
    type "EIGHT_LEVEL_ALPHABETIC" {
        modifiers= Shift+Lock+LevelThree+LevelFive;
        map[Shift]= Level2;
        map[Lock]= Level2;
        map[LevelThree]= Level3;
        map[Shift+LevelThree]= Level4;
        map[Lock+LevelThree]= Level4;
        map[Shift+Lock+LevelThree]= Level3;
        map[LevelFive]= Level5;
        map[Shift+LevelFive]= Level6;
        map[Lock+LevelFive]= Level6;
        map[LevelThree+LevelFive]= Level7;
        map[Shift+LevelThree+LevelFive]= Level8;
        map[Lock+LevelThree+LevelFive]= Level8;
        map[Shift+Lock+LevelThree+LevelFive]= Level7;
        level_name[Level1]= "Base";
        level_name[Level2]= "Shift";
        level_name[Level3]= "Alt Base";
        level_name[Level4]= "Shift Alt";
        level_name[Level5]= "X";
        level_name[Level6]= "X Shift";
        level_name[Level7]= "X Alt Base";
        level_name[Level8]= "X Shift Alt";
    };
    type "EIGHT_LEVEL_LEVEL_FIVE_LOCK" {
        modifiers= Shift+Lock+NumLock+LevelThree+LevelFive;
        map[Shift]= Level2;
        map[LevelThree]= Level3;
        map[Shift+LevelThree]= Level4;
        map[LevelFive]= Level5;
        map[Shift+LevelFive]= Level6;
        preserve[Shift+LevelFive]= Shift;
        map[LevelThree+LevelFive]= Level7;
        map[Shift+LevelThree+LevelFive]= Level8;
        map[NumLock]= Level5;
        map[Shift+NumLock]= Level6;
        preserve[Shift+NumLock]= Shift;
        map[NumLock+LevelThree]= Level7;
        map[Shift+NumLock+LevelThree]= Level8;
        map[Shift+NumLock+LevelFive]= Level2;
        map[NumLock+LevelThree+LevelFive]= Level3;
        map[Shift+NumLock+LevelThree+LevelFive]= Level4;
        map[Shift+Lock]= Level2;
        map[Lock+LevelThree]= Level3;
        map[Shift+Lock+LevelThree]= Level4;
        map[Lock+LevelFive]= Level5;
        map[Shift+Lock+LevelFive]= Level6;
        preserve[Shift+Lock+LevelFive]= Shift;
        map[Lock+LevelThree+LevelFive]= Level7;
        map[Shift+Lock+LevelThree+LevelFive]= Level8;
        map[Lock+NumLock]= Level5;
        map[Shift+Lock+NumLock]= Level6;
        preserve[Shift+Lock+NumLock]= Shift;
        map[Lock+NumLock+LevelThree]= Level7;
        map[Shift+Lock+NumLock+LevelThree]= Level8;
        map[Shift+Lock+NumLock+LevelFive]= Level2;
        map[Lock+NumLock+LevelThree+LevelFive]= Level3;
        map[Shift+Lock+NumLock+LevelThree+LevelFive]= Level4;
        level_name[Level1]= "Base";
        level_name[Level2]= "Shift";
        level_name[Level3]= "Alt Base";
        level_name[Level4]= "Shift Alt";
        level_name[Level5]= "X";
        level_name[Level6]= "X Shift";
        level_name[Level7]= "X Alt Base";
        level_name[Level8]= "X Shift Alt";
    };
    type "EIGHT_LEVEL_ALPHABETIC_LEVEL_FIVE_LOCK" {
        modifiers= Shift+Lock+NumLock+LevelThree+LevelFive;
        map[Shift]= Level2;
        map[LevelThree]= Level3;
        map[Shift+LevelThree]= Level4;
        map[LevelFive]= Level5;
        map[Shift+LevelFive]= Level6;
        preserve[Shift+LevelFive]= Shift;
        map[LevelThree+LevelFive]= Level7;
        map[Shift+LevelThree+LevelFive]= Level8;
        map[NumLock]= Level5;
        map[Shift+NumLock]= Level6;
        preserve[Shift+NumLock]= Shift;
        map[NumLock+LevelThree]= Level7;
        map[Shift+NumLock+LevelThree]= Level8;
        map[Shift+NumLock+LevelFive]= Level2;
        map[NumLock+LevelThree+LevelFive]= Level3;
        map[Shift+NumLock+LevelThree+LevelFive]= Level4;
        map[Lock]= Level2;
        map[Lock+LevelThree]= Level3;
        map[Shift+Lock+LevelThree]= Level4;
        map[Lock+LevelFive]= Level5;
        map[Shift+Lock+LevelFive]= Level6;
        map[Lock+LevelThree+LevelFive]= Level7;
        map[Shift+Lock+LevelThree+LevelFive]= Level8;
        map[Lock+NumLock]= Level5;
        map[Shift+Lock+NumLock]= Level6;
        map[Lock+NumLock+LevelThree]= Level7;
        map[Shift+Lock+NumLock+LevelThree]= Level8;
        map[Lock+NumLock+LevelFive]= Level2;
        map[Lock+NumLock+LevelThree+LevelFive]= Level4;
        map[Shift+Lock+NumLock+LevelThree+LevelFive]= Level3;
        level_name[Level1]= "Base";
        level_name[Level2]= "Shift";
        level_name[Level3]= "Alt Base";
        level_name[Level4]= "Shift Alt";
        level_name[Level5]= "X";
        level_name[Level6]= "X Shift";
        level_name[Level7]= "X Alt Base";
        level_name[Level8]= "X Shift Alt";
    };
    type "EIGHT_LEVEL_SEMIALPHABETIC" {
        modifiers= Shift+Lock+LevelThree+LevelFive;
        map[Shift]= Level2;
        map[Lock]= Level2;
        map[LevelThree]= Level3;
        map[Shift+LevelThree]= Level4;
        map[Lock+LevelThree]= Level3;
        preserve[Lock+LevelThree]= Lock;
        map[Shift+Lock+LevelThree]= Level4;
        preserve[Shift+Lock+LevelThree]= Lock;
        map[LevelFive]= Level5;
        map[Shift+LevelFive]= Level6;
        map[Lock+LevelFive]= Level6;
        preserve[Lock+LevelFive]= Lock;
        map[Shift+Lock+LevelFive]= Level6;
        preserve[Shift+Lock+LevelFive]= Lock;
        map[LevelThree+LevelFive]= Level7;
        map[Shift+LevelThree+LevelFive]= Level8;
        map[Lock+LevelThree+LevelFive]= Level7;
        preserve[Lock+LevelThree+LevelFive]= Lock;
        map[Shift+Lock+LevelThree+LevelFive]= Level8;
        preserve[Shift+Lock+LevelThree+LevelFive]= Lock;
        level_name[Level1]= "Base";
        level_name[Level2]= "Shift";
        level_name[Level3]= "Alt Base";
        level_name[Level4]= "Shift Alt";
        level_name[Level5]= "X";
        level_name[Level6]= "X Shift";
        level_name[Level7]= "X Alt Base";
        level_name[Level8]= "X Shift Alt";
    };
    type "FOUR_LEVEL" {
        modifiers= Shift+LevelThree;
        map[Shift]= Level2;
        map[LevelThree]= Level3;
        map[Shift+LevelThree]= Level4;
        level_name[Level1]= "Base";
        level_name[Level2]= "Shift";
        level_name[Level3]= "Alt Base";
        level_name[Level4]= "Shift Alt";
    };
    type "FOUR_LEVEL_ALPHABETIC" {
        modifiers= Shift+Lock+LevelThree;
        map[Shift]= Level2;
        map[Lock]= Level2;
        map[LevelThree]= Level3;
        map[Shift+LevelThree]= Level4;
        map[Lock+LevelThree]= Level4;
        map[Shift+Lock+LevelThree]= Level3;
        level_name[Level1]= "Base";
        level_name[Level2]= "Shift";
        level_name[Level3]= "Alt Base";
        level_name[Level4]= "Shift Alt";
    };
    type "FOUR_LEVEL_SEMIALPHABETIC" {
        modifiers= Shift+Lock+LevelThree;
        map[Shift]= Level2;
        map[Lock]= Level2;
        map[LevelThree]= Level3;
        map[Shift+LevelThree]= Level4;
        map[Lock+LevelThree]= Level3;
        preserve[Lock+LevelThree]= Lock;
        map[Shift+Lock+LevelThree]= Level4;
        preserve[Shift+Lock+LevelThree]= Lock;
        level_name[Level1]= "Base";
        level_name[Level2]= "Shift";
        level_name[Level3]= "Alt Base";
        level_name[Level4]= "Shift Alt";
    };
    type "FOUR_LEVEL_MIXED_KEYPAD" {
        modifiers= Shift+NumLock+LevelThree;
        map[Shift+NumLock]= Level1;
        map[NumLock]= Level2;
        map[Shift]= Level2;
        map[LevelThree]= Level3;
        map[NumLock+LevelThree]= Level3;
        map[Shift+LevelThree]= Level4;
        map[Shift+NumLock+LevelThree]= Level4;
        level_name[Level1]= "Base";
        level_name[Level2]= "Number";
        level_name[Level3]= "Alt Base";
        level_name[Level4]= "Shift Alt";
    };
    type "FOUR_LEVEL_X" {
        modifiers= Shift+Control+Alt+LevelThree;
        map[LevelThree]= Level2;
        map[Shift+LevelThree]= Level3;
        map[Control+Alt]= Level4;
        level_name[Level1]= "Base";
        level_name[Level2]= "Alt Base";
        level_name[Level3]= "Shift Alt";
        level_name[Level4]= "Ctrl+Alt";
    };
    type "SEPARATE_CAPS_AND_SHIFT_ALPHABETIC" {
        modifiers= Shift+Lock+LevelThree;
        map[Shift]= Level2;
        map[Lock]= Level4;
        preserve[Lock]= Lock;
        map[LevelThree]= Level3;
        map[Shift+LevelThree]= Level4;
        map[Lock+LevelThree]= Level3;
        preserve[Lock+LevelThree]= Lock;
        map[Shift+Lock+LevelThree]= Level3;
        level_name[Level1]= "Base";
        level_name[Level2]= "Shift";
        level_name[Level3]= "AltGr Base";
        level_name[Level4]= "Shift AltGr";
    };
    type "FOUR_LEVEL_PLUS_LOCK" {
        modifiers= Shift+Lock+LevelThree;
        map[Shift]= Level2;
        map[LevelThree]= Level3;
        map[Shift+LevelThree]= Level4;
        map[Lock]= Level5;
        map[Shift+Lock]= Level2;
        map[Lock+LevelThree]= Level3;
        map[Shift+Lock+LevelThree]= Level4;
        level_name[Level1]= "Base";
        level_name[Level2]= "Shift";
        level_name[Level3]= "Alt Base";
        level_name[Level4]= "Shift Alt";
        level_name[Level5]= "Lock";
    };
    type "FOUR_LEVEL_KEYPAD" {
        modifiers= Shift+NumLock+LevelThree;
        map[Shift]= Level2;
        map[NumLock]= Level2;
        map[LevelThree]= Level3;
        map[Shift+LevelThree]= Level4;
        map[NumLock+LevelThree]= Level4;
        map[Shift+NumLock+LevelThree]= Level3;
        level_name[Level1]= "Base";
        level_name[Level2]= "Number";
        level_name[Level3]= "Alt Base";
        level_name[Level4]= "Alt Number";
    };
};

xkb_compatibility "complete" {

    virtual_modifiers NumLock,Alt,LevelThree,LAlt,RAlt,RControl,LControl,ScrollLock,LevelFive,AltGr,Meta,Super,Hyper;

    interpret.useModMapMods= AnyLevel;
    interpret.repeat= False;
    interpret.locking= False;
    interpret ISO_Level2_Latch+Exactly(Shift) {
        useModMapMods=level1;
        action= LatchMods(modifiers=Shift,clearLocks,latchToLock);
    };
    interpret Shift_Lock+AnyOf(Shift+Lock) {
        action= LockMods(modifiers=Shift);
    };
    interpret Num_Lock+AnyOf(all) {
        virtualModifier= NumLock;
        action= LockMods(modifiers=NumLock);
    };
    interpret ISO_Level3_Shift+AnyOf(all) {
        virtualModifier= LevelThree;
        useModMapMods=level1;
        action= SetMods(modifiers=LevelThree,clearLocks);
    };
    interpret ISO_Level3_Latch+AnyOf(all) {
        virtualModifier= LevelThree;
        useModMapMods=level1;
        action= LatchMods(modifiers=LevelThree,clearLocks,latchToLock);
    };
    interpret ISO_Level3_Lock+AnyOf(all) {
        virtualModifier= LevelThree;
        useModMapMods=level1;
        action= LockMods(modifiers=LevelThree);
    };
    interpret Alt_L+AnyOf(all) {
        virtualModifier= Alt;
        action= SetMods(modifiers=modMapMods,clearLocks);
    };
    interpret Alt_R+AnyOf(all) {
        virtualModifier= Alt;
        action= SetMods(modifiers=modMapMods,clearLocks);
    };
    interpret Meta_L+AnyOf(all) {
        virtualModifier= Meta;
        action= SetMods(modifiers=modMapMods,clearLocks);
    };
    interpret Meta_R+AnyOf(all) {
        virtualModifier= Meta;
        action= SetMods(modifiers=modMapMods,clearLocks);
    };
    interpret Super_L+AnyOf(all) {
        virtualModifier= Super;
        action= SetMods(modifiers=modMapMods,clearLocks);
    };
    interpret Super_R+AnyOf(all) {
        virtualModifier= Super;
        action= SetMods(modifiers=modMapMods,clearLocks);
    };
    interpret Hyper_L+AnyOf(all) {
        virtualModifier= Hyper;
        action= SetMods(modifiers=modMapMods,clearLocks);
    };
    interpret Hyper_R+AnyOf(all) {
        virtualModifier= Hyper;
        action= SetMods(modifiers=modMapMods,clearLocks);
    };
    interpret Scroll_Lock+AnyOf(all) {
        virtualModifier= ScrollLock;
        action= LockMods(modifiers=modMapMods);
    };
    interpret ISO_Level5_Shift+AnyOf(all) {
        virtualModifier= LevelFive;
        useModMapMods=level1;
        action= SetMods(modifiers=LevelFive,clearLocks);
    };
    interpret ISO_Level5_Latch+AnyOf(all) {
        virtualModifier= LevelFive;
        useModMapMods=level1;
        action= LatchMods(modifiers=LevelFive,clearLocks,latchToLock);
    };
    interpret ISO_Level5_Lock+AnyOf(all) {
        virtualModifier= LevelFive;
        useModMapMods=level1;
        action= LockMods(modifiers=LevelFive);
    };
    interpret Mode_switch+AnyOfOrNone(all) {
        virtualModifier= AltGr;
        useModMapMods=level1;
        action= SetGroup(group=+1);
    };
    interpret ISO_Level3_Shift+AnyOfOrNone(all) {
        action= SetMods(modifiers=LevelThree,clearLocks);
    };
    interpret ISO_Level3_Latch+AnyOfOrNone(all) {
        action= LatchMods(modifiers=LevelThree,clearLocks,latchToLock);
    };
    interpret ISO_Level3_Lock+AnyOfOrNone(all) {
        action= LockMods(modifiers=LevelThree);
    };
    interpret ISO_Group_Latch+AnyOfOrNone(all) {
        virtualModifier= AltGr;
        useModMapMods=level1;
        action= LatchGroup(group=2);
    };
    interpret ISO_Next_Group+AnyOfOrNone(all) {
        virtualModifier= AltGr;
        useModMapMods=level1;
        action= LockGroup(group=+1);
    };
    interpret ISO_Prev_Group+AnyOfOrNone(all) {
        virtualModifier= AltGr;
        useModMapMods=level1;
        action= LockGroup(group=-1);
    };
    interpret ISO_First_Group+AnyOfOrNone(all) {
        action= LockGroup(group=1);
    };
    interpret ISO_Last_Group+AnyOfOrNone(all) {
        action= LockGroup(group=2);
    };
    interpret KP_1+AnyOfOrNone(all) {
        repeat= True;
        action= MovePtr(x=-1,y=+1);
    };
    interpret KP_End+AnyOfOrNone(all) {
        repeat= True;
        action= MovePtr(x=-1,y=+1);
    };
    interpret KP_2+AnyOfOrNone(all) {
        repeat= True;
        action= MovePtr(x=+0,y=+1);
    };
    interpret KP_Down+AnyOfOrNone(all) {
        repeat= True;
        action= MovePtr(x=+0,y=+1);
    };
    interpret KP_3+AnyOfOrNone(all) {
        repeat= True;
        action= MovePtr(x=+1,y=+1);
    };
    interpret KP_Next+AnyOfOrNone(all) {
        repeat= True;
        action= MovePtr(x=+1,y=+1);
    };
    interpret KP_4+AnyOfOrNone(all) {
        repeat= True;
        action= MovePtr(x=-1,y=+0);
    };
    interpret KP_Left+AnyOfOrNone(all) {
        repeat= True;
        action= MovePtr(x=-1,y=+0);
    };
    interpret KP_6+AnyOfOrNone(all) {
        repeat= True;
        action= MovePtr(x=+1,y=+0);
    };
    interpret KP_Right+AnyOfOrNone(all) {
        repeat= True;
        action= MovePtr(x=+1,y=+0);
    };
    interpret KP_7+AnyOfOrNone(all) {
        repeat= True;
        action= MovePtr(x=-1,y=-1);
    };
    interpret KP_Home+AnyOfOrNone(all) {
        repeat= True;
        action= MovePtr(x=-1,y=-1);
    };
    interpret KP_8+AnyOfOrNone(all) {
        repeat= True;
        action= MovePtr(x=+0,y=-1);
    };
    interpret KP_Up+AnyOfOrNone(all) {
        repeat= True;
        action= MovePtr(x=+0,y=-1);
    };
    interpret KP_9+AnyOfOrNone(all) {
        repeat= True;
        action= MovePtr(x=+1,y=-1);
    };
    interpret KP_Prior+AnyOfOrNone(all) {
        repeat= True;
        action= MovePtr(x=+1,y=-1);
    };
    interpret KP_5+AnyOfOrNone(all) {
        repeat= True;
        action= PtrBtn(button=default);
    };
    interpret KP_Begin+AnyOfOrNone(all) {
        repeat= True;
        action= PtrBtn(button=default);
    };
    interpret KP_F2+AnyOfOrNone(all) {
        repeat= True;
        action= SetPtrDflt(affect=button,button=1);
    };
    interpret KP_Divide+AnyOfOrNone(all) {
        repeat= True;
        action= SetPtrDflt(affect=button,button=1);
    };
    interpret KP_F3+AnyOfOrNone(all) {
        repeat= True;
        action= SetPtrDflt(affect=button,button=2);
    };
    interpret KP_Multiply+AnyOfOrNone(all) {
        repeat= True;
        action= SetPtrDflt(affect=button,button=2);
    };
    interpret KP_F4+AnyOfOrNone(all) {
        repeat= True;
        action= SetPtrDflt(affect=button,button=3);
    };
    interpret KP_Subtract+AnyOfOrNone(all) {
        repeat= True;
        action= SetPtrDflt(affect=button,button=3);
    };
    interpret KP_Separator+AnyOfOrNone(all) {
        repeat= True;
        action= PtrBtn(button=default,count=2);
    };
    interpret KP_Add+AnyOfOrNone(all) {
        repeat= True;
        action= PtrBtn(button=default,count=2);
    };
    interpret KP_0+AnyOfOrNone(all) {
        repeat= True;
        action= LockPtrBtn(button=default,affect=lock);
    };
    interpret KP_Insert+AnyOfOrNone(all) {
        repeat= True;
        action= LockPtrBtn(button=default,affect=lock);
    };
    interpret KP_Decimal+AnyOfOrNone(all) {
        repeat= True;
        action= LockPtrBtn(button=default,affect=unlock);
    };
    interpret KP_Delete+AnyOfOrNone(all) {
        repeat= True;
        action= LockPtrBtn(button=default,affect=unlock);
    };
    interpret F25+AnyOfOrNone(all) {
        repeat= True;
        action= SetPtrDflt(affect=button,button=1);
    };
    interpret F26+AnyOfOrNone(all) {
        repeat= True;
        action= SetPtrDflt(affect=button,button=2);
    };
    interpret F27+AnyOfOrNone(all) {
        repeat= True;
        action= MovePtr(x=-1,y=-1);
    };
    interpret F29+AnyOfOrNone(all) {
        repeat= True;
        action= MovePtr(x=+1,y=-1);
    };
    interpret F31+AnyOfOrNone(all) {
        repeat= True;
        action= PtrBtn(button=default);
    };
    interpret F33+AnyOfOrNone(all) {
        repeat= True;
        action= MovePtr(x=-1,y=+1);
    };
    interpret F35+AnyOfOrNone(all) {
        repeat= True;
        action= MovePtr(x=+1,y=+1);
    };
    interpret Pointer_Button_Dflt+AnyOfOrNone(all) {
        action= PtrBtn(button=default);
    };
    interpret Pointer_Button1+AnyOfOrNone(all) {
        action= PtrBtn(button=1);
    };
    interpret Pointer_Button2+AnyOfOrNone(all) {
        action= PtrBtn(button=2);
    };
    interpret Pointer_Button3+AnyOfOrNone(all) {
        action= PtrBtn(button=3);
    };
    interpret Pointer_DblClick_Dflt+AnyOfOrNone(all) {
        action= PtrBtn(button=default,count=2);
    };
    interpret Pointer_DblClick1+AnyOfOrNone(all) {
        action= PtrBtn(button=1,count=2);
    };
    interpret Pointer_DblClick2+AnyOfOrNone(all) {
        action= PtrBtn(button=2,count=2);
    };
    interpret Pointer_DblClick3+AnyOfOrNone(all) {
        action= PtrBtn(button=3,count=2);
    };
    interpret Pointer_Drag_Dflt+AnyOfOrNone(all) {
        action= LockPtrBtn(button=default,affect=both);
    };
    interpret Pointer_Drag1+AnyOfOrNone(all) {
        action= LockPtrBtn(button=1,affect=both);
    };
    interpret Pointer_Drag2+AnyOfOrNone(all) {
        action= LockPtrBtn(button=2,affect=both);
    };
    interpret Pointer_Drag3+AnyOfOrNone(all) {
        action= LockPtrBtn(button=3,affect=both);
    };
    interpret Pointer_EnableKeys+AnyOfOrNone(all) {
        action= LockControls(controls=MouseKeys);
    };
    interpret Pointer_Accelerate+AnyOfOrNone(all) {
        action= LockControls(controls=MouseKeysAccel);
    };
    interpret Pointer_DfltBtnNext+AnyOfOrNone(all) {
        action= SetPtrDflt(affect=button,button=+1);
    };
    interpret Pointer_DfltBtnPrev+AnyOfOrNone(all) {
        action= SetPtrDflt(affect=button,button=-1);
    };
    interpret AccessX_Enable+AnyOfOrNone(all) {
        action= LockControls(controls=AccessXKeys);
    };
    interpret AccessX_Feedback_Enable+AnyOfOrNone(all) {
        action= LockControls(controls=AccessXFeedback);
    };
    interpret RepeatKeys_Enable+AnyOfOrNone(all) {
        action= LockControls(controls=RepeatKeys);
    };
    interpret SlowKeys_Enable+AnyOfOrNone(all) {
        action= LockControls(controls=SlowKeys);
    };
    interpret BounceKeys_Enable+AnyOfOrNone(all) {
        action= LockControls(controls=BounceKeys);
    };
    interpret StickyKeys_Enable+AnyOfOrNone(all) {
        action= LockControls(controls=StickyKeys);
    };
    interpret MouseKeys_Enable+AnyOfOrNone(all) {
        action= LockControls(controls=MouseKeys);
    };
    interpret MouseKeys_Accel_Enable+AnyOfOrNone(all) {
        action= LockControls(controls=MouseKeysAccel);
    };
    interpret Overlay1_Enable+AnyOfOrNone(all) {
        action= LockControls(controls=Overlay1);
    };
    interpret Overlay2_Enable+AnyOfOrNone(all) {
        action= LockControls(controls=Overlay2);
    };
    interpret AudibleBell_Enable+AnyOfOrNone(all) {
        action= LockControls(controls=AudibleBell);
    };
    interpret Terminate_Server+AnyOfOrNone(all) {
        action= Terminate();
    };
    interpret Alt_L+AnyOfOrNone(all) {
        action= SetMods(modifiers=Alt,clearLocks);
    };
    interpret Alt_R+AnyOfOrNone(all) {
        action= SetMods(modifiers=Alt,clearLocks);
    };
    interpret Meta_L+AnyOfOrNone(all) {
        action= SetMods(modifiers=Meta,clearLocks);
    };
    interpret Meta_R+AnyOfOrNone(all) {
        action= SetMods(modifiers=Meta,clearLocks);
    };
    interpret Super_L+AnyOfOrNone(all) {
        action= SetMods(modifiers=Super,clearLocks);
    };
    interpret Super_R+AnyOfOrNone(all) {
        action= SetMods(modifiers=Super,clearLocks);
    };
    interpret Hyper_L+AnyOfOrNone(all) {
        action= SetMods(modifiers=Hyper,clearLocks);
    };
    interpret Hyper_R+AnyOfOrNone(all) {
        action= SetMods(modifiers=Hyper,clearLocks);
    };
    interpret Shift_L+AnyOfOrNone(all) {
        action= SetMods(modifiers=Shift,clearLocks);
    };
    interpret XF86Switch_VT_1+AnyOfOrNone(all) {
        repeat= True;
        action= SwitchScreen(screen=1,!same);
    };
    interpret XF86Switch_VT_2+AnyOfOrNone(all) {
        repeat= True;
        action= SwitchScreen(screen=2,!same);
    };
    interpret XF86Switch_VT_3+AnyOfOrNone(all) {
        repeat= True;
        action= SwitchScreen(screen=3,!same);
    };
    interpret XF86Switch_VT_4+AnyOfOrNone(all) {
        repeat= True;
        action= SwitchScreen(screen=4,!same);
    };
    interpret XF86Switch_VT_5+AnyOfOrNone(all) {
        repeat= True;
        action= SwitchScreen(screen=5,!same);
    };
    interpret XF86Switch_VT_6+AnyOfOrNone(all) {
        repeat= True;
        action= SwitchScreen(screen=6,!same);
    };
    interpret XF86Switch_VT_7+AnyOfOrNone(all) {
        repeat= True;
        action= SwitchScreen(screen=7,!same);
    };
    interpret XF86Switch_VT_8+AnyOfOrNone(all) {
        repeat= True;
        action= SwitchScreen(screen=8,!same);
    };
    interpret XF86Switch_VT_9+AnyOfOrNone(all) {
        repeat= True;
        action= SwitchScreen(screen=9,!same);
    };
    interpret XF86Switch_VT_10+AnyOfOrNone(all) {
        repeat= True;
        action= SwitchScreen(screen=10,!same);
    };
    interpret XF86Switch_VT_11+AnyOfOrNone(all) {
        repeat= True;
        action= SwitchScreen(screen=11,!same);
    };
    interpret XF86Switch_VT_12+AnyOfOrNone(all) {
        repeat= True;
        action= SwitchScreen(screen=12,!same);
    };
    interpret XF86LogGrabInfo+AnyOfOrNone(all) {
        repeat= True;
        action= Private(type=0x86,data[0]=0x50,data[1]=0x72,data[2]=0x47,data[3]=0x72,data[4]=0x62,data[5]=0x73,data[6]=0x00);
    };
    interpret XF86LogWindowTree+AnyOfOrNone(all) {
        repeat= True;
        action= Private(type=0x86,data[0]=0x50,data[1]=0x72,data[2]=0x57,data[3]=0x69,data[4]=0x6e,data[5]=0x73,data[6]=0x00);
    };
    interpret XF86Next_VMode+AnyOfOrNone(all) {
        repeat= True;
        action= Private(type=0x86,data[0]=0x2b,data[1]=0x56,data[2]=0x4d,data[3]=0x6f,data[4]=0x64,data[5]=0x65,data[6]=0x00);
    };
    interpret XF86Prev_VMode+AnyOfOrNone(all) {
        repeat= True;
        action= Private(type=0x86,data[0]=0x2d,data[1]=0x56,data[2]=0x4d,data[3]=0x6f,data[4]=0x64,data[5]=0x65,data[6]=0x00);
    };
    interpret ISO_Level5_Shift+AnyOfOrNone(all) {
        action= SetMods(modifiers=LevelFive,clearLocks);
    };
    interpret ISO_Level5_Latch+AnyOfOrNone(all) {
        action= LatchMods(modifiers=LevelFive,clearLocks,latchToLock);
    };
    interpret ISO_Level5_Lock+AnyOfOrNone(all) {
        action= LockMods(modifiers=LevelFive);
    };
    interpret Caps_Lock+AnyOfOrNone(all) {
        action= LockMods(modifiers=Lock);
    };
    interpret Any+Exactly(Lock) {
        action= LockMods(modifiers=Lock);
    };
    interpret Any+AnyOf(all) {
        action= SetMods(modifiers=modMapMods,clearLocks);
    };
    group 2 = AltGr;
    group 3 = AltGr;
    group 4 = AltGr;
    indicator "Caps Lock" {
        !allowExplicit;
        whichModState= locked;
        modifiers= Lock;
    };
    indicator "Num Lock" {
        !allowExplicit;
        whichModState= locked;
        modifiers= NumLock;
    };
    indicator "Scroll Lock" {
        whichModState= locked;
        modifiers= ScrollLock;
    };
    indicator "Shift Lock" {
        !allowExplicit;
        whichModState= locked;
        modifiers= Shift;
    };
    indicator "Group 2" {
        !allowExplicit;
        groups= 0xfe;
    };
    indicator "Mouse Keys" {
        indicatorDrivesKeyboard;
        controls= mouseKeys;
    };
};

xkb_symbols "us(dvorak)+pc(pc105)" {

    name[group1]="English (Dvorak)";

    key  <ESC> {         [          Escape ] };
    key <AE01> {         [               1,          exclam ] };
    key <AE02> {         [               2,              at ] };
    key <AE03> {         [               3,      numbersign ] };
    key <AE04> {         [               4,          dollar ] };
    key <AE05> {         [               5,         percent ] };
    key <AE06> {
        type= "FOUR_LEVEL",
        symbols[Group1]= [               6,     asciicircum, dead_circumflex, dead_circumflex ]
    };
    key <AE07> {         [               7,       ampersand ] };
    key <AE08> {         [               8,        asterisk ] };
    key <AE09> {
        type= "FOUR_LEVEL",
        symbols[Group1]= [               9,       parenleft,      dead_grave,      dead_breve ]
    };
    key <AE10> {         [               0,      parenright ] };
    key <AE11> {         [     bracketleft,       braceleft ] };
    key <AE12> {
        type= "FOUR_LEVEL",
        symbols[Group1]= [    bracketright,      braceright,      dead_tilde,        NoSymbol ]
    };
    key <BKSP> {         [       BackSpace,       BackSpace ] };
    key  <TAB> {         [             Tab,    ISO_Left_Tab ] };
    key <AD01> {
        type= "FOUR_LEVEL",
        symbols[Group1]= [      apostrophe,        quotedbl,      dead_acute,  dead_diaeresis ]
    };
    key <AD02> {
        type= "FOUR_LEVEL",
        symbols[Group1]= [           comma,            less,    dead_cedilla,      dead_caron ]
    };
    key <AD03> {
        type= "FOUR_LEVEL",
        symbols[Group1]= [          period,         greater,   dead_abovedot,  periodcentered ]
    };
    key <AD04> {
        type= "ALPHABETIC",
        symbols[Group1]= [               p,               P ]
    };
    key <AD05> {
        type= "ALPHABETIC",
        symbols[Group1]= [               y,               Y ]
    };
    key <AD06> {
        type= "ALPHABETIC",
        symbols[Group1]= [               f,               F ]
    };
    key <AD07> {
        type= "ALPHABETIC",
        symbols[Group1]= [               g,               G ]
    };
    key <AD08> {
        type= "ALPHABETIC",
        symbols[Group1]= [               c,               C ]
    };
    key <AD09> {
        type= "ALPHABETIC",
        symbols[Group1]= [               r,               R ]
    };
    key <AD10> {
        type= "ALPHABETIC",
        symbols[Group1]= [               l,               L ]
    };
    key <AD11> {         [           slash,        question ] };
    key <AD12> {         [           equal,            plus ] };
    key <RTRN> {         [          Return ] };
    key <LCTL> {         [       Control_L ] };
    key <AC01> {
        type= "ALPHABETIC",
        symbols[Group1]= [               a,               A ]
    };
    key <AC02> {
        type= "ALPHABETIC",
        symbols[Group1]= [               o,               O ]
    };
    key <AC03> {
        type= "ALPHABETIC",
        symbols[Group1]= [               e,               E ]
    };
    key <AC04> {
        type= "ALPHABETIC",
        symbols[Group1]= [               u,               U ]
    };
    key <AC05> {
        type= "ALPHABETIC",
        symbols[Group1]= [               i,               I ]
    };
    key <AC06> {
        type= "ALPHABETIC",
        symbols[Group1]= [               d,               D ]
    };
    key <AC07> {
        type= "ALPHABETIC",
        symbols[Group1]= [               h,               H ]
    };
    key <AC08> {
        type= "ALPHABETIC",
        symbols[Group1]= [               t,               T ]
    };
    key <AC09> {
        type= "ALPHABETIC",
        symbols[Group1]= [               n,               N ]
    };
    key <AC10> {
        type= "ALPHABETIC",
        symbols[Group1]= [               s,               S ]
    };
    key <AC11> {         [           minus,      underscore ] };
    key <TLDE> {
        type= "FOUR_LEVEL",
        symbols[Group1]= [           grave,      asciitilde,      dead_grave,      dead_tilde ]
    };
    key <LFSH> {         [         Shift_L ] };
    key <BKSL> {         [       backslash,             bar ] };
    key <AB01> {
        type= "FOUR_LEVEL",
        symbols[Group1]= [       semicolon,           colon,     dead_ogonek, dead_doubleacute ]
    };
    key <AB02> {
        type= "ALPHABETIC",
        symbols[Group1]= [               q,               Q ]
    };
    key <AB03> {
        type= "ALPHABETIC",
        symbols[Group1]= [               j,               J ]
    };
    key <AB04> {
        type= "ALPHABETIC",
        symbols[Group1]= [               k,               K ]
    };
    key <AB05> {
        type= "ALPHABETIC",
        symbols[Group1]= [               x,               X ]
    };
    key <AB06> {
        type= "ALPHABETIC",
        symbols[Group1]= [               b,               B ]
    };
    key <AB07> {
        type= "ALPHABETIC",
        symbols[Group1]= [               m,               M ]
    };
    key <AB08> {
        type= "ALPHABETIC",
        symbols[Group1]= [               w,               W ]
    };
    key <AB09> {
        type= "ALPHABETIC",
        symbols[Group1]= [               v,               V ]
    };
    key <AB10> {
        type= "ALPHABETIC",
        symbols[Group1]= [               z,               Z ]
    };
    key <RTSH> {         [         Shift_R ] };
    key <KPMU> {
        type= "CTRL+ALT",
        symbols[Group1]= [     KP_Multiply,     KP_Multiply,     KP_Multiply,     KP_Multiply,   XF86ClearGrab ]
    };
    key <LALT> {         [           Alt_L,          Meta_L ] };
    key <SPCE> {         [           space ] };
    key <CAPS> {         [       Caps_Lock ] };
    key <FK01> {
        type= "CTRL+ALT",
        symbols[Group1]= [              F1,              F1,              F1,              F1, XF86Switch_VT_1 ]
    };
    key <FK02> {
        type= "CTRL+ALT",
        symbols[Group1]= [              F2,              F2,              F2,              F2, XF86Switch_VT_2 ]
    };
    key <FK03> {
        type= "CTRL+ALT",
        symbols[Group1]= [              F3,              F3,              F3,              F3, XF86Switch_VT_3 ]
    };
    key <FK04> {
        type= "CTRL+ALT",
        symbols[Group1]= [              F4,              F4,              F4,              F4, XF86Switch_VT_4 ]
    };
    key <FK05> {
        type= "CTRL+ALT",
        symbols[Group1]= [              F5,              F5,              F5,              F5, XF86Switch_VT_5 ]
    };
    key <FK06> {
        type= "CTRL+ALT",
        symbols[Group1]= [              F6,              F6,              F6,              F6, XF86Switch_VT_6 ]
    };
    key <FK07> {
        type= "CTRL+ALT",
        symbols[Group1]= [              F7,              F7,              F7,              F7, XF86Switch_VT_7 ]
    };
    key <FK08> {
        type= "CTRL+ALT",
        symbols[Group1]= [              F8,              F8,              F8,              F8, XF86Switch_VT_8 ]
    };
    key <FK09> {
        type= "CTRL+ALT",
        symbols[Group1]= [              F9,              F9,              F9,              F9, XF86Switch_VT_9 ]
    };
    key <FK10> {
        type= "CTRL+ALT",
        symbols[Group1]= [             F10,             F10,             F10,             F10, XF86Switch_VT_10 ]
    };
    key <NMLK> {         [        Num_Lock ] };
    key <SCLK> {         [     Scroll_Lock ] };
    key  <KP7> {         [         KP_Home,            KP_7 ] };
    key  <KP8> {         [           KP_Up,            KP_8 ] };
    key  <KP9> {         [        KP_Prior,            KP_9 ] };
    key <KPSU> {
        type= "CTRL+ALT",
        symbols[Group1]= [     KP_Subtract,     KP_Subtract,     KP_Subtract,     KP_Subtract,  XF86Prev_VMode ]
    };
    key  <KP4> {         [         KP_Left,            KP_4 ] };
    key  <KP5> {         [        KP_Begin,            KP_5 ] };
    key  <KP6> {         [        KP_Right,            KP_6 ] };
    key <KPAD> {
        type= "CTRL+ALT",
        symbols[Group1]= [          KP_Add,          KP_Add,          KP_Add,          KP_Add,  XF86Next_VMode ]
    };
    key  <KP1> {         [          KP_End,            KP_1 ] };
    key  <KP2> {         [         KP_Down,            KP_2 ] };
    key  <KP3> {         [         KP_Next,            KP_3 ] };
    key  <KP0> {         [       KP_Insert,            KP_0 ] };
    key <KPDL> {         [       KP_Delete,      KP_Decimal ] };
    key <LVL3> {         [ ISO_Level3_Shift ] };
    key <LSGT> {
        type= "FOUR_LEVEL",
        symbols[Group1]= [            less,         greater,             bar,       brokenbar ]
    };
    key <FK11> {
        type= "CTRL+ALT",
        symbols[Group1]= [             F11,             F11,             F11,             F11, XF86Switch_VT_11 ]
    };
    key <FK12> {
        type= "CTRL+ALT",
        symbols[Group1]= [             F12,             F12,             F12,             F12, XF86Switch_VT_12 ]
    };
    key <KPEN> {         [        KP_Enter ] };
    key <RCTL> {         [       Control_R ] };
    key <KPDV> {
        type= "CTRL+ALT",
        symbols[Group1]= [       KP_Divide,       KP_Divide,       KP_Divide,       KP_Divide,      XF86Ungrab ]
    };
    key <PRSC> {
        type= "PC_ALT_LEVEL2",
        symbols[Group1]= [           Print,         Sys_Req ]
    };
    key <RALT> {
        type= "TWO_LEVEL",
        symbols[Group1]= [           Alt_R,          Meta_R ]
    };
    key <HOME> {         [            Home ] };
    key   <UP> {         [              Up ] };
    key <PGUP> {         [           Prior ] };
    key <LEFT> {         [            Left ] };
    key <RGHT> {         [           Right ] };
    key  <END> {         [             End ] };
    key <DOWN> {         [            Down ] };
    key <PGDN> {         [            Next ] };
    key  <INS> {         [          Insert ] };
    key <DELE> {         [          Delete ] };
    key <KPEQ> {         [        KP_Equal ] };
    key <PAUS> {
        type= "PC_CONTROL_LEVEL2",
        symbols[Group1]= [           Pause,           Break ]
    };
    key <I129> {         [      KP_Decimal,      KP_Decimal ] };
    key <LWIN> {         [         Super_L ] };
    key <RWIN> {         [         Super_R ] };
    key <COMP> {         [            Menu ] };
    key <MDSW> {         [     Mode_switch ] };
    key  <ALT> {         [        NoSymbol,           Alt_L ] };
    key <META> {         [        NoSymbol,          Meta_L ] };
    key <SUPR> {         [        NoSymbol,         Super_L ] };
    key <HYPR> {         [        NoSymbol,         Hyper_L ] };
    key <I235> {         [     XF86Display ] };
    key <I236> {         [ XF86KbdLightOnOff ] };
    key <I237> {         [ XF86KbdBrightnessDown ] };
    key <I238> {         [ XF86KbdBrightnessUp ] };
    modifier_map Control { <LCTL> };
    modifier_map Shift { <LFSH> };
    modifier_map Shift { <RTSH> };
    modifier_map Mod1 { <LALT> };
    modifier_map Lock { <CAPS> };
    modifier_map Mod2 { <NMLK> };
    modifier_map Mod5 { <LVL3> };
    modifier_map Control { <RCTL> };
    modifier_map Mod1 { <RALT> };
    modifier_map Mod4 { <LWIN> };
    modifier_map Mod4 { <RWIN> };
    modifier_map Mod5 { <MDSW> };
    modifier_map Mod1 { <META> };
    modifier_map Mod4 { <SUPR> };
    modifier_map Mod4 { <HYPR> };
};

};

^ permalink raw reply	[flat|nested] 48+ messages in thread

* Re: PGTK-related misconceptions
  2022-07-28  1:39             ` Akira Kyle
@ 2022-07-28  2:50               ` Po Lu
  0 siblings, 0 replies; 48+ messages in thread
From: Po Lu @ 2022-07-28  2:50 UTC (permalink / raw)
  To: Akira Kyle; +Cc: Trey Peacock, Morgan Smith, emacs-devel

Akira Kyle <akira@akirakyle.com> writes:

> I'm not totally convinced, since sway should just be using the .xkb
> file I specify. The relevant code is in sway/input/keyboard.c where it
> uses the .xkb file in sway_keyboard_compile_keymap which then sway
> sets using wlr_keyboard_set_keymap inside
> sway_keyboard_configure. So this should be the same keymap that GTK is
> using.

It would be nice if you (or someone else) set a breakpoint here:

->if (mods & (1 << xkb_keymap_mod_get_index (xkb_keymap, "Super")))
    state |= GDK_SUPER_MASK;

in the GDK source code to see what real modifier gets returned under
Sway.

TIA.



^ permalink raw reply	[flat|nested] 48+ messages in thread

* Re: PGTK-related misconceptions
  2022-07-26 12:35           ` Po Lu
@ 2022-07-29 14:26             ` Stefan Monnier
  2022-07-30  0:58               ` Po Lu
  0 siblings, 1 reply; 48+ messages in thread
From: Stefan Monnier @ 2022-07-29 14:26 UTC (permalink / raw)
  To: Po Lu
  Cc: Lars Ingebrigtsen, Akira Kyle, Trey Peacock, Morgan Smith,
	emacs-devel

>> Adding a workaround for what is apparently a really common problem here
>> sounds like something we just have to do.
> I'd rather document the workaround here in etc/PROBLEMS, once Akira
> confirms that it works.

There should be a matching bug report in Sway, right?


        Stefan




^ permalink raw reply	[flat|nested] 48+ messages in thread

* Re: PGTK-related misconceptions
  2022-07-29 14:26             ` Stefan Monnier
@ 2022-07-30  0:58               ` Po Lu
  0 siblings, 0 replies; 48+ messages in thread
From: Po Lu @ 2022-07-30  0:58 UTC (permalink / raw)
  To: Stefan Monnier
  Cc: Lars Ingebrigtsen, Akira Kyle, Trey Peacock, Morgan Smith,
	emacs-devel

Stefan Monnier <monnier@iro.umontreal.ca> writes:

>> I'd rather document the workaround here in etc/PROBLEMS, once Akira
>> confirms that it works.
>
> There should be a matching bug report in Sway, right?

Yes, but it'd be easier to report the bug to them if we know the
workaround.



^ permalink raw reply	[flat|nested] 48+ messages in thread

end of thread, other threads:[~2022-07-30  0:58 UTC | newest]

Thread overview: 48+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2022-04-18 21:50 PGTK-related misconceptions Trey
2022-04-19  0:59 ` Po Lu
2022-04-19  3:28   ` Trey Peacock
2022-04-19  4:27     ` Po Lu
2022-04-19 23:02       ` Trey Peacock
2022-04-20  0:48         ` Po Lu
2022-04-20  2:33           ` Trey Peacock
2022-04-20  4:05             ` Po Lu
2022-07-25 21:18     ` Akira Kyle
2022-07-26  2:08       ` Po Lu
2022-07-26 12:10         ` Lars Ingebrigtsen
2022-07-26 12:35           ` Po Lu
2022-07-29 14:26             ` Stefan Monnier
2022-07-30  0:58               ` Po Lu
2022-07-26 21:36         ` Akira Kyle
2022-07-27  2:48           ` Po Lu
2022-07-27  8:34             ` Trey Peacock
2022-07-27  9:10               ` Po Lu
2022-07-27 13:45                 ` Trey Peacock
2022-07-27 13:52                   ` Po Lu
2022-07-28  1:39             ` Akira Kyle
2022-07-28  2:50               ` Po Lu
  -- strict thread matches above, loose matches on Subject: below --
2022-04-20  7:52 Trey Peacock
2022-04-20  8:25 ` Po Lu
2022-04-20 13:13   ` Brian Cully
     [not found] <DM5PR03MB3163BBCF9626AD3B88900011C5EE9@DM5PR03MB3163.namprd03.prod.outlook.com>
2022-04-15  2:29 ` Po Lu
2022-04-15  7:11   ` Byung-Hee HWANG
2022-04-15 16:24   ` Eric Abrahamsen
2022-04-18  5:18   ` Sean Whitton
2022-04-18  5:31     ` Po Lu
2022-04-18  5:43       ` Sean Whitton
2022-04-18  5:57         ` Po Lu
2022-04-18 18:27           ` Sean Whitton
2022-04-18 19:49           ` Jim Porter
2022-04-19  1:02             ` Po Lu
2022-04-19  2:46               ` Sean Whitton
2022-04-19  2:18             ` Tim Cross
2022-04-19  5:56               ` Eli Zaretskii
2022-04-19  8:13                 ` Tim Cross
2022-04-19 10:32                   ` Eli Zaretskii
2022-04-19  9:10   ` Dirk-Jan C. Binnema
2022-04-19 10:42     ` Po Lu
2022-04-19 11:53     ` Phil Sainty
2022-04-19 13:58       ` Sean Whitton
2022-04-20  3:29         ` Phil Sainty
2022-04-20  4:48           ` Stefan Monnier
2022-04-19 16:51       ` Yuri Khan
2022-04-22  5:44         ` Pankaj Jangid

Code repositories for project(s) associated with this public inbox

	https://git.savannah.gnu.org/cgit/emacs.git

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).