/* 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
Free Software Foundation, Inc.
This file is part of GNU Emacs.
#include <sys/types.h>
#include <sys/stat.h>
-#ifndef VMS
#if 1 /* Used to be #ifdef EMACS_BITMAP_FILES, but this should always work. */
#include "bitmaps/gray.xbm"
#else
#include <X11/bitmaps/gray>
#endif
-#else
-#include "[.bitmaps]gray.xbm"
-#endif
#ifdef USE_GTK
#include "gtkutil.h"
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;
Lisp_Object Qsuppress_icon;
Lisp_Object Qundefined_color;
Lisp_Object Qcompound_text, Qcancel_timer;
+static Lisp_Object Qfont_param;
/* In dispnew.c */
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),
(GCForeground | GCBackground
- | GCFillStyle /* | GCStipple */ | GCLineWidth),
+ | GCFillStyle | GCLineWidth),
&gc_values);
/* Reliefs. */
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
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);
}
+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;
+}
+
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
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");
/* Extract the window parameters from the supplied values
that are needed to determine window geometry. */
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
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,
{
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,
{
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,
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.
output_data.x structure to indicate that an hourglass cursor is
shown on the frames. */
-static void
+void
show_hourglass (timer)
struct atimer *timer;
{
/* Hide the hourglass pointer on all frames, if it is currently
shown. */
-static void
+void
hide_hourglass ()
{
if (hourglass_shown_p)
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);
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);
/* x, y, width, height */
0, 0, 1, 1,
/* Border. */
- 1,
+ f->border_width,
CopyFromParent, InputOutput, CopyFromParent,
mask, &attrs);
UNBLOCK_INPUT;
/* 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),
*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);
*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)
if (FRAMEP (frame))
{
- Fdelete_frame (frame, Qnil);
+ delete_frame (frame, Qnil);
deleted = Qt;
#ifdef USE_LUCID
Lisp_Object frame, ignored;
{
FRAME_PTR f = check_x_frame (frame);
- char *fontname;
- Lisp_Object font = Qnil;
+ char *name;
+ Lisp_Object default_font, font = Qnil;
int count = SPECPDL_INDEX ();
check_x ();
BLOCK_INPUT;
- fontname = xg_get_font_name (f, NULL);
+ 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 (fontname)
+ if (name)
{
- font = build_string (fontname);
- xfree (fontname);
+ font = build_string (name);
+ xfree (name);
}
UNBLOCK_INPUT;
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. */
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.
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);
/* Setting callback functions for fontset handler. */
check_window_system_func = check_x;
- hourglass_atimer = NULL;
- hourglass_shown_p = 0;
-
defsubr (&Sx_show_tip);
defsubr (&Sx_hide_tip);
tip_timer = Qnil;
defsubr (&Sx_file_dialog);
#endif
-#ifdef USE_GTK
+#if defined (USE_GTK) && defined (HAVE_FREETYPE)
defsubr (&Sx_select_font);
#endif
}