#include <config.h>
#include <stdio.h>
#include <math.h>
+#include <setjmp.h>
+#include <ctype.h>
#ifdef HAVE_UNISTD_H
#include <unistd.h>
#include <X11/bitmaps/gray>
#endif
+#include "xsettings.h"
+
#ifdef USE_GTK
#include "gtkutil.h"
#endif
#include <Xm/FileSB.h>
#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. */
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 */
int image_cache_refcount, dpyinfo_refcount;
#endif
+#if defined (USE_GTK) && defined (HAVE_FREETYPE)
+char *x_last_font_name;
+#endif
\f
/* Error if we are not connected to X. */
#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)
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 *
if (x->menubar_widget)
{
GtkWidget *gwdesc = xg_win_to_widget (dpyinfo->display, wdesc);
- int found = 0;
- BLOCK_INPUT;
+ /* This gives false positives, but the rectangle check in xterm.c
+ where this is called takes care of that. */
if (gwdesc != 0
&& (gwdesc == x->menubar_widget
- || gtk_widget_get_parent (gwdesc) == x->menubar_widget))
- found = 1;
- UNBLOCK_INPUT;
- if (found) return f;
+ || gtk_widget_is_ancestor (x->menubar_widget, gwdesc)
+ || gtk_widget_is_ancestor (gwdesc, x->menubar_widget)))
+ return f;
}
#else
if (x->menubar_widget
}
XDefineCursor (FRAME_X_DISPLAY (f), FRAME_X_WINDOW (f),
- f->output.x->current_cursor = f->output_data.x->text_cursor);
+ f->output_data.x->current_cursor
+ = f->output_data.x->text_cursor);
UNBLOCK_INPUT;
}
XDefineCursor (FRAME_X_DISPLAY (f), FRAME_X_WINDOW (f),
- f->output.x->current_cursor = f->output_data.x->text_cursor);
+ f->output_data.x->current_cursor
+ = f->output_data.x->text_cursor);
UNBLOCK_INPUT;
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;
}
-/* Free what was was allocated in x_make_gc. */
+/* Free what was allocated in x_make_gc. */
void
x_free_gcs (f)
{
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);
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);
}
{
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 ();
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;
/* 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. */
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.
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. */);
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+. */);
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 */
#if defined (USE_GTK) && defined (HAVE_FREETYPE)
defsubr (&Sx_select_font);
+ x_last_font_name = NULL;
#endif
}