X-Git-Url: https://code.delx.au/gnu-emacs/blobdiff_plain/56f41f98c0536b58e5f2bfeb8e0675d64796125b..1d424b5859841d55ba95a8e3687ee675c1e6eb60:/src/xfns.c diff --git a/src/xfns.c b/src/xfns.c index 9b9ba48ba8..8f03d90c79 100644 --- a/src/xfns.c +++ b/src/xfns.c @@ -152,12 +152,16 @@ int display_hourglass_p; /* Non-zero means prompt with the old GTK file selection dialog. */ -int x_use_old_gtk_file_dialog; +int x_gtk_use_old_file_dialog; /* If non-zero, by default show hidden files in the GTK file chooser. */ int x_gtk_show_hidden_files; +/* If non-zero, don't show additional help text in the GTK file chooser. */ + +int x_gtk_file_dialog_help_text; + /* If non-zero, don't collapse to tool bar when it is detached. */ int x_gtk_whole_detached_tool_bar; @@ -759,9 +763,7 @@ x_decode_color (f, color_name, mono_color) if (x_defined_color (f, SDATA (color_name), &cdef, 1)) return cdef.pixel; - Fsignal (Qerror, Fcons (build_string ("Undefined color"), - Fcons (color_name, Qnil))); - return 0; + signal_error ("Undefined color", color_name); } @@ -1626,7 +1628,7 @@ x_set_name_internal (f, name) text.format = 8; text.nitems = bytes; - if (NILP (f->icon_name)) + if (!STRINGP (f->icon_name)) { icon = text; } @@ -2018,13 +2020,14 @@ xic_create_fontsetname (base_fontname, motif) else { int len; - char *p1 = NULL, *p2 = NULL; + char *p1 = NULL, *p2 = NULL, *p3 = NULL; char *font_allcs = NULL; char *font_allfamilies = NULL; char *font_all = NULL; char *allcs = "*-*-*-*-*-*-*"; char *allfamilies = "-*-*-"; char *all = "*-*-*-*-"; + char *base; for (i = 0, p = base_fontname; i < 8; p++) { @@ -2035,8 +2038,27 @@ xic_create_fontsetname (base_fontname, motif) p1 = p + 1; else if (i == 7) p2 = p + 1; + else if (i == 6) + p3 = p + 1; } } + /* If base_fontname specifies ADSTYLE, make it a + wildcard. */ + if (*p3 != '*') + { + int diff = (p2 - p3) - 2; + + base = alloca (strlen (base_fontname) + 1); + bcopy (base_fontname, base, p3 - base_fontname); + base[p3 - base_fontname] = '*'; + base[(p3 - base_fontname) + 1] = '-'; + strcpy (base + (p3 - base_fontname) + 2, p2); + p = base + (p - base_fontname) - diff; + p1 = base + (p1 - base_fontname); + p2 = base + (p2 - base_fontname) - diff; + base_fontname = base; + } + /* Build the font spec that matches all charsets. */ len = p - base_fontname + strlen (allcs) + 1; font_allcs = (char *) alloca (len); @@ -2044,7 +2066,8 @@ xic_create_fontsetname (base_fontname, motif) bcopy (base_fontname, font_allcs, p - base_fontname); strcat (font_allcs, allcs); - /* Build the font spec that matches all families. */ + /* Build the font spec that matches all families and + add-styles. */ len = p - p1 + strlen (allcs) + strlen (allfamilies) + 1; font_allfamilies = (char *) alloca (len); bzero (font_allfamilies, len); @@ -2114,10 +2137,33 @@ xic_create_xfontset (f, base_fontname) /* New fontset. */ xfs = XCreateFontSet (FRAME_X_DISPLAY (f), - fontsetname, &missing_list, - &missing_count, &def_string); + fontsetname, &missing_list, + &missing_count, &def_string); if (missing_list) - XFreeStringList (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); + if (missing_list) + XFreeStringList (missing_list); + if (xfs) + break; + p0 = p1 ? p1 + 1 : NULL; + } + } xfree (fontsetname); } @@ -3075,7 +3121,6 @@ This function is an internal primitive--use `make-frame' instead. */) f->output_data.x->scroll_bar_top_shadow_pixel = -1; f->output_data.x->scroll_bar_bottom_shadow_pixel = -1; #endif /* USE_TOOLKIT_SCROLL_BARS */ - record_unwind_protect (unwind_create_frame, frame); f->icon_name = x_get_arg (dpyinfo, parms, Qicon_name, "iconName", "Title", @@ -3084,6 +3129,9 @@ This function is an internal primitive--use `make-frame' instead. */) f->icon_name = Qnil; FRAME_X_DISPLAY_INFO (f) = dpyinfo; + + /* 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; dpyinfo_refcount = dpyinfo->reference_count; @@ -3189,8 +3237,7 @@ This function is an internal primitive--use `make-frame' instead. */) if (! STRINGP (font)) font = build_string ("fixed"); - x_default_parameter (f, parms, Qfont, font, - "font", "Font", RES_TYPE_STRING); + x_set_frame_parameters (f, Fcons (Fcons (Qfont, font), Qnil)); } #ifdef USE_LUCID @@ -3476,14 +3523,9 @@ DEFUN ("xw-color-values", Fxw_color_values, Sxw_color_values, 1, 2, 0, CHECK_STRING (color); if (x_defined_color (f, SDATA (color), &foo, 0)) - { - Lisp_Object rgb[3]; - - rgb[0] = make_number (foo.red); - rgb[1] = make_number (foo.green); - rgb[2] = make_number (foo.blue); - return Flist (3, rgb); - } + return list3 (make_number (foo.red), + make_number (foo.green), + make_number (foo.blue)); else return Qnil; } @@ -4073,11 +4115,15 @@ If DISPLAY is nil, that stands for the selected frame's display. */) x_destroy_all_bitmaps (dpyinfo); XSetCloseDownMode (dpyinfo->display, DestroyAll); +#ifdef USE_GTK + xg_display_close (dpyinfo->display); +#else #ifdef USE_X_TOOLKIT XtCloseDisplay (dpyinfo->display); #else XCloseDisplay (dpyinfo->display); #endif +#endif /* ! USE_GTK */ x_delete_display (dpyinfo); UNBLOCK_INPUT; @@ -5334,6 +5380,8 @@ or directory must exist. ONLY-DIR-P is ignored." */) int count = SPECPDL_INDEX (); struct gcpro gcpro1, gcpro2, gcpro3, gcpro4, gcpro5, gcpro6; + check_x (); + GCPRO6 (prompt, dir, default_filename, mustmatch, only_dir_p, file); if (popup_activated ()) @@ -5501,6 +5549,8 @@ directories. */) struct gcpro gcpro1, gcpro2, gcpro3, gcpro4, gcpro5, gcpro6; char *cdef_file; + check_x (); + GCPRO6 (prompt, dir, default_filename, mustmatch, only_dir_p, file); if (popup_activated ()) @@ -5799,12 +5849,12 @@ Chinese, Japanese, and Korean. */); Vx_pixel_size_width_font_regexp = Qnil; /* This is not ifdef:ed, so other builds than GTK can customize it. */ - DEFVAR_BOOL ("x-use-old-gtk-file-dialog", &x_use_old_gtk_file_dialog, + DEFVAR_BOOL ("x-gtk-use-old-file-dialog", &x_gtk_use_old_file_dialog, doc: /* *Non-nil means prompt with the old GTK file selection dialog. If nil or if the file selection dialog is not available, the new GTK file chooser is used instead. To turn off all file dialogs set the variable `use-file-dialog'. */); - x_use_old_gtk_file_dialog = 0; + x_gtk_use_old_file_dialog = 0; DEFVAR_BOOL ("x-gtk-show-hidden-files", &x_gtk_show_hidden_files, doc: /* *If non-nil, the GTK file chooser will by default show hidden files. @@ -5812,6 +5862,12 @@ Note that this is just the default, there is a toggle button on the file chooser to show or not show hidden files on a case by case basis. */); x_gtk_show_hidden_files = 0; + DEFVAR_BOOL ("x-gtk-file-dialog-help-text", &x_gtk_file_dialog_help_text, + doc: /* *If non-nil, the GTK file chooser will show additional help text. +If more space for files in the file chooser dialog is wanted, set this to nil +to turn the additional text off. */); + x_gtk_file_dialog_help_text = 1; + DEFVAR_BOOL ("x-gtk-whole-detached-tool-bar", &x_gtk_whole_detached_tool_bar, doc: /* *If non-nil, a detached tool bar is shown in full. The default is to just show an arrow and pressing on that arrow shows