On Tue, 6 Jun 2023, adr wrote:
hmm... by the nature of xorg and looking at the code of ctwm this
looks unachievable. It would be easy to add an option like MapToFocus
so all new mapped windows get focus (and grab the pointer). That's
the behaviour already when ClickToFocus is set and the window wants
input (A similar behaviour occurs with transient windows when
AutoFousToTransients is set). The window should also grab the
pointer to not lose focus, for example moving it using the keyboard
when ClicToFocus is not set.

This patch does that, if someone wants to try it.

==================================================
diff -ur usr/xsrc/external/mit/ctwm/dist/ctwm_main.c 
/usr/xsrc/external/mit/ctwm/dist/ctwm_main.c
--- usr/xsrc/external/mit/ctwm/dist/ctwm_main.c 2021-04-11 09:36:52.000000000 
+0100
+++ /usr/xsrc/external/mit/ctwm/dist/ctwm_main.c        2023-06-07 
02:33:34.572100881 +0100
@@ -1074,6 +1074,7 @@
        scr->StayUpMenus = false;
        scr->WarpToDefaultMenuEntry = false;
        scr->ClickToFocus = false;
+       scr->MapToFocus = false;
        scr->SloppyFocus = false;
        scr->SaveWorkspaceFocus = false;
        scr->NoIconTitlebar = false;
diff -ur usr/xsrc/external/mit/ctwm/dist/event_handlers.c 
/usr/xsrc/external/mit/ctwm/dist/event_handlers.c
--- usr/xsrc/external/mit/ctwm/dist/event_handlers.c    2021-04-11 
09:36:52.000000000 +0100
+++ /usr/xsrc/external/mit/ctwm/dist/event_handlers.c   2023-06-07 
02:53:24.600649543 +0100
@@ -2020,6 +2020,9 @@
                                                Tmp_win->wmhints->input) {
                                        SetFocus(Tmp_win, CurrentTime);
                                }
+                               if(Scr->MapToFocus && Tmp_win->wmhints->input) {
+                                       WarpToWindow(Tmp_win, true);
+                               }
                                break;

                        case InactiveState:
diff -ur usr/xsrc/external/mit/ctwm/dist/parse_be.c 
/usr/xsrc/external/mit/ctwm/dist/parse_be.c
--- usr/xsrc/external/mit/ctwm/dist/parse_be.c  2021-04-11 09:36:52.000000000 
+0100
+++ /usr/xsrc/external/mit/ctwm/dist/parse_be.c 2023-06-07 02:37:27.498039084 
+0100
@@ -128,6 +128,7 @@
 #define kw0_GrabServer                  76
 #define kw0_DontNameDecorations         77
 #define kw0_StrictWinNameEncoding       78
+#define kw0_MapToFocus                  79

 #define kws_UsePPosition                1
 #define kws_IconFont                    2
@@ -326,6 +327,7 @@
        { "lock",                   LOCK, 0 },
        { "m",                      META, 0 },
        { "maketitle",              MAKE_TITLE, 0 },
+       { "maptofocus",             KEYWORD, kw0_MapToFocus },
        { "mapwindowbackground",    CLKEYWORD, kwcl_MapWindowBackground },
        { "mapwindowcurrentworkspace", MAPWINDOWCURRENTWORKSPACE, 0},
        { "mapwindowdefaultworkspace", MAPWINDOWDEFAULTWORKSPACE, 0},
@@ -788,6 +790,10 @@
                        Scr->ClickToFocus = true;
                        return true;

+               case kw0_MapToFocus:
+                       Scr->MapToFocus = true;
+                       return true;
+
                case kw0_ReallyMoveInWorkspaceManager:
                        Scr->ReallyMoveInWorkspaceManager = true;
                        return true;
diff -ur usr/xsrc/external/mit/ctwm/dist/screen.h 
/usr/xsrc/external/mit/ctwm/dist/screen.h
--- usr/xsrc/external/mit/ctwm/dist/screen.h    2021-04-11 11:11:58.000000000 
+0100
+++ /usr/xsrc/external/mit/ctwm/dist/screen.h   2023-06-07 02:38:16.774530269 
+0100
@@ -879,6 +879,7 @@
        bool StayUpMenus;  ///< StayUpMenus config var
        bool WarpToDefaultMenuEntry; ///< WarpToDefaultMenuEntry config var
        bool ClickToFocus; ///< ClickToFocus config var
+       bool MapToFocus;   ///< MapToFocus config var
        bool SloppyFocus;  ///< SloppyFocus config var
        bool SaveWorkspaceFocus; ///< SaveWorkspaceFocus config var
        bool NoIconManagers;     ///< NoIconManagers config var

Reply via email to