X-Git-Url: http://git.hcoop.net/bpt/emacs.git/blobdiff_plain/a9989764a4d54bf58381d5c3902e575bdf314245..cbf21103d9fad16fe87d9affbc955c75cce657e4:/src/xfns.c diff --git a/src/xfns.c b/src/xfns.c index e94641bcbe..e079ff6025 100644 --- a/src/xfns.c +++ b/src/xfns.c @@ -5,10 +5,10 @@ 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,9 +16,7 @@ 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 @@ -50,10 +48,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 +56,11 @@ 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 #ifdef USE_GTK #include "gtkutil.h" @@ -154,10 +145,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 +196,7 @@ Lisp_Object Qnone; Lisp_Object Qsuppress_icon; Lisp_Object Qundefined_color; Lisp_Object Qcompound_text, Qcancel_timer; +static Lisp_Object Qfont_param; /* In dispnew.c */ @@ -1928,8 +1916,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 +2092,11 @@ print_fontset_result (xfs, name, missing_list, missing_count) #endif static XFontSet -xic_create_xfontset (f, base_fontname) - 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) +xic_create_xfontset (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 +2107,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 +2188,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 +2261,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 +2416,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) @@ -2720,6 +2599,10 @@ x_window (f, window_prompting, minibuffer_only) XtManageChild (pane_widget); XtRealizeWidget (shell_widget); + if (FRAME_X_EMBEDDED_P (f)) + XReparentWindow (FRAME_X_DISPLAY (f), XtWindow (shell_widget), + f->output_data.x->parent_desc, 0, 0); + FRAME_X_WINDOW (f) = XtWindow (frame_widget); validate_x_resource_name (); @@ -3037,15 +2920,13 @@ x_make_gc (f) /* Create the GCs of this frame. Note that many default values are used. */ - /* Normal video */ - 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. */ @@ -3054,7 +2935,7 @@ 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. */ @@ -3067,7 +2948,7 @@ x_make_gc (f) cursor_bits, 16, 16); f->output_data.x->cursor_gc = XCreateGC (FRAME_X_DISPLAY (f), FRAME_X_WINDOW (f), - (GCFont | GCForeground | GCBackground + (GCForeground | GCBackground | GCFillStyle /* | GCStipple */ | GCLineWidth), &gc_values); @@ -3164,20 +3045,30 @@ 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", + Lisp_Object font_param = x_get_arg (dpyinfo, parms, Qfont, NULL, NULL, RES_TYPE_STRING); + Lisp_Object font; + if (EQ (font_param, Qunbound)) + font_param = Qnil; + 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-12", +#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 @@ -3199,15 +3090,21 @@ x_default_font_parameter (f, parms) if (NILP (font)) error ("No suitable font was found"); } + 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, "font", "Font", RES_TYPE_STRING); } -#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 @@ -3242,11 +3139,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"); @@ -3317,7 +3210,7 @@ This function is an internal primitive--use `make-frame' instead. */) /* With FRAME_X_DISPLAY_INFO set up, this unwind-protect is safe. */ record_unwind_protect (unwind_create_frame, frame); #if GLYPH_DEBUG - image_cache_refcount = FRAME_X_IMAGE_CACHE (f)->refcount; + image_cache_refcount = FRAME_IMAGE_CACHE (f)->refcount; dpyinfo_refcount = dpyinfo->reference_count; #endif /* GLYPH_DEBUG */ @@ -3385,82 +3278,32 @@ 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. */ + 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); - - /* 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); #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); + xlwmenu_default_font = XLoadQueryFont (FRAME_X_DISPLAY (f), "fixed"); #endif - x_default_parameter (f, parms, Qborder_width, make_number (2), - "borderWidth", "BorderWidth", RES_TYPE_NUMBER); + /* 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), + "borderWidth", "BorderWidth", RES_TYPE_NUMBER); /* This defaults to 1 in order to match xterm. We recognize either internalBorderWidth or internalBorder (which is what xterm calls @@ -3475,7 +3318,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, @@ -3531,8 +3379,6 @@ else x_default_parameter (f, parms, Qfullscreen, Qnil, "fullscreen", "Fullscreen", RES_TYPE_SYMBOL); - f->output_data.x->parent_desc = FRAME_X_DISPLAY_INFO (f)->root_window; - /* Compute the size of the X window. */ window_prompting = x_figure_window_size (f, parms, 1); @@ -3569,6 +3415,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 @@ -4172,7 +4020,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; @@ -4612,85 +4460,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. @@ -4699,7 +4468,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; { @@ -4764,7 +4533,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) @@ -4921,7 +4690,7 @@ x_create_tip_frame (dpyinfo, parms, text) f->icon_name = Qnil; FRAME_X_DISPLAY_INFO (f) = dpyinfo; #if GLYPH_DEBUG - image_cache_refcount = FRAME_X_IMAGE_CACHE (f)->refcount; + image_cache_refcount = FRAME_IMAGE_CACHE (f)->refcount; dpyinfo_refcount = dpyinfo->reference_count; #endif /* GLYPH_DEBUG */ f->output_data.x->parent_desc = FRAME_X_DISPLAY_INFO (f)->root_window; @@ -4978,68 +4747,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); @@ -5172,7 +4894,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), @@ -5308,6 +5030,9 @@ Text larger than the specified size is clipped. */) GCPRO4 (string, parms, frame, timeout); CHECK_STRING (string); + if (SCHARS (string) == 0) + string = make_unibyte_string (" ", 1); + f = check_x_frame (frame); if (NILP (timeout)) timeout = make_number (5); @@ -5834,6 +5559,59 @@ 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 default_font, font = Qnil; + 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; + + XSETFONT (default_font, FRAME_FONT (f)); + if (FONTP (default_font)) + { + 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); + } + else + name = xg_get_font_name (f, NULL); + + if (name) + { + font = build_string (name); + xfree (name); + } + + UNBLOCK_INPUT; + + if (NILP (font)) + Fsignal (Qquit, Qnil); + + return unbind_to (count, font); +} +#endif /* HAVE_FREETYPE */ + #endif /* USE_GTK */ @@ -5979,9 +5757,8 @@ 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 }; void @@ -6003,6 +5780,8 @@ syms_of_xfns () staticpro (&Qcompound_text); Qcancel_timer = intern ("cancel-timer"); staticpro (&Qcancel_timer); + Qfont_param = intern ("font-parameter"); + staticpro (&Qfont_param); /* This is the end of symbol initialization. */ /* Text property `display' should be nonsticky by default. */ @@ -6035,15 +5814,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. @@ -6181,23 +5951,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; @@ -6212,6 +5967,10 @@ 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); +#endif } #endif /* HAVE_X_WINDOWS */