]> git.eshelyaron.com Git - emacs.git/commitdiff
Fix input methods for GTK.
authorJan Djärv <jan.h.d@swipnet.se>
Sat, 25 Jan 2003 16:25:39 +0000 (16:25 +0000)
committerJan Djärv <jan.h.d@swipnet.se>
Sat, 25 Jan 2003 16:25:39 +0000 (16:25 +0000)
Don't right justify GTK help menu.

src/ChangeLog
src/gtkutil.c
src/gtkutil.h
src/xfns.c
src/xterm.c
src/xterm.h

index bc02917930c3be72702836a6d409bb090dc6b280..8339724aff3d0d3fd370f6d67ad1d323c7d67d51 100644 (file)
@@ -1,3 +1,20 @@
+2003-01-25  Jan D.  <jan.h.d@swipnet.se>
+
+       * xterm.h: Change to return value of x_dispatch_event to int.
+
+       * xterm.c (x_filter_event): New function.
+       (event_handler_gdk, XTread_socket): Call x_filter_event.
+       (x_dispatch_event): Change to return value of finish.
+       (event_handler_gdk): Use return value from x_dispatch_event.
+
+       * xfns.c (x_window): Call create_frame_xic for GTK version to
+       initialize input methods.
+
+       * gtkutil.h: Add (void) prototypes.
+
+       * gtkutil.c (create_menus): Remove code that puts the help menu to
+       the right.
+
 2003-01-25  Jason Rumney  <jasonr@gnu.org>
 
        * w32fns.c (XPutPixel): Handle monochrome images; used for masks.
index e9f3d7e91172d6db6a0f51d8c6f2cae0b65bc889..d2acfee8c5477fefdb68bde96093a381a412a990 100644 (file)
@@ -1462,10 +1462,6 @@ create_menus (data, f, select_cb, deactivate_cb, highlight_cb,
                                                  0);
               gtk_menu_item_set_submenu (GTK_MENU_ITEM (w), submenu);
             }
-
-          /* Assume "Help" is the last menu in the menubar.  */
-          if (menu_bar_p && ! item->next)
-            gtk_menu_item_set_right_justified (GTK_MENU_ITEM (w), TRUE);
         }
 
       gtk_menu_shell_append (GTK_MENU_SHELL (wmenu), w);
index fa16bcdbb5f4483fa0e22d688dcc2428f0aa7882..103b97814172e45caee85cf8f318263a44ab2635 100644 (file)
@@ -123,7 +123,7 @@ typedef struct _widget_value
   struct _widget_value *free_list;
 } widget_value;
 
-extern widget_value *malloc_widget_value ();
+extern widget_value *malloc_widget_value P_ ((void));
 extern void free_widget_value P_ ((widget_value *));
 
 extern char *xg_get_file_name P_ ((FRAME_PTR f,
@@ -186,10 +186,10 @@ extern void x_wm_set_size_hint P_ ((FRAME_PTR f,
 extern void xg_set_background_color P_ ((FRAME_PTR f, unsigned long bg));
 
 /* Mark all callback data that are Lisp_object:s during GC.  */
-extern void xg_mark_data ();
+extern void xg_mark_data P_ ((void));
 
 /* Initialize GTK specific parts.  */
-extern void xg_initialize ();
+extern void xg_initialize P_ ((void));
 
 /* Setting scrollbar values invokes the callback.  Use this variable
    to indicate that the callback should do nothing.  */
index 1b9b629b36638046ec9600c5b645b15704899346..e7f339198c87783d12a0c8e0441516d67499ba07 100644 (file)
@@ -4039,6 +4039,35 @@ x_window (f)
 {
   if (! xg_create_frame_widgets (f))
     error ("Unable to create window");
+
+#ifdef HAVE_X_I18N
+  FRAME_XIC (f) = NULL;
+#ifdef USE_XIM
+  BLOCK_INPUT;
+  create_frame_xic (f);
+  if (FRAME_XIC (f))
+    {
+      /* XIM server might require some X events. */
+      unsigned long fevent = NoEventMask;
+      XGetICValues(FRAME_XIC (f), XNFilterEvents, &fevent, NULL);
+
+      if (fevent != NoEventMask)
+        {
+          XSetWindowAttributes attributes;
+          XWindowAttributes wattr;
+          unsigned long attribute_mask;
+
+          XGetWindowAttributes (FRAME_X_DISPLAY (f), FRAME_X_WINDOW (f),
+                                &wattr);
+          attributes.event_mask = wattr.your_event_mask | fevent;
+          attribute_mask = CWEventMask;
+          XChangeWindowAttributes (FRAME_X_DISPLAY (f), FRAME_X_WINDOW (f),
+                                   attribute_mask, &attributes);
+        }
+    }
+  UNBLOCK_INPUT;
+#endif
+#endif
 }
 
 #else /*! USE_GTK */
@@ -11761,7 +11790,7 @@ selection dialog's entry field, if MUSTMATCH is non-nil.  */)
     {
       XEvent event;
       XtAppNextEvent (Xt_app_con, &event);
-      x_dispatch_event (&event, FRAME_X_DISPLAY (f) );
+      (void) x_dispatch_event (&event, FRAME_X_DISPLAY (f) );
     }
 
   /* Get the result.  */
index 080439004685faead37c47a0f0b15eed97a8a8b4..4fa0e8bb49b4172da02413f9eda14455d18eefbb 100644 (file)
@@ -10214,6 +10214,32 @@ enum
   X_EVENT_DROP
 };
 
+/* Filter events for the current X input method.
+   DPYINFO is the display this event is for.
+   EVENT is the X event to filter.
+
+   Returns non-zero if the event was filtered, caller shall not process
+   this event further.
+   Returns zero if event is wasn't filtered.  */
+   
+#ifdef HAVE_X_I18N
+static int
+x_filter_event (dpyinfo, event)
+     struct x_display_info *dpyinfo;
+     XEvent *event;
+{
+  /* XFilterEvent returns non-zero if the input method has
+   consumed the event.  We pass the frame's X window to
+   XFilterEvent because that's the one for which the IC
+   was created.  */
+
+  struct frame *f1 = x_any_window_to_frame (dpyinfo,
+                                            event->xclient.window);
+
+  return XFilterEvent (event, f1 ? FRAME_X_WINDOW (f1) : None);
+}
+#endif
+
 #ifdef USE_GTK
 static struct x_display_info *current_dpyinfo;
 static struct input_event **current_bufp;
@@ -10233,13 +10259,23 @@ event_handler_gdk (gxev, ev, data)
   XEvent *xev = (XEvent*)gxev;
 
   if (current_numcharsp)
-    current_count += handle_one_xevent (current_dpyinfo,
-                                        xev,
-                                        current_bufp,
-                                        current_numcharsp,
-                                        &current_finish);
+    {
+#ifdef HAVE_X_I18N
+      /* Filter events for the current X input method.
+         GTK calls XFilterEvent but not for key press and release,
+         so we do it here.  */
+      if (xev->type == KeyPress || xev->type == KeyRelease)
+        if (x_filter_event (current_dpyinfo, xev))
+          return GDK_FILTER_REMOVE;
+#endif
+      current_count += handle_one_xevent (current_dpyinfo,
+                                          xev,
+                                          current_bufp,
+                                          current_numcharsp,
+                                          &current_finish);
+    }
   else
-    x_dispatch_event (xev, GDK_DISPLAY ());
+    current_finish = x_dispatch_event (xev, GDK_DISPLAY ());
 
   if (current_finish == X_EVENT_GOTO_OUT || current_finish == X_EVENT_DROP)
     return GDK_FILTER_REMOVE;
@@ -11520,8 +11556,10 @@ handle_one_xevent (dpyinfo, eventp, bufp_r, numcharsp, finish)
 
 /* Handles the XEvent EVENT on display DISPLAY.
    This is used for event loops outside the normal event handling,
-   i.e. looping while a popup menu or a dialog is posted.  */
-void
+   i.e. looping while a popup menu or a dialog is posted.
+
+   Returns the value handle_one_xevent sets in the finish argument.  */
+int
 x_dispatch_event (event, display)
      XEvent *event;
      Display *display;
@@ -11530,7 +11568,7 @@ x_dispatch_event (event, display)
   struct input_event bufp[10];
   struct input_event *bufpp = bufp;
   int numchars = 10;
-  int finish;
+  int finish = X_EVENT_NORMAL;
       
   for (dpyinfo = x_display_list; dpyinfo; dpyinfo = dpyinfo->next)
     if (dpyinfo->display == display)
@@ -11547,6 +11585,8 @@ x_dispatch_event (event, display)
       for (i = 0; i < events; ++i)
         kbd_buffer_store_event (&bufp[i]);
     }
+
+  return finish;
 }
 
 
@@ -11667,17 +11707,9 @@ XTread_socket (sd, bufp, numchars, expected)
          XNextEvent (dpyinfo->display, &event);
 
 #ifdef HAVE_X_I18N
-         {
-           /* Filter events for the current X input method.
-              XFilterEvent returns non-zero if the input method has
-              consumed the event.  We pass the frame's X window to
-              XFilterEvent because that's the one for which the IC
-              was created.  */
-           struct frame *f1 = x_any_window_to_frame (dpyinfo,
-                                                     event.xclient.window);
-           if (XFilterEvent (&event, f1 ? FRAME_X_WINDOW (f1) : None))
-             break;
-         }
+          /* Filter events for the current X input method.  */
+          if (x_filter_event (dpyinfo, &event))
+            break;
 #endif
          event_found = 1;
 
@@ -13025,7 +13057,7 @@ struct xim_inst_t
 };
 
 /* XIM instantiate callback function, which is called whenever an XIM
-   server is available.  DISPLAY is teh display of the XIM.
+   server is available.  DISPLAY is the display of the XIM.
    CLIENT_DATA contains a pointer to an xim_inst_t structure created
    when the callback was registered.  */
 
@@ -15167,6 +15199,10 @@ x_term_init (display_name, xrm_option, resource_name)
     argv[argc++] = "--name";
     argv[argc++] = resource_name;
     
+#ifdef HAVE_X11R5
+    XSetLocaleModifiers ("");
+#endif
+
     gtk_init (&argc, &argv2);
 
     /* gtk_init does set_locale.  We must fix locale after calling it.  */
index 7ad148c00042c0ce182a373e5b77690f374594aa..129dca32f5c33e7a7c87c92c77b01017b7e3a2cc 100644 (file)
@@ -1090,7 +1090,7 @@ extern void x_clear_area P_ ((Display *, Window, int, int, int, int, int));
 extern void x_fullscreen_adjust P_ ((struct frame *f, int *, int *,
                                      int *, int *));
 
-extern void x_dispatch_event P_ ((XEvent *, Display *));
+extern int x_dispatch_event P_ ((XEvent *, Display *));
 
 /* Defined in xselect.c */