X-Git-Url: https://code.delx.au/gnu-emacs/blobdiff_plain/62d168d8b3dedb5b27a64639d48a82c0176ebb22..de92a50b9e157cac071355b9836717e62b9edff1:/src/xfns.c diff --git a/src/xfns.c b/src/xfns.c index f1df3c27d0..44d8fb31f2 100644 --- a/src/xfns.c +++ b/src/xfns.c @@ -1,6 +1,6 @@ /* Functions for the X window system. Copyright (C) 1989, 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, - 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009 + 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 Free Software Foundation, Inc. This file is part of GNU Emacs. @@ -21,6 +21,8 @@ along with GNU Emacs. If not, see . */ #include #include #include +#include +#include #ifdef HAVE_UNISTD_H #include @@ -62,6 +64,8 @@ along with GNU Emacs. If not, see . */ #include #endif +#include "xsettings.h" + #ifdef USE_GTK #include "gtkutil.h" #endif @@ -97,13 +101,10 @@ along with GNU Emacs. If not, see . */ #include #endif -/* Do the EDITRES protocol if running X11R5 - Exception: HP-UX (at least version A.09.05) has X11R5 without EditRes */ - -#if (XtSpecificationRelease >= 5) && !defined(NO_EDITRES) +#if !defined(NO_EDITRES) #define HACK_EDITRES extern void _XEditResCheckMessages (); -#endif /* R5 + Athena */ +#endif /* not defined NO_EDITRES */ /* Unique id counter for widgets created by the Lucid Widget Library. */ @@ -196,7 +197,7 @@ Lisp_Object Qnone; Lisp_Object Qsuppress_icon; Lisp_Object Qundefined_color; Lisp_Object Qcompound_text, Qcancel_timer; -static Lisp_Object Qfont_param; +Lisp_Object Qfont_param; /* In dispnew.c */ @@ -204,10 +205,15 @@ extern Lisp_Object Vwindow_system_version; /* The below are defined in frame.c. */ +extern Lisp_Object Qtooltip; + #if GLYPH_DEBUG int image_cache_refcount, dpyinfo_refcount; #endif +#if defined (USE_GTK) && defined (HAVE_FREETYPE) +char *x_last_font_name; +#endif /* Error if we are not connected to X. */ @@ -247,7 +253,7 @@ check_x_frame (frame) } /* Let the user specify an X display with a Lisp object. - OBJECT may be nil, a frame or a terminal id. + OBJECT may be nil, a frame or a terminal object. nil stands for the selected frame--or, if that is not an X frame, the first X display on the list. */ @@ -268,7 +274,7 @@ check_x_display_info (object) else error ("X windows are not in use or not initialized"); } - else if (INTEGERP (object)) + else if (TERMINALP (object)) { struct terminal *t = get_terminal (object, 1); @@ -374,10 +380,7 @@ x_any_window_to_frame (dpyinfo, wdesc) #ifdef USE_GTK GtkWidget *gwdesc = xg_win_to_widget (dpyinfo->display, wdesc); if (gwdesc != 0 - && (gwdesc == x->widget - || gwdesc == x->edit_widget - || gwdesc == x->vbox_widget - || gwdesc == x->menubar_widget)) + && gtk_widget_get_toplevel (gwdesc) == x->widget) found = f; #else if (wdesc == XtWindow (x->widget) @@ -398,61 +401,14 @@ x_any_window_to_frame (dpyinfo, wdesc) return found; } -/* Likewise, but exclude the menu bar widget. */ - -struct frame * -x_non_menubar_window_to_frame (dpyinfo, wdesc) - struct x_display_info *dpyinfo; - int wdesc; -{ - Lisp_Object tail, frame; - struct frame *f; - struct x_output *x; - - if (wdesc == None) return 0; - - for (tail = Vframe_list; CONSP (tail); tail = XCDR (tail)) - { - frame = XCAR (tail); - if (!FRAMEP (frame)) - continue; - f = XFRAME (frame); - if (!FRAME_X_P (f) || FRAME_X_DISPLAY_INFO (f) != dpyinfo) - continue; - x = f->output_data.x; - /* This frame matches if the window is any of its widgets. */ - if (x->hourglass_window == wdesc) - return f; - else if (x->widget) - { -#ifdef USE_GTK - GtkWidget *gwdesc = xg_win_to_widget (dpyinfo->display, wdesc); - if (gwdesc != 0 - && (gwdesc == x->widget - || gwdesc == x->edit_widget - || gwdesc == x->vbox_widget)) - return f; -#else - if (wdesc == XtWindow (x->widget) - || wdesc == XtWindow (x->column_widget) - || wdesc == XtWindow (x->edit_widget)) - return f; -#endif - } - else if (FRAME_X_WINDOW (f) == wdesc) - /* A tooltip frame. */ - return f; - } - return 0; -} - /* Likewise, but consider only the menu bar widget. */ struct frame * -x_menubar_window_to_frame (dpyinfo, wdesc) +x_menubar_window_to_frame (dpyinfo, event) struct x_display_info *dpyinfo; - int wdesc; + XEvent *event; { + Window wdesc = event->xany.window; Lisp_Object tail, frame; struct frame *f; struct x_output *x; @@ -468,22 +424,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); - int found = 0; - - BLOCK_INPUT; - if (gwdesc != 0 - && (gwdesc == x->menubar_widget - || gtk_widget_get_parent (gwdesc) == x->menubar_widget)) - found = 1; - UNBLOCK_INPUT; - if (found) 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; @@ -588,12 +533,20 @@ x_real_positions (f, xptr, yptr) int real_x = 0, real_y = 0; int had_errors = 0; Window win = f->output_data.x->parent_desc; + Atom actual_type; + unsigned long actual_size, bytes_remaining; + int i, rc, actual_format; + struct x_display_info *dpyinfo = FRAME_X_DISPLAY_INFO (f); + long max_len = 400; + Display *dpy = FRAME_X_DISPLAY (f); + unsigned char *tmp_data = NULL; + Atom target_type = XA_CARDINAL; BLOCK_INPUT; - x_catch_errors (FRAME_X_DISPLAY (f)); + x_catch_errors (dpy); - if (win == FRAME_X_DISPLAY_INFO (f)->root_window) + if (win == dpyinfo->root_window) win = FRAME_OUTER_WINDOW (f); /* This loop traverses up the containment tree until we hit the root @@ -678,6 +631,33 @@ x_real_positions (f, xptr, yptr) had_errors = x_had_errors_p (FRAME_X_DISPLAY (f)); } + + if (dpyinfo->root_window == f->output_data.x->parent_desc) + { + /* Try _NET_FRAME_EXTENTS if our parent is the root window. */ + rc = XGetWindowProperty (dpy, win, dpyinfo->Xatom_net_frame_extents, + 0, max_len, False, target_type, + &actual_type, &actual_format, &actual_size, + &bytes_remaining, &tmp_data); + + if (rc == Success && actual_type == target_type && !x_had_errors_p (dpy) + && actual_size == 4 && actual_format == 32) + { + int ign; + Window rootw; + long *fe = (long *)tmp_data; + + XGetGeometry (FRAME_X_DISPLAY (f), win, + &rootw, &real_x, &real_y, &ign, &ign, &ign, &ign); + outer_x = -fe[0]; + outer_y = -fe[2]; + real_x -= fe[0]; + real_y -= fe[2]; + } + } + + if (tmp_data) XFree (tmp_data); + x_uncatch_errors (); UNBLOCK_INPUT; @@ -941,6 +921,35 @@ x_set_background_color (f, arg, oldval) } } +static Cursor +make_invisible_cursor (f) + struct frame *f; +{ + Display *dpy = FRAME_X_DISPLAY (f); + static char const no_data[] = { 0 }; + Pixmap pix; + XColor col; + Cursor c; + + x_catch_errors (dpy); + pix = XCreateBitmapFromData (dpy, FRAME_X_DISPLAY_INFO (f)->root_window, + no_data, 1, 1); + if (! x_had_errors_p (dpy) && pix != None) + { + col.pixel = 0; + col.red = col.green = col.blue = 0; + col.flags = DoRed | DoGreen | DoBlue; + c = XCreatePixmapCursor (dpy, pix, pix, &col, &col, 0, 0); + if (x_had_errors_p (dpy) || c == None) + c = 0; + XFreePixmap (dpy, pix); + } + + x_uncatch_errors (); + + return c; +} + void x_set_mouse_color (f, arg, oldval) struct frame *f; @@ -1046,7 +1055,11 @@ x_set_mouse_color (f, arg, oldval) } if (FRAME_X_WINDOW (f) != 0) - XDefineCursor (dpy, FRAME_X_WINDOW (f), cursor); + XDefineCursor (dpy, FRAME_X_WINDOW (f), + f->output_data.x->current_cursor = cursor); + + 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) @@ -1332,7 +1345,43 @@ x_set_menu_bar_lines (f, value, oldval) #else /* not USE_X_TOOLKIT && not USE_GTK */ FRAME_MENU_BAR_LINES (f) = nlines; change_window_heights (f->root_window, nlines - olines); -#endif /* not USE_X_TOOLKIT */ + + /* If the menu bar height gets changed, the internal border below + the top margin has to be cleared. Also, if the menu bar gets + larger, the area for the added lines has to be cleared except for + the first menu bar line that is to be drawn later. */ + if (nlines != olines) + { + int height = FRAME_INTERNAL_BORDER_WIDTH (f); + int width = FRAME_PIXEL_WIDTH (f); + int y; + + /* height can be zero here. */ + if (height > 0 && width > 0) + { + y = FRAME_TOP_MARGIN_HEIGHT (f); + + BLOCK_INPUT; + x_clear_area (FRAME_X_DISPLAY (f), FRAME_X_WINDOW (f), + 0, y, width, height, False); + UNBLOCK_INPUT; + } + + if (nlines > 1 && nlines > olines) + { + y = (olines == 0 ? 1 : olines) * FRAME_LINE_HEIGHT (f); + height = nlines * FRAME_LINE_HEIGHT (f) - y; + + BLOCK_INPUT; + x_clear_area (FRAME_X_DISPLAY (f), FRAME_X_WINDOW (f), + 0, y, width, height, False); + UNBLOCK_INPUT; + } + + if (nlines == 0 && WINDOWP (f->menu_bar_window)) + clear_glyph_matrix (XWINDOW (f->menu_bar_window)->current_matrix); + } +#endif /* not USE_X_TOOLKIT && not USE_GTK */ adjust_glyphs (f); } @@ -1418,7 +1467,7 @@ x_set_tool_bar_lines (f, value, oldval) { int height = FRAME_INTERNAL_BORDER_WIDTH (f); int width = FRAME_PIXEL_WIDTH (f); - int y = nlines * FRAME_LINE_HEIGHT (f); + int y = (FRAME_MENU_BAR_LINES (f) + nlines) * FRAME_LINE_HEIGHT (f); /* height can be zero here. */ if (height > 0 && width > 0) @@ -2671,7 +2720,8 @@ x_window (f, window_prompting, minibuffer_only) } XDefineCursor (FRAME_X_DISPLAY (f), FRAME_X_WINDOW (f), - f->output_data.x->text_cursor); + f->output_data.x->current_cursor + = f->output_data.x->text_cursor); UNBLOCK_INPUT; @@ -2816,7 +2866,8 @@ x_window (f) } XDefineCursor (FRAME_X_DISPLAY (f), FRAME_X_WINDOW (f), - f->output_data.x->text_cursor); + f->output_data.x->current_cursor + = f->output_data.x->text_cursor); UNBLOCK_INPUT; @@ -2901,14 +2952,6 @@ x_icon (f, parms) background, border and mouse colors; also create the mouse cursor and the gray border tile. */ -static char cursor_bits[] = - { - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 - }; - static void x_make_gc (f) struct frame *f; @@ -2967,7 +3010,7 @@ x_make_gc (f) } -/* Free what was was allocated in x_make_gc. */ +/* Free what was allocated in x_make_gc. */ void x_free_gcs (f) @@ -3049,10 +3092,22 @@ x_default_font_parameter (f, 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); + RES_TYPE_STRING); Lisp_Object font; + int got_from_gconf = 0; if (EQ (font_param, Qunbound)) font_param = Qnil; + + if (NILP (font_param)) + { + /* System font takes precedendce over X resources. We must 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)); + } + font = !NILP (font_param) ? font_param : x_get_arg (dpyinfo, parms, Qfont, "font", "Font", RES_TYPE_STRING); @@ -3062,7 +3117,7 @@ x_default_font_parameter (f, parms) = { #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", @@ -3092,7 +3147,11 @@ x_default_font_parameter (f, parms) we've applied the `default' face settings. */ x_set_frame_parameters (f, Fcons (Fcons (Qfont_param, font_param), Qnil)); } - x_default_parameter (f, parms, Qfont, font, "font", "Font", RES_TYPE_STRING); + + x_default_parameter (f, parms, Qfont, font, + got_from_gconf ? NULL : "font", + got_from_gconf ? NULL : "Font", + RES_TYPE_STRING); } @@ -3292,7 +3351,6 @@ This function is an internal primitive--use `make-frame' instead. */) f->resx = dpyinfo->resx; f->resy = dpyinfo->resy; - register_font_driver (&xfont_driver, f); #ifdef HAVE_FREETYPE #ifdef HAVE_XFT register_font_driver (&xftfont_driver, f); @@ -3300,6 +3358,7 @@ This function is an internal primitive--use `make-frame' instead. */) register_font_driver (&ftxfont_driver, f); #endif /* not HAVE_XFT */ #endif /* HAVE_FREETYPE */ + register_font_driver (&xfont_driver, f); x_default_parameter (f, parms, Qfont_backend, Qnil, "fontBackend", "FontBackend", RES_TYPE_STRING); @@ -3316,7 +3375,9 @@ This function is an internal primitive--use `make-frame' instead. */) #ifdef USE_LUCID /* Prevent lwlib/xlwmenu.c from crashing because of a bug whereby it fails to get any font. */ + BLOCK_INPUT; xlwmenu_default_font = XLoadQueryFont (FRAME_X_DISPLAY (f), "fixed"); + UNBLOCK_INPUT; #endif /* Frame contents get displaced if an embedded X window has a border. */ @@ -3385,7 +3446,7 @@ This function is an internal primitive--use `make-frame' instead. */) init_frame_faces (f); x_default_parameter (f, parms, Qmenu_bar_lines, make_number (1), - "menuBar", "MenuBar", RES_TYPE_NUMBER); + "menuBar", "MenuBar", RES_TYPE_BOOLEAN_NUMBER); x_default_parameter (f, parms, Qtool_bar_lines, make_number (1), "toolBar", "ToolBar", RES_TYPE_NUMBER); x_default_parameter (f, parms, Qbuffer_predicate, Qnil, @@ -3639,7 +3700,7 @@ DEFUN ("x-display-grayscale-p", Fx_display_grayscale_p, Sx_display_grayscale_p, doc: /* Return t if the X display supports shades of gray. Note that color displays do support shades of gray. The optional argument TERMINAL specifies which display to ask about. -TERMINAL should be a terminal id, a frame or a display name (a string). +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; @@ -3668,7 +3729,7 @@ DEFUN ("x-display-pixel-width", Fx_display_pixel_width, Sx_display_pixel_width, 0, 1, 0, doc: /* Return the width in pixels of the X display TERMINAL. The optional argument TERMINAL specifies which display to ask about. -TERMINAL should be a terminal id, a frame or a display name (a string). +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; @@ -3682,7 +3743,7 @@ DEFUN ("x-display-pixel-height", Fx_display_pixel_height, Sx_display_pixel_height, 0, 1, 0, doc: /* Return the height in pixels of the X display TERMINAL. The optional argument TERMINAL specifies which display to ask about. -TERMINAL should be a terminal id, a frame or a display name (a string). +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; @@ -3696,7 +3757,7 @@ DEFUN ("x-display-planes", Fx_display_planes, Sx_display_planes, 0, 1, 0, doc: /* Return the number of bitplanes of the X display TERMINAL. The optional argument TERMINAL specifies which display to ask about. -TERMINAL should be a terminal id, a frame or a display name (a string). +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; @@ -3710,7 +3771,7 @@ DEFUN ("x-display-color-cells", Fx_display_color_cells, Sx_display_color_cells, 0, 1, 0, doc: /* Return the number of color cells of the X display TERMINAL. The optional argument TERMINAL specifies which display to ask about. -TERMINAL should be a terminal id, a frame or a display name (a string). +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; @@ -3735,7 +3796,7 @@ DEFUN ("x-server-max-request-size", Fx_server_max_request_size, 0, 1, 0, doc: /* Return the maximum request size of the X server of display TERMINAL. The optional argument TERMINAL specifies which display to ask about. -TERMINAL should be a terminal id, a frame or a display name (a string). +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; @@ -3750,7 +3811,7 @@ DEFUN ("x-server-vendor", Fx_server_vendor, Sx_server_vendor, 0, 1, 0, \(Labelling every distributor as a "vendor" embodies the false assumption that operating systems cannot be developed and distributed noncommercially.) The optional argument TERMINAL specifies which display to ask about. -TERMINAL should be a terminal id, a frame or a display name (a string). +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; @@ -3769,7 +3830,7 @@ version numbers of the X Protocol in use, and the distributor-specific release number. See also the function `x-server-vendor'. The optional argument TERMINAL specifies which display to ask about. -TERMINAL should be a terminal id, a frame or a display name (a string). +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; @@ -3785,7 +3846,7 @@ If omitted or nil, that stands for the selected frame's display. */) DEFUN ("x-display-screens", Fx_display_screens, Sx_display_screens, 0, 1, 0, doc: /* Return the number of screens on the X server of display TERMINAL. The optional argument TERMINAL specifies which display to ask about. -TERMINAL should be a terminal id, a frame or a display name (a string). +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; @@ -3798,7 +3859,7 @@ If omitted or nil, that stands for the selected frame's display. */) DEFUN ("x-display-mm-height", Fx_display_mm_height, Sx_display_mm_height, 0, 1, 0, doc: /* Return the height in millimeters of the X display TERMINAL. The optional argument TERMINAL specifies which display to ask about. -TERMINAL should be a terminal id, a frame or a display name (a string). +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; @@ -3811,7 +3872,7 @@ If omitted or nil, that stands for the selected frame's display. */) DEFUN ("x-display-mm-width", Fx_display_mm_width, Sx_display_mm_width, 0, 1, 0, doc: /* Return the width in millimeters of the X display TERMINAL. The optional argument TERMINAL specifies which display to ask about. -TERMINAL should be a terminal id, a frame or a display name (a string). +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; @@ -3826,7 +3887,7 @@ DEFUN ("x-display-backing-store", Fx_display_backing_store, doc: /* Return an indication of whether X display TERMINAL does backing store. 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 id, a frame or a display name (a string). +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; @@ -3863,7 +3924,7 @@ The value is one of the symbols `static-gray', `gray-scale', `static-color', `pseudo-color', `true-color', or `direct-color'. The optional argument TERMINAL specifies which display to ask about. -TERMINAL should a terminal id, a frame or a display name (a string). +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; @@ -3903,7 +3964,7 @@ DEFUN ("x-display-save-under", Fx_display_save_under, Sx_display_save_under, 0, 1, 0, doc: /* Return t if the X display TERMINAL supports the save-under feature. The optional argument TERMINAL specifies which display to ask about. -TERMINAL should be a terminal id, a frame or a display name (a string). +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; @@ -4174,7 +4235,7 @@ An insecure way to solve the problem may be to use `xhost'.\n", DEFUN ("x-close-connection", Fx_close_connection, Sx_close_connection, 1, 1, 0, doc: /* Close the connection to TERMINAL's X server. -For TERMINAL, specify a terminal id, a frame or a display name (a +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) @@ -4210,7 +4271,7 @@ Turning on synchronization prohibits the Xlib routines from buffering requests and seriously degrades performance, but makes debugging much easier. The optional second argument TERMINAL specifies which display to act on. -TERMINAL should be a terminal id, a frame or a display name (a string). +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; @@ -4830,6 +4891,7 @@ x_create_tip_frame (dpyinfo, parms, text) { XSetWindowAttributes attrs; unsigned long mask; + Atom type = FRAME_X_DISPLAY_INFO (f)->Xatom_net_window_type_tooltip; BLOCK_INPUT; mask = CWBackPixel | CWOverrideRedirect | CWEventMask; @@ -4854,6 +4916,10 @@ x_create_tip_frame (dpyinfo, parms, text) f->border_width, CopyFromParent, InputOutput, CopyFromParent, mask, &attrs); + XChangeProperty (FRAME_X_DISPLAY (f), tip_window, + FRAME_X_DISPLAY_INFO (f)->Xatom_net_window_type, + XA_ATOM, 32, PropModeReplace, + (unsigned char *)&type, 1); UNBLOCK_INPUT; } @@ -4876,9 +4942,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 */ @@ -5158,7 +5223,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; @@ -5593,7 +5658,10 @@ If FRAME is omitted or nil, it defaults to the selected frame. */) { FRAME_PTR f = check_x_frame (frame); char *name; - Lisp_Object default_font, font = Qnil; + Lisp_Object font; + Lisp_Object font_param; + char *default_name = NULL; + struct gcpro gcpro1, gcpro2; int count = SPECPDL_INDEX (); check_x (); @@ -5607,21 +5675,43 @@ If FRAME is omitted or nil, it defaults to the selected frame. */) BLOCK_INPUT; - XSETFONT (default_font, FRAME_FONT (f)); - if (FONTP (default_font)) + GCPRO2(font_param, font); + + XSETFONT (font, FRAME_FONT (f)); + font_param = Ffont_get (font, intern (":name")); + if (STRINGP (font_param)) + default_name = xstrdup (SDATA (font_param)); + else { - char *default_name = alloca (256); - if (font_unparse_gtkname (default_font, f, default_name, 256) < 0) - default_name = NULL; - name = xg_get_font_name (f, default_name); + font_param = Fframe_parameter (frame, Qfont_param); + if (STRINGP (font_param)) + default_name = xstrdup (SDATA (font_param)); } - else - name = xg_get_font_name (f, NULL); + + if (default_name == NULL && x_last_font_name != NULL) + default_name = xstrdup (x_last_font_name); + + /* Convert fontconfig names to Gtk names, i.e. remove - before number */ + if (default_name) + { + char *p = strrchr (default_name, '-'); + if (p) + { + char *ep = p+1; + while (isdigit (*ep)) + ++ep; + if (*ep == '\0') *p = ' '; + } + } + + name = xg_get_font_name (f, default_name); + xfree (default_name); if (name) { font = build_string (name); - xfree (name); + g_free (x_last_font_name); + x_last_font_name = name; } UNBLOCK_INPUT; @@ -5779,7 +5869,8 @@ frame_parm_handler x_frame_parm_handlers[] = x_set_wait_for_wm, x_set_fullscreen, x_set_font_backend, - x_set_alpha + x_set_alpha, + x_set_sticky, }; void @@ -5791,17 +5882,17 @@ syms_of_xfns () /* The section below is built by the lisp expression at the top of the file, just above where these variables are declared. */ /*&&& init symbols here &&&*/ - Qnone = intern ("none"); + Qnone = intern_c_string ("none"); staticpro (&Qnone); - Qsuppress_icon = intern ("suppress-icon"); + Qsuppress_icon = intern_c_string ("suppress-icon"); staticpro (&Qsuppress_icon); - Qundefined_color = intern ("undefined-color"); + Qundefined_color = intern_c_string ("undefined-color"); staticpro (&Qundefined_color); - Qcompound_text = intern ("compound-text"); + Qcompound_text = intern_c_string ("compound-text"); staticpro (&Qcompound_text); - Qcancel_timer = intern ("cancel-timer"); + Qcancel_timer = intern_c_string ("cancel-timer"); staticpro (&Qcancel_timer); - Qfont_param = intern ("font-parameter"); + Qfont_param = intern_c_string ("font-parameter"); staticpro (&Qfont_param); /* This is the end of symbol initialization. */ @@ -5811,9 +5902,9 @@ syms_of_xfns () Fput (Qundefined_color, Qerror_conditions, - Fcons (Qundefined_color, Fcons (Qerror, Qnil))); + pure_cons (Qundefined_color, pure_cons (Qerror, Qnil))); Fput (Qundefined_color, Qerror_message, - build_string ("Undefined color")); + make_pure_c_string ("Undefined color")); DEFVAR_LISP ("x-pointer-shape", &Vx_pointer_shape, doc: /* The shape of the pointer when over text. @@ -5862,8 +5953,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, @@ -5910,12 +6001,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; - Fprovide (intern ("x"), Qnil); + Fprovide (intern_c_string ("x"), Qnil); #ifdef USE_X_TOOLKIT - Fprovide (intern ("x-toolkit"), Qnil); + Fprovide (intern_c_string ("x-toolkit"), Qnil); #ifdef USE_MOTIF - Fprovide (intern ("motif"), Qnil); + Fprovide (intern_c_string ("motif"), Qnil); DEFVAR_LISP ("motif-version-string", &Vmotif_version_string, doc: /* Version info for LessTif/Motif. */); @@ -5928,8 +6019,8 @@ the tool bar buttons. */); is not an X toolkit in that sense (USE_X_TOOLKIT is not defined). But for a user it is a toolkit for X, and indeed, configure accepts --with-x-toolkit=gtk. */ - Fprovide (intern ("x-toolkit"), Qnil); - Fprovide (intern ("gtk"), Qnil); + Fprovide (intern_c_string ("x-toolkit"), Qnil); + Fprovide (intern_c_string ("gtk"), Qnil); DEFVAR_LISP ("gtk-version-string", &Vgtk_version_string, doc: /* Version info for GTK+. */); @@ -5937,7 +6028,7 @@ the tool bar buttons. */); char gtk_version[40]; g_snprintf (gtk_version, sizeof (gtk_version), "%u.%u.%u", GTK_MAJOR_VERSION, GTK_MINOR_VERSION, GTK_MICRO_VERSION); - Vgtk_version_string = build_string (gtk_version); + Vgtk_version_string = make_pure_string (gtk_version, strlen (gtk_version), strlen (gtk_version), 0); } #endif /* USE_GTK */ @@ -5992,6 +6083,7 @@ the tool bar buttons. */); #if defined (USE_GTK) && defined (HAVE_FREETYPE) defsubr (&Sx_select_font); + x_last_font_name = NULL; #endif }