# HG changeset patch # User Jan Dj¸«£rv # Date 1043511939 0 # Node ID a4d0ee33dcce6894875a7615902302f6c5e78fa2 # Parent d8479f6ef62da99849c5cf34d101c5b7e23d04bd Fix input methods for GTK. Don't right justify GTK help menu. diff -r d8479f6ef62d -r a4d0ee33dcce src/ChangeLog --- a/src/ChangeLog Sat Jan 25 15:14:16 2003 +0000 +++ b/src/ChangeLog Sat Jan 25 16:25:39 2003 +0000 @@ -1,3 +1,20 @@ +2003-01-25 Jan D. + + * 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 * w32fns.c (XPutPixel): Handle monochrome images; used for masks. diff -r d8479f6ef62d -r a4d0ee33dcce src/gtkutil.c --- a/src/gtkutil.c Sat Jan 25 15:14:16 2003 +0000 +++ b/src/gtkutil.c Sat Jan 25 16:25:39 2003 +0000 @@ -1462,10 +1462,6 @@ 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); diff -r d8479f6ef62d -r a4d0ee33dcce src/gtkutil.h --- a/src/gtkutil.h Sat Jan 25 15:14:16 2003 +0000 +++ b/src/gtkutil.h Sat Jan 25 16:25:39 2003 +0000 @@ -123,7 +123,7 @@ 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 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. */ diff -r d8479f6ef62d -r a4d0ee33dcce src/xfns.c --- a/src/xfns.c Sat Jan 25 15:14:16 2003 +0000 +++ b/src/xfns.c Sat Jan 25 16:25:39 2003 +0000 @@ -4039,6 +4039,35 @@ { 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 @@ { 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. */ diff -r d8479f6ef62d -r a4d0ee33dcce src/xterm.c --- a/src/xterm.c Sat Jan 25 15:14:16 2003 +0000 +++ b/src/xterm.c Sat Jan 25 16:25:39 2003 +0000 @@ -10214,6 +10214,32 @@ 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 @@ XEvent *xev = (XEvent*)gxev; if (current_numcharsp) - current_count += handle_one_xevent (current_dpyinfo, - xev, - current_bufp, - current_numcharsp, - ¤t_finish); - else - x_dispatch_event (xev, GDK_DISPLAY ()); + { +#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, + ¤t_finish); + } + else + 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 @@ /* 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 @@ 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 @@ for (i = 0; i < events; ++i) kbd_buffer_store_event (&bufp[i]); } + + return finish; } @@ -11667,17 +11707,9 @@ 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 @@ }; /* 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 @@ 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. */ diff -r d8479f6ef62d -r a4d0ee33dcce src/xterm.h --- a/src/xterm.h Sat Jan 25 15:14:16 2003 +0000 +++ b/src/xterm.h Sat Jan 25 16:25:39 2003 +0000 @@ -1090,7 +1090,7 @@ 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 */