]> git.eshelyaron.com Git - emacs.git/commitdiff
pgtk: Handle (child) frame focusing better
authorJeff Walsh <fejfighter@gmail.com>
Sun, 26 Sep 2021 14:20:57 +0000 (00:20 +1000)
committerYuuki Harano <masm+github@masm11.me>
Mon, 15 Nov 2021 12:07:28 +0000 (21:07 +0900)
child frames on pgtk are gtk widgets inside the parent surface, rather
than subsurfaces (in wayland ters), and the edit widget is handled
separately from the parent window, so we need to handle signals more
correctly, rather than squinting and assuming an event for the window
is just an event for the edit widget.

* src/gtkutil.c (xg_set_no_accept_focus): set
focus on widget rather than request it on window
* src/pgtkterm.c (pgtk_focus_frame): focus frame on edit_widget
instead
(button_event): Implement focus calls to replace dead X calls

src/gtkutil.c
src/pgtkterm.c

index 6822aeb4e32d9c9adea0199fadf4c62de17fd286..3e4d6e076ffd0d94ce212e8cbba02d3e82e15895 100644 (file)
@@ -1996,16 +1996,19 @@ xg_set_no_focus_on_map (struct frame *f, Lisp_Object no_focus_on_map)
 void
 xg_set_no_accept_focus (struct frame *f, Lisp_Object no_accept_focus)
 {
+  gboolean g_no_accept_focus = NILP (no_accept_focus) ? TRUE : FALSE;
 #ifdef HAVE_PGTK
   if (!FRAME_GTK_OUTER_WIDGET (f))
-    return;
+    {
+      if (FRAME_WIDGET(f))
+       gtk_widget_set_can_focus (FRAME_WIDGET(f), g_no_accept_focus);
+      return;
+    }
 #endif
   block_input ();
   if (FRAME_GTK_WIDGET (f))
     {
       GtkWindow *gwin = GTK_WINDOW (FRAME_GTK_OUTER_WIDGET (f));
-      gboolean g_no_accept_focus = NILP (no_accept_focus) ? TRUE : FALSE;
-
       gtk_window_set_accept_focus (gwin, g_no_accept_focus);
     }
   unblock_input ();
index 75386ee6c39ba2a3f1a52d8fa0f89a7e9e87e38d..978d4798d5feb7e5cd10b0346299cef139ff3abb 100644 (file)
@@ -4702,12 +4702,12 @@ pgtk_focus_frame (struct frame *f, bool noactivate)
 {
   struct pgtk_display_info *dpyinfo = FRAME_DISPLAY_INFO (f);
 
-  GtkWidget *wid = FRAME_GTK_OUTER_WIDGET (f);
+  GtkWidget *wid = FRAME_WIDGET (f);
 
   if (dpyinfo->x_focus_frame != f && wid != NULL)
     {
       block_input ();
-      gtk_window_present (GTK_WINDOW (wid));
+      gtk_widget_grab_focus(wid);
       unblock_input ();
     }
 }
@@ -6460,12 +6460,11 @@ button_event (GtkWidget * widget, GdkEvent * event, gpointer * user_data)
          if (FRAME_PARENT_FRAME (f) || (hf && frame_ancestor_p (f, hf)))
            {
              block_input ();
-#if 0
-             XSetInputFocus (FRAME_X_DISPLAY (f), FRAME_OUTER_WINDOW (f),
-                             RevertToParent, CurrentTime);
-             if (FRAME_PARENT_FRAME (f))
-               XRaiseWindow (FRAME_X_DISPLAY (f), FRAME_OUTER_WINDOW (f));
-#endif
+             gtk_widget_grab_focus(FRAME_GTK_WIDGET(f));
+             if (FRAME_GTK_OUTER_WIDGET (f))
+               {
+                 gtk_window_present (GTK_WINDOW (FRAME_GTK_OUTER_WIDGET (f)));
+               }
              unblock_input ();
            }
        }