X-Git-Url: https://git.hcoop.net/bpt/emacs.git/blobdiff_plain/6e7d621c18f9645c886c0bb4fac69ec5c9c1fd12..dee186b61d9f2528ed1f2125035dd7e5e5a12f2a:/src/xfns.c diff --git a/src/xfns.c b/src/xfns.c index 0ebce8d1e2..b2f8222c6e 100644 --- a/src/xfns.c +++ b/src/xfns.c @@ -99,6 +99,12 @@ along with GNU Emacs. If not, see . */ #include #include #include +#include +#include +#endif + +#ifdef USE_LUCID +#include "../lwlib/xlwmenu.h" #endif #if !defined(NO_EDITRES) @@ -110,11 +116,6 @@ extern void _XEditResCheckMessages (); extern LWLIB_ID widget_id_tick; -#ifdef USE_LUCID -/* This is part of a kludge--see lwlib/xlwmenu.c. */ -extern XFontStruct *xlwmenu_default_font; -#endif - extern void free_frame_menubar (); extern double atof (); @@ -162,6 +163,10 @@ int x_gtk_file_dialog_help_text; int x_gtk_whole_detached_tool_bar; +/* If non-zero, use Gtk+ tooltips. */ + +static int x_gtk_use_system_tooltips; + /* The background and shape of the mouse pointer, and shape when not over text or in the modeline. */ @@ -199,12 +204,6 @@ Lisp_Object Qundefined_color; Lisp_Object Qcompound_text, Qcancel_timer; Lisp_Object Qfont_param; -/* In dispnew.c */ - -extern Lisp_Object Vwindow_system_version; - -/* The below are defined in frame.c. */ - #if GLYPH_DEBUG int image_cache_refcount, dpyinfo_refcount; #endif @@ -217,7 +216,7 @@ char *x_last_font_name; /* Error if we are not connected to X. */ void -check_x () +check_x (void) { if (! x_in_use) error ("X windows are not in use or not initialized"); @@ -227,7 +226,7 @@ check_x () You should not call this unless HAVE_MENUS is defined. */ int -have_menus_p () +have_menus_p (void) { return x_in_use; } @@ -236,8 +235,7 @@ have_menus_p () and checking validity for X. */ FRAME_PTR -check_x_frame (frame) - Lisp_Object frame; +check_x_frame (Lisp_Object frame) { FRAME_PTR f; @@ -256,8 +254,7 @@ check_x_frame (frame) the first X display on the list. */ struct x_display_info * -check_x_display_info (object) - Lisp_Object object; +check_x_display_info (Lisp_Object object) { struct x_display_info *dpyinfo = NULL; @@ -299,9 +296,7 @@ check_x_display_info (object) /* This function can be called during GC, so use GC_xxx type test macros. */ struct frame * -x_window_to_frame (dpyinfo, wdesc) - struct x_display_info *dpyinfo; - int wdesc; +x_window_to_frame (struct x_display_info *dpyinfo, int wdesc) { Lisp_Object tail, frame; struct frame *f; @@ -349,9 +344,7 @@ x_window_to_frame (dpyinfo, wdesc) windows. */ struct frame * -x_any_window_to_frame (dpyinfo, wdesc) - struct x_display_info *dpyinfo; - int wdesc; +x_any_window_to_frame (struct x_display_info *dpyinfo, int wdesc) { Lisp_Object tail, frame; struct frame *f, *found; @@ -402,10 +395,9 @@ x_any_window_to_frame (dpyinfo, wdesc) /* Likewise, but consider only the menu bar widget. */ struct frame * -x_menubar_window_to_frame (dpyinfo, wdesc) - struct x_display_info *dpyinfo; - int wdesc; +x_menubar_window_to_frame (struct x_display_info *dpyinfo, XEvent *event) { + Window wdesc = event->xany.window; Lisp_Object tail, frame; struct frame *f; struct x_output *x; @@ -421,21 +413,11 @@ x_menubar_window_to_frame (dpyinfo, wdesc) if (!FRAME_X_P (f) || FRAME_X_DISPLAY_INFO (f) != dpyinfo) continue; x = f->output_data.x; - /* Match if the window is this frame's menubar. */ #ifdef USE_GTK - if (x->menubar_widget) - { - GtkWidget *gwdesc = xg_win_to_widget (dpyinfo->display, wdesc); - - /* This gives false positives, but the rectangle check in xterm.c - where this is called takes care of that. */ - if (gwdesc != 0 - && (gwdesc == x->menubar_widget - || gtk_widget_is_ancestor (x->menubar_widget, gwdesc) - || gtk_widget_is_ancestor (gwdesc, x->menubar_widget))) - return f; - } + if (x->menubar_widget && xg_event_is_for_menubar (f, event)) + return f; #else + /* Match if the window is this frame's menubar. */ if (x->menubar_widget && lw_window_is_in_menubar (wdesc, x->menubar_widget)) return f; @@ -448,9 +430,7 @@ x_menubar_window_to_frame (dpyinfo, wdesc) If WDESC is some other (smaller) window, we return 0. */ struct frame * -x_top_window_to_frame (dpyinfo, wdesc) - struct x_display_info *dpyinfo; - int wdesc; +x_top_window_to_frame (struct x_display_info *dpyinfo, int wdesc) { Lisp_Object tail, frame; struct frame *f; @@ -498,33 +478,33 @@ x_top_window_to_frame (dpyinfo, wdesc) -static void x_default_font_parameter P_ ((struct frame *, Lisp_Object)); - -static Lisp_Object unwind_create_frame P_ ((Lisp_Object)); -static Lisp_Object unwind_create_tip_frame P_ ((Lisp_Object)); - -void x_set_foreground_color P_ ((struct frame *, Lisp_Object, Lisp_Object)); -static void x_set_wait_for_wm P_ ((struct frame *, Lisp_Object, Lisp_Object)); -void x_set_background_color P_ ((struct frame *, Lisp_Object, Lisp_Object)); -void x_set_mouse_color P_ ((struct frame *, Lisp_Object, Lisp_Object)); -void x_set_cursor_color P_ ((struct frame *, Lisp_Object, Lisp_Object)); -void x_set_border_color P_ ((struct frame *, Lisp_Object, Lisp_Object)); -void x_set_cursor_type P_ ((struct frame *, Lisp_Object, Lisp_Object)); -void x_set_icon_type P_ ((struct frame *, Lisp_Object, Lisp_Object)); -void x_set_icon_name P_ ((struct frame *, Lisp_Object, Lisp_Object)); -void x_explicitly_set_name P_ ((struct frame *, Lisp_Object, Lisp_Object)); -void x_set_menu_bar_lines P_ ((struct frame *, Lisp_Object, Lisp_Object)); -void x_set_title P_ ((struct frame *, Lisp_Object, Lisp_Object)); -void x_set_tool_bar_lines P_ ((struct frame *, Lisp_Object, Lisp_Object)); -void x_set_scroll_bar_foreground P_ ((struct frame *, Lisp_Object, - Lisp_Object)); -void x_set_scroll_bar_background P_ ((struct frame *, Lisp_Object, - Lisp_Object)); -static Lisp_Object x_default_scroll_bar_color_parameter P_ ((struct frame *, - Lisp_Object, - Lisp_Object, - char *, char *, - int)); +static void x_default_font_parameter (struct frame *, Lisp_Object); + +static Lisp_Object unwind_create_frame (Lisp_Object); +static Lisp_Object unwind_create_tip_frame (Lisp_Object); + +void x_set_foreground_color (struct frame *, Lisp_Object, Lisp_Object); +static void x_set_wait_for_wm (struct frame *, Lisp_Object, Lisp_Object); +void x_set_background_color (struct frame *, Lisp_Object, Lisp_Object); +void x_set_mouse_color (struct frame *, Lisp_Object, Lisp_Object); +void x_set_cursor_color (struct frame *, Lisp_Object, Lisp_Object); +void x_set_border_color (struct frame *, Lisp_Object, Lisp_Object); +void x_set_cursor_type (struct frame *, Lisp_Object, Lisp_Object); +void x_set_icon_type (struct frame *, Lisp_Object, Lisp_Object); +void x_set_icon_name (struct frame *, Lisp_Object, Lisp_Object); +void x_explicitly_set_name (struct frame *, Lisp_Object, Lisp_Object); +void x_set_menu_bar_lines (struct frame *, Lisp_Object, Lisp_Object); +void x_set_title (struct frame *, Lisp_Object, Lisp_Object); +void x_set_tool_bar_lines (struct frame *, Lisp_Object, Lisp_Object); +void x_set_scroll_bar_foreground (struct frame *, Lisp_Object, + Lisp_Object); +void x_set_scroll_bar_background (struct frame *, Lisp_Object, + Lisp_Object); +static Lisp_Object x_default_scroll_bar_color_parameter (struct frame *, + Lisp_Object, + Lisp_Object, + const char *, const char *, + int); /* Store the screen positions of frame F into XPTR and YPTR. @@ -532,9 +512,7 @@ static Lisp_Object x_default_scroll_bar_color_parameter P_ ((struct frame *, not Emacs's own window. */ void -x_real_positions (f, xptr, yptr) - FRAME_PTR f; - int *xptr, *yptr; +x_real_positions (FRAME_PTR f, int *xptr, int *yptr) { int win_x, win_y, outer_x, outer_y; int real_x = 0, real_y = 0; @@ -652,9 +630,7 @@ x_real_positions (f, xptr, yptr) /* Gamma-correct COLOR on frame F. */ void -gamma_correct (f, color) - struct frame *f; - XColor *color; +gamma_correct (struct frame *f, XColor *color) { if (f->gamma) { @@ -671,18 +647,19 @@ gamma_correct (f, color) no color could be allocated. */ int -x_defined_color (f, color_name, color, alloc_p) - struct frame *f; - char *color_name; - XColor *color; - int alloc_p; +x_defined_color (struct frame *f, const char *color_name, + XColor *color, int alloc_p) { - int success_p; + int success_p = 0; Display *dpy = FRAME_X_DISPLAY (f); Colormap cmap = FRAME_X_COLORMAP (f); BLOCK_INPUT; - success_p = XParseColor (dpy, cmap, color_name, color); +#ifdef USE_GTK + success_p = xg_check_special_colors (f, color_name, color); +#endif + if (!success_p) + success_p = XParseColor (dpy, cmap, color_name, color); if (success_p && alloc_p) success_p = x_alloc_nearest_color (f, cmap, color); UNBLOCK_INPUT; @@ -696,10 +673,7 @@ x_defined_color (f, color_name, color, alloc_p) Signal an error if color can't be allocated. */ int -x_decode_color (f, color_name, mono_color) - FRAME_PTR f; - Lisp_Object color_name; - int mono_color; +x_decode_color (FRAME_PTR f, Lisp_Object color_name, int mono_color) { XColor cdef; @@ -733,22 +707,34 @@ x_decode_color (f, color_name, mono_color) See also the comment of wait_for_wm in struct x_output. */ static void -x_set_wait_for_wm (f, new_value, old_value) - struct frame *f; - Lisp_Object new_value, old_value; +x_set_wait_for_wm (struct frame *f, Lisp_Object new_value, Lisp_Object old_value) { f->output_data.x->wait_for_wm = !NILP (new_value); } +static void +x_set_tool_bar_position (struct frame *f, + Lisp_Object new_value, + Lisp_Object old_value) +{ + if (! EQ (new_value, Qleft) && ! EQ (new_value, Qright) + && ! EQ (new_value, Qbottom) && ! EQ (new_value, Qtop)) + return; + if (EQ (new_value, old_value)) return; + +#ifdef USE_GTK + if (xg_change_toolbar_position (f, new_value)) + f->tool_bar_position = new_value; +#endif +} + #ifdef USE_GTK /* Set icon from FILE for frame F. By using GTK functions the icon may be any format that GdkPixbuf knows about, i.e. not just bitmaps. */ int -xg_set_icon (f, file) - FRAME_PTR f; - Lisp_Object file; +xg_set_icon (FRAME_PTR f, Lisp_Object file) { int result = 0; Lisp_Object found; @@ -782,12 +768,10 @@ xg_set_icon (f, file) } int -xg_set_icon_from_xpm_data (f, data) - FRAME_PTR f; - char **data; +xg_set_icon_from_xpm_data (FRAME_PTR f, const char **data) { int result = 0; - GdkPixbuf *pixbuf = gdk_pixbuf_new_from_xpm_data ((const char **) data); + GdkPixbuf *pixbuf = gdk_pixbuf_new_from_xpm_data (data); if (!pixbuf) return 0; @@ -808,9 +792,7 @@ xg_set_icon_from_xpm_data (f, data) in the standard place; do not attempt to change the window. */ void -x_set_foreground_color (f, arg, oldval) - struct frame *f; - Lisp_Object arg, oldval; +x_set_foreground_color (struct frame *f, Lisp_Object arg, Lisp_Object oldval) { struct x_output *x = f->output_data.x; unsigned long fg, old_fg; @@ -846,9 +828,7 @@ x_set_foreground_color (f, arg, oldval) } void -x_set_background_color (f, arg, oldval) - struct frame *f; - Lisp_Object arg, oldval; +x_set_background_color (struct frame *f, Lisp_Object arg, Lisp_Object oldval) { struct x_output *x = f->output_data.x; unsigned long bg; @@ -894,8 +874,7 @@ x_set_background_color (f, arg, oldval) } static Cursor -make_invisible_cursor (f) - struct frame *f; +make_invisible_cursor (struct frame *f) { Display *dpy = FRAME_X_DISPLAY (f); static char const no_data[] = { 0 }; @@ -923,9 +902,7 @@ make_invisible_cursor (f) } void -x_set_mouse_color (f, arg, oldval) - struct frame *f; - Lisp_Object arg, oldval; +x_set_mouse_color (struct frame *f, Lisp_Object arg, Lisp_Object oldval) { struct x_output *x = f->output_data.x; Display *dpy = FRAME_X_DISPLAY (f); @@ -1032,7 +1009,7 @@ x_set_mouse_color (f, arg, oldval) if (FRAME_X_DISPLAY_INFO (f)->invisible_cursor == 0) FRAME_X_DISPLAY_INFO (f)->invisible_cursor = make_invisible_cursor (f); - + if (cursor != x->text_cursor && x->text_cursor != 0) XFreeCursor (dpy, x->text_cursor); @@ -1070,9 +1047,7 @@ x_set_mouse_color (f, arg, oldval) } void -x_set_cursor_color (f, arg, oldval) - struct frame *f; - Lisp_Object arg, oldval; +x_set_cursor_color (struct frame *f, Lisp_Object arg, Lisp_Object oldval) { unsigned long fore_pixel, pixel; int fore_pixel_allocated_p = 0, pixel_allocated_p = 0; @@ -1143,9 +1118,7 @@ x_set_cursor_color (f, arg, oldval) F has an x-window. */ void -x_set_border_pixel (f, pix) - struct frame *f; - int pix; +x_set_border_pixel (struct frame *f, int pix) { unload_color (f, f->output_data.x->border_pixel); f->output_data.x->border_pixel = pix; @@ -1174,9 +1147,7 @@ x_set_border_pixel (f, pix) and so emacs' border colors may be overridden. */ void -x_set_border_color (f, arg, oldval) - struct frame *f; - Lisp_Object arg, oldval; +x_set_border_color (struct frame *f, Lisp_Object arg, Lisp_Object oldval) { int pix; @@ -1188,9 +1159,7 @@ x_set_border_color (f, arg, oldval) void -x_set_cursor_type (f, arg, oldval) - FRAME_PTR f; - Lisp_Object arg, oldval; +x_set_cursor_type (FRAME_PTR f, Lisp_Object arg, Lisp_Object oldval) { set_frame_cursor_types (f, arg); @@ -1199,9 +1168,7 @@ x_set_cursor_type (f, arg, oldval) } void -x_set_icon_type (f, arg, oldval) - struct frame *f; - Lisp_Object arg, oldval; +x_set_icon_type (struct frame *f, Lisp_Object arg, Lisp_Object oldval) { int result; @@ -1233,9 +1200,7 @@ x_set_icon_type (f, arg, oldval) } void -x_set_icon_name (f, arg, oldval) - struct frame *f; - Lisp_Object arg, oldval; +x_set_icon_name (struct frame *f, Lisp_Object arg, Lisp_Object oldval) { int result; @@ -1273,9 +1238,7 @@ x_set_icon_name (f, arg, oldval) void -x_set_menu_bar_lines (f, value, oldval) - struct frame *f; - Lisp_Object value, oldval; +x_set_menu_bar_lines (struct frame *f, Lisp_Object value, Lisp_Object oldval) { int nlines; #if ! defined (USE_X_TOOLKIT) && ! defined (USE_GTK) @@ -1365,9 +1328,7 @@ x_set_menu_bar_lines (f, value, oldval) The frame's height doesn't change. */ void -x_set_tool_bar_lines (f, value, oldval) - struct frame *f; - Lisp_Object value, oldval; +x_set_tool_bar_lines (struct frame *f, Lisp_Object value, Lisp_Object oldval) { int delta, nlines, root_height; Lisp_Object root_window; @@ -1462,9 +1423,7 @@ x_set_tool_bar_lines (f, value, oldval) the frame parameter. */ void -x_set_scroll_bar_foreground (f, value, oldval) - struct frame *f; - Lisp_Object value, oldval; +x_set_scroll_bar_foreground (struct frame *f, Lisp_Object value, Lisp_Object oldval) { unsigned long pixel; @@ -1497,9 +1456,7 @@ x_set_scroll_bar_foreground (f, value, oldval) parameter. */ void -x_set_scroll_bar_background (f, value, oldval) - struct frame *f; - Lisp_Object value, oldval; +x_set_scroll_bar_background (struct frame *f, Lisp_Object value, Lisp_Object oldval) { unsigned long pixel; @@ -1562,11 +1519,7 @@ x_set_scroll_bar_background (f, value, oldval) the result should be `COMPOUND_TEXT'. */ static unsigned char * -x_encode_text (string, coding_system, selectionp, text_bytes, stringp, freep) - Lisp_Object string, coding_system; - int *text_bytes, *stringp; - int selectionp; - int *freep; +x_encode_text (Lisp_Object string, Lisp_Object coding_system, int selectionp, int *text_bytes, int *stringp, int *freep) { int result = string_xstring_p (string); struct coding_system coding; @@ -1600,9 +1553,7 @@ x_encode_text (string, coding_system, selectionp, text_bytes, stringp, freep) icon name to NAME. */ static void -x_set_name_internal (f, name) - FRAME_PTR f; - Lisp_Object name; +x_set_name_internal (FRAME_PTR f, Lisp_Object name) { if (FRAME_X_WINDOW (f)) { @@ -1612,8 +1563,8 @@ x_set_name_internal (f, name) int bytes, stringp; int do_free_icon_value = 0, do_free_text_value = 0; Lisp_Object coding_system; -#ifdef USE_GTK Lisp_Object encoded_name; + Lisp_Object encoded_icon_name; struct gcpro gcpro1; /* As ENCODE_UTF_8 may cause GC and relocation of string data, @@ -1621,7 +1572,6 @@ x_set_name_internal (f, name) GCPRO1 (name); encoded_name = ENCODE_UTF_8 (name); UNGCPRO; -#endif coding_system = Qcompound_text; /* Note: Encoding strategy @@ -1637,7 +1587,12 @@ x_set_name_internal (f, name) We may also be able to use "UTF8_STRING" in text.encoding in the future which can encode all Unicode characters. But, for the moment, there's no way to know that the - current window manager supports it or not. */ + current window manager supports it or not. + + Either way, we also set the _NET_WM_NAME and _NET_WM_ICON_NAME + properties. Per the EWMH specification, those two properties + are always UTF8_STRING. This matches what gtk_window_set_title() + does in the USE_GTK case. */ text.value = x_encode_text (name, coding_system, 0, &bytes, &stringp, &do_free_text_value); text.encoding = (stringp ? XA_STRING @@ -1648,6 +1603,7 @@ x_set_name_internal (f, name) if (!STRINGP (f->icon_name)) { icon = text; + encoded_icon_name = encoded_name; } else { @@ -1658,6 +1614,8 @@ x_set_name_internal (f, name) : FRAME_X_DISPLAY_INFO (f)->Xatom_COMPOUND_TEXT); icon.format = 8; icon.nitems = bytes; + + encoded_icon_name = ENCODE_UTF_8 (f->icon_name); } #ifdef USE_GTK @@ -1665,9 +1623,21 @@ x_set_name_internal (f, name) (char *) SDATA (encoded_name)); #else /* not USE_GTK */ XSetWMName (FRAME_X_DISPLAY (f), FRAME_OUTER_WINDOW (f), &text); + XChangeProperty (FRAME_X_DISPLAY (f), FRAME_OUTER_WINDOW (f), + FRAME_X_DISPLAY_INFO (f)->Xatom_net_wm_name, + FRAME_X_DISPLAY_INFO (f)->Xatom_UTF8_STRING, + 8, PropModeReplace, + (char *) SDATA (encoded_name), + SBYTES (encoded_name)); #endif /* not USE_GTK */ XSetWMIconName (FRAME_X_DISPLAY (f), FRAME_OUTER_WINDOW (f), &icon); + XChangeProperty (FRAME_X_DISPLAY (f), FRAME_OUTER_WINDOW (f), + FRAME_X_DISPLAY_INFO (f)->Xatom_net_wm_icon_name, + FRAME_X_DISPLAY_INFO (f)->Xatom_UTF8_STRING, + 8, PropModeReplace, + (char *) SDATA (encoded_icon_name), + SBYTES (encoded_icon_name)); if (do_free_icon_value) xfree (icon.value); @@ -1690,10 +1660,7 @@ x_set_name_internal (f, name) F->explicit_name is set, ignore the new name; otherwise, set it. */ void -x_set_name (f, name, explicit) - struct frame *f; - Lisp_Object name; - int explicit; +x_set_name (struct frame *f, Lisp_Object name, int explicit) { /* Make sure that requests from lisp code override requests from Emacs redisplay code. */ @@ -1740,9 +1707,7 @@ x_set_name (f, name, explicit) specified a name for the frame; the name will override any set by the redisplay code. */ void -x_explicitly_set_name (f, arg, oldval) - FRAME_PTR f; - Lisp_Object arg, oldval; +x_explicitly_set_name (FRAME_PTR f, Lisp_Object arg, Lisp_Object oldval) { x_set_name (f, arg, 1); } @@ -1751,9 +1716,7 @@ x_explicitly_set_name (f, arg, oldval) name; names set this way will never override names set by the user's lisp code. */ void -x_implicitly_set_name (f, arg, oldval) - FRAME_PTR f; - Lisp_Object arg, oldval; +x_implicitly_set_name (FRAME_PTR f, Lisp_Object arg, Lisp_Object oldval) { x_set_name (f, arg, 0); } @@ -1762,9 +1725,7 @@ x_implicitly_set_name (f, arg, oldval) If NAME is nil, use the frame name as the title. */ void -x_set_title (f, name, old_name) - struct frame *f; - Lisp_Object name, old_name; +x_set_title (struct frame *f, Lisp_Object name, Lisp_Object old_name) { /* Don't change the title if it's already NAME. */ if (EQ (name, f->title)) @@ -1783,8 +1744,7 @@ x_set_title (f, name, old_name) } void -x_set_scroll_bar_default_width (f) - struct frame *f; +x_set_scroll_bar_default_width (struct frame *f) { int wid = FRAME_COLUMN_WIDTH (f); @@ -1811,14 +1771,10 @@ x_set_scroll_bar_default_width (f) named NAME. If that is not found either, use the value DEFLT. */ static Lisp_Object -x_default_scroll_bar_color_parameter (f, alist, prop, xprop, xclass, - foreground_p) - struct frame *f; - Lisp_Object alist; - Lisp_Object prop; - char *xprop; - char *xclass; - int foreground_p; +x_default_scroll_bar_color_parameter (struct frame *f, + Lisp_Object alist, Lisp_Object prop, + const char *xprop, const char *xclass, + int foreground_p) { struct x_display_info *dpyinfo = FRAME_X_DISPLAY_INFO (f); Lisp_Object tem; @@ -1869,9 +1825,7 @@ x_default_scroll_bar_color_parameter (f, alist, prop, xprop, xclass, for example, but Xt doesn't). */ static void -hack_wm_protocols (f, widget) - FRAME_PTR f; - Widget widget; +hack_wm_protocols (FRAME_PTR f, Widget widget) { Display *dpy = XtDisplay (widget); Window w = XtWindow (widget); @@ -1937,8 +1891,8 @@ hack_wm_protocols (f, widget) #ifdef HAVE_X_I18N -static XFontSet xic_create_xfontset P_ ((struct frame *)); -static XIMStyle best_xim_style P_ ((XIMStyles *, XIMStyles *)); +static XFontSet xic_create_xfontset (struct frame *); +static XIMStyle best_xim_style (XIMStyles *, XIMStyles *); /* Supported XIM styles, ordered by preference. */ @@ -1960,14 +1914,12 @@ static XIMStyle supported_xim_styles[] = /* Create an X fontset on frame F with base font name BASE_FONTNAME. */ -char xic_defaut_fontset[] = "-*-*-*-r-normal--14-*-*-*-*-*-*-*"; +const char xic_defaut_fontset[] = "-*-*-*-r-normal--14-*-*-*-*-*-*-*"; /* Create an Xt fontset spec from the name of a base font. If `motif' is True use the Motif syntax. */ char * -xic_create_fontsetname (base_fontname, motif) - char *base_fontname; - Bool motif; +xic_create_fontsetname (const char *base_fontname, int motif) { const char *sep = motif ? ";" : ","; char *fontsetname; @@ -1977,7 +1929,7 @@ xic_create_fontsetname (base_fontname, motif) { /* There is no base font name, use the default. */ int len = strlen (base_fontname) + 2; fontsetname = xmalloc (len); - bzero (fontsetname, len); + memset (fontsetname, 0, len); strcpy (fontsetname, base_fontname); } else @@ -1987,7 +1939,7 @@ xic_create_fontsetname (base_fontname, motif) - the base font. - the base font where the charset spec is replaced by -*-*. - the same but with the family also replaced with -*-*-. */ - char *p = base_fontname; + const char *p = base_fontname; int i; for (i = 0; *p; p++) @@ -1998,7 +1950,7 @@ xic_create_fontsetname (base_fontname, motif) Use the specified font plus the default. */ int len = strlen (base_fontname) + strlen (xic_defaut_fontset) + 3; fontsetname = xmalloc (len); - bzero (fontsetname, len); + memset (fontsetname, 0, len); strcpy (fontsetname, base_fontname); strcat (fontsetname, sep); strcat (fontsetname, xic_defaut_fontset); @@ -2006,13 +1958,13 @@ xic_create_fontsetname (base_fontname, motif) else { int len; - char *p1 = NULL, *p2 = NULL, *p3 = NULL; + const char *p1 = NULL, *p2 = NULL, *p3 = NULL; char *font_allcs = NULL; char *font_allfamilies = NULL; char *font_all = NULL; - char *allcs = "*-*-*-*-*-*-*"; - char *allfamilies = "-*-*-"; - char *all = "*-*-*-*-"; + const char *allcs = "*-*-*-*-*-*-*"; + const char *allfamilies = "-*-*-"; + const char *all = "*-*-*-*-"; char *base; for (i = 0, p = base_fontname; i < 8; p++) @@ -2035,7 +1987,7 @@ xic_create_fontsetname (base_fontname, motif) int diff = (p2 - p3) - 2; base = alloca (strlen (base_fontname) + 1); - bcopy (base_fontname, base, p3 - base_fontname); + memcpy (base, base_fontname, p3 - base_fontname); base[p3 - base_fontname] = '*'; base[(p3 - base_fontname) + 1] = '-'; strcpy (base + (p3 - base_fontname) + 2, p2); @@ -2048,33 +2000,33 @@ xic_create_fontsetname (base_fontname, motif) /* Build the font spec that matches all charsets. */ len = p - base_fontname + strlen (allcs) + 1; font_allcs = (char *) alloca (len); - bzero (font_allcs, len); - bcopy (base_fontname, font_allcs, p - base_fontname); + memset (font_allcs, 0, len); + memcpy (font_allcs, base_fontname, p - base_fontname); strcat (font_allcs, allcs); /* Build the font spec that matches all families and add-styles. */ len = p - p1 + strlen (allcs) + strlen (allfamilies) + 1; font_allfamilies = (char *) alloca (len); - bzero (font_allfamilies, len); + memset (font_allfamilies, 0, len); strcpy (font_allfamilies, allfamilies); - bcopy (p1, font_allfamilies + strlen (allfamilies), p - p1); + memcpy (font_allfamilies + strlen (allfamilies), p1, p - p1); strcat (font_allfamilies, allcs); /* Build the font spec that matches all. */ len = p - p2 + strlen (allcs) + strlen (all) + strlen (allfamilies) + 1; font_all = (char *) alloca (len); - bzero (font_all, len); + memset (font_all, 0, len); strcpy (font_all, allfamilies); strcat (font_all, all); - bcopy (p2, font_all + strlen (all) + strlen (allfamilies), p - p2); + memcpy (font_all + strlen (all) + strlen (allfamilies), p2, p - p2); strcat (font_all, allcs); /* Build the actual font set name. */ len = strlen (base_fontname) + strlen (font_allcs) + strlen (font_allfamilies) + strlen (font_all) + 5; fontsetname = xmalloc (len); - bzero (fontsetname, len); + memset (fontsetname, 0, len); strcpy (fontsetname, base_fontname); strcat (fontsetname, sep); strcat (fontsetname, font_allcs); @@ -2113,8 +2065,7 @@ print_fontset_result (xfs, name, missing_list, missing_count) #endif static XFontSet -xic_create_xfontset (f) - struct frame *f; +xic_create_xfontset (struct frame *f) { XFontSet xfs = NULL; struct font *font = FRAME_FONT (f); @@ -2142,7 +2093,7 @@ xic_create_xfontset (f) char **missing_list; int missing_count; char *def_string; - char *xlfd_format = "-*-*-medium-r-normal--%d-*-*-*-*-*"; + const char *xlfd_format = "-*-*-medium-r-normal--%d-*-*-*-*-*"; sprintf (buf, xlfd_format, pixel_size); missing_list = NULL; @@ -2193,7 +2144,7 @@ xic_create_xfontset (f) } if (! xfs) { - char *last_resort = "-*-*-*-r-normal--*-*-*-*-*-*"; + const char *last_resort = "-*-*-*-r-normal--*-*-*-*-*-*"; missing_list = NULL; xfs = XCreateFontSet (FRAME_X_DISPLAY (f), last_resort, @@ -2213,8 +2164,7 @@ xic_create_xfontset (f) /* Free the X fontset of frame F if it is the last frame using it. */ void -xic_free_xfontset (f) - struct frame *f; +xic_free_xfontset (struct frame *f) { Lisp_Object rest, frame; int shared_p = 0; @@ -2251,9 +2201,7 @@ xic_free_xfontset (f) input method XIM. */ static XIMStyle -best_xim_style (user, xim) - XIMStyles *user; - XIMStyles *xim; +best_xim_style (XIMStyles *user, XIMStyles *xim) { int i, j; @@ -2271,8 +2219,7 @@ best_xim_style (user, xim) static XIMStyle xic_style; void -create_frame_xic (f) - struct frame *f; +create_frame_xic (struct frame *f) { XIM xim; XIC xic = NULL; @@ -2347,8 +2294,7 @@ create_frame_xic (f) /* Destroy XIC and free XIC fontset of frame F, if any. */ void -free_frame_xic (f) - struct frame *f; +free_frame_xic (struct frame *f) { if (FRAME_XIC (f) == NULL) return; @@ -2364,9 +2310,7 @@ free_frame_xic (f) pixel position X/Y. X and Y are relative to window W. */ void -xic_set_preeditarea (w, x, y) - struct window *w; - int x, y; +xic_set_preeditarea (struct window *w, int x, int y) { struct frame *f = XFRAME (w->frame); XVaNestedList attr; @@ -2383,8 +2327,7 @@ xic_set_preeditarea (w, x, y) /* Place status area for XIC in bottom right corner of frame F.. */ void -xic_set_statusarea (f) - struct frame *f; +xic_set_statusarea (struct frame *f) { XIC xic = FRAME_XIC (f); XVaNestedList attr; @@ -2414,7 +2357,7 @@ xic_set_statusarea (f) area.x = FRAME_PIXEL_WIDTH (f) - area.width - FRAME_INTERNAL_BORDER_WIDTH (f); area.y = (FRAME_PIXEL_HEIGHT (f) - area.height - FRAME_MENUBAR_HEIGHT (f) - - FRAME_TOOLBAR_HEIGHT (f) + - FRAME_TOOLBAR_TOP_HEIGHT (f) - FRAME_INTERNAL_BORDER_WIDTH (f)); XFree (needed); @@ -2428,9 +2371,7 @@ xic_set_statusarea (f) BASE_FONTNAME. Called when a new Emacs fontset is chosen. */ void -xic_set_xfontset (f, base_fontname) - struct frame *f; - char *base_fontname; +xic_set_xfontset (struct frame *f, const char *base_fontname) { XVaNestedList attr; XFontSet xfs; @@ -2458,10 +2399,7 @@ xic_set_xfontset (f, base_fontname) /* Create and set up the X widget for frame F. */ static void -x_window (f, window_prompting, minibuffer_only) - struct frame *f; - long window_prompting; - int minibuffer_only; +x_window (struct frame *f, long window_prompting, int minibuffer_only) { XClassHint class_hints; XSetWindowAttributes attributes; @@ -2513,6 +2451,7 @@ x_window (f, window_prompting, minibuffer_only) XtSetArg (al[ac], XtNvisual, FRAME_X_VISUAL (f)); ac++; XtSetArg (al[ac], XtNdepth, FRAME_X_DISPLAY_INFO (f)->n_planes); ac++; XtSetArg (al[ac], XtNcolormap, FRAME_X_COLORMAP (f)); ac++; + XtSetArg (al[ac], XtNborderWidth, 0); ac++; XtSetValues (pane_widget, al, ac); f->output_data.x->column_widget = pane_widget; @@ -2528,6 +2467,7 @@ x_window (f, window_prompting, minibuffer_only) XtSetArg (al[ac], XtNvisual, FRAME_X_VISUAL (f)); ac++; XtSetArg (al[ac], XtNdepth, FRAME_X_DISPLAY_INFO (f)->n_planes); ac++; XtSetArg (al[ac], XtNcolormap, FRAME_X_COLORMAP (f)); ac++; + XtSetArg (al[ac], XtNborderWidth, 0); ac++; frame_widget = XtCreateWidget (f->namebuf, emacsFrameClass, pane_widget, al, ac); @@ -2705,8 +2645,7 @@ x_window (f, window_prompting, minibuffer_only) #else /* not USE_X_TOOLKIT */ #ifdef USE_GTK void -x_window (f) - FRAME_PTR f; +x_window (FRAME_PTR f) { if (! xg_create_frame_widgets (f)) error ("Unable to create window"); @@ -2746,9 +2685,7 @@ x_window (f) /* Create and set up the X window for frame F. */ void -x_window (f) - struct frame *f; - +x_window (struct frame *f) { XClassHint class_hints; XSetWindowAttributes attributes; @@ -2853,9 +2790,7 @@ x_window (f) /* Verify that the icon position args for this window are valid. */ static void -x_icon_verify (f, parms) - struct frame *f; - Lisp_Object parms; +x_icon_verify (struct frame *f, Lisp_Object parms) { Lisp_Object icon_x, icon_y; @@ -2877,9 +2812,7 @@ x_icon_verify (f, parms) well. */ static void -x_icon (f, parms) - struct frame *f; - Lisp_Object parms; +x_icon (struct frame *f, Lisp_Object parms) { Lisp_Object icon_x, icon_y; #if 0 @@ -2925,8 +2858,7 @@ x_icon (f, parms) mouse cursor and the gray border tile. */ static void -x_make_gc (f) - struct frame *f; +x_make_gc (struct frame *f) { XGCValues gc_values; @@ -2985,8 +2917,7 @@ x_make_gc (f) /* Free what was allocated in x_make_gc. */ void -x_free_gcs (f) - struct frame *f; +x_free_gcs (struct frame *f) { Display *dpy = FRAME_X_DISPLAY (f); @@ -3025,8 +2956,7 @@ x_free_gcs (f) constructed. */ static Lisp_Object -unwind_create_frame (frame) - Lisp_Object frame; +unwind_create_frame (Lisp_Object frame) { struct frame *f = XFRAME (frame); @@ -3058,38 +2988,40 @@ unwind_create_frame (frame) static void -x_default_font_parameter (f, parms) - struct frame *f; - Lisp_Object parms; +x_default_font_parameter (struct frame *f, Lisp_Object parms) { struct x_display_info *dpyinfo = FRAME_X_DISPLAY_INFO (f); Lisp_Object font_param = x_get_arg (dpyinfo, parms, Qfont, NULL, NULL, RES_TYPE_STRING); - Lisp_Object font; - int got_from_gconf = 0; + Lisp_Object font = Qnil; if (EQ (font_param, Qunbound)) font_param = Qnil; if (NILP (font_param)) { - /* System font takes precedendce over X resources. We must suggest this + /* System font should take precedendce over X resources. We suggest this regardless of font-use-system-font because .emacs may not have been read yet. */ const char *system_font = xsettings_get_system_font (); - if (system_font) font_param = make_string (system_font, - strlen (system_font)); + if (system_font) + { + char *name = xstrdup (system_font); + font = font_open_by_name (f, name); + free (name); + } } - - font = !NILP (font_param) ? font_param - : x_get_arg (dpyinfo, parms, Qfont, "font", "Font", RES_TYPE_STRING); - if (! STRINGP (font)) + if (NILP (font)) + font = !NILP (font_param) ? font_param + : x_get_arg (dpyinfo, parms, Qfont, "font", "Font", RES_TYPE_STRING); + + if (! FONTP (font) && ! STRINGP (font)) { - char *names[] + const char *names[] = { #ifdef HAVE_XFT /* This will find the normal Xft font. */ - "monospace-12", + "monospace-10", #endif "-adobe-courier-medium-r-*-*-*-120-*-*-*-*-iso8859-1", "-misc-fixed-medium-r-normal-*-*-140-*-*-c-*-iso8859-1", @@ -3120,10 +3052,8 @@ x_default_font_parameter (f, parms) x_set_frame_parameters (f, Fcons (Fcons (Qfont_param, font_param), Qnil)); } - x_default_parameter (f, parms, Qfont, font, - got_from_gconf ? NULL : "font", - got_from_gconf ? NULL : "Font", - RES_TYPE_STRING); + /* This call will make X resources override any system font setting. */ + x_default_parameter (f, parms, Qfont, font, "font", "Font", RES_TYPE_STRING); } @@ -3131,8 +3061,7 @@ DEFUN ("x-wm-set-size-hint", Fx_wm_set_size_hint, Sx_wm_set_size_hint, 0, 1, 0, doc: /* Send the size hints for frame FRAME to the window manager. If FRAME is nil, use the selected frame. */) - (frame) - Lisp_Object frame; + (Lisp_Object frame) { struct frame *f; if (NILP (frame)) @@ -3145,6 +3074,37 @@ If FRAME is nil, use the selected frame. */) return Qnil; } +static void +set_machine_and_pid_properties (struct frame *f) +{ + /* See the above comment "Note: Encoding strategy". */ + XTextProperty text; + int bytes, stringp; + int do_free_text_value = 0; + long pid = (long) getpid (); + + text.value = x_encode_text (Vsystem_name, + Qcompound_text, 0, &bytes, &stringp, + &do_free_text_value); + text.encoding = (stringp ? XA_STRING + : FRAME_X_DISPLAY_INFO (f)->Xatom_COMPOUND_TEXT); + text.format = 8; + text.nitems = bytes; + XSetWMClientMachine (FRAME_X_DISPLAY (f), + FRAME_OUTER_WINDOW (f), + &text); + if (do_free_text_value) + xfree (text.value); + + XChangeProperty (FRAME_X_DISPLAY (f), + FRAME_OUTER_WINDOW (f), + XInternAtom (FRAME_X_DISPLAY (f), + "_NET_WM_PID", + False), + XA_CARDINAL, 32, PropModeReplace, + (unsigned char *) &pid, 1); +} + DEFUN ("x-create-frame", Fx_create_frame, Sx_create_frame, 1, 1, 0, doc: /* Make a new X window, which is called a "frame" in Emacs terms. @@ -3156,8 +3116,7 @@ then `default-minibuffer-frame' must be a frame whose minibuffer can be shared by the new frame. This function is an internal primitive--use `make-frame' instead. */) - (parms) - Lisp_Object parms; + (Lisp_Object parms) { struct frame *f; Lisp_Object frame, tem; @@ -3234,7 +3193,7 @@ This function is an internal primitive--use `make-frame' instead. */) f->output_method = output_x_window; f->output_data.x = (struct x_output *) xmalloc (sizeof (struct x_output)); - bzero (f->output_data.x, sizeof (struct x_output)); + memset (f->output_data.x, 0, sizeof (struct x_output)); f->output_data.x->icon_bitmap = -1; FRAME_FONTSET (f) = -1; f->output_data.x->scroll_bar_foreground_pixel = -1; @@ -3344,15 +3303,9 @@ This function is an internal primitive--use `make-frame' instead. */) error ("Invalid frame font"); } -#ifdef USE_LUCID - /* Prevent lwlib/xlwmenu.c from crashing because of a bug - whereby it fails to get any font. */ - xlwmenu_default_font = XLoadQueryFont (FRAME_X_DISPLAY (f), "fixed"); -#endif - /* Frame contents get displaced if an embedded X window has a border. */ if (! FRAME_X_EMBEDDED_P (f)) - x_default_parameter (f, parms, Qborder_width, make_number (2), + x_default_parameter (f, parms, Qborder_width, make_number (0), "borderWidth", "BorderWidth", RES_TYPE_NUMBER); /* This defaults to 1 in order to match xterm. We recognize either @@ -3376,7 +3329,12 @@ This function is an internal primitive--use `make-frame' instead. */) #endif "internalBorderWidth", "internalBorderWidth", RES_TYPE_NUMBER); - x_default_parameter (f, parms, Qvertical_scroll_bars, Qleft, + x_default_parameter (f, parms, Qvertical_scroll_bars, +#if defined(USE_GTK) && defined(USE_TOOLKIT_SCROLL_BARS) + Qright, +#else + Qleft, +#endif "verticalScrollBars", "ScrollBars", RES_TYPE_SYMBOL); @@ -3415,10 +3373,18 @@ This function is an internal primitive--use `make-frame' instead. */) happen. */ init_frame_faces (f); - x_default_parameter (f, parms, Qmenu_bar_lines, make_number (1), - "menuBar", "MenuBar", RES_TYPE_NUMBER); - x_default_parameter (f, parms, Qtool_bar_lines, make_number (1), - "toolBar", "ToolBar", RES_TYPE_NUMBER); + /* The X resources controlling the menu-bar and tool-bar are + processed specially at startup, and reflected in the mode + variables; ignore them here. */ + x_default_parameter (f, parms, Qmenu_bar_lines, + NILP (Vmenu_bar_mode) + ? make_number (0) : make_number (1), + NULL, NULL, RES_TYPE_NUMBER); + x_default_parameter (f, parms, Qtool_bar_lines, + NILP (Vtool_bar_mode) + ? make_number (0) : make_number (1), + NULL, NULL, RES_TYPE_NUMBER); + x_default_parameter (f, parms, Qbuffer_predicate, Qnil, "bufferPredicate", "BufferPredicate", RES_TYPE_SYMBOL); @@ -3428,6 +3394,8 @@ This function is an internal primitive--use `make-frame' instead. */) "waitForWM", "WaitForWM", RES_TYPE_BOOLEAN); x_default_parameter (f, parms, Qfullscreen, Qnil, "fullscreen", "Fullscreen", RES_TYPE_SYMBOL); + x_default_parameter (f, parms, Qtool_bar_position, + f->tool_bar_position, 0, 0, RES_TYPE_SYMBOL); /* Compute the size of the X window. */ window_prompting = x_figure_window_size (f, parms, 1); @@ -3524,19 +3492,24 @@ This function is an internal primitive--use `make-frame' instead. */) ; } + BLOCK_INPUT; + + /* Set machine name and pid for the purpose of window managers. */ + set_machine_and_pid_properties(f); + /* Set the WM leader property. GTK does this itself, so this is not needed when using GTK. */ if (dpyinfo->client_leader_window != 0) { - BLOCK_INPUT; XChangeProperty (FRAME_X_DISPLAY (f), FRAME_OUTER_WINDOW (f), dpyinfo->Xatom_wm_client_leader, XA_WINDOW, 32, PropModeReplace, (unsigned char *) &dpyinfo->client_leader_window, 1); - UNBLOCK_INPUT; } + UNBLOCK_INPUT; + /* Initialize `default-minibuffer-frame' in case this is the first frame on this terminal. */ if (FRAME_HAS_MINIBUF_P (f) @@ -3565,8 +3538,7 @@ This function is an internal primitive--use `make-frame' instead. */) know about that structure. */ Lisp_Object -x_get_focus_frame (frame) - struct frame *frame; +x_get_focus_frame (struct frame *frame) { struct x_display_info *dpyinfo = FRAME_X_DISPLAY_INFO (frame); Lisp_Object xfocus; @@ -3590,8 +3562,7 @@ x_get_focus_frame (frame) DEFUN ("x-focus-frame", Fx_focus_frame, Sx_focus_frame, 1, 1, 0, doc: /* Set the input focus to FRAME. FRAME nil means use the selected frame. */) - (frame) - Lisp_Object frame; + (Lisp_Object frame) { struct frame *f = check_x_frame (frame); Display *dpy = FRAME_X_DISPLAY (f); @@ -3610,8 +3581,7 @@ FRAME nil means use the selected frame. */) DEFUN ("xw-color-defined-p", Fxw_color_defined_p, Sxw_color_defined_p, 1, 2, 0, doc: /* Internal function called by `color-defined-p', which see. */) - (color, frame) - Lisp_Object color, frame; + (Lisp_Object color, Lisp_Object frame) { XColor foo; FRAME_PTR f = check_x_frame (frame); @@ -3626,8 +3596,7 @@ DEFUN ("xw-color-defined-p", Fxw_color_defined_p, Sxw_color_defined_p, 1, 2, 0, DEFUN ("xw-color-values", Fxw_color_values, Sxw_color_values, 1, 2, 0, doc: /* Internal function called by `color-values', which see. */) - (color, frame) - Lisp_Object color, frame; + (Lisp_Object color, Lisp_Object frame) { XColor foo; FRAME_PTR f = check_x_frame (frame); @@ -3644,8 +3613,7 @@ DEFUN ("xw-color-values", Fxw_color_values, Sxw_color_values, 1, 2, 0, DEFUN ("xw-display-color-p", Fxw_display_color_p, Sxw_display_color_p, 0, 1, 0, doc: /* Internal function called by `display-color-p', which see. */) - (terminal) - Lisp_Object terminal; + (Lisp_Object terminal) { struct x_display_info *dpyinfo = check_x_display_info (terminal); @@ -3672,8 +3640,7 @@ Note that color displays do support shades of gray. The optional argument TERMINAL specifies which display to ask about. TERMINAL should be a terminal object, a frame or a display name (a string). If omitted or nil, that stands for the selected frame's display. */) - (terminal) - Lisp_Object terminal; + (Lisp_Object terminal) { struct x_display_info *dpyinfo = check_x_display_info (terminal); @@ -3701,8 +3668,7 @@ DEFUN ("x-display-pixel-width", Fx_display_pixel_width, Sx_display_pixel_width, The optional argument TERMINAL specifies which display to ask about. TERMINAL should be a terminal object, a frame or a display name (a string). If omitted or nil, that stands for the selected frame's display. */) - (terminal) - Lisp_Object terminal; + (Lisp_Object terminal) { struct x_display_info *dpyinfo = check_x_display_info (terminal); @@ -3715,8 +3681,7 @@ DEFUN ("x-display-pixel-height", Fx_display_pixel_height, The optional argument TERMINAL specifies which display to ask about. TERMINAL should be a terminal object, a frame or a display name (a string). If omitted or nil, that stands for the selected frame's display. */) - (terminal) - Lisp_Object terminal; + (Lisp_Object terminal) { struct x_display_info *dpyinfo = check_x_display_info (terminal); @@ -3729,8 +3694,7 @@ DEFUN ("x-display-planes", Fx_display_planes, Sx_display_planes, The optional argument TERMINAL specifies which display to ask about. TERMINAL should be a terminal object, a frame or a display name (a string). If omitted or nil, that stands for the selected frame's display. */) - (terminal) - Lisp_Object terminal; + (Lisp_Object terminal) { struct x_display_info *dpyinfo = check_x_display_info (terminal); @@ -3743,8 +3707,7 @@ DEFUN ("x-display-color-cells", Fx_display_color_cells, Sx_display_color_cells, The optional argument TERMINAL specifies which display to ask about. TERMINAL should be a terminal object, a frame or a display name (a string). If omitted or nil, that stands for the selected frame's display. */) - (terminal) - Lisp_Object terminal; + (Lisp_Object terminal) { struct x_display_info *dpyinfo = check_x_display_info (terminal); @@ -3768,8 +3731,7 @@ DEFUN ("x-server-max-request-size", Fx_server_max_request_size, The optional argument TERMINAL specifies which display to ask about. TERMINAL should be a terminal object, a frame or a display name (a string). If omitted or nil, that stands for the selected frame's display. */) - (terminal) - Lisp_Object terminal; + (Lisp_Object terminal) { struct x_display_info *dpyinfo = check_x_display_info (terminal); @@ -3783,11 +3745,10 @@ that operating systems cannot be developed and distributed noncommercially.) The optional argument TERMINAL specifies which display to ask about. TERMINAL should be a terminal object, a frame or a display name (a string). If omitted or nil, that stands for the selected frame's display. */) - (terminal) - Lisp_Object terminal; + (Lisp_Object terminal) { struct x_display_info *dpyinfo = check_x_display_info (terminal); - char *vendor = ServerVendor (dpyinfo->display); + const char *vendor = ServerVendor (dpyinfo->display); if (! vendor) vendor = ""; return build_string (vendor); @@ -3802,8 +3763,7 @@ number. See also the function `x-server-vendor'. The optional argument TERMINAL specifies which display to ask about. TERMINAL should be a terminal object, a frame or a display name (a string). If omitted or nil, that stands for the selected frame's display. */) - (terminal) - Lisp_Object terminal; + (Lisp_Object terminal) { struct x_display_info *dpyinfo = check_x_display_info (terminal); Display *dpy = dpyinfo->display; @@ -3818,8 +3778,7 @@ DEFUN ("x-display-screens", Fx_display_screens, Sx_display_screens, 0, 1, 0, The optional argument TERMINAL specifies which display to ask about. TERMINAL should be a terminal object, a frame or a display name (a string). If omitted or nil, that stands for the selected frame's display. */) - (terminal) - Lisp_Object terminal; + (Lisp_Object terminal) { struct x_display_info *dpyinfo = check_x_display_info (terminal); @@ -3831,8 +3790,7 @@ DEFUN ("x-display-mm-height", Fx_display_mm_height, Sx_display_mm_height, 0, 1, The optional argument TERMINAL specifies which display to ask about. TERMINAL should be a terminal object, a frame or a display name (a string). If omitted or nil, that stands for the selected frame's display. */) - (terminal) - Lisp_Object terminal; + (Lisp_Object terminal) { struct x_display_info *dpyinfo = check_x_display_info (terminal); @@ -3844,8 +3802,7 @@ DEFUN ("x-display-mm-width", Fx_display_mm_width, Sx_display_mm_width, 0, 1, 0, The optional argument TERMINAL specifies which display to ask about. TERMINAL should be a terminal object, a frame or a display name (a string). If omitted or nil, that stands for the selected frame's display. */) - (terminal) - Lisp_Object terminal; + (Lisp_Object terminal) { struct x_display_info *dpyinfo = check_x_display_info (terminal); @@ -3859,8 +3816,7 @@ The value may be `always', `when-mapped', or `not-useful'. The optional argument TERMINAL specifies which display to ask about. TERMINAL should be a terminal object, a frame or a display name (a string). If omitted or nil, that stands for the selected frame's display. */) - (terminal) - Lisp_Object terminal; + (Lisp_Object terminal) { struct x_display_info *dpyinfo = check_x_display_info (terminal); Lisp_Object result; @@ -3896,8 +3852,7 @@ The value is one of the symbols `static-gray', `gray-scale', The optional argument TERMINAL specifies which display to ask about. TERMINAL should a terminal object, a frame or a display name (a string). If omitted or nil, that stands for the selected frame's display. */) - (terminal) - Lisp_Object terminal; + (Lisp_Object terminal) { struct x_display_info *dpyinfo = check_x_display_info (terminal); Lisp_Object result; @@ -3936,8 +3891,7 @@ DEFUN ("x-display-save-under", Fx_display_save_under, The optional argument TERMINAL specifies which display to ask about. TERMINAL should be a terminal object, a frame or a display name (a string). If omitted or nil, that stands for the selected frame's display. */) - (terminal) - Lisp_Object terminal; + (Lisp_Object terminal) { struct x_display_info *dpyinfo = check_x_display_info (terminal); @@ -3948,36 +3902,31 @@ If omitted or nil, that stands for the selected frame's display. */) } int -x_pixel_width (f) - register struct frame *f; +x_pixel_width (register struct frame *f) { return FRAME_PIXEL_WIDTH (f); } int -x_pixel_height (f) - register struct frame *f; +x_pixel_height (register struct frame *f) { return FRAME_PIXEL_HEIGHT (f); } int -x_char_width (f) - register struct frame *f; +x_char_width (register struct frame *f) { return FRAME_COLUMN_WIDTH (f); } int -x_char_height (f) - register struct frame *f; +x_char_height (register struct frame *f) { return FRAME_LINE_HEIGHT (f); } int -x_screen_planes (f) - register struct frame *f; +x_screen_planes (register struct frame *f) { return FRAME_X_DISPLAY_INFO (f)->n_planes; } @@ -3993,7 +3942,7 @@ x_screen_planes (f) static struct visual_class { - char *name; + const char *name; int class; } visual_classes[] = @@ -4034,8 +3983,7 @@ XScreenNumberOfScreen (scr) members of DPYINFO appropriately. Called from x_term_init. */ void -select_visual (dpyinfo) - struct x_display_info *dpyinfo; +select_visual (struct x_display_info *dpyinfo) { Display *dpy = dpyinfo->display; Screen *screen = dpyinfo->screen; @@ -4057,7 +4005,7 @@ select_visual (dpyinfo) XVisualInfo vinfo; strcpy (s, SDATA (value)); - dash = index (s, '-'); + dash = strchr (s, '-'); if (dash) { dpyinfo->n_planes = atoi (dash + 1); @@ -4095,7 +4043,7 @@ select_visual (dpyinfo) vinfo_template.screen = XScreenNumberOfScreen (screen); vinfo = XGetVisualInfo (dpy, VisualIDMask | VisualScreenMask, &vinfo_template, &n_visuals); - if (n_visuals != 1) + if (n_visuals <= 0) fatal ("Can't get proper X visual info"); dpyinfo->n_planes = vinfo->depth; @@ -4108,8 +4056,7 @@ select_visual (dpyinfo) Open a new connection if necessary. */ struct x_display_info * -x_display_info_for_name (name) - Lisp_Object name; +x_display_info_for_name (Lisp_Object name) { Lisp_Object names; struct x_display_info *dpyinfo; @@ -4156,8 +4103,7 @@ DISPLAY is the name of the display to connect to. Optional second arg XRM-STRING is a string of resources in xrdb format. If the optional third arg MUST-SUCCEED is non-nil, terminate Emacs if we can't open the connection. */) - (display, xrm_string, must_succeed) - Lisp_Object display, xrm_string, must_succeed; + (Lisp_Object display, Lisp_Object xrm_string, Lisp_Object must_succeed) { unsigned char *xrm_option; struct x_display_info *dpyinfo; @@ -4208,8 +4154,7 @@ DEFUN ("x-close-connection", Fx_close_connection, For TERMINAL, specify a terminal object, a frame or a display name (a string). If TERMINAL is nil, that stands for the selected frame's terminal. */) - (terminal) - Lisp_Object terminal; + (Lisp_Object terminal) { struct x_display_info *dpyinfo = check_x_display_info (terminal); @@ -4223,7 +4168,7 @@ terminal. */) DEFUN ("x-display-list", Fx_display_list, Sx_display_list, 0, 0, 0, doc: /* Return the list of display names that Emacs has connections to. */) - () + (void) { Lisp_Object tail, result; @@ -4243,8 +4188,7 @@ easier. The optional second argument TERMINAL specifies which display to act on. TERMINAL should be a terminal object, a frame or a display name (a string). If TERMINAL is omitted or nil, that stands for the selected frame's display. */) - (on, terminal) - Lisp_Object terminal, on; + (Lisp_Object on, Lisp_Object terminal) { struct x_display_info *dpyinfo = check_x_display_info (terminal); @@ -4256,8 +4200,7 @@ If TERMINAL is omitted or nil, that stands for the selected frame's display. */ /* Wait for responses to all X commands issued so far for frame F. */ void -x_sync (f) - FRAME_PTR f; +x_sync (FRAME_PTR f) { BLOCK_INPUT; XSync (FRAME_X_DISPLAY (f), False); @@ -4288,8 +4231,7 @@ If OUTER_P is non-nil, the property is changed for the outer X window of FRAME. Default is to change on the edit X window. Value is VALUE. */) - (prop, value, frame, type, format, outer_p) - Lisp_Object prop, value, frame, type, format, outer_p; + (Lisp_Object prop, Lisp_Object value, Lisp_Object frame, Lisp_Object type, Lisp_Object format, Lisp_Object outer_p) { struct frame *f = check_x_frame (frame); Atom prop_atom; @@ -4367,8 +4309,7 @@ DEFUN ("x-delete-window-property", Fx_delete_window_property, Sx_delete_window_property, 1, 2, 0, doc: /* Remove window property PROP from X window of FRAME. FRAME nil or omitted means use the selected frame. Value is PROP. */) - (prop, frame) - Lisp_Object prop, frame; + (Lisp_Object prop, Lisp_Object frame) { struct frame *f = check_x_frame (frame); Atom prop_atom; @@ -4399,8 +4340,7 @@ If VECTOR_RET_P is non-nil, don't return a string but a vector of values. Value is nil if FRAME hasn't a property with name PROP or if PROP has no value of TYPE. */) - (prop, frame, type, source, delete_p, vector_ret_p) - Lisp_Object prop, frame, type, source, delete_p, vector_ret_p; + (Lisp_Object prop, Lisp_Object frame, Lisp_Object type, Lisp_Object source, Lisp_Object delete_p, Lisp_Object vector_ret_p) { struct frame *f = check_x_frame (frame); Atom prop_atom; @@ -4468,7 +4408,7 @@ no value of TYPE. */) elements." This applies even if long is more than 32 bits, the X library converts from 32 bit elements received from the X server to long - and passes the long array to us. Thus, for that case bcopy can not + and passes the long array to us. Thus, for that case memcpy can not be used. We convert to a 32 bit type here, because so much code assume on that. @@ -4519,8 +4459,7 @@ no value of TYPE. */) shown on the frames. */ void -show_hourglass (timer) - struct atimer *timer; +show_hourglass (struct atimer *timer) { /* The timer implementation will cancel this timer automatically after this function has run. Set hourglass_atimer to null @@ -4584,7 +4523,7 @@ show_hourglass (timer) shown. */ void -hide_hourglass () +hide_hourglass (void) { if (hourglass_shown_p) { @@ -4619,10 +4558,10 @@ hide_hourglass () Tool tips ***********************************************************************/ -static Lisp_Object x_create_tip_frame P_ ((struct x_display_info *, - Lisp_Object, Lisp_Object)); -static void compute_tip_xy P_ ((struct frame *, Lisp_Object, Lisp_Object, - Lisp_Object, int, int, int *, int *)); +static Lisp_Object x_create_tip_frame (struct x_display_info *, + Lisp_Object, Lisp_Object); +static void compute_tip_xy (struct frame *, Lisp_Object, Lisp_Object, + Lisp_Object, int, int, int *, int *); /* The frame of a currently visible tooltip. */ @@ -4645,8 +4584,7 @@ Lisp_Object Vx_max_tooltip_size; static Lisp_Object -unwind_create_tip_frame (frame) - Lisp_Object frame; +unwind_create_tip_frame (Lisp_Object frame) { Lisp_Object deleted; @@ -4671,9 +4609,9 @@ unwind_create_tip_frame (frame) when this happens. */ static Lisp_Object -x_create_tip_frame (dpyinfo, parms, text) - struct x_display_info *dpyinfo; - Lisp_Object parms, text; +x_create_tip_frame (struct x_display_info *dpyinfo, + Lisp_Object parms, + Lisp_Object text) { struct frame *f; Lisp_Object frame, tem; @@ -4728,7 +4666,7 @@ x_create_tip_frame (dpyinfo, parms, text) counts etc. */ f->output_method = output_x_window; f->output_data.x = (struct x_output *) xmalloc (sizeof (struct x_output)); - bzero (f->output_data.x, sizeof (struct x_output)); + memset (f->output_data.x, 0, sizeof (struct x_output)); f->output_data.x->icon_bitmap = -1; FRAME_FONTSET (f) = -1; f->output_data.x->scroll_bar_foreground_pixel = -1; @@ -4813,7 +4751,7 @@ x_create_tip_frame (dpyinfo, parms, text) needed to determine window geometry. */ x_default_font_parameter (f, parms); - x_default_parameter (f, parms, Qborder_width, make_number (2), + x_default_parameter (f, parms, Qborder_width, make_number (0), "borderWidth", "BorderWidth", RES_TYPE_NUMBER); /* This defaults to 2 in order to match xterm. We recognize either @@ -4912,9 +4850,8 @@ x_create_tip_frame (dpyinfo, parms, text) change_frame_size (f, height, width, 1, 0, 0); /* Add `tooltip' frame parameter's default value. */ - if (NILP (Fframe_parameter (frame, intern ("tooltip")))) - Fmodify_frame_parameters (frame, Fcons (Fcons (intern ("tooltip"), Qt), - Qnil)); + if (NILP (Fframe_parameter (frame, Qtooltip))) + Fmodify_frame_parameters (frame, Fcons (Fcons (Qtooltip, Qt), Qnil)); /* FIXME - can this be done in a similar way to normal frames? http://lists.gnu.org/archive/html/emacs-devel/2007-10/msg00641.html */ @@ -4988,11 +4925,7 @@ x_create_tip_frame (dpyinfo, parms, text) the display in *ROOT_X, and *ROOT_Y. */ static void -compute_tip_xy (f, parms, dx, dy, width, height, root_x, root_y) - struct frame *f; - Lisp_Object parms, dx, dy; - int width, height; - int *root_x, *root_y; +compute_tip_xy (struct frame *f, Lisp_Object parms, Lisp_Object dx, Lisp_Object dy, int width, int height, int *root_x, int *root_y) { Lisp_Object left, top; int win_x, win_y; @@ -5069,8 +5002,7 @@ DY added (default is -10). A tooltip's maximum size is specified by `x-max-tooltip-size'. Text larger than the specified size is clipped. */) - (string, frame, parms, timeout, dx, dy) - Lisp_Object string, frame, parms, timeout, dx, dy; + (Lisp_Object string, Lisp_Object frame, Lisp_Object parms, Lisp_Object timeout, Lisp_Object dx, Lisp_Object dy) { struct frame *f; struct window *w; @@ -5106,6 +5038,27 @@ Text larger than the specified size is clipped. */) else CHECK_NUMBER (dy); +#ifdef USE_GTK + if (x_gtk_use_system_tooltips) + { + int ok; + + /* Hide a previous tip, if any. */ + Fx_hide_tip (); + + BLOCK_INPUT; + if ((ok = xg_prepare_tooltip (f, string, &width, &height)) != 0) + { + compute_tip_xy (f, parms, dx, dy, width, height, &root_x, &root_y); + xg_show_tooltip (f, root_x, root_y); + /* This is used in Fx_hide_tip. */ + XSETFRAME (tip_frame, f); + } + UNBLOCK_INPUT; + if (ok) goto start_timer; + } +#endif /* USE_GTK */ + if (NILP (last_show_tip_args)) last_show_tip_args = Fmake_vector (make_number (3), Qnil); @@ -5194,7 +5147,7 @@ Text larger than the specified size is clipped. */) clear_glyph_matrix (w->desired_matrix); clear_glyph_matrix (w->current_matrix); SET_TEXT_POS (pos, BEGV, BEGV_BYTE); - try_window (FRAME_ROOT_WINDOW (f), pos, 0); + try_window (FRAME_ROOT_WINDOW (f), pos, TRY_WINDOW_IGNORE_FONTS_CHANGE); /* Compute width and height of the tooltip. */ width = height = 0; @@ -5211,15 +5164,15 @@ Text larger than the specified size is clipped. */) /* Let the row go over the full width of the frame. */ row->full_width_p = 1; + row_width = row->pixel_width; /* There's a glyph at the end of rows that is used to place the cursor there. Don't include the width of this glyph. */ if (row->used[TEXT_AREA]) { last = &row->glyphs[TEXT_AREA][row->used[TEXT_AREA] - 1]; - row_width = row->pixel_width - last->pixel_width; + if (INTEGERP (last->object)) + row_width -= last->pixel_width; } - else - row_width = row->pixel_width; height += row->height; width = max (width, row_width); @@ -5261,11 +5214,12 @@ Text larger than the specified size is clipped. */) DEFUN ("x-hide-tip", Fx_hide_tip, Sx_hide_tip, 0, 0, 0, doc: /* Hide the current tooltip window, if there is any. Value is t if tooltip was open, nil otherwise. */) - () + (void) { int count; Lisp_Object deleted, frame, timer; struct gcpro gcpro1, gcpro2; + struct frame *f; /* Return quickly if nothing to do. */ if (NILP (tip_timer) && NILP (tip_frame)) @@ -5283,6 +5237,14 @@ Value is t if tooltip was open, nil otherwise. */) if (!NILP (timer)) call1 (Qcancel_timer, timer); +#ifdef USE_GTK + /* When using system tooltip, tip_frame is the Emacs frame on which + the tip is shown. */ + f = XFRAME (frame); + if (FRAME_LIVE_P (f) && xg_hide_tooltip (f)) + frame = Qnil; +#endif + if (FRAMEP (frame)) { delete_frame (frame, Qnil); @@ -5293,9 +5255,9 @@ Value is t if tooltip was open, nil otherwise. */) redisplay procedure is not called when a tip frame over menu items is unmapped. Redisplay the menu manually... */ { - struct frame *f = SELECTED_FRAME (); - Widget w = f->output_data.x->menubar_widget; - extern void xlwmenu_redisplay P_ ((Widget)); + Widget w; + f = SELECTED_FRAME (); + w = f->output_data.x->menubar_widget; if (!DoesSaveUnders (FRAME_X_DISPLAY_INFO (f)->screen) && w != NULL) @@ -5322,12 +5284,9 @@ DEFUN ("x-uses-old-gtk-dialog", Fx_uses_old_gtk_dialog, Sx_uses_old_gtk_dialog, 0, 0, 0, doc: /* Return t if the old Gtk+ file selection dialog is used. */) - () + (void) { #ifdef USE_GTK - extern int use_dialog_box; - extern int use_file_dialog; - if (use_dialog_box && use_file_dialog && have_menus_p () @@ -5342,9 +5301,7 @@ DEFUN ("x-uses-old-gtk-dialog", Fx_uses_old_gtk_dialog, /* Callback for "OK" and "Cancel" on file selection dialog. */ static void -file_dialog_cb (widget, client_data, call_data) - Widget widget; - XtPointer call_data, client_data; +file_dialog_cb (Widget widget, XtPointer client_data, XtPointer call_data) { int *result = (int *) client_data; XmAnyCallbackStruct *cb = (XmAnyCallbackStruct *) call_data; @@ -5358,17 +5315,14 @@ file_dialog_cb (widget, client_data, call_data) in this case. */ static void -file_dialog_unmap_cb (widget, client_data, call_data) - Widget widget; - XtPointer call_data, client_data; +file_dialog_unmap_cb (Widget widget, XtPointer client_data, XtPointer call_data) { int *result = (int *) client_data; *result = XmCR_CANCEL; } static Lisp_Object -clean_up_file_dialog (arg) - Lisp_Object arg; +clean_up_file_dialog (Lisp_Object arg) { struct Lisp_Save_Value *p = XSAVE_VALUE (arg); Widget dialog = (Widget) p->pointer; @@ -5389,8 +5343,7 @@ DEFUN ("x-file-dialog", Fx_file_dialog, Sx_file_dialog, 2, 5, 0, Use a file selection dialog. Select DEFAULT-FILENAME in the dialog's file selection box, if specified. If MUSTMATCH is non-nil, the returned file or directory must exist. ONLY-DIR-P is ignored." */) - (prompt, dir, default_filename, mustmatch, only_dir_p) - Lisp_Object prompt, dir, default_filename, mustmatch, only_dir_p; + (Lisp_Object prompt, Lisp_Object dir, Lisp_Object default_filename, Lisp_Object mustmatch, Lisp_Object only_dir_p) { int result; struct frame *f = SELECTED_FRAME (); @@ -5399,7 +5352,6 @@ or directory must exist. ONLY-DIR-P is ignored." */) Widget dialog, text, help; Arg al[10]; int ac = 0; - extern XtAppContext Xt_app_con; XmString dir_xmstring, pattern_xmstring; int count = SPECPDL_INDEX (); struct gcpro gcpro1, gcpro2, gcpro3, gcpro4, gcpro5, gcpro6; @@ -5548,8 +5500,7 @@ or directory must exist. ONLY-DIR-P is ignored." */) #ifdef USE_GTK static Lisp_Object -clean_up_dialog (arg) - Lisp_Object arg; +clean_up_dialog (Lisp_Object arg) { x_menu_set_in_use (0); @@ -5562,8 +5513,7 @@ Use a file selection dialog. Select DEFAULT-FILENAME in the dialog's file selection box, if specified. If MUSTMATCH is non-nil, the returned file or directory must exist. If ONLY-DIR-P is non-nil, the user can only select directories. */) - (prompt, dir, default_filename, mustmatch, only_dir_p) - Lisp_Object prompt, dir, default_filename, mustmatch, only_dir_p; + (Lisp_Object prompt, Lisp_Object dir, Lisp_Object default_filename, Lisp_Object mustmatch, Lisp_Object only_dir_p) { FRAME_PTR f = SELECTED_FRAME (); char *fn; @@ -5624,8 +5574,7 @@ DEFUN ("x-select-font", Fx_select_font, Sx_select_font, 0, 2, 0, Return a GTK-style font string corresponding to the selection. If FRAME is omitted or nil, it defaults to the selected frame. */) - (frame, ignored) - Lisp_Object frame, ignored; + (Lisp_Object frame, Lisp_Object ignored) { FRAME_PTR f = check_x_frame (frame); char *name; @@ -5652,7 +5601,7 @@ If FRAME is omitted or nil, it defaults to the selected frame. */) font_param = Ffont_get (font, intern (":name")); if (STRINGP (font_param)) default_name = xstrdup (SDATA (font_param)); - else + else { font_param = Fframe_parameter (frame, Qfont_param); if (STRINGP (font_param)) @@ -5663,7 +5612,7 @@ If FRAME is omitted or nil, it defaults to the selected frame. */) default_name = xstrdup (x_last_font_name); /* Convert fontconfig names to Gtk names, i.e. remove - before number */ - if (default_name) + if (default_name) { char *p = strrchr (default_name, '-'); if (p) @@ -5713,8 +5662,7 @@ FRAME nil means use the selected frame. Value is t if we know that both keys are present, and are mapped to the usual X keysyms. Value is `lambda' if we cannot determine if both keys are present and mapped to the usual X keysyms. */) - (frame) - Lisp_Object frame; + (Lisp_Object frame) { #ifdef HAVE_XKBGETKEYBOARD XkbDescPtr kb; @@ -5775,9 +5723,9 @@ present and mapped to the usual X keysyms. */) /* The XKB symbolic key names can be seen most easily in the PS file generated by `xkbprint -label name $DISPLAY'. */ - if (bcmp ("DELE", kb->names->keys[i].name, 4) == 0) + if (memcmp ("DELE", kb->names->keys[i].name, 4) == 0) delete_keycode = i; - else if (bcmp ("BKSP", kb->names->keys[i].name, 4) == 0) + else if (memcmp ("BKSP", kb->names->keys[i].name, 4) == 0) backspace_keycode = i; } @@ -5842,10 +5790,11 @@ frame_parm_handler x_frame_parm_handlers[] = x_set_font_backend, x_set_alpha, x_set_sticky, + x_set_tool_bar_position, }; void -syms_of_xfns () +syms_of_xfns (void) { /* This is zero if not using X windows. */ x_in_use = 0; @@ -5924,8 +5873,8 @@ or when you set the mouse color. */); Vx_cursor_fore_pixel = Qnil; DEFVAR_LISP ("x-max-tooltip-size", &Vx_max_tooltip_size, - doc: /* Maximum size for tooltips. Value is a pair (COLUMNS . ROWS). -Text larger than this is clipped. */); + doc: /* Maximum size for tooltips. +Value is a pair (COLUMNS . ROWS). Text larger than this is clipped. */); Vx_max_tooltip_size = Fcons (make_number (80), make_number (40)); DEFVAR_LISP ("x-no-window-manager", &Vx_no_window_manager, @@ -5972,6 +5921,12 @@ The default is to just show an arrow and pressing on that arrow shows the tool bar buttons. */); x_gtk_whole_detached_tool_bar = 0; + DEFVAR_BOOL ("x-gtk-use-system-tooltips", &x_gtk_use_system_tooltips, + doc: /* *If non-nil with a Gtk+ built Emacs, the Gtk+ toolip is used. +Otherwise use Emacs own tooltip implementation. +When using Gtk+ tooltips, the tooltip face is not used. */); + x_gtk_use_system_tooltips = 1; + Fprovide (intern_c_string ("x"), Qnil); #ifdef USE_X_TOOLKIT @@ -5992,6 +5947,7 @@ the tool bar buttons. */); accepts --with-x-toolkit=gtk. */ Fprovide (intern_c_string ("x-toolkit"), Qnil); Fprovide (intern_c_string ("gtk"), Qnil); + Fprovide (intern_c_string ("move-toolbar"), Qnil); DEFVAR_LISP ("gtk-version-string", &Vgtk_version_string, doc: /* Version info for GTK+. */);