summaryrefslogtreecommitdiff
path: root/src/xfns.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/xfns.c')
-rw-r--r--src/xfns.c849
1 files changed, 431 insertions, 418 deletions
diff --git a/src/xfns.c b/src/xfns.c
index 44d8fb31f2e..8c4ac2210fc 100644
--- a/src/xfns.c
+++ b/src/xfns.c
@@ -99,6 +99,12 @@ along with GNU Emacs. If not, see <http://www.gnu.org/licenses/>. */
#include <Xm/Xm.h>
#include <Xm/DialogS.h>
#include <Xm/FileSB.h>
+#include <Xm/List.h>
+#include <Xm/TextF.h>
+#endif
+
+#ifdef USE_LUCID
+#include "../lwlib/xlwmenu.h"
#endif
#if !defined(NO_EDITRES)
@@ -110,11 +116,6 @@ extern void _XEditResCheckMessages ();
extern LWLIB_ID widget_id_tick;
-#ifdef USE_LUCID
-/* This is part of a kludge--see lwlib/xlwmenu.c. */
-extern XFontStruct *xlwmenu_default_font;
-#endif
-
extern void free_frame_menubar ();
extern double atof ();
@@ -162,6 +163,10 @@ int x_gtk_file_dialog_help_text;
int x_gtk_whole_detached_tool_bar;
+/* If non-zero, use Gtk+ tooltips. */
+
+static int x_gtk_use_system_tooltips;
+
/* The background and shape of the mouse pointer, and shape when not
over text or in the modeline. */
@@ -199,14 +204,6 @@ Lisp_Object Qundefined_color;
Lisp_Object Qcompound_text, Qcancel_timer;
Lisp_Object Qfont_param;
-/* In dispnew.c */
-
-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
@@ -219,7 +216,7 @@ char *x_last_font_name;
/* Error if we are not connected to X. */
void
-check_x ()
+check_x (void)
{
if (! x_in_use)
error ("X windows are not in use or not initialized");
@@ -229,7 +226,7 @@ check_x ()
You should not call this unless HAVE_MENUS is defined. */
int
-have_menus_p ()
+have_menus_p (void)
{
return x_in_use;
}
@@ -238,8 +235,7 @@ have_menus_p ()
and checking validity for X. */
FRAME_PTR
-check_x_frame (frame)
- Lisp_Object frame;
+check_x_frame (Lisp_Object frame)
{
FRAME_PTR f;
@@ -258,8 +254,7 @@ check_x_frame (frame)
the first X display on the list. */
struct x_display_info *
-check_x_display_info (object)
- Lisp_Object object;
+check_x_display_info (Lisp_Object object)
{
struct x_display_info *dpyinfo = NULL;
@@ -301,9 +296,7 @@ check_x_display_info (object)
/* This function can be called during GC, so use GC_xxx type test macros. */
struct frame *
-x_window_to_frame (dpyinfo, wdesc)
- struct x_display_info *dpyinfo;
- int wdesc;
+x_window_to_frame (struct x_display_info *dpyinfo, int wdesc)
{
Lisp_Object tail, frame;
struct frame *f;
@@ -351,9 +344,7 @@ x_window_to_frame (dpyinfo, wdesc)
windows. */
struct frame *
-x_any_window_to_frame (dpyinfo, wdesc)
- struct x_display_info *dpyinfo;
- int wdesc;
+x_any_window_to_frame (struct x_display_info *dpyinfo, int wdesc)
{
Lisp_Object tail, frame;
struct frame *f, *found;
@@ -404,9 +395,7 @@ x_any_window_to_frame (dpyinfo, wdesc)
/* Likewise, but consider only the menu bar widget. */
struct frame *
-x_menubar_window_to_frame (dpyinfo, event)
- struct x_display_info *dpyinfo;
- XEvent *event;
+x_menubar_window_to_frame (struct x_display_info *dpyinfo, XEvent *event)
{
Window wdesc = event->xany.window;
Lisp_Object tail, frame;
@@ -441,9 +430,7 @@ x_menubar_window_to_frame (dpyinfo, event)
If WDESC is some other (smaller) window, we return 0. */
struct frame *
-x_top_window_to_frame (dpyinfo, wdesc)
- struct x_display_info *dpyinfo;
- int wdesc;
+x_top_window_to_frame (struct x_display_info *dpyinfo, int wdesc)
{
Lisp_Object tail, frame;
struct frame *f;
@@ -491,33 +478,33 @@ x_top_window_to_frame (dpyinfo, wdesc)
-static void x_default_font_parameter P_ ((struct frame *, Lisp_Object));
-
-static Lisp_Object unwind_create_frame P_ ((Lisp_Object));
-static Lisp_Object unwind_create_tip_frame P_ ((Lisp_Object));
-
-void x_set_foreground_color P_ ((struct frame *, Lisp_Object, Lisp_Object));
-static void x_set_wait_for_wm P_ ((struct frame *, Lisp_Object, Lisp_Object));
-void x_set_background_color P_ ((struct frame *, Lisp_Object, Lisp_Object));
-void x_set_mouse_color P_ ((struct frame *, Lisp_Object, Lisp_Object));
-void x_set_cursor_color P_ ((struct frame *, Lisp_Object, Lisp_Object));
-void x_set_border_color P_ ((struct frame *, Lisp_Object, Lisp_Object));
-void x_set_cursor_type P_ ((struct frame *, Lisp_Object, Lisp_Object));
-void x_set_icon_type P_ ((struct frame *, Lisp_Object, Lisp_Object));
-void x_set_icon_name P_ ((struct frame *, Lisp_Object, Lisp_Object));
-void x_explicitly_set_name P_ ((struct frame *, Lisp_Object, Lisp_Object));
-void x_set_menu_bar_lines P_ ((struct frame *, Lisp_Object, Lisp_Object));
-void x_set_title P_ ((struct frame *, Lisp_Object, Lisp_Object));
-void x_set_tool_bar_lines P_ ((struct frame *, Lisp_Object, Lisp_Object));
-void x_set_scroll_bar_foreground P_ ((struct frame *, Lisp_Object,
- Lisp_Object));
-void x_set_scroll_bar_background P_ ((struct frame *, Lisp_Object,
- Lisp_Object));
-static Lisp_Object x_default_scroll_bar_color_parameter P_ ((struct frame *,
- Lisp_Object,
- Lisp_Object,
- char *, char *,
- int));
+static void x_default_font_parameter (struct frame *, Lisp_Object);
+
+static Lisp_Object unwind_create_frame (Lisp_Object);
+static Lisp_Object unwind_create_tip_frame (Lisp_Object);
+
+void x_set_foreground_color (struct frame *, Lisp_Object, Lisp_Object);
+static void x_set_wait_for_wm (struct frame *, Lisp_Object, Lisp_Object);
+void x_set_background_color (struct frame *, Lisp_Object, Lisp_Object);
+void x_set_mouse_color (struct frame *, Lisp_Object, Lisp_Object);
+void x_set_cursor_color (struct frame *, Lisp_Object, Lisp_Object);
+void x_set_border_color (struct frame *, Lisp_Object, Lisp_Object);
+void x_set_cursor_type (struct frame *, Lisp_Object, Lisp_Object);
+void x_set_icon_type (struct frame *, Lisp_Object, Lisp_Object);
+void x_set_icon_name (struct frame *, Lisp_Object, Lisp_Object);
+void x_explicitly_set_name (struct frame *, Lisp_Object, Lisp_Object);
+void x_set_menu_bar_lines (struct frame *, Lisp_Object, Lisp_Object);
+void x_set_title (struct frame *, Lisp_Object, Lisp_Object);
+void x_set_tool_bar_lines (struct frame *, Lisp_Object, Lisp_Object);
+void x_set_scroll_bar_foreground (struct frame *, Lisp_Object,
+ Lisp_Object);
+void x_set_scroll_bar_background (struct frame *, Lisp_Object,
+ Lisp_Object);
+static Lisp_Object x_default_scroll_bar_color_parameter (struct frame *,
+ Lisp_Object,
+ Lisp_Object,
+ const char *, const char *,
+ int);
/* Store the screen positions of frame F into XPTR and YPTR.
@@ -525,9 +512,7 @@ static Lisp_Object x_default_scroll_bar_color_parameter P_ ((struct frame *,
not Emacs's own window. */
void
-x_real_positions (f, xptr, yptr)
- FRAME_PTR f;
- int *xptr, *yptr;
+x_real_positions (FRAME_PTR f, int *xptr, int *yptr)
{
int win_x, win_y, outer_x, outer_y;
int real_x = 0, real_y = 0;
@@ -680,9 +665,7 @@ x_real_positions (f, xptr, yptr)
/* Gamma-correct COLOR on frame F. */
void
-gamma_correct (f, color)
- struct frame *f;
- XColor *color;
+gamma_correct (struct frame *f, XColor *color)
{
if (f->gamma)
{
@@ -699,18 +682,19 @@ gamma_correct (f, color)
no color could be allocated. */
int
-x_defined_color (f, color_name, color, alloc_p)
- struct frame *f;
- char *color_name;
- XColor *color;
- int alloc_p;
+x_defined_color (struct frame *f, const char *color_name,
+ XColor *color, int alloc_p)
{
- int success_p;
+ int success_p = 0;
Display *dpy = FRAME_X_DISPLAY (f);
Colormap cmap = FRAME_X_COLORMAP (f);
BLOCK_INPUT;
- success_p = XParseColor (dpy, cmap, color_name, color);
+#ifdef USE_GTK
+ success_p = xg_check_special_colors (f, color_name, color);
+#endif
+ if (!success_p)
+ success_p = XParseColor (dpy, cmap, color_name, color);
if (success_p && alloc_p)
success_p = x_alloc_nearest_color (f, cmap, color);
UNBLOCK_INPUT;
@@ -724,10 +708,7 @@ x_defined_color (f, color_name, color, alloc_p)
Signal an error if color can't be allocated. */
int
-x_decode_color (f, color_name, mono_color)
- FRAME_PTR f;
- Lisp_Object color_name;
- int mono_color;
+x_decode_color (FRAME_PTR f, Lisp_Object color_name, int mono_color)
{
XColor cdef;
@@ -761,22 +742,34 @@ x_decode_color (f, color_name, mono_color)
See also the comment of wait_for_wm in struct x_output. */
static void
-x_set_wait_for_wm (f, new_value, old_value)
- struct frame *f;
- Lisp_Object new_value, old_value;
+x_set_wait_for_wm (struct frame *f, Lisp_Object new_value, Lisp_Object old_value)
{
f->output_data.x->wait_for_wm = !NILP (new_value);
}
+static void
+x_set_tool_bar_position (struct frame *f,
+ Lisp_Object new_value,
+ Lisp_Object old_value)
+{
+ if (! EQ (new_value, Qleft) && ! EQ (new_value, Qright)
+ && ! EQ (new_value, Qbottom) && ! EQ (new_value, Qtop))
+ return;
+ if (EQ (new_value, old_value)) return;
+
+#ifdef USE_GTK
+ if (xg_change_toolbar_position (f, new_value))
+ f->tool_bar_position = new_value;
+#endif
+}
+
#ifdef USE_GTK
/* Set icon from FILE for frame F. By using GTK functions the icon
may be any format that GdkPixbuf knows about, i.e. not just bitmaps. */
int
-xg_set_icon (f, file)
- FRAME_PTR f;
- Lisp_Object file;
+xg_set_icon (FRAME_PTR f, Lisp_Object file)
{
int result = 0;
Lisp_Object found;
@@ -810,12 +803,10 @@ xg_set_icon (f, file)
}
int
-xg_set_icon_from_xpm_data (f, data)
- FRAME_PTR f;
- char **data;
+xg_set_icon_from_xpm_data (FRAME_PTR f, const char **data)
{
int result = 0;
- GdkPixbuf *pixbuf = gdk_pixbuf_new_from_xpm_data ((const char **) data);
+ GdkPixbuf *pixbuf = gdk_pixbuf_new_from_xpm_data (data);
if (!pixbuf)
return 0;
@@ -836,9 +827,7 @@ xg_set_icon_from_xpm_data (f, data)
in the standard place; do not attempt to change the window. */
void
-x_set_foreground_color (f, arg, oldval)
- struct frame *f;
- Lisp_Object arg, oldval;
+x_set_foreground_color (struct frame *f, Lisp_Object arg, Lisp_Object oldval)
{
struct x_output *x = f->output_data.x;
unsigned long fg, old_fg;
@@ -874,9 +863,7 @@ x_set_foreground_color (f, arg, oldval)
}
void
-x_set_background_color (f, arg, oldval)
- struct frame *f;
- Lisp_Object arg, oldval;
+x_set_background_color (struct frame *f, Lisp_Object arg, Lisp_Object oldval)
{
struct x_output *x = f->output_data.x;
unsigned long bg;
@@ -922,8 +909,7 @@ x_set_background_color (f, arg, oldval)
}
static Cursor
-make_invisible_cursor (f)
- struct frame *f;
+make_invisible_cursor (struct frame *f)
{
Display *dpy = FRAME_X_DISPLAY (f);
static char const no_data[] = { 0 };
@@ -951,9 +937,7 @@ make_invisible_cursor (f)
}
void
-x_set_mouse_color (f, arg, oldval)
- struct frame *f;
- Lisp_Object arg, oldval;
+x_set_mouse_color (struct frame *f, Lisp_Object arg, Lisp_Object oldval)
{
struct x_output *x = f->output_data.x;
Display *dpy = FRAME_X_DISPLAY (f);
@@ -1098,9 +1082,7 @@ x_set_mouse_color (f, arg, oldval)
}
void
-x_set_cursor_color (f, arg, oldval)
- struct frame *f;
- Lisp_Object arg, oldval;
+x_set_cursor_color (struct frame *f, Lisp_Object arg, Lisp_Object oldval)
{
unsigned long fore_pixel, pixel;
int fore_pixel_allocated_p = 0, pixel_allocated_p = 0;
@@ -1171,9 +1153,7 @@ x_set_cursor_color (f, arg, oldval)
F has an x-window. */
void
-x_set_border_pixel (f, pix)
- struct frame *f;
- int pix;
+x_set_border_pixel (struct frame *f, int pix)
{
unload_color (f, f->output_data.x->border_pixel);
f->output_data.x->border_pixel = pix;
@@ -1202,9 +1182,7 @@ x_set_border_pixel (f, pix)
and so emacs' border colors may be overridden. */
void
-x_set_border_color (f, arg, oldval)
- struct frame *f;
- Lisp_Object arg, oldval;
+x_set_border_color (struct frame *f, Lisp_Object arg, Lisp_Object oldval)
{
int pix;
@@ -1216,9 +1194,7 @@ x_set_border_color (f, arg, oldval)
void
-x_set_cursor_type (f, arg, oldval)
- FRAME_PTR f;
- Lisp_Object arg, oldval;
+x_set_cursor_type (FRAME_PTR f, Lisp_Object arg, Lisp_Object oldval)
{
set_frame_cursor_types (f, arg);
@@ -1227,9 +1203,7 @@ x_set_cursor_type (f, arg, oldval)
}
void
-x_set_icon_type (f, arg, oldval)
- struct frame *f;
- Lisp_Object arg, oldval;
+x_set_icon_type (struct frame *f, Lisp_Object arg, Lisp_Object oldval)
{
int result;
@@ -1261,9 +1235,7 @@ x_set_icon_type (f, arg, oldval)
}
void
-x_set_icon_name (f, arg, oldval)
- struct frame *f;
- Lisp_Object arg, oldval;
+x_set_icon_name (struct frame *f, Lisp_Object arg, Lisp_Object oldval)
{
int result;
@@ -1301,9 +1273,7 @@ x_set_icon_name (f, arg, oldval)
void
-x_set_menu_bar_lines (f, value, oldval)
- struct frame *f;
- Lisp_Object value, oldval;
+x_set_menu_bar_lines (struct frame *f, Lisp_Object value, Lisp_Object oldval)
{
int nlines;
#if ! defined (USE_X_TOOLKIT) && ! defined (USE_GTK)
@@ -1393,9 +1363,7 @@ x_set_menu_bar_lines (f, value, oldval)
The frame's height doesn't change. */
void
-x_set_tool_bar_lines (f, value, oldval)
- struct frame *f;
- Lisp_Object value, oldval;
+x_set_tool_bar_lines (struct frame *f, Lisp_Object value, Lisp_Object oldval)
{
int delta, nlines, root_height;
Lisp_Object root_window;
@@ -1490,9 +1458,7 @@ x_set_tool_bar_lines (f, value, oldval)
the frame parameter. */
void
-x_set_scroll_bar_foreground (f, value, oldval)
- struct frame *f;
- Lisp_Object value, oldval;
+x_set_scroll_bar_foreground (struct frame *f, Lisp_Object value, Lisp_Object oldval)
{
unsigned long pixel;
@@ -1525,9 +1491,7 @@ x_set_scroll_bar_foreground (f, value, oldval)
parameter. */
void
-x_set_scroll_bar_background (f, value, oldval)
- struct frame *f;
- Lisp_Object value, oldval;
+x_set_scroll_bar_background (struct frame *f, Lisp_Object value, Lisp_Object oldval)
{
unsigned long pixel;
@@ -1590,11 +1554,7 @@ x_set_scroll_bar_background (f, value, oldval)
the result should be `COMPOUND_TEXT'. */
static unsigned char *
-x_encode_text (string, coding_system, selectionp, text_bytes, stringp, freep)
- Lisp_Object string, coding_system;
- int *text_bytes, *stringp;
- int selectionp;
- int *freep;
+x_encode_text (Lisp_Object string, Lisp_Object coding_system, int selectionp, int *text_bytes, int *stringp, int *freep)
{
int result = string_xstring_p (string);
struct coding_system coding;
@@ -1628,9 +1588,7 @@ x_encode_text (string, coding_system, selectionp, text_bytes, stringp, freep)
icon name to NAME. */
static void
-x_set_name_internal (f, name)
- FRAME_PTR f;
- Lisp_Object name;
+x_set_name_internal (FRAME_PTR f, Lisp_Object name)
{
if (FRAME_X_WINDOW (f))
{
@@ -1640,8 +1598,8 @@ x_set_name_internal (f, name)
int bytes, stringp;
int do_free_icon_value = 0, do_free_text_value = 0;
Lisp_Object coding_system;
-#ifdef USE_GTK
Lisp_Object encoded_name;
+ Lisp_Object encoded_icon_name;
struct gcpro gcpro1;
/* As ENCODE_UTF_8 may cause GC and relocation of string data,
@@ -1649,7 +1607,6 @@ x_set_name_internal (f, name)
GCPRO1 (name);
encoded_name = ENCODE_UTF_8 (name);
UNGCPRO;
-#endif
coding_system = Qcompound_text;
/* Note: Encoding strategy
@@ -1665,7 +1622,12 @@ x_set_name_internal (f, name)
We may also be able to use "UTF8_STRING" in text.encoding
in the future which can encode all Unicode characters.
But, for the moment, there's no way to know that the
- current window manager supports it or not. */
+ current window manager supports it or not.
+
+ Either way, we also set the _NET_WM_NAME and _NET_WM_ICON_NAME
+ properties. Per the EWMH specification, those two properties
+ are always UTF8_STRING. This matches what gtk_window_set_title()
+ does in the USE_GTK case. */
text.value = x_encode_text (name, coding_system, 0, &bytes, &stringp,
&do_free_text_value);
text.encoding = (stringp ? XA_STRING
@@ -1676,6 +1638,7 @@ x_set_name_internal (f, name)
if (!STRINGP (f->icon_name))
{
icon = text;
+ encoded_icon_name = encoded_name;
}
else
{
@@ -1686,6 +1649,8 @@ x_set_name_internal (f, name)
: FRAME_X_DISPLAY_INFO (f)->Xatom_COMPOUND_TEXT);
icon.format = 8;
icon.nitems = bytes;
+
+ encoded_icon_name = ENCODE_UTF_8 (f->icon_name);
}
#ifdef USE_GTK
@@ -1693,9 +1658,21 @@ x_set_name_internal (f, name)
(char *) SDATA (encoded_name));
#else /* not USE_GTK */
XSetWMName (FRAME_X_DISPLAY (f), FRAME_OUTER_WINDOW (f), &text);
+ XChangeProperty (FRAME_X_DISPLAY (f), FRAME_OUTER_WINDOW (f),
+ FRAME_X_DISPLAY_INFO (f)->Xatom_net_wm_name,
+ FRAME_X_DISPLAY_INFO (f)->Xatom_UTF8_STRING,
+ 8, PropModeReplace,
+ (char *) SDATA (encoded_name),
+ SBYTES (encoded_name));
#endif /* not USE_GTK */
XSetWMIconName (FRAME_X_DISPLAY (f), FRAME_OUTER_WINDOW (f), &icon);
+ XChangeProperty (FRAME_X_DISPLAY (f), FRAME_OUTER_WINDOW (f),
+ FRAME_X_DISPLAY_INFO (f)->Xatom_net_wm_icon_name,
+ FRAME_X_DISPLAY_INFO (f)->Xatom_UTF8_STRING,
+ 8, PropModeReplace,
+ (char *) SDATA (encoded_icon_name),
+ SBYTES (encoded_icon_name));
if (do_free_icon_value)
xfree (icon.value);
@@ -1718,10 +1695,7 @@ x_set_name_internal (f, name)
F->explicit_name is set, ignore the new name; otherwise, set it. */
void
-x_set_name (f, name, explicit)
- struct frame *f;
- Lisp_Object name;
- int explicit;
+x_set_name (struct frame *f, Lisp_Object name, int explicit)
{
/* Make sure that requests from lisp code override requests from
Emacs redisplay code. */
@@ -1768,9 +1742,7 @@ x_set_name (f, name, explicit)
specified a name for the frame; the name will override any set by the
redisplay code. */
void
-x_explicitly_set_name (f, arg, oldval)
- FRAME_PTR f;
- Lisp_Object arg, oldval;
+x_explicitly_set_name (FRAME_PTR f, Lisp_Object arg, Lisp_Object oldval)
{
x_set_name (f, arg, 1);
}
@@ -1779,9 +1751,7 @@ x_explicitly_set_name (f, arg, oldval)
name; names set this way will never override names set by the user's
lisp code. */
void
-x_implicitly_set_name (f, arg, oldval)
- FRAME_PTR f;
- Lisp_Object arg, oldval;
+x_implicitly_set_name (FRAME_PTR f, Lisp_Object arg, Lisp_Object oldval)
{
x_set_name (f, arg, 0);
}
@@ -1790,9 +1760,7 @@ x_implicitly_set_name (f, arg, oldval)
If NAME is nil, use the frame name as the title. */
void
-x_set_title (f, name, old_name)
- struct frame *f;
- Lisp_Object name, old_name;
+x_set_title (struct frame *f, Lisp_Object name, Lisp_Object old_name)
{
/* Don't change the title if it's already NAME. */
if (EQ (name, f->title))
@@ -1811,8 +1779,7 @@ x_set_title (f, name, old_name)
}
void
-x_set_scroll_bar_default_width (f)
- struct frame *f;
+x_set_scroll_bar_default_width (struct frame *f)
{
int wid = FRAME_COLUMN_WIDTH (f);
@@ -1839,14 +1806,10 @@ x_set_scroll_bar_default_width (f)
named NAME. If that is not found either, use the value DEFLT. */
static Lisp_Object
-x_default_scroll_bar_color_parameter (f, alist, prop, xprop, xclass,
- foreground_p)
- struct frame *f;
- Lisp_Object alist;
- Lisp_Object prop;
- char *xprop;
- char *xclass;
- int foreground_p;
+x_default_scroll_bar_color_parameter (struct frame *f,
+ Lisp_Object alist, Lisp_Object prop,
+ const char *xprop, const char *xclass,
+ int foreground_p)
{
struct x_display_info *dpyinfo = FRAME_X_DISPLAY_INFO (f);
Lisp_Object tem;
@@ -1897,9 +1860,7 @@ x_default_scroll_bar_color_parameter (f, alist, prop, xprop, xclass,
for example, but Xt doesn't). */
static void
-hack_wm_protocols (f, widget)
- FRAME_PTR f;
- Widget widget;
+hack_wm_protocols (FRAME_PTR f, Widget widget)
{
Display *dpy = XtDisplay (widget);
Window w = XtWindow (widget);
@@ -1965,8 +1926,8 @@ hack_wm_protocols (f, widget)
#ifdef HAVE_X_I18N
-static XFontSet xic_create_xfontset P_ ((struct frame *));
-static XIMStyle best_xim_style P_ ((XIMStyles *, XIMStyles *));
+static XFontSet xic_create_xfontset (struct frame *);
+static XIMStyle best_xim_style (XIMStyles *, XIMStyles *);
/* Supported XIM styles, ordered by preference. */
@@ -1988,14 +1949,12 @@ static XIMStyle supported_xim_styles[] =
/* Create an X fontset on frame F with base font name BASE_FONTNAME. */
-char xic_defaut_fontset[] = "-*-*-*-r-normal--14-*-*-*-*-*-*-*";
+const char xic_defaut_fontset[] = "-*-*-*-r-normal--14-*-*-*-*-*-*-*";
/* Create an Xt fontset spec from the name of a base font.
If `motif' is True use the Motif syntax. */
char *
-xic_create_fontsetname (base_fontname, motif)
- char *base_fontname;
- Bool motif;
+xic_create_fontsetname (const char *base_fontname, int motif)
{
const char *sep = motif ? ";" : ",";
char *fontsetname;
@@ -2005,7 +1964,7 @@ xic_create_fontsetname (base_fontname, motif)
{ /* There is no base font name, use the default. */
int len = strlen (base_fontname) + 2;
fontsetname = xmalloc (len);
- bzero (fontsetname, len);
+ memset (fontsetname, 0, len);
strcpy (fontsetname, base_fontname);
}
else
@@ -2015,7 +1974,7 @@ xic_create_fontsetname (base_fontname, motif)
- the base font.
- the base font where the charset spec is replaced by -*-*.
- the same but with the family also replaced with -*-*-. */
- char *p = base_fontname;
+ const char *p = base_fontname;
int i;
for (i = 0; *p; p++)
@@ -2026,7 +1985,7 @@ xic_create_fontsetname (base_fontname, motif)
Use the specified font plus the default. */
int len = strlen (base_fontname) + strlen (xic_defaut_fontset) + 3;
fontsetname = xmalloc (len);
- bzero (fontsetname, len);
+ memset (fontsetname, 0, len);
strcpy (fontsetname, base_fontname);
strcat (fontsetname, sep);
strcat (fontsetname, xic_defaut_fontset);
@@ -2034,13 +1993,13 @@ xic_create_fontsetname (base_fontname, motif)
else
{
int len;
- char *p1 = NULL, *p2 = NULL, *p3 = NULL;
+ const 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 = "*-*-*-*-";
+ const char *allcs = "*-*-*-*-*-*-*";
+ const char *allfamilies = "-*-*-";
+ const char *all = "*-*-*-*-";
char *base;
for (i = 0, p = base_fontname; i < 8; p++)
@@ -2063,7 +2022,7 @@ xic_create_fontsetname (base_fontname, motif)
int diff = (p2 - p3) - 2;
base = alloca (strlen (base_fontname) + 1);
- bcopy (base_fontname, base, p3 - base_fontname);
+ memcpy (base, base_fontname, p3 - base_fontname);
base[p3 - base_fontname] = '*';
base[(p3 - base_fontname) + 1] = '-';
strcpy (base + (p3 - base_fontname) + 2, p2);
@@ -2076,33 +2035,33 @@ xic_create_fontsetname (base_fontname, motif)
/* Build the font spec that matches all charsets. */
len = p - base_fontname + strlen (allcs) + 1;
font_allcs = (char *) alloca (len);
- bzero (font_allcs, len);
- bcopy (base_fontname, font_allcs, p - base_fontname);
+ memset (font_allcs, 0, len);
+ memcpy (font_allcs, base_fontname, p - base_fontname);
strcat (font_allcs, allcs);
/* 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);
+ memset (font_allfamilies, 0, len);
strcpy (font_allfamilies, allfamilies);
- bcopy (p1, font_allfamilies + strlen (allfamilies), p - p1);
+ memcpy (font_allfamilies + strlen (allfamilies), p1, p - p1);
strcat (font_allfamilies, allcs);
/* Build the font spec that matches all. */
len = p - p2 + strlen (allcs) + strlen (all) + strlen (allfamilies) + 1;
font_all = (char *) alloca (len);
- bzero (font_all, len);
+ memset (font_all, 0, len);
strcpy (font_all, allfamilies);
strcat (font_all, all);
- bcopy (p2, font_all + strlen (all) + strlen (allfamilies), p - p2);
+ memcpy (font_all + strlen (all) + strlen (allfamilies), p2, p - p2);
strcat (font_all, allcs);
/* Build the actual font set name. */
len = strlen (base_fontname) + strlen (font_allcs)
+ strlen (font_allfamilies) + strlen (font_all) + 5;
fontsetname = xmalloc (len);
- bzero (fontsetname, len);
+ memset (fontsetname, 0, len);
strcpy (fontsetname, base_fontname);
strcat (fontsetname, sep);
strcat (fontsetname, font_allcs);
@@ -2141,8 +2100,7 @@ print_fontset_result (xfs, name, missing_list, missing_count)
#endif
static XFontSet
-xic_create_xfontset (f)
- struct frame *f;
+xic_create_xfontset (struct frame *f)
{
XFontSet xfs = NULL;
struct font *font = FRAME_FONT (f);
@@ -2170,7 +2128,7 @@ xic_create_xfontset (f)
char **missing_list;
int missing_count;
char *def_string;
- char *xlfd_format = "-*-*-medium-r-normal--%d-*-*-*-*-*";
+ const char *xlfd_format = "-*-*-medium-r-normal--%d-*-*-*-*-*";
sprintf (buf, xlfd_format, pixel_size);
missing_list = NULL;
@@ -2221,7 +2179,7 @@ xic_create_xfontset (f)
}
if (! xfs)
{
- char *last_resort = "-*-*-*-r-normal--*-*-*-*-*-*";
+ const char *last_resort = "-*-*-*-r-normal--*-*-*-*-*-*";
missing_list = NULL;
xfs = XCreateFontSet (FRAME_X_DISPLAY (f), last_resort,
@@ -2241,8 +2199,7 @@ xic_create_xfontset (f)
/* Free the X fontset of frame F if it is the last frame using it. */
void
-xic_free_xfontset (f)
- struct frame *f;
+xic_free_xfontset (struct frame *f)
{
Lisp_Object rest, frame;
int shared_p = 0;
@@ -2279,9 +2236,7 @@ xic_free_xfontset (f)
input method XIM. */
static XIMStyle
-best_xim_style (user, xim)
- XIMStyles *user;
- XIMStyles *xim;
+best_xim_style (XIMStyles *user, XIMStyles *xim)
{
int i, j;
@@ -2299,8 +2254,7 @@ best_xim_style (user, xim)
static XIMStyle xic_style;
void
-create_frame_xic (f)
- struct frame *f;
+create_frame_xic (struct frame *f)
{
XIM xim;
XIC xic = NULL;
@@ -2375,8 +2329,7 @@ create_frame_xic (f)
/* Destroy XIC and free XIC fontset of frame F, if any. */
void
-free_frame_xic (f)
- struct frame *f;
+free_frame_xic (struct frame *f)
{
if (FRAME_XIC (f) == NULL)
return;
@@ -2392,9 +2345,7 @@ free_frame_xic (f)
pixel position X/Y. X and Y are relative to window W. */
void
-xic_set_preeditarea (w, x, y)
- struct window *w;
- int x, y;
+xic_set_preeditarea (struct window *w, int x, int y)
{
struct frame *f = XFRAME (w->frame);
XVaNestedList attr;
@@ -2411,8 +2362,7 @@ xic_set_preeditarea (w, x, y)
/* Place status area for XIC in bottom right corner of frame F.. */
void
-xic_set_statusarea (f)
- struct frame *f;
+xic_set_statusarea (struct frame *f)
{
XIC xic = FRAME_XIC (f);
XVaNestedList attr;
@@ -2442,7 +2392,7 @@ xic_set_statusarea (f)
area.x = FRAME_PIXEL_WIDTH (f) - area.width - FRAME_INTERNAL_BORDER_WIDTH (f);
area.y = (FRAME_PIXEL_HEIGHT (f) - area.height
- FRAME_MENUBAR_HEIGHT (f)
- - FRAME_TOOLBAR_HEIGHT (f)
+ - FRAME_TOOLBAR_TOP_HEIGHT (f)
- FRAME_INTERNAL_BORDER_WIDTH (f));
XFree (needed);
@@ -2456,9 +2406,7 @@ xic_set_statusarea (f)
BASE_FONTNAME. Called when a new Emacs fontset is chosen. */
void
-xic_set_xfontset (f, base_fontname)
- struct frame *f;
- char *base_fontname;
+xic_set_xfontset (struct frame *f, const char *base_fontname)
{
XVaNestedList attr;
XFontSet xfs;
@@ -2486,10 +2434,7 @@ xic_set_xfontset (f, base_fontname)
/* Create and set up the X widget for frame F. */
static void
-x_window (f, window_prompting, minibuffer_only)
- struct frame *f;
- long window_prompting;
- int minibuffer_only;
+x_window (struct frame *f, long window_prompting, int minibuffer_only)
{
XClassHint class_hints;
XSetWindowAttributes attributes;
@@ -2541,6 +2486,7 @@ x_window (f, window_prompting, minibuffer_only)
XtSetArg (al[ac], XtNvisual, FRAME_X_VISUAL (f)); ac++;
XtSetArg (al[ac], XtNdepth, FRAME_X_DISPLAY_INFO (f)->n_planes); ac++;
XtSetArg (al[ac], XtNcolormap, FRAME_X_COLORMAP (f)); ac++;
+ XtSetArg (al[ac], XtNborderWidth, 0); ac++;
XtSetValues (pane_widget, al, ac);
f->output_data.x->column_widget = pane_widget;
@@ -2556,6 +2502,7 @@ x_window (f, window_prompting, minibuffer_only)
XtSetArg (al[ac], XtNvisual, FRAME_X_VISUAL (f)); ac++;
XtSetArg (al[ac], XtNdepth, FRAME_X_DISPLAY_INFO (f)->n_planes); ac++;
XtSetArg (al[ac], XtNcolormap, FRAME_X_COLORMAP (f)); ac++;
+ XtSetArg (al[ac], XtNborderWidth, 0); ac++;
frame_widget = XtCreateWidget (f->namebuf, emacsFrameClass, pane_widget,
al, ac);
@@ -2733,8 +2680,7 @@ x_window (f, window_prompting, minibuffer_only)
#else /* not USE_X_TOOLKIT */
#ifdef USE_GTK
void
-x_window (f)
- FRAME_PTR f;
+x_window (FRAME_PTR f)
{
if (! xg_create_frame_widgets (f))
error ("Unable to create window");
@@ -2774,9 +2720,7 @@ x_window (f)
/* Create and set up the X window for frame F. */
void
-x_window (f)
- struct frame *f;
-
+x_window (struct frame *f)
{
XClassHint class_hints;
XSetWindowAttributes attributes;
@@ -2881,9 +2825,7 @@ x_window (f)
/* Verify that the icon position args for this window are valid. */
static void
-x_icon_verify (f, parms)
- struct frame *f;
- Lisp_Object parms;
+x_icon_verify (struct frame *f, Lisp_Object parms)
{
Lisp_Object icon_x, icon_y;
@@ -2905,9 +2847,7 @@ x_icon_verify (f, parms)
well. */
static void
-x_icon (f, parms)
- struct frame *f;
- Lisp_Object parms;
+x_icon (struct frame *f, Lisp_Object parms)
{
Lisp_Object icon_x, icon_y;
#if 0
@@ -2953,8 +2893,7 @@ x_icon (f, parms)
mouse cursor and the gray border tile. */
static void
-x_make_gc (f)
- struct frame *f;
+x_make_gc (struct frame *f)
{
XGCValues gc_values;
@@ -3013,8 +2952,7 @@ x_make_gc (f)
/* Free what was allocated in x_make_gc. */
void
-x_free_gcs (f)
- struct frame *f;
+x_free_gcs (struct frame *f)
{
Display *dpy = FRAME_X_DISPLAY (f);
@@ -3053,8 +2991,7 @@ x_free_gcs (f)
constructed. */
static Lisp_Object
-unwind_create_frame (frame)
- Lisp_Object frame;
+unwind_create_frame (Lisp_Object frame)
{
struct frame *f = XFRAME (frame);
@@ -3086,34 +3023,36 @@ unwind_create_frame (frame)
static void
-x_default_font_parameter (f, parms)
- struct frame *f;
- Lisp_Object parms;
+x_default_font_parameter (struct frame *f, Lisp_Object parms)
{
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);
- Lisp_Object font;
- int got_from_gconf = 0;
+ Lisp_Object font = Qnil;
if (EQ (font_param, Qunbound))
font_param = Qnil;
if (NILP (font_param))
{
- /* System font takes precedendce over X resources. We must suggest this
+ /* System font should take precedendce over X resources. We 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));
+ if (system_font)
+ {
+ char *name = xstrdup (system_font);
+ font = font_open_by_name (f, name);
+ free (name);
+ }
}
- font = !NILP (font_param) ? font_param
- : x_get_arg (dpyinfo, parms, Qfont, "font", "Font", RES_TYPE_STRING);
+ if (NILP (font))
+ font = !NILP (font_param) ? font_param
+ : x_get_arg (dpyinfo, parms, Qfont, "font", "Font", RES_TYPE_STRING);
- if (! STRINGP (font))
+ if (! FONTP (font) && ! STRINGP (font))
{
- char *names[]
+ const char *names[]
= {
#ifdef HAVE_XFT
/* This will find the normal Xft font. */
@@ -3148,10 +3087,8 @@ x_default_font_parameter (f, parms)
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);
+ /* This call will make X resources override any system font setting. */
+ x_default_parameter (f, parms, Qfont, font, "font", "Font", RES_TYPE_STRING);
}
@@ -3159,8 +3096,7 @@ 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;
+ (Lisp_Object frame)
{
struct frame *f;
if (NILP (frame))
@@ -3173,6 +3109,23 @@ If FRAME is nil, use the selected frame. */)
return Qnil;
}
+static void
+set_machine_and_pid_properties (struct frame *f)
+{
+ long pid = (long) getpid ();
+
+ /* This will set WM_CLIENT_MACHINE and WM_LOCALE_NAME. */
+ XSetWMProperties (FRAME_X_DISPLAY (f), FRAME_OUTER_WINDOW (f), NULL, NULL,
+ NULL, 0, NULL, NULL, NULL);
+ XChangeProperty (FRAME_X_DISPLAY (f),
+ FRAME_OUTER_WINDOW (f),
+ XInternAtom (FRAME_X_DISPLAY (f),
+ "_NET_WM_PID",
+ False),
+ XA_CARDINAL, 32, PropModeReplace,
+ (unsigned char *) &pid, 1);
+}
+
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.
@@ -3184,8 +3137,7 @@ then `default-minibuffer-frame' must be a frame whose minibuffer can
be shared by the new frame.
This function is an internal primitive--use `make-frame' instead. */)
- (parms)
- Lisp_Object parms;
+ (Lisp_Object parms)
{
struct frame *f;
Lisp_Object frame, tem;
@@ -3262,7 +3214,7 @@ This function is an internal primitive--use `make-frame' instead. */)
f->output_method = output_x_window;
f->output_data.x = (struct x_output *) xmalloc (sizeof (struct x_output));
- bzero (f->output_data.x, sizeof (struct x_output));
+ memset (f->output_data.x, 0, sizeof (struct x_output));
f->output_data.x->icon_bitmap = -1;
FRAME_FONTSET (f) = -1;
f->output_data.x->scroll_bar_foreground_pixel = -1;
@@ -3372,17 +3324,9 @@ This function is an internal primitive--use `make-frame' instead. */)
error ("Invalid frame font");
}
-#ifdef USE_LUCID
- /* Prevent lwlib/xlwmenu.c from crashing because of a bug
- whereby it fails to get any font. */
- 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. */
if (! FRAME_X_EMBEDDED_P (f))
- x_default_parameter (f, parms, Qborder_width, make_number (2),
+ x_default_parameter (f, parms, Qborder_width, make_number (0),
"borderWidth", "BorderWidth", RES_TYPE_NUMBER);
/* This defaults to 1 in order to match xterm. We recognize either
@@ -3406,7 +3350,12 @@ This function is an internal primitive--use `make-frame' instead. */)
#endif
"internalBorderWidth", "internalBorderWidth",
RES_TYPE_NUMBER);
- x_default_parameter (f, parms, Qvertical_scroll_bars, Qleft,
+ x_default_parameter (f, parms, Qvertical_scroll_bars,
+#if defined(USE_GTK) && defined(USE_TOOLKIT_SCROLL_BARS)
+ Qright,
+#else
+ Qleft,
+#endif
"verticalScrollBars", "ScrollBars",
RES_TYPE_SYMBOL);
@@ -3417,8 +3366,6 @@ This function is an internal primitive--use `make-frame' instead. */)
"background", "Background", RES_TYPE_STRING);
x_default_parameter (f, parms, Qmouse_color, build_string ("black"),
"pointerColor", "Foreground", RES_TYPE_STRING);
- x_default_parameter (f, parms, Qcursor_color, build_string ("black"),
- "cursorColor", "Foreground", RES_TYPE_STRING);
x_default_parameter (f, parms, Qborder_color, build_string ("black"),
"borderColor", "BorderColor", RES_TYPE_STRING);
x_default_parameter (f, parms, Qscreen_gamma, Qnil,
@@ -3445,10 +3392,18 @@ This function is an internal primitive--use `make-frame' instead. */)
happen. */
init_frame_faces (f);
- x_default_parameter (f, parms, Qmenu_bar_lines, make_number (1),
- "menuBar", "MenuBar", RES_TYPE_BOOLEAN_NUMBER);
- x_default_parameter (f, parms, Qtool_bar_lines, make_number (1),
- "toolBar", "ToolBar", RES_TYPE_NUMBER);
+ /* The X resources controlling the menu-bar and tool-bar are
+ processed specially at startup, and reflected in the mode
+ variables; ignore them here. */
+ x_default_parameter (f, parms, Qmenu_bar_lines,
+ NILP (Vmenu_bar_mode)
+ ? make_number (0) : make_number (1),
+ NULL, NULL, RES_TYPE_NUMBER);
+ x_default_parameter (f, parms, Qtool_bar_lines,
+ NILP (Vtool_bar_mode)
+ ? make_number (0) : make_number (1),
+ NULL, NULL, RES_TYPE_NUMBER);
+
x_default_parameter (f, parms, Qbuffer_predicate, Qnil,
"bufferPredicate", "BufferPredicate",
RES_TYPE_SYMBOL);
@@ -3458,6 +3413,8 @@ This function is an internal primitive--use `make-frame' instead. */)
"waitForWM", "WaitForWM", RES_TYPE_BOOLEAN);
x_default_parameter (f, parms, Qfullscreen, Qnil,
"fullscreen", "Fullscreen", RES_TYPE_SYMBOL);
+ x_default_parameter (f, parms, Qtool_bar_position,
+ f->tool_bar_position, 0, 0, RES_TYPE_SYMBOL);
/* Compute the size of the X window. */
window_prompting = x_figure_window_size (f, parms, 1);
@@ -3554,19 +3511,24 @@ This function is an internal primitive--use `make-frame' instead. */)
;
}
+ BLOCK_INPUT;
+
+ /* Set machine name and pid for the purpose of window managers. */
+ set_machine_and_pid_properties(f);
+
/* Set the WM leader property. GTK does this itself, so this is not
needed when using GTK. */
if (dpyinfo->client_leader_window != 0)
{
- BLOCK_INPUT;
XChangeProperty (FRAME_X_DISPLAY (f),
FRAME_OUTER_WINDOW (f),
dpyinfo->Xatom_wm_client_leader,
XA_WINDOW, 32, PropModeReplace,
(unsigned char *) &dpyinfo->client_leader_window, 1);
- UNBLOCK_INPUT;
}
+ UNBLOCK_INPUT;
+
/* Initialize `default-minibuffer-frame' in case this is the first
frame on this terminal. */
if (FRAME_HAS_MINIBUF_P (f)
@@ -3595,8 +3557,7 @@ This function is an internal primitive--use `make-frame' instead. */)
know about that structure. */
Lisp_Object
-x_get_focus_frame (frame)
- struct frame *frame;
+x_get_focus_frame (struct frame *frame)
{
struct x_display_info *dpyinfo = FRAME_X_DISPLAY_INFO (frame);
Lisp_Object xfocus;
@@ -3620,8 +3581,7 @@ x_get_focus_frame (frame)
DEFUN ("x-focus-frame", Fx_focus_frame, Sx_focus_frame, 1, 1, 0,
doc: /* Set the input focus to FRAME.
FRAME nil means use the selected frame. */)
- (frame)
- Lisp_Object frame;
+ (Lisp_Object frame)
{
struct frame *f = check_x_frame (frame);
Display *dpy = FRAME_X_DISPLAY (f);
@@ -3639,9 +3599,9 @@ FRAME nil means use the selected frame. */)
DEFUN ("xw-color-defined-p", Fxw_color_defined_p, Sxw_color_defined_p, 1, 2, 0,
- doc: /* Internal function called by `color-defined-p', which see. */)
- (color, frame)
- Lisp_Object color, frame;
+ doc: /* Internal function called by `color-defined-p', which see
+.\(Note that the Nextstep version of this function ignores FRAME.) */)
+ (Lisp_Object color, Lisp_Object frame)
{
XColor foo;
FRAME_PTR f = check_x_frame (frame);
@@ -3656,8 +3616,7 @@ DEFUN ("xw-color-defined-p", Fxw_color_defined_p, Sxw_color_defined_p, 1, 2, 0,
DEFUN ("xw-color-values", Fxw_color_values, Sxw_color_values, 1, 2, 0,
doc: /* Internal function called by `color-values', which see. */)
- (color, frame)
- Lisp_Object color, frame;
+ (Lisp_Object color, Lisp_Object frame)
{
XColor foo;
FRAME_PTR f = check_x_frame (frame);
@@ -3674,8 +3633,7 @@ DEFUN ("xw-color-values", Fxw_color_values, Sxw_color_values, 1, 2, 0,
DEFUN ("xw-display-color-p", Fxw_display_color_p, Sxw_display_color_p, 0, 1, 0,
doc: /* Internal function called by `display-color-p', which see. */)
- (terminal)
- Lisp_Object terminal;
+ (Lisp_Object terminal)
{
struct x_display_info *dpyinfo = check_x_display_info (terminal);
@@ -3702,8 +3660,7 @@ Note that color displays do support shades of gray.
The optional argument TERMINAL specifies which display to ask about.
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;
+ (Lisp_Object terminal)
{
struct x_display_info *dpyinfo = check_x_display_info (terminal);
@@ -3731,8 +3688,7 @@ DEFUN ("x-display-pixel-width", Fx_display_pixel_width, Sx_display_pixel_width,
The optional argument TERMINAL specifies which display to ask about.
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;
+ (Lisp_Object terminal)
{
struct x_display_info *dpyinfo = check_x_display_info (terminal);
@@ -3745,8 +3701,7 @@ DEFUN ("x-display-pixel-height", Fx_display_pixel_height,
The optional argument TERMINAL specifies which display to ask about.
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;
+ (Lisp_Object terminal)
{
struct x_display_info *dpyinfo = check_x_display_info (terminal);
@@ -3759,8 +3714,7 @@ DEFUN ("x-display-planes", Fx_display_planes, Sx_display_planes,
The optional argument TERMINAL specifies which display to ask about.
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;
+ (Lisp_Object terminal)
{
struct x_display_info *dpyinfo = check_x_display_info (terminal);
@@ -3773,8 +3727,7 @@ DEFUN ("x-display-color-cells", Fx_display_color_cells, Sx_display_color_cells,
The optional argument TERMINAL specifies which display to ask about.
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;
+ (Lisp_Object terminal)
{
struct x_display_info *dpyinfo = check_x_display_info (terminal);
@@ -3798,8 +3751,7 @@ DEFUN ("x-server-max-request-size", Fx_server_max_request_size,
The optional argument TERMINAL specifies which display to ask about.
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;
+ (Lisp_Object terminal)
{
struct x_display_info *dpyinfo = check_x_display_info (terminal);
@@ -3813,11 +3765,10 @@ that operating systems cannot be developed and distributed noncommercially.)
The optional argument TERMINAL specifies which display to ask about.
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;
+ (Lisp_Object terminal)
{
struct x_display_info *dpyinfo = check_x_display_info (terminal);
- char *vendor = ServerVendor (dpyinfo->display);
+ const char *vendor = ServerVendor (dpyinfo->display);
if (! vendor) vendor = "";
return build_string (vendor);
@@ -3832,8 +3783,7 @@ number. See also the function `x-server-vendor'.
The optional argument TERMINAL specifies which display to ask about.
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;
+ (Lisp_Object terminal)
{
struct x_display_info *dpyinfo = check_x_display_info (terminal);
Display *dpy = dpyinfo->display;
@@ -3848,8 +3798,7 @@ DEFUN ("x-display-screens", Fx_display_screens, Sx_display_screens, 0, 1, 0,
The optional argument TERMINAL specifies which display to ask about.
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;
+ (Lisp_Object terminal)
{
struct x_display_info *dpyinfo = check_x_display_info (terminal);
@@ -3861,8 +3810,7 @@ DEFUN ("x-display-mm-height", Fx_display_mm_height, Sx_display_mm_height, 0, 1,
The optional argument TERMINAL specifies which display to ask about.
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;
+ (Lisp_Object terminal)
{
struct x_display_info *dpyinfo = check_x_display_info (terminal);
@@ -3874,8 +3822,7 @@ DEFUN ("x-display-mm-width", Fx_display_mm_width, Sx_display_mm_width, 0, 1, 0,
The optional argument TERMINAL specifies which display to ask about.
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;
+ (Lisp_Object terminal)
{
struct x_display_info *dpyinfo = check_x_display_info (terminal);
@@ -3889,8 +3836,7 @@ 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 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;
+ (Lisp_Object terminal)
{
struct x_display_info *dpyinfo = check_x_display_info (terminal);
Lisp_Object result;
@@ -3926,8 +3872,7 @@ The value is one of the symbols `static-gray', `gray-scale',
The optional argument TERMINAL specifies which display to ask about.
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;
+ (Lisp_Object terminal)
{
struct x_display_info *dpyinfo = check_x_display_info (terminal);
Lisp_Object result;
@@ -3966,8 +3911,7 @@ DEFUN ("x-display-save-under", Fx_display_save_under,
The optional argument TERMINAL specifies which display to ask about.
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;
+ (Lisp_Object terminal)
{
struct x_display_info *dpyinfo = check_x_display_info (terminal);
@@ -3978,36 +3922,31 @@ If omitted or nil, that stands for the selected frame's display. */)
}
int
-x_pixel_width (f)
- register struct frame *f;
+x_pixel_width (register struct frame *f)
{
return FRAME_PIXEL_WIDTH (f);
}
int
-x_pixel_height (f)
- register struct frame *f;
+x_pixel_height (register struct frame *f)
{
return FRAME_PIXEL_HEIGHT (f);
}
int
-x_char_width (f)
- register struct frame *f;
+x_char_width (register struct frame *f)
{
return FRAME_COLUMN_WIDTH (f);
}
int
-x_char_height (f)
- register struct frame *f;
+x_char_height (register struct frame *f)
{
return FRAME_LINE_HEIGHT (f);
}
int
-x_screen_planes (f)
- register struct frame *f;
+x_screen_planes (register struct frame *f)
{
return FRAME_X_DISPLAY_INFO (f)->n_planes;
}
@@ -4023,7 +3962,7 @@ x_screen_planes (f)
static struct visual_class
{
- char *name;
+ const char *name;
int class;
}
visual_classes[] =
@@ -4064,8 +4003,7 @@ XScreenNumberOfScreen (scr)
members of DPYINFO appropriately. Called from x_term_init. */
void
-select_visual (dpyinfo)
- struct x_display_info *dpyinfo;
+select_visual (struct x_display_info *dpyinfo)
{
Display *dpy = dpyinfo->display;
Screen *screen = dpyinfo->screen;
@@ -4087,7 +4025,7 @@ select_visual (dpyinfo)
XVisualInfo vinfo;
strcpy (s, SDATA (value));
- dash = index (s, '-');
+ dash = strchr (s, '-');
if (dash)
{
dpyinfo->n_planes = atoi (dash + 1);
@@ -4125,7 +4063,7 @@ select_visual (dpyinfo)
vinfo_template.screen = XScreenNumberOfScreen (screen);
vinfo = XGetVisualInfo (dpy, VisualIDMask | VisualScreenMask,
&vinfo_template, &n_visuals);
- if (n_visuals != 1)
+ if (n_visuals <= 0)
fatal ("Can't get proper X visual info");
dpyinfo->n_planes = vinfo->depth;
@@ -4138,8 +4076,7 @@ select_visual (dpyinfo)
Open a new connection if necessary. */
struct x_display_info *
-x_display_info_for_name (name)
- Lisp_Object name;
+x_display_info_for_name (Lisp_Object name)
{
Lisp_Object names;
struct x_display_info *dpyinfo;
@@ -4181,13 +4118,13 @@ x_display_info_for_name (name)
DEFUN ("x-open-connection", Fx_open_connection, Sx_open_connection,
1, 3, 0,
- doc: /* Open a connection to an X server.
+ doc: /* Open a connection to a display server.
DISPLAY is the name of the display to connect to.
Optional second arg XRM-STRING is a string of resources in xrdb format.
If the optional third arg MUST-SUCCEED is non-nil,
-terminate Emacs if we can't open the connection. */)
- (display, xrm_string, must_succeed)
- Lisp_Object display, xrm_string, must_succeed;
+terminate Emacs if we can't open the connection.
+\(In the Nextstep version, the last two arguments are currently ignored.) */)
+ (Lisp_Object display, Lisp_Object xrm_string, Lisp_Object must_succeed)
{
unsigned char *xrm_option;
struct x_display_info *dpyinfo;
@@ -4238,8 +4175,7 @@ DEFUN ("x-close-connection", Fx_close_connection,
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)
- Lisp_Object terminal;
+ (Lisp_Object terminal)
{
struct x_display_info *dpyinfo = check_x_display_info (terminal);
@@ -4253,7 +4189,7 @@ terminal. */)
DEFUN ("x-display-list", Fx_display_list, Sx_display_list, 0, 0, 0,
doc: /* Return the list of display names that Emacs has connections to. */)
- ()
+ (void)
{
Lisp_Object tail, result;
@@ -4266,6 +4202,9 @@ DEFUN ("x-display-list", Fx_display_list, Sx_display_list, 0, 0, 0,
DEFUN ("x-synchronize", Fx_synchronize, Sx_synchronize, 1, 2, 0,
doc: /* If ON is non-nil, report X errors as soon as the erring request is made.
+This function only has an effect on X Windows. With MS Windows, it is
+defined but does nothing.
+
If ON is nil, allow buffering of requests.
Turning on synchronization prohibits the Xlib routines from buffering
requests and seriously degrades performance, but makes debugging much
@@ -4273,8 +4212,7 @@ easier.
The optional second argument TERMINAL specifies which display to act on.
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;
+ (Lisp_Object on, Lisp_Object terminal)
{
struct x_display_info *dpyinfo = check_x_display_info (terminal);
@@ -4286,8 +4224,7 @@ If TERMINAL is omitted or nil, that stands for the selected frame's display. */
/* Wait for responses to all X commands issued so far for frame F. */
void
-x_sync (f)
- FRAME_PTR f;
+x_sync (FRAME_PTR f)
{
BLOCK_INPUT;
XSync (FRAME_X_DISPLAY (f), False);
@@ -4302,12 +4239,12 @@ x_sync (f)
DEFUN ("x-change-window-property", Fx_change_window_property,
Sx_change_window_property, 2, 6, 0,
doc: /* Change window property PROP to VALUE on the X window of FRAME.
-PROP must be a string.
-VALUE may be a string or a list of conses, numbers and/or strings.
-If an element in the list is a string, it is converted to
-an Atom and the value of the Atom is used. If an element is a cons,
-it is converted to a 32 bit number where the car is the 16 top bits and the
-cdr is the lower 16 bits.
+PROP must be a string. VALUE may be a string or a list of conses,
+numbers and/or strings. If an element in the list is a string, it is
+converted to an atom and the value of the atom is used. If an element
+is a cons, it is converted to a 32 bit number where the car is the 16
+top bits and the cdr is the lower 16 bits.
+
FRAME nil or omitted means use the selected frame.
If TYPE is given and non-nil, it is the name of the type of VALUE.
If TYPE is not given or nil, the type is STRING.
@@ -4315,11 +4252,8 @@ FORMAT gives the size in bits of each element if VALUE is a list.
It must be one of 8, 16 or 32.
If VALUE is a string or FORMAT is nil or not given, FORMAT defaults to 8.
If OUTER_P is non-nil, the property is changed for the outer X window of
-FRAME. Default is to change on the edit X window.
-
-Value is VALUE. */)
- (prop, value, frame, type, format, outer_p)
- Lisp_Object prop, value, frame, type, format, outer_p;
+FRAME. Default is to change on the edit X window. */)
+ (Lisp_Object prop, Lisp_Object value, Lisp_Object frame, Lisp_Object type, Lisp_Object format, Lisp_Object outer_p)
{
struct frame *f = check_x_frame (frame);
Atom prop_atom;
@@ -4397,8 +4331,7 @@ DEFUN ("x-delete-window-property", Fx_delete_window_property,
Sx_delete_window_property, 1, 2, 0,
doc: /* Remove window property PROP from X window of FRAME.
FRAME nil or omitted means use the selected frame. Value is PROP. */)
- (prop, frame)
- Lisp_Object prop, frame;
+ (Lisp_Object prop, Lisp_Object frame)
{
struct frame *f = check_x_frame (frame);
Atom prop_atom;
@@ -4420,17 +4353,20 @@ DEFUN ("x-window-property", Fx_window_property, Sx_window_property,
1, 6, 0,
doc: /* Value is the value of window property PROP on FRAME.
If FRAME is nil or omitted, use the selected frame.
-If TYPE is nil or omitted, get the property as a string. Otherwise TYPE
-is the name of the Atom that denotes the type expected.
+
+On MS Windows, this function only accepts the PROP and FRAME arguments.
+
+On X Windows, the following optional arguments are also accepted:
+If TYPE is nil or omitted, get the property as a string.
+Otherwise TYPE is the name of the atom that denotes the type expected.
If SOURCE is non-nil, get the property on that window instead of from
FRAME. The number 0 denotes the root window.
If DELETE_P is non-nil, delete the property after retreiving it.
If VECTOR_RET_P is non-nil, don't return a string but a vector of values.
Value is nil if FRAME hasn't a property with name PROP or if PROP has
-no value of TYPE. */)
- (prop, frame, type, source, delete_p, vector_ret_p)
- Lisp_Object prop, frame, type, source, delete_p, vector_ret_p;
+no value of TYPE (always string in the MS Windows case). */)
+ (Lisp_Object prop, Lisp_Object frame, Lisp_Object type, Lisp_Object source, Lisp_Object delete_p, Lisp_Object vector_ret_p)
{
struct frame *f = check_x_frame (frame);
Atom prop_atom;
@@ -4498,7 +4434,7 @@ no value of TYPE. */)
elements."
This applies even if long is more than 32 bits, the X library
converts from 32 bit elements received from the X server to long
- and passes the long array to us. Thus, for that case bcopy can not
+ and passes the long array to us. Thus, for that case memcpy can not
be used. We convert to a 32 bit type here, because so much code
assume on that.
@@ -4549,8 +4485,7 @@ no value of TYPE. */)
shown on the frames. */
void
-show_hourglass (timer)
- struct atimer *timer;
+show_hourglass (struct atimer *timer)
{
/* The timer implementation will cancel this timer automatically
after this function has run. Set hourglass_atimer to null
@@ -4614,7 +4549,7 @@ show_hourglass (timer)
shown. */
void
-hide_hourglass ()
+hide_hourglass (void)
{
if (hourglass_shown_p)
{
@@ -4649,10 +4584,10 @@ hide_hourglass ()
Tool tips
***********************************************************************/
-static Lisp_Object x_create_tip_frame P_ ((struct x_display_info *,
- Lisp_Object, Lisp_Object));
-static void compute_tip_xy P_ ((struct frame *, Lisp_Object, Lisp_Object,
- Lisp_Object, int, int, int *, int *));
+static Lisp_Object x_create_tip_frame (struct x_display_info *,
+ Lisp_Object, Lisp_Object);
+static void compute_tip_xy (struct frame *, Lisp_Object, Lisp_Object,
+ Lisp_Object, int, int, int *, int *);
/* The frame of a currently visible tooltip. */
@@ -4675,8 +4610,7 @@ Lisp_Object Vx_max_tooltip_size;
static Lisp_Object
-unwind_create_tip_frame (frame)
- Lisp_Object frame;
+unwind_create_tip_frame (Lisp_Object frame)
{
Lisp_Object deleted;
@@ -4701,9 +4635,9 @@ unwind_create_tip_frame (frame)
when this happens. */
static Lisp_Object
-x_create_tip_frame (dpyinfo, parms, text)
- struct x_display_info *dpyinfo;
- Lisp_Object parms, text;
+x_create_tip_frame (struct x_display_info *dpyinfo,
+ Lisp_Object parms,
+ Lisp_Object text)
{
struct frame *f;
Lisp_Object frame, tem;
@@ -4758,7 +4692,7 @@ x_create_tip_frame (dpyinfo, parms, text)
counts etc. */
f->output_method = output_x_window;
f->output_data.x = (struct x_output *) xmalloc (sizeof (struct x_output));
- bzero (f->output_data.x, sizeof (struct x_output));
+ memset (f->output_data.x, 0, sizeof (struct x_output));
f->output_data.x->icon_bitmap = -1;
FRAME_FONTSET (f) = -1;
f->output_data.x->scroll_bar_foreground_pixel = -1;
@@ -4843,7 +4777,7 @@ x_create_tip_frame (dpyinfo, parms, text)
needed to determine window geometry. */
x_default_font_parameter (f, parms);
- x_default_parameter (f, parms, Qborder_width, make_number (2),
+ x_default_parameter (f, parms, Qborder_width, make_number (0),
"borderWidth", "BorderWidth", RES_TYPE_NUMBER);
/* This defaults to 2 in order to match xterm. We recognize either
@@ -5017,11 +4951,7 @@ x_create_tip_frame (dpyinfo, parms, text)
the display in *ROOT_X, and *ROOT_Y. */
static void
-compute_tip_xy (f, parms, dx, dy, width, height, root_x, root_y)
- struct frame *f;
- Lisp_Object parms, dx, dy;
- int width, height;
- int *root_x, *root_y;
+compute_tip_xy (struct frame *f, Lisp_Object parms, Lisp_Object dx, Lisp_Object dy, int width, int height, int *root_x, int *root_y)
{
Lisp_Object left, top;
int win_x, win_y;
@@ -5088,7 +5018,7 @@ change the tooltip's appearance.
Automatically hide the tooltip after TIMEOUT seconds. TIMEOUT nil
means use the default timeout of 5 seconds.
-If the list of frame parameters PARAMS contains a `left' parameters,
+If the list of frame parameters PARMS contains a `left' parameters,
the tooltip is displayed at that x-position. Otherwise it is
displayed at the mouse position, with offset DX added (default is 5 if
DX isn't specified). Likewise for the y-position; if a `top' frame
@@ -5098,15 +5028,14 @@ DY added (default is -10).
A tooltip's maximum size is specified by `x-max-tooltip-size'.
Text larger than the specified size is clipped. */)
- (string, frame, parms, timeout, dx, dy)
- Lisp_Object string, frame, parms, timeout, dx, dy;
+ (Lisp_Object string, Lisp_Object frame, Lisp_Object parms, Lisp_Object timeout, Lisp_Object dx, Lisp_Object dy)
{
struct frame *f;
struct window *w;
int root_x, root_y;
struct buffer *old_buffer;
struct text_pos pos;
- int i, width, height;
+ int i, width, height, seen_reversed_p;
struct gcpro gcpro1, gcpro2, gcpro3, gcpro4;
int old_windows_or_buffers_changed = windows_or_buffers_changed;
int count = SPECPDL_INDEX ();
@@ -5135,6 +5064,27 @@ Text larger than the specified size is clipped. */)
else
CHECK_NUMBER (dy);
+#ifdef USE_GTK
+ if (x_gtk_use_system_tooltips)
+ {
+ int ok;
+
+ /* Hide a previous tip, if any. */
+ Fx_hide_tip ();
+
+ BLOCK_INPUT;
+ if ((ok = xg_prepare_tooltip (f, string, &width, &height)) != 0)
+ {
+ compute_tip_xy (f, parms, dx, dy, width, height, &root_x, &root_y);
+ xg_show_tooltip (f, root_x, root_y);
+ /* This is used in Fx_hide_tip. */
+ XSETFRAME (tip_frame, f);
+ }
+ UNBLOCK_INPUT;
+ if (ok) goto start_timer;
+ }
+#endif /* USE_GTK */
+
if (NILP (last_show_tip_args))
last_show_tip_args = Fmake_vector (make_number (3), Qnil);
@@ -5226,7 +5176,7 @@ Text larger than the specified size is clipped. */)
try_window (FRAME_ROOT_WINDOW (f), pos, TRY_WINDOW_IGNORE_FONTS_CHANGE);
/* Compute width and height of the tooltip. */
- width = height = 0;
+ width = height = seen_reversed_p = 0;
for (i = 0; i < w->desired_matrix->nrows; ++i)
{
struct glyph_row *row = &w->desired_matrix->rows[i];
@@ -5240,20 +5190,75 @@ Text larger than the specified size is clipped. */)
/* Let the row go over the full width of the frame. */
row->full_width_p = 1;
- /* There's a glyph at the end of rows that is used to place
- the cursor there. Don't include the width of this glyph. */
+ row_width = row->pixel_width;
if (row->used[TEXT_AREA])
{
- last = &row->glyphs[TEXT_AREA][row->used[TEXT_AREA] - 1];
- row_width = row->pixel_width - last->pixel_width;
+ /* There's a glyph at the end of rows that is used to place
+ the cursor there. Don't include the width of this glyph. */
+ if (!row->reversed_p)
+ {
+ last = &row->glyphs[TEXT_AREA][row->used[TEXT_AREA] - 1];
+ if (INTEGERP (last->object))
+ row_width -= last->pixel_width;
+ }
+ else
+ {
+ /* There could be a stretch glyph at the beginning of R2L
+ rows that is produced by extend_face_to_end_of_line.
+ Don't count that glyph. */
+ struct glyph *g = row->glyphs[TEXT_AREA];
+
+ if (g->type == STRETCH_GLYPH && INTEGERP (g->object))
+ {
+ row_width -= g->pixel_width;
+ seen_reversed_p = 1;
+ }
+ }
}
- else
- row_width = row->pixel_width;
height += row->height;
width = max (width, row_width);
}
+ /* If we've seen partial-length R2L rows, we need to re-adjust the
+ tool-tip frame width and redisplay it again, to avoid over-wide
+ tips due to the stretch glyph that extends R2L lines to full
+ width of the frame. */
+ if (seen_reversed_p)
+ {
+ /* w->total_cols and FRAME_TOTAL_COLS want the width in columns,
+ not in pixels. */
+ width /= WINDOW_FRAME_COLUMN_WIDTH (w);
+ w->total_cols = make_number (width);
+ FRAME_TOTAL_COLS (f) = width;
+ adjust_glyphs (f);
+ clear_glyph_matrix (w->desired_matrix);
+ clear_glyph_matrix (w->current_matrix);
+ try_window (FRAME_ROOT_WINDOW (f), pos, 0);
+ width = height = 0;
+ /* Recompute width and height of the tooltip. */
+ for (i = 0; i < w->desired_matrix->nrows; ++i)
+ {
+ struct glyph_row *row = &w->desired_matrix->rows[i];
+ struct glyph *last;
+ int row_width;
+
+ if (!row->enabled_p || !row->displays_text_p)
+ break;
+ row->full_width_p = 1;
+ row_width = row->pixel_width;
+ if (row->used[TEXT_AREA] && !row->reversed_p)
+ {
+ last = &row->glyphs[TEXT_AREA][row->used[TEXT_AREA] - 1];
+ if (INTEGERP (last->object))
+ row_width -= last->pixel_width;
+ }
+
+ height += row->height;
+ width = max (width, row_width);
+ }
+ }
+
/* Add the frame's internal border to the width and height the X
window should have. */
height += 2 * FRAME_INTERNAL_BORDER_WIDTH (f);
@@ -5290,11 +5295,12 @@ Text larger than the specified size is clipped. */)
DEFUN ("x-hide-tip", Fx_hide_tip, Sx_hide_tip, 0, 0, 0,
doc: /* Hide the current tooltip window, if there is any.
Value is t if tooltip was open, nil otherwise. */)
- ()
+ (void)
{
int count;
Lisp_Object deleted, frame, timer;
struct gcpro gcpro1, gcpro2;
+ struct frame *f;
/* Return quickly if nothing to do. */
if (NILP (tip_timer) && NILP (tip_frame))
@@ -5312,6 +5318,14 @@ Value is t if tooltip was open, nil otherwise. */)
if (!NILP (timer))
call1 (Qcancel_timer, timer);
+#ifdef USE_GTK
+ /* When using system tooltip, tip_frame is the Emacs frame on which
+ the tip is shown. */
+ f = XFRAME (frame);
+ if (FRAME_LIVE_P (f) && xg_hide_tooltip (f))
+ frame = Qnil;
+#endif
+
if (FRAMEP (frame))
{
delete_frame (frame, Qnil);
@@ -5322,9 +5336,9 @@ Value is t if tooltip was open, nil otherwise. */)
redisplay procedure is not called when a tip frame over menu
items is unmapped. Redisplay the menu manually... */
{
- struct frame *f = SELECTED_FRAME ();
- Widget w = f->output_data.x->menubar_widget;
- extern void xlwmenu_redisplay P_ ((Widget));
+ Widget w;
+ f = SELECTED_FRAME ();
+ w = f->output_data.x->menubar_widget;
if (!DoesSaveUnders (FRAME_X_DISPLAY_INFO (f)->screen)
&& w != NULL)
@@ -5351,12 +5365,9 @@ DEFUN ("x-uses-old-gtk-dialog", Fx_uses_old_gtk_dialog,
Sx_uses_old_gtk_dialog,
0, 0, 0,
doc: /* Return t if the old Gtk+ file selection dialog is used. */)
- ()
+ (void)
{
#ifdef USE_GTK
- extern int use_dialog_box;
- extern int use_file_dialog;
-
if (use_dialog_box
&& use_file_dialog
&& have_menus_p ()
@@ -5371,9 +5382,7 @@ DEFUN ("x-uses-old-gtk-dialog", Fx_uses_old_gtk_dialog,
/* Callback for "OK" and "Cancel" on file selection dialog. */
static void
-file_dialog_cb (widget, client_data, call_data)
- Widget widget;
- XtPointer call_data, client_data;
+file_dialog_cb (Widget widget, XtPointer client_data, XtPointer call_data)
{
int *result = (int *) client_data;
XmAnyCallbackStruct *cb = (XmAnyCallbackStruct *) call_data;
@@ -5387,17 +5396,14 @@ file_dialog_cb (widget, client_data, call_data)
in this case. */
static void
-file_dialog_unmap_cb (widget, client_data, call_data)
- Widget widget;
- XtPointer call_data, client_data;
+file_dialog_unmap_cb (Widget widget, XtPointer client_data, XtPointer call_data)
{
int *result = (int *) client_data;
*result = XmCR_CANCEL;
}
static Lisp_Object
-clean_up_file_dialog (arg)
- Lisp_Object arg;
+clean_up_file_dialog (Lisp_Object arg)
{
struct Lisp_Save_Value *p = XSAVE_VALUE (arg);
Widget dialog = (Widget) p->pointer;
@@ -5417,9 +5423,12 @@ DEFUN ("x-file-dialog", Fx_file_dialog, Sx_file_dialog, 2, 5, 0,
doc: /* Read file name, prompting with PROMPT in directory DIR.
Use a file selection dialog. Select DEFAULT-FILENAME in the dialog's file
selection box, if specified. If MUSTMATCH is non-nil, the returned file
-or directory must exist. ONLY-DIR-P is ignored." */)
- (prompt, dir, default_filename, mustmatch, only_dir_p)
- Lisp_Object prompt, dir, default_filename, mustmatch, only_dir_p;
+or directory must exist.
+
+This function is only defined on MS Windows, and X Windows with the
+Motif or Gtk toolkits. With the Motif toolkit, ONLY-DIR-P is ignored.
+Otherwise, if ONLY-DIR-P is non-nil, the user can only select directories. */)
+ (Lisp_Object prompt, Lisp_Object dir, Lisp_Object default_filename, Lisp_Object mustmatch, Lisp_Object only_dir_p)
{
int result;
struct frame *f = SELECTED_FRAME ();
@@ -5428,7 +5437,6 @@ or directory must exist. ONLY-DIR-P is ignored." */)
Widget dialog, text, help;
Arg al[10];
int ac = 0;
- extern XtAppContext Xt_app_con;
XmString dir_xmstring, pattern_xmstring;
int count = SPECPDL_INDEX ();
struct gcpro gcpro1, gcpro2, gcpro3, gcpro4, gcpro5, gcpro6;
@@ -5577,8 +5585,7 @@ or directory must exist. ONLY-DIR-P is ignored." */)
#ifdef USE_GTK
static Lisp_Object
-clean_up_dialog (arg)
- Lisp_Object arg;
+clean_up_dialog (Lisp_Object arg)
{
x_menu_set_in_use (0);
@@ -5589,10 +5596,12 @@ DEFUN ("x-file-dialog", Fx_file_dialog, Sx_file_dialog, 2, 5, 0,
doc: /* Read file name, prompting with PROMPT in directory DIR.
Use a file selection dialog. Select DEFAULT-FILENAME in the dialog's file
selection box, if specified. If MUSTMATCH is non-nil, the returned file
-or directory must exist. If ONLY-DIR-P is non-nil, the user can only select
-directories. */)
- (prompt, dir, default_filename, mustmatch, only_dir_p)
- Lisp_Object prompt, dir, default_filename, mustmatch, only_dir_p;
+or directory must exist.
+
+This function is only defined on MS Windows, and X Windows with the
+Motif or Gtk toolkits. With the Motif toolkit, ONLY-DIR-P is ignored.
+Otherwise, if ONLY-DIR-P is non-nil, the user can only select directories. */)
+ (Lisp_Object prompt, Lisp_Object dir, Lisp_Object default_filename, Lisp_Object mustmatch, Lisp_Object only_dir_p)
{
FRAME_PTR f = SELECTED_FRAME ();
char *fn;
@@ -5653,8 +5662,7 @@ DEFUN ("x-select-font", Fx_select_font, Sx_select_font, 0, 2, 0,
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;
+ (Lisp_Object frame, Lisp_Object ignored)
{
FRAME_PTR f = check_x_frame (frame);
char *name;
@@ -5742,8 +5750,7 @@ FRAME nil means use the selected frame.
Value is t if we know that both keys are present, and are mapped to the
usual X keysyms. Value is `lambda' if we cannot determine if both keys are
present and mapped to the usual X keysyms. */)
- (frame)
- Lisp_Object frame;
+ (Lisp_Object frame)
{
#ifdef HAVE_XKBGETKEYBOARD
XkbDescPtr kb;
@@ -5804,9 +5811,9 @@ present and mapped to the usual X keysyms. */)
/* The XKB symbolic key names can be seen most easily in
the PS file generated by `xkbprint -label name
$DISPLAY'. */
- if (bcmp ("DELE", kb->names->keys[i].name, 4) == 0)
+ if (memcmp ("DELE", kb->names->keys[i].name, 4) == 0)
delete_keycode = i;
- else if (bcmp ("BKSP", kb->names->keys[i].name, 4) == 0)
+ else if (memcmp ("BKSP", kb->names->keys[i].name, 4) == 0)
backspace_keycode = i;
}
@@ -5871,10 +5878,11 @@ frame_parm_handler x_frame_parm_handlers[] =
x_set_font_backend,
x_set_alpha,
x_set_sticky,
+ x_set_tool_bar_position,
};
void
-syms_of_xfns ()
+syms_of_xfns (void)
{
/* This is zero if not using X windows. */
x_in_use = 0;
@@ -6001,6 +6009,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;
+ DEFVAR_BOOL ("x-gtk-use-system-tooltips", &x_gtk_use_system_tooltips,
+ doc: /* *If non-nil with a Gtk+ built Emacs, the Gtk+ toolip is used.
+Otherwise use Emacs own tooltip implementation.
+When using Gtk+ tooltips, the tooltip face is not used. */);
+ x_gtk_use_system_tooltips = 1;
+
Fprovide (intern_c_string ("x"), Qnil);
#ifdef USE_X_TOOLKIT
@@ -6021,6 +6035,7 @@ the tool bar buttons. */);
accepts --with-x-toolkit=gtk. */
Fprovide (intern_c_string ("x-toolkit"), Qnil);
Fprovide (intern_c_string ("gtk"), Qnil);
+ Fprovide (intern_c_string ("move-toolbar"), Qnil);
DEFVAR_LISP ("gtk-version-string", &Vgtk_version_string,
doc: /* Version info for GTK+. */);
@@ -6089,5 +6104,3 @@ the tool bar buttons. */);
#endif /* HAVE_X_WINDOWS */
-/* arch-tag: 55040d02-5485-4d58-8b22-95a7a05f3288
- (do not change this comment) */