summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorJan Djärv <jan.h.d@swipnet.se>2003-01-25 16:25:39 +0000
committerJan Djärv <jan.h.d@swipnet.se>2003-01-25 16:25:39 +0000
commit714020d511267397880798af93acdbba4b0271ca (patch)
tree4f9ca2bf1aca32f7e87d12142a14cad328c7691d /src
parent329e4d4fe310c2c5f9bc434c2d6685012d7eefb0 (diff)
downloademacs-714020d511267397880798af93acdbba4b0271ca.tar.gz
Fix input methods for GTK.
Don't right justify GTK help menu.
Diffstat (limited to 'src')
-rw-r--r--src/ChangeLog17
-rw-r--r--src/gtkutil.c4
-rw-r--r--src/gtkutil.h6
-rw-r--r--src/xfns.c31
-rw-r--r--src/xterm.c78
-rw-r--r--src/xterm.h2
6 files changed, 108 insertions, 30 deletions
diff --git a/src/ChangeLog b/src/ChangeLog
index bc02917930c..8339724aff3 100644
--- a/src/ChangeLog
+++ b/src/ChangeLog
@@ -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.
diff --git a/src/gtkutil.c b/src/gtkutil.c
index e9f3d7e9117..d2acfee8c54 100644
--- a/src/gtkutil.c
+++ b/src/gtkutil.c
@@ -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);
diff --git a/src/gtkutil.h b/src/gtkutil.h
index fa16bcdbb5f..103b9781417 100644
--- a/src/gtkutil.h
+++ b/src/gtkutil.h
@@ -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. */
diff --git a/src/xfns.c b/src/xfns.c
index 1b9b629b366..e7f339198c8 100644
--- a/src/xfns.c
+++ b/src/xfns.c
@@ -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. */
diff --git a/src/xterm.c b/src/xterm.c
index 08043900468..4fa0e8bb49b 100644
--- a/src/xterm.c
+++ b/src/xterm.c
@@ -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. */
diff --git a/src/xterm.h b/src/xterm.h
index 7ad148c0004..129dca32f5c 100644
--- a/src/xterm.h
+++ b/src/xterm.h
@@ -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 */