X-Git-Url: https://code.delx.au/gnu-emacs/blobdiff_plain/e983096bb6a50fdae6625cb363642bcd74ec39c5..31887d45e8c5cf28b1e85f76a0aba40186f7f1a5:/src/xfns.c diff --git a/src/xfns.c b/src/xfns.c index bfbc6ac02e..635264ea86 100644 --- a/src/xfns.c +++ b/src/xfns.c @@ -1,14 +1,14 @@ /* 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 + 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 Free Software Foundation, Inc. This file is part of GNU Emacs. -GNU Emacs is free software; you can redistribute it and/or modify +GNU Emacs is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by -the Free Software Foundation; either version 3, or (at your option) -any later version. +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. GNU Emacs is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of @@ -16,13 +16,13 @@ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License -along with GNU Emacs; see the file COPYING. If not, write to -the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, -Boston, MA 02110-1301, USA. */ +along with GNU Emacs. If not, see . */ #include #include #include +#include +#include #ifdef HAVE_UNISTD_H #include @@ -50,10 +50,7 @@ Boston, MA 02110-1301, USA. */ #include "termhooks.h" #include "atimer.h" #include "termchar.h" - -#ifdef USE_FONT_BACKEND #include "font.h" -#endif /* USE_FONT_BACKEND */ #ifdef HAVE_X_WINDOWS @@ -61,15 +58,13 @@ Boston, MA 02110-1301, USA. */ #include #include -#ifndef VMS #if 1 /* Used to be #ifdef EMACS_BITMAP_FILES, but this should always work. */ #include "bitmaps/gray.xbm" #else #include #endif -#else -#include "[.bitmaps]gray.xbm" -#endif + +#include "xsettings.h" #ifdef USE_GTK #include "gtkutil.h" @@ -106,13 +101,10 @@ Boston, MA 02110-1301, USA. */ #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. */ @@ -154,10 +146,6 @@ int gray_bitmap_width = gray_width; int gray_bitmap_height = gray_height; char *gray_bitmap_bits = gray_bits; -/* Non-zero means we're allowed to display an hourglass cursor. */ - -int display_hourglass_p; - /* Non-zero means prompt with the old GTK file selection dialog. */ int x_gtk_use_old_file_dialog; @@ -209,6 +197,7 @@ Lisp_Object Qnone; Lisp_Object Qsuppress_icon; Lisp_Object Qundefined_color; Lisp_Object Qcompound_text, Qcancel_timer; +Lisp_Object Qfont_param; /* In dispnew.c */ @@ -216,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. */ @@ -259,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. */ @@ -280,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); @@ -386,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) @@ -410,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; @@ -480,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; @@ -600,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 @@ -690,6 +631,34 @@ 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; + + XGetGeometry (FRAME_X_DISPLAY (f), win, + &rootw, &real_x, &real_y, &ign, &ign, &ign, &ign); + long *fe = (long *)tmp_data; + + 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; @@ -953,6 +922,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; @@ -1058,7 +1056,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) @@ -1344,7 +1346,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); } @@ -1430,7 +1468,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) @@ -1928,8 +1966,7 @@ hack_wm_protocols (f, widget) #ifdef HAVE_X_I18N -static XFontSet xic_create_xfontset P_ ((struct frame *, char *)); -static XFontSet xic_create_xfontset2 P_ ((struct frame *)); +static XFontSet xic_create_xfontset P_ ((struct frame *)); static XIMStyle best_xim_style P_ ((XIMStyles *, XIMStyles *)); @@ -2105,105 +2142,11 @@ print_fontset_result (xfs, name, missing_list, missing_count) #endif static XFontSet -xic_create_xfontset (f, base_fontname) +xic_create_xfontset (f) struct frame *f; - char *base_fontname; { XFontSet xfs = NULL; - char **missing_list = NULL; - int missing_count; - char *def_string; - Lisp_Object rest, frame; - - if (!base_fontname) - base_fontname = xic_defaut_fontset; - - /* See if there is another frame already using same fontset. */ - FOR_EACH_FRAME (rest, frame) - { - struct frame *cf = XFRAME (frame); - if (cf != f && FRAME_LIVE_P (f) && FRAME_X_P (cf) - && FRAME_X_DISPLAY_INFO (cf) == FRAME_X_DISPLAY_INFO (f) - && FRAME_XIC_BASE_FONTNAME (cf) - && !strcmp (FRAME_XIC_BASE_FONTNAME (cf), base_fontname)) - { - xfs = FRAME_XIC_FONTSET (cf); - break; - } - } - - if (!xfs) - { - char *fontsetname = xic_create_fontsetname (base_fontname, False); - - /* New fontset. */ - xfs = XCreateFontSet (FRAME_X_DISPLAY (f), - fontsetname, &missing_list, - &missing_count, &def_string); -#ifdef DEBUG_XIC_FONTSET - print_fontset_result (xfs, fontsetname, missing_list, missing_count); -#endif - if (missing_list) - XFreeStringList (missing_list); - if (! xfs) - { - /* FONTSETNAME contains a list of font names (specific fonts - first, general fonts last), but giving that to - XCreateFontSet at once occasionally fails (bug of X?). - So, we try to call XCreateFontSet for each fontname. */ - char *p0 = fontsetname, *p1; - - while (p0) - { - p1 = strchr (p0, ','); - if (p1) - *p1 = '\0'; - xfs = XCreateFontSet (FRAME_X_DISPLAY (f), - p0, &missing_list, - &missing_count, &def_string); -#ifdef DEBUG_XIC_FONTSET - print_fontset_result (xfs, p0, missing_list, missing_count); -#endif - if (missing_list) - XFreeStringList (missing_list); - if (xfs) - break; - p0 = p1 ? p1 + 1 : NULL; - } - } - xfree (fontsetname); - if (! xfs && base_fontname != xic_defaut_fontset) - { - /* Try the default fontset name at a last resort. */ - fontsetname = xic_create_fontsetname (xic_defaut_fontset, False); - xfs = XCreateFontSet (FRAME_X_DISPLAY (f), - fontsetname, &missing_list, - &missing_count, &def_string); -#ifdef DEBUG_XIC_FONTSET - print_fontset_result (xfs, fontsetname, missing_list, missing_count); -#endif - if (missing_list) - XFreeStringList (missing_list); - xfree (fontsetname); - } - } - - if (FRAME_XIC_BASE_FONTNAME (f)) - xfree (FRAME_XIC_BASE_FONTNAME (f)); - FRAME_XIC_BASE_FONTNAME (f) = xstrdup (base_fontname); - - /* No need to free def_string. */ - return xfs; -} - -#ifdef USE_FONT_BACKEND - -static XFontSet -xic_create_xfontset2 (f) - struct frame *f; -{ - XFontSet xfs = NULL; - struct font *font = FRAME_FONT_OBJECT (f); + struct font *font = FRAME_FONT (f); int pixel_size = font->pixel_size; Lisp_Object rest, frame; @@ -2214,8 +2157,8 @@ xic_create_xfontset2 (f) if (cf != f && FRAME_LIVE_P (f) && FRAME_X_P (cf) && FRAME_X_DISPLAY_INFO (cf) == FRAME_X_DISPLAY_INFO (f) - && FRAME_FONT_OBJECT (f) - && FRAME_FONT_OBJECT (f)->pixel_size == pixel_size) + && FRAME_FONT (f) + && FRAME_FONT (f)->pixel_size == pixel_size) { xfs = FRAME_XIC_FONTSET (cf); break; @@ -2295,7 +2238,6 @@ xic_create_xfontset2 (f) return xfs; } -#endif /* USE_FONT_BACKEND */ /* Free the X fontset of frame F if it is the last frame using it. */ @@ -2369,15 +2311,7 @@ create_frame_xic (f) return; /* Create X fontset. */ -#ifdef USE_FONT_BACKEND - if (enable_font_backend) - xfs = xic_create_xfontset2 (f); - else -#endif - xfs = xic_create_xfontset - (f, (FRAME_FONTSET (f) < 0) ? NULL - : (char *) SDATA (fontset_ascii (FRAME_FONTSET (f)))); - + xfs = xic_create_xfontset (f); xim = FRAME_X_XIM (f); if (xim) { @@ -2532,12 +2466,7 @@ xic_set_xfontset (f, base_fontname) xic_free_xfontset (f); -#ifdef USE_FONT_BACKEND - if (enable_font_backend) - xfs = xic_create_xfontset2 (f); - else -#endif - xfs = xic_create_xfontset (f, base_fontname); + xfs = xic_create_xfontset (f); attr = XVaCreateNestedList (0, XNFontSet, xfs, NULL); if (FRAME_XIC_STYLE (f) & XIMPreeditPosition) @@ -2792,7 +2721,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; @@ -2937,7 +2867,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; @@ -3022,14 +2953,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; @@ -3041,20 +2964,13 @@ x_make_gc (f) /* Create the GCs of this frame. Note that many default values are used. */ - /* Normal video */ -#ifdef USE_FONT_BACKEND - if (enable_font_backend) - gc_values.font = FRAME_X_DISPLAY_INFO (f)->font->fid; - else -#endif - gc_values.font = FRAME_FONT (f)->fid; gc_values.foreground = FRAME_FOREGROUND_PIXEL (f); gc_values.background = FRAME_BACKGROUND_PIXEL (f); gc_values.line_width = 0; /* Means 1 using fast algorithm. */ f->output_data.x->normal_gc = XCreateGC (FRAME_X_DISPLAY (f), FRAME_X_WINDOW (f), - GCLineWidth | GCFont | GCForeground | GCBackground, + GCLineWidth | GCForeground | GCBackground, &gc_values); /* Reverse video style. */ @@ -3063,21 +2979,17 @@ x_make_gc (f) f->output_data.x->reverse_gc = XCreateGC (FRAME_X_DISPLAY (f), FRAME_X_WINDOW (f), - GCFont | GCForeground | GCBackground | GCLineWidth, + GCForeground | GCBackground | GCLineWidth, &gc_values); /* Cursor has cursor-color background, background-color foreground. */ gc_values.foreground = FRAME_BACKGROUND_PIXEL (f); gc_values.background = f->output_data.x->cursor_pixel; gc_values.fill_style = FillOpaqueStippled; - gc_values.stipple - = XCreateBitmapFromData (FRAME_X_DISPLAY (f), - FRAME_X_DISPLAY_INFO (f)->root_window, - cursor_bits, 16, 16); f->output_data.x->cursor_gc = XCreateGC (FRAME_X_DISPLAY (f), FRAME_X_WINDOW (f), - (GCFont | GCForeground | GCBackground - | GCFillStyle /* | GCStipple */ | GCLineWidth), + (GCForeground | GCBackground + | GCFillStyle | GCLineWidth), &gc_values); /* Reliefs. */ @@ -3099,7 +3011,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) @@ -3173,20 +3085,42 @@ unwind_create_frame (frame) return Qnil; } -#ifdef USE_FONT_BACKEND + static void x_default_font_parameter (f, parms) struct frame *f; Lisp_Object parms; { struct x_display_info *dpyinfo = FRAME_X_DISPLAY_INFO (f); - Lisp_Object font = x_get_arg (dpyinfo, parms, Qfont, "font", "Font", - RES_TYPE_STRING); + Lisp_Object font_param = x_get_arg (dpyinfo, parms, Qfont, NULL, NULL, + 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); if (! STRINGP (font)) { char *names[] - = { "-adobe-courier-medium-r-*-*-*-120-*-*-*-*-iso8859-1", + = { +#ifdef HAVE_XFT + /* This will find the normal Xft font. */ + "monospace-10", +#endif + "-adobe-courier-medium-r-*-*-*-120-*-*-*-*-iso8859-1", "-misc-fixed-medium-r-normal-*-*-140-*-*-c-*-iso8859-1", "-*-*-medium-r-normal-*-*-140-*-*-c-*-iso8859-1", /* This was formerly the first thing tried, but it finds @@ -3208,15 +3142,43 @@ x_default_font_parameter (f, parms) if (NILP (font)) error ("No suitable font was found"); } - x_default_parameter (f, parms, Qfont, font, "font", "Font", RES_TYPE_STRING); + else if (!NILP (font_param)) + { + /* Remember the explicit font parameter, so we can re-apply it after + 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, + got_from_gconf ? NULL : "font", + got_from_gconf ? NULL : "Font", + RES_TYPE_STRING); +} + + +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; +{ + struct frame *f; + if (NILP (frame)) + frame = selected_frame; + f = XFRAME (frame); + BLOCK_INPUT; + if (FRAME_X_P (f)) + x_wm_set_size_hint (f, 0, 0); + UNBLOCK_INPUT; + return Qnil; } -#endif /* USE_FONT_BACKEND */ 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. Return an Emacs frame object. -ALIST is an alist of frame parameters. +PARMS is an alist of frame parameters. If the parameters specify that the frame should not have a minibuffer, and do not specify a specific minibuffer window to use, then `default-minibuffer-frame' must be a frame whose minibuffer can @@ -3251,11 +3213,7 @@ This function is an internal primitive--use `make-frame' instead. */) if (EQ (display, Qunbound)) display = Qnil; dpyinfo = check_x_display_info (display); -#ifdef MULTI_KBOARD kb = dpyinfo->terminal->kboard; -#else - kb = &the_only_kboard; -#endif if (!dpyinfo->terminal->name) error ("Terminal is not live, can't create new frames on it"); @@ -3394,78 +3352,33 @@ This function is an internal primitive--use `make-frame' instead. */) f->resx = dpyinfo->resx; f->resy = dpyinfo->resy; -#ifdef USE_FONT_BACKEND - if (enable_font_backend) - { - /* Perhaps, we must allow frame parameter, say `font-backend', - to specify which font backends to use. */ #ifdef HAVE_FREETYPE #ifdef HAVE_XFT - register_font_driver (&xftfont_driver, f); + register_font_driver (&xftfont_driver, f); #else /* not HAVE_XFT */ - register_font_driver (&ftxfont_driver, f); + register_font_driver (&ftxfont_driver, f); #endif /* not HAVE_XFT */ #endif /* HAVE_FREETYPE */ - register_font_driver (&xfont_driver, f); + register_font_driver (&xfont_driver, f); - x_default_parameter (f, parms, Qfont_backend, Qnil, - "fontBackend", "FontBackend", RES_TYPE_STRING); - } -#endif /* USE_FONT_BACKEND */ + x_default_parameter (f, parms, Qfont_backend, Qnil, + "fontBackend", "FontBackend", RES_TYPE_STRING); /* Extract the window parameters from the supplied values that are needed to determine window geometry. */ -#ifdef USE_FONT_BACKEND - if (enable_font_backend) - x_default_font_parameter (f, parms); -else -#endif /* USE_FONT_BACKEND */ - { - Lisp_Object font; - - font = x_get_arg (dpyinfo, parms, Qfont, "font", "Font", RES_TYPE_STRING); - - /* If the caller has specified no font, try out fonts which we - hope have bold and italic variations. */ - if (!STRINGP (font)) - { - char *names[] - = { "-adobe-courier-medium-r-*-*-*-120-*-*-*-*-iso8859-1", - "-misc-fixed-medium-r-normal-*-*-140-*-*-c-*-iso8859-1", - "-*-*-medium-r-normal-*-*-140-*-*-c-*-iso8859-1", - /* This was formerly the first thing tried, but it finds - too many fonts and takes too long. */ - "-*-*-medium-r-*-*-*-*-*-*-c-*-iso8859-1", - /* If those didn't work, look for something which will - at least work. */ - "-*-fixed-*-*-*-*-*-140-*-*-c-*-iso8859-1", - NULL }; - int i; - - BLOCK_INPUT; - for (i = 0; names[i]; i++) - { - Lisp_Object list; - - list = x_list_fonts (f, build_string (names[i]), 0, 1); - if (CONSP (list)) - { - font = XCAR (list); - break; - } - } - UNBLOCK_INPUT; - if (! STRINGP (font)) - font = build_string ("fixed"); - } - x_default_parameter (f, parms, Qfont, font, - "font", "Font", RES_TYPE_STRING); - } + x_default_font_parameter (f, parms); + if (!FRAME_FONT (f)) + { + delete_frame (frame, Qnoelisp); + 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 = FRAME_FONT (f); + 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. */ @@ -3486,7 +3399,12 @@ else parms = Fcons (Fcons (Qinternal_border_width, value), parms); } - x_default_parameter (f, parms, Qinternal_border_width, make_number (1), + x_default_parameter (f, parms, Qinternal_border_width, +#ifdef USE_GTK /* We used to impose 0 in xg_create_frame_widgets. */ + make_number (0), +#else + make_number (1), +#endif "internalBorderWidth", "internalBorderWidth", RES_TYPE_NUMBER); x_default_parameter (f, parms, Qvertical_scroll_bars, Qleft, @@ -3529,7 +3447,7 @@ else 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, @@ -3578,6 +3496,8 @@ else x_default_parameter (f, parms, Qscroll_bar_width, Qnil, "scrollBarWidth", "ScrollBarWidth", RES_TYPE_NUMBER); + x_default_parameter (f, parms, Qalpha, Qnil, + "alpha", "Alpha", RES_TYPE_NUMBER); /* Dimensions, especially FRAME_LINES (f), must be done via change_frame_size. Change will not be effected unless different from the current @@ -3781,7 +3701,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; @@ -3810,35 +3730,35 @@ 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; { struct x_display_info *dpyinfo = check_x_display_info (terminal); - return make_number (dpyinfo->width); + return make_number (x_display_pixel_width (dpyinfo)); } 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; { struct x_display_info *dpyinfo = check_x_display_info (terminal); - return make_number (dpyinfo->height); + return make_number (x_display_pixel_height (dpyinfo)); } 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; @@ -3852,7 +3772,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; @@ -3877,7 +3797,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; @@ -3892,7 +3812,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; @@ -3911,7 +3831,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; @@ -3927,7 +3847,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; @@ -3940,7 +3860,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; @@ -3953,7 +3873,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; @@ -3968,7 +3888,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; @@ -4005,7 +3925,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; @@ -4045,7 +3965,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; @@ -4181,7 +4101,7 @@ select_visual (dpyinfo) /* Determine the visual class. */ for (i = 0; visual_classes[i].name; ++i) - if (xstricmp (s, visual_classes[i].name) == 0) + if (xstrcasecmp (s, visual_classes[i].name) == 0) { class = visual_classes[i].class; break; @@ -4316,7 +4236,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) @@ -4352,7 +4272,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; @@ -4621,85 +4541,6 @@ no value of TYPE. */) Busy cursor ***********************************************************************/ -/* If non-null, an asynchronous timer that, when it expires, displays - an hourglass cursor on all frames. */ - -static struct atimer *hourglass_atimer; - -/* Non-zero means an hourglass cursor is currently shown. */ - -static int hourglass_shown_p; - -/* Number of seconds to wait before displaying an hourglass cursor. */ - -static Lisp_Object Vhourglass_delay; - -/* Default number of seconds to wait before displaying an hourglass - cursor. */ - -#define DEFAULT_HOURGLASS_DELAY 1 - -/* Function prototypes. */ - -static void show_hourglass P_ ((struct atimer *)); -static void hide_hourglass P_ ((void)); - -/* Return non-zero if houglass timer has been started or hourglass is shown. */ - -int -hourglass_started () -{ - return hourglass_shown_p || hourglass_atimer != NULL; -} - - -/* Cancel a currently active hourglass timer, and start a new one. */ - -void -start_hourglass () -{ - EMACS_TIME delay; - int secs, usecs = 0; - - cancel_hourglass (); - - if (INTEGERP (Vhourglass_delay) - && XINT (Vhourglass_delay) > 0) - secs = XFASTINT (Vhourglass_delay); - else if (FLOATP (Vhourglass_delay) - && XFLOAT_DATA (Vhourglass_delay) > 0) - { - Lisp_Object tem; - tem = Ftruncate (Vhourglass_delay, Qnil); - secs = XFASTINT (tem); - usecs = (XFLOAT_DATA (Vhourglass_delay) - secs) * 1000000; - } - else - secs = DEFAULT_HOURGLASS_DELAY; - - EMACS_SET_SECS_USECS (delay, secs, usecs); - hourglass_atimer = start_atimer (ATIMER_RELATIVE, delay, - show_hourglass, NULL); -} - - -/* Cancel the hourglass cursor timer if active, hide a busy cursor if - shown. */ - -void -cancel_hourglass () -{ - if (hourglass_atimer) - { - cancel_atimer (hourglass_atimer); - hourglass_atimer = NULL; - } - - if (hourglass_shown_p) - hide_hourglass (); -} - - /* Timer function of hourglass_atimer. TIMER is equal to hourglass_atimer. @@ -4708,7 +4549,7 @@ cancel_hourglass () output_data.x structure to indicate that an hourglass cursor is shown on the frames. */ -static void +void show_hourglass (timer) struct atimer *timer; { @@ -4773,7 +4614,7 @@ show_hourglass (timer) /* Hide the hourglass pointer on all frames, if it is currently shown. */ -static void +void hide_hourglass () { if (hourglass_shown_p) @@ -4987,68 +4828,21 @@ x_create_tip_frame (dpyinfo, parms, text) f->resx = dpyinfo->resx; f->resy = dpyinfo->resy; -#ifdef USE_FONT_BACKEND - if (enable_font_backend) - { - /* Perhaps, we must allow frame parameter, say `font-backend', - to specify which font backends to use. */ + register_font_driver (&xfont_driver, f); #ifdef HAVE_FREETYPE #ifdef HAVE_XFT - register_font_driver (&xftfont_driver, f); + register_font_driver (&xftfont_driver, f); #else /* not HAVE_XFT */ - register_font_driver (&ftxfont_driver, f); + 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); - } -#endif /* USE_FONT_BACKEND */ + x_default_parameter (f, parms, Qfont_backend, Qnil, + "fontBackend", "FontBackend", RES_TYPE_STRING); /* Extract the window parameters from the supplied values that are needed to determine window geometry. */ -#ifdef USE_FONT_BACKEND - if (enable_font_backend) - x_default_font_parameter (f, parms); -else -#endif /* USE_FONT_BACKEND */ - { - Lisp_Object font; - - font = x_get_arg (dpyinfo, parms, Qfont, "font", "Font", RES_TYPE_STRING); - - BLOCK_INPUT; - /* First, try whatever font the caller has specified. */ - if (STRINGP (font)) - { - tem = Fquery_fontset (font, Qnil); - if (STRINGP (tem)) - font = x_new_fontset (f, tem); - else - font = x_new_font (f, SDATA (font)); - } - - /* Try out a font which we hope has bold and italic variations. */ - if (!STRINGP (font)) - font = x_new_font (f, "-adobe-courier-medium-r-*-*-*-120-*-*-*-*-iso8859-1"); - if (!STRINGP (font)) - font = x_new_font (f, "-misc-fixed-medium-r-normal-*-*-140-*-*-c-*-iso8859-1"); - if (! STRINGP (font)) - font = x_new_font (f, "-*-*-medium-r-normal-*-*-140-*-*-c-*-iso8859-1"); - if (! STRINGP (font)) - /* This was formerly the first thing tried, but it finds too many fonts - and takes too long. */ - font = x_new_font (f, "-*-*-medium-r-*-*-*-*-*-*-c-*-iso8859-1"); - /* If those didn't work, look for something which will at least work. */ - if (! STRINGP (font)) - font = x_new_font (f, "-*-fixed-*-*-*-*-*-140-*-*-c-*-iso8859-1"); - UNBLOCK_INPUT; - if (! STRINGP (font)) - font = build_string ("fixed"); - - x_set_frame_parameters (f, Fcons (Fcons (Qfont, font), Qnil)); - } + x_default_font_parameter (f, parms); x_default_parameter (f, parms, Qborder_width, make_number (2), "borderWidth", "BorderWidth", RES_TYPE_NUMBER); @@ -5098,6 +4892,7 @@ else { XSetWindowAttributes attrs; unsigned long mask; + Atom type = FRAME_X_DISPLAY_INFO (f)->Xatom_net_window_type_tooltip; BLOCK_INPUT; mask = CWBackPixel | CWOverrideRedirect | CWEventMask; @@ -5119,9 +4914,13 @@ else /* x, y, width, height */ 0, 0, 1, 1, /* Border. */ - 1, + 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; } @@ -5144,9 +4943,8 @@ else 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 */ @@ -5181,7 +4979,7 @@ else /* Set tip_frame here, so that */ tip_frame = frame; - call1 (Qface_set_after_frame_default, frame); + call2 (Qface_set_after_frame_default, frame, Qnil); if (!EQ (bg, Fframe_parameter (frame, Qbackground_color))) Fmodify_frame_parameters (frame, Fcons (Fcons (Qbackground_color, bg), @@ -5249,9 +5047,10 @@ compute_tip_xy (f, parms, dx, dy, width, height, root_x, root_y) *root_y = XINT (top); else if (*root_y + XINT (dy) <= 0) *root_y = 0; /* Can happen for negative dy */ - else if (*root_y + XINT (dy) + height <= FRAME_X_DISPLAY_INFO (f)->height) + else if (*root_y + XINT (dy) + height + <= x_display_pixel_height (FRAME_X_DISPLAY_INFO (f))) /* It fits below the pointer */ - *root_y += XINT (dy); + *root_y += XINT (dy); else if (height + XINT (dy) <= *root_y) /* It fits above the pointer. */ *root_y -= height + XINT (dy); @@ -5263,7 +5062,8 @@ compute_tip_xy (f, parms, dx, dy, width, height, root_x, root_y) *root_x = XINT (left); else if (*root_x + XINT (dx) <= 0) *root_x = 0; /* Can happen for negative dx */ - else if (*root_x + XINT (dx) + width <= FRAME_X_DISPLAY_INFO (f)->width) + else if (*root_x + XINT (dx) + width + <= x_display_pixel_width (FRAME_X_DISPLAY_INFO (f))) /* It fits to the right of the pointer. */ *root_x += XINT (dx); else if (width + XINT (dx) <= *root_x) @@ -5515,7 +5315,7 @@ Value is t if tooltip was open, nil otherwise. */) if (FRAMEP (frame)) { - Fdelete_frame (frame, Qnil); + delete_frame (frame, Qnil); deleted = Qt; #ifdef USE_LUCID @@ -5846,6 +5646,84 @@ directories. */) return unbind_to (count, decoded_file); } + +#ifdef HAVE_FREETYPE + +DEFUN ("x-select-font", Fx_select_font, Sx_select_font, 0, 2, 0, + doc: /* Read a font name using a GTK font selection dialog. +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; +{ + FRAME_PTR f = check_x_frame (frame); + char *name; + Lisp_Object font; + Lisp_Object font_param; + char *default_name = NULL; + struct gcpro gcpro1, gcpro2; + int count = SPECPDL_INDEX (); + + check_x (); + + if (popup_activated ()) + error ("Trying to use a menu from within a menu-entry"); + + /* Prevent redisplay. */ + specbind (Qinhibit_redisplay, Qt); + record_unwind_protect (clean_up_dialog, Qnil); + + BLOCK_INPUT; + + 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 + { + font_param = Fframe_parameter (frame, Qfont_param); + if (STRINGP (font_param)) + default_name = xstrdup (SDATA (font_param)); + } + + 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); + g_free (x_last_font_name); + x_last_font_name = name; + } + + UNBLOCK_INPUT; + + if (NILP (font)) + Fsignal (Qquit, Qnil); + + return unbind_to (count, font); +} +#endif /* HAVE_FREETYPE */ + #endif /* USE_GTK */ @@ -5991,9 +5869,9 @@ frame_parm_handler x_frame_parm_handlers[] = x_set_fringe_width, x_set_wait_for_wm, x_set_fullscreen, -#ifdef USE_FONT_BACKEND - x_set_font_backend -#endif /* USE_FONT_BACKEND */ + x_set_font_backend, + x_set_alpha, + x_set_sticky, }; void @@ -6005,16 +5883,18 @@ 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_c_string ("font-parameter"); + staticpro (&Qfont_param); /* This is the end of symbol initialization. */ /* Text property `display' should be nonsticky by default. */ @@ -6023,9 +5903,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. @@ -6047,15 +5927,6 @@ This variable takes effect when you create a new frame or when you set the mouse color. */); Vx_hourglass_pointer_shape = Qnil; - DEFVAR_BOOL ("display-hourglass", &display_hourglass_p, - doc: /* Non-zero means Emacs displays an hourglass pointer on window systems. */); - display_hourglass_p = 1; - - DEFVAR_LISP ("hourglass-delay", &Vhourglass_delay, - doc: /* *Seconds to wait before displaying an hourglass pointer. -Value must be an integer or float. */); - Vhourglass_delay = make_number (DEFAULT_HOURGLASS_DELAY); - #if 0 /* This doesn't really do anything. */ DEFVAR_LISP ("x-mode-pointer-shape", &Vx_mode_pointer_shape, doc: /* The shape of the pointer when over the mode line. @@ -6083,8 +5954,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, @@ -6131,12 +6002,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. */); @@ -6149,8 +6020,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+. */); @@ -6158,7 +6029,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 */ @@ -6184,6 +6055,7 @@ the tool bar buttons. */); defsubr (&Sx_display_visual_class); defsubr (&Sx_display_backing_store); defsubr (&Sx_display_save_under); + defsubr (&Sx_wm_set_size_hint); defsubr (&Sx_create_frame); defsubr (&Sx_open_connection); defsubr (&Sx_close_connection); @@ -6193,23 +6065,8 @@ the tool bar buttons. */); defsubr (&Sx_backspace_delete_keys_p); /* Setting callback functions for fontset handler. */ - get_font_info_func = x_get_font_info; - -#if 0 /* This function pointer doesn't seem to be used anywhere. - And the pointer assigned has the wrong type, anyway. */ - list_fonts_func = x_list_fonts; -#endif - - load_font_func = x_load_font; - find_ccl_program_func = x_find_ccl_program; - query_font_func = x_query_font; - set_frame_fontset_func = x_set_font; - get_font_repertory_func = x_get_font_repertory; check_window_system_func = check_x; - hourglass_atimer = NULL; - hourglass_shown_p = 0; - defsubr (&Sx_show_tip); defsubr (&Sx_hide_tip); tip_timer = Qnil; @@ -6224,6 +6081,11 @@ the tool bar buttons. */); #if defined (USE_MOTIF) || defined (USE_GTK) defsubr (&Sx_file_dialog); #endif + +#if defined (USE_GTK) && defined (HAVE_FREETYPE) + defsubr (&Sx_select_font); + x_last_font_name = NULL; +#endif } #endif /* HAVE_X_WINDOWS */