#include "dispextern.h"
#include "keyboard.h"
#include "blockinput.h"
-#include <paths.h>
+#include <epaths.h>
#include "charset.h"
#include "fontset.h"
/* Regexp matching a font name whose width is the same as `PIXEL_SIZE'. */
Lisp_Object Vx_pixel_size_width_font_regexp;
+/* A flag to control how to display unibyte 8-bit character. */
+int unibyte_display_via_language_environment;
+
/* Evaluate this expression to rebuild the section of syms_of_xfns
that initializes and staticpros the symbols declared below. Note
that Emacs 18 has a bug that keeps C-x C-e from being able to
Lisp_Object Qright;
Lisp_Object Qmouse_color;
Lisp_Object Qnone;
+Lisp_Object Qouter_window_id;
Lisp_Object Qparent_id;
Lisp_Object Qscroll_bar_width;
Lisp_Object Qsuppress_icon;
{
if (NILP (frame))
{
- if (FRAME_X_P (selected_frame))
+ if (FRAME_X_P (selected_frame)
+ && FRAME_LIVE_P (selected_frame))
return FRAME_X_DISPLAY_INFO (selected_frame);
else if (x_display_list != 0)
return x_display_list;
fd = openp (Vx_bitmap_file_path, file, "", &found, 0);
if (fd < 0)
return -1;
+ /* XReadBitmapFile won't handle magic file names. */
+ if (fd == 0)
+ return -1;
close (fd);
filename = (char *) XSTRING (found)->data;
id = x_allocate_bitmap_record (f);
dpyinfo->bitmaps[id - 1].pixmap = bitmap;
dpyinfo->bitmaps[id - 1].refcount = 1;
- dpyinfo->bitmaps[id - 1].file = (char *) xmalloc (XSTRING (file)->size + 1);
+ dpyinfo->bitmaps[id - 1].file
+ = (char *) xmalloc (STRING_BYTES (XSTRING (file)) + 1);
dpyinfo->bitmaps[id - 1].depth = 1;
dpyinfo->bitmaps[id - 1].height = height;
dpyinfo->bitmaps[id - 1].width = width;
/* Remove reference to bitmap with id number ID. */
-int
+void
x_destroy_bitmap (f, id)
FRAME_PTR f;
int id;
/* Attach the `x-frame-parameter' properties to
the Lisp symbol names of parameters relevant to X. */
+void
init_x_parm_symbols ()
{
int i;
make_number (i));
}
\f
-/* Change the parameters of FRAME as specified by ALIST.
+/* Change the parameters of frame F as specified by ALIST.
If a parameter is not specially recognized, do nothing;
otherwise call the `x_set_...' function for that parameter. */
int left_no_change = 0, top_no_change = 0;
int icon_left_no_change = 0, icon_top_no_change = 0;
+ struct gcpro gcpro1, gcpro2;
+
i = 0;
for (tail = alist; CONSP (tail); tail = Fcdr (tail))
i++;
values[i] = Fcdr (elt);
i++;
}
+ /* TAIL and ALIST are not used again below here. */
+ alist = tail = Qnil;
+ GCPRO2 (*parms, *values);
+ gcpro1.nvars = i;
+ gcpro2.nvars = i;
+
+ /* There is no need to gcpro LEFT, TOP, ICON_LEFT, or ICON_TOP,
+ because their values appear in VALUES and strings are not valid. */
top = left = Qunbound;
icon_left = icon_top = Qunbound;
&& ! (icon_left_no_change && icon_top_no_change))
x_wm_set_icon_position (f, XINT (icon_left), XINT (icon_top));
}
+
+ UNGCPRO;
}
/* Store the screen positions of frame F into XPTR and YPTR.
and whose values are not correctly recorded in the frame's
param_alist need to be considered here. */
+void
x_report_frame_params (f, alistptr)
struct frame *f;
Lisp_Object *alistptr;
sprintf (buf, "%ld", (long) FRAME_X_WINDOW (f));
store_in_alist (alistptr, Qwindow_id,
build_string (buf));
+ sprintf (buf, "%ld", (long) FRAME_OUTER_WINDOW (f));
+ store_in_alist (alistptr, Qouter_window_id,
+ build_string (buf));
store_in_alist (alistptr, Qicon_name, f->icon_name);
FRAME_SAMPLE_VISIBILITY (f);
store_in_alist (alistptr, Qvisibility,
struct frame *f;
Lisp_Object arg, oldval;
{
- f->output_data.x->foreground_pixel
+ unsigned long pixel
= x_decode_color (f, arg, BLACK_PIX_DEFAULT (f));
+
+ if (f->output_data.x->foreground_pixel != f->output_data.x->mouse_pixel
+ && f->output_data.x->foreground_pixel != f->output_data.x->cursor_pixel
+ && f->output_data.x->foreground_pixel != f->output_data.x->cursor_foreground_pixel)
+ unload_color (f, f->output_data.x->foreground_pixel);
+ f->output_data.x->foreground_pixel = pixel;
+
if (FRAME_X_WINDOW (f) != 0)
{
BLOCK_INPUT;
Pixmap temp;
int mask;
- f->output_data.x->background_pixel
+ unsigned long pixel
= x_decode_color (f, arg, WHITE_PIX_DEFAULT (f));
+ if (f->output_data.x->background_pixel != f->output_data.x->mouse_pixel
+ && f->output_data.x->background_pixel != f->output_data.x->cursor_pixel
+ && f->output_data.x->background_pixel != f->output_data.x->cursor_foreground_pixel)
+ unload_color (f, f->output_data.x->background_pixel);
+ f->output_data.x->background_pixel = pixel;
+
if (FRAME_X_WINDOW (f) != 0)
{
BLOCK_INPUT;
Cursor cursor, nontext_cursor, mode_cursor, cross_cursor;
int count;
int mask_color;
-
+ unsigned long pixel = f->output_data.x->mouse_pixel;
+
if (!EQ (Qnil, arg))
- f->output_data.x->mouse_pixel
- = x_decode_color (f, arg, BLACK_PIX_DEFAULT (f));
+ pixel = x_decode_color (f, arg, BLACK_PIX_DEFAULT (f));
+
mask_color = f->output_data.x->background_pixel;
/* No invisible pointers. */
- if (mask_color == f->output_data.x->mouse_pixel
- && mask_color == f->output_data.x->background_pixel)
- f->output_data.x->mouse_pixel = f->output_data.x->foreground_pixel;
+ if (mask_color == pixel
+ && mask_color == f->output_data.x->background_pixel)
+ pixel = f->output_data.x->foreground_pixel;
+
+ if (f->output_data.x->background_pixel != f->output_data.x->mouse_pixel
+ && f->output_data.x->foreground_pixel != f->output_data.x->mouse_pixel
+ && f->output_data.x->cursor_pixel != f->output_data.x->mouse_pixel
+ && f->output_data.x->cursor_foreground_pixel != f->output_data.x->mouse_pixel)
+ unload_color (f, f->output_data.x->mouse_pixel);
+ f->output_data.x->mouse_pixel = pixel;
BLOCK_INPUT;
struct frame *f;
Lisp_Object arg, oldval;
{
- unsigned long fore_pixel;
+ unsigned long fore_pixel, pixel;
if (!EQ (Vx_cursor_fore_pixel, Qnil))
fore_pixel = x_decode_color (f, Vx_cursor_fore_pixel,
WHITE_PIX_DEFAULT (f));
else
fore_pixel = f->output_data.x->background_pixel;
- f->output_data.x->cursor_pixel = x_decode_color (f, arg, BLACK_PIX_DEFAULT (f));
-
+ pixel = x_decode_color (f, arg, BLACK_PIX_DEFAULT (f));
+
/* Make sure that the cursor color differs from the background color. */
- if (f->output_data.x->cursor_pixel == f->output_data.x->background_pixel)
+ if (pixel == f->output_data.x->background_pixel)
{
- f->output_data.x->cursor_pixel = f->output_data.x->mouse_pixel;
- if (f->output_data.x->cursor_pixel == fore_pixel)
+ pixel = f->output_data.x->mouse_pixel;
+ if (pixel == fore_pixel)
fore_pixel = f->output_data.x->background_pixel;
}
+
+ if (f->output_data.x->background_pixel != f->output_data.x->cursor_foreground_pixel
+ && f->output_data.x->foreground_pixel != f->output_data.x->cursor_foreground_pixel
+ && f->output_data.x->mouse_pixel != f->output_data.x->cursor_foreground_pixel
+ && f->output_data.x->cursor_pixel != f->output_data.x->cursor_foreground_pixel)
+ unload_color (f, f->output_data.x->cursor_foreground_pixel);
f->output_data.x->cursor_foreground_pixel = fore_pixel;
+ if (f->output_data.x->background_pixel != f->output_data.x->cursor_pixel
+ && f->output_data.x->foreground_pixel != f->output_data.x->cursor_pixel
+ && f->output_data.x->mouse_pixel != f->output_data.x->cursor_pixel
+ && f->output_data.x->cursor_foreground_pixel != f->output_data.x->cursor_pixel)
+ unload_color (f, f->output_data.x->cursor_pixel);
+ f->output_data.x->cursor_pixel = pixel;
+
if (FRAME_X_WINDOW (f) != 0)
{
BLOCK_INPUT;
Note that this does not fully take effect if done before
F has an x-window. */
+void
x_set_border_pixel (f, pix)
struct frame *f;
int pix;
{
+ unload_color (f, f->output_data.x->border_pixel);
f->output_data.x->border_pixel = pix;
if (FRAME_X_WINDOW (f) != 0 && f->output_data.x->border_width > 0)
UNBLOCK_INPUT;
}
\f
-extern Lisp_Object x_new_font ();
-extern Lisp_Object x_new_fontset ();
-extern Lisp_Object Fquery_fontset ();
-
void
x_set_font (f, arg, oldval)
struct frame *f;
CHECK_STRING (arg, 1);
- fontset_name = Fquery_fontset (arg);
+ fontset_name = Fquery_fontset (arg, Qnil);
BLOCK_INPUT;
result = (STRINGP (fontset_name)
#ifdef USE_X_TOOLKIT
if (f->output_data.x->edit_widget)
- widget_store_internal_border (f->output_data.x->edit_widget,
- f->output_data.x->internal_border_width);
+ widget_store_internal_border (f->output_data.x->edit_widget);
#endif
if (f->output_data.x->internal_border_width == old)
text.value = XSTRING (name)->data;
text.encoding = XA_STRING;
text.format = 8;
- text.nitems = XSTRING (name)->size;
+ text.nitems = STRING_BYTES (XSTRING (name));
icon_name = (!NILP (f->icon_name) ? f->icon_name : name);
icon.value = XSTRING (icon_name)->data;
icon.encoding = XA_STRING;
icon.format = 8;
- icon.nitems = XSTRING (icon_name)->size;
+ icon.nitems = STRING_BYTES (XSTRING (icon_name));
#ifdef USE_X_TOOLKIT
XSetWMName (FRAME_X_DISPLAY (f),
XtWindow (f->output_data.x->widget), &text);
text.value = XSTRING (name)->data;
text.encoding = XA_STRING;
text.format = 8;
- text.nitems = XSTRING (name)->size;
+ text.nitems = STRING_BYTES (XSTRING (name));
icon_name = (!NILP (f->icon_name) ? f->icon_name : name);
icon.value = XSTRING (icon_name)->data;
icon.encoding = XA_STRING;
icon.format = 8;
- icon.nitems = XSTRING (icon_name)->size;
+ icon.nitems = STRING_BYTES (XSTRING (icon_name));
#ifdef USE_X_TOOLKIT
XSetWMName (FRAME_X_DISPLAY (f),
XtWindow (f->output_data.x->widget), &text);
unsigned char *p = XSTRING (Vx_resource_name)->data;
int i;
- len = XSTRING (Vx_resource_name)->size;
+ len = STRING_BYTES (XSTRING (Vx_resource_name));
/* Only letters, digits, - and _ are valid in resource names.
Count the valid characters and count the invalid ones. */
/* Allocate space for the components, the dots which separate them,
and the final '\0'. Make them big enough for the worst case. */
- name_key = (char *) alloca (XSTRING (Vx_resource_name)->size
+ name_key = (char *) alloca (STRING_BYTES (XSTRING (Vx_resource_name))
+ (STRINGP (component)
- ? XSTRING (component)->size : 0)
- + XSTRING (attribute)->size
+ ? STRING_BYTES (XSTRING (component)) : 0)
+ + STRING_BYTES (XSTRING (attribute))
+ 3);
- class_key = (char *) alloca (XSTRING (Vx_resource_class)->size
- + XSTRING (class)->size
+ class_key = (char *) alloca (STRING_BYTES (XSTRING (Vx_resource_class))
+ + STRING_BYTES (XSTRING (class))
+ (STRINGP (subclass)
- ? XSTRING (subclass)->size : 0)
+ ? STRING_BYTES (XSTRING (subclass)) : 0)
+ 3);
/* Start with emacs.FRAMENAME for the name (the specific one)
/* Allocate space for the components, the dots which separate them,
and the final '\0'. Make them big enough for the worst case. */
- name_key = (char *) alloca (XSTRING (Vx_resource_name)->size
+ name_key = (char *) alloca (STRING_BYTES (XSTRING (Vx_resource_name))
+ (STRINGP (component)
- ? XSTRING (component)->size : 0)
- + XSTRING (attribute)->size
+ ? STRING_BYTES (XSTRING (component)) : 0)
+ + STRING_BYTES (XSTRING (attribute))
+ 3);
- class_key = (char *) alloca (XSTRING (Vx_resource_class)->size
- + XSTRING (class)->size
+ class_key = (char *) alloca (STRING_BYTES (XSTRING (Vx_resource_class))
+ + STRING_BYTES (XSTRING (class))
+ (STRINGP (subclass)
- ? XSTRING (subclass)->size : 0)
+ ? STRING_BYTES (XSTRING (subclass)) : 0)
+ 3);
/* Start with emacs.FRAMENAME for the name (the specific one)
/* Allocate space for the components, the dots which separate them,
and the final '\0'. */
- name_key = (char *) alloca (XSTRING (Vinvocation_name)->size
+ name_key = (char *) alloca (STRING_BYTES (XSTRING (Vinvocation_name))
+ strlen (attribute) + 2);
class_key = (char *) alloca ((sizeof (EMACS_CLASS) - 1)
+ strlen (class) + 2);
}
/* Record in frame F the specified or default value according to ALIST
- of the parameter named PARAM (a Lisp symbol).
- If no value is specified for PARAM, look for an X default for XPROP
+ of the parameter named PROP (a Lisp symbol).
+ If no value is specified for PROP, look for an X default for XPROP
on the frame named NAME.
If that is not found either, use the value DEFLT. */
/* Create and set up the X window for frame F. */
+void
x_window (f)
struct frame *f;
f->output_data.x = (struct x_output *) xmalloc (sizeof (struct x_output));
bzero (f->output_data.x, sizeof (struct x_output));
f->output_data.x->icon_bitmap = -1;
+ f->output_data.x->fontset = -1;
f->icon_name
= x_get_arg (dpyinfo, parms, Qicon_name, "iconName", "Title", string);
/* First, try whatever font the caller has specified. */
if (STRINGP (font))
{
- tem = Fquery_fontset (font);
+ tem = Fquery_fontset (font, Qnil);
if (STRINGP (tem))
font = x_new_fontset (f, XSTRING (tem)->data);
else
#endif
x_default_parameter (f, parms, Qborder_width, make_number (2),
- "borderwidth", "BorderWidth", number);
+ "borderWidth", "BorderWidth", number);
/* This defaults to 2 in order to match xterm. We recognize either
internalBorderWidth or internalBorder (which is what xterm calls
it). */
}
int
-x_screen_planes (frame)
- Lisp_Object frame;
+x_screen_planes (f)
+ register struct frame *f;
{
- return FRAME_X_DISPLAY_INFO (XFRAME (frame))->n_planes;
+ return FRAME_X_DISPLAY_INFO (f)->n_planes;
}
\f
#if 0 /* These no longer seem like the right way to do things. */
if (NILP (modifiers))
XRebindKeysym (x_current_display, keysym, modifier_list, 0,
- XSTRING (newstring)->data, XSTRING (newstring)->size);
+ XSTRING (newstring)->data,
+ STRING_BYTES (XSTRING (newstring)));
else
{
register Lisp_Object rest, mod;
}
XRebindKeysym (x_current_display, keysym, modifier_list, i,
- XSTRING (newstring)->data, XSTRING (newstring)->size);
+ XSTRING (newstring)->data,
+ STRING_BYTES (XSTRING (newstring)));
}
return Qnil;
if (!NILP (item))
{
CHECK_STRING (item, 2);
- strsize = XSTRING (item)->size;
+ strsize = STRING_BYTES (XSTRING (item));
rawstring = (unsigned char *) xmalloc (strsize);
bcopy (XSTRING (item)->data, rawstring, strsize);
modifier[1] = 1 << i;
UNBLOCK_INPUT;
}
\f
+void
syms_of_xfns ()
{
/* This is zero if not using X windows. */
staticpro (&Qvisibility);
Qwindow_id = intern ("window-id");
staticpro (&Qwindow_id);
+ Qouter_window_id = intern ("outer-window-id");
+ staticpro (&Qouter_window_id);
Qx_frame_parameter = intern ("x-frame-parameter");
staticpro (&Qx_frame_parameter);
Qx_resource_name = intern ("x-resource-name");
Chinese, Japanese, and Korean.");
Vx_pixel_size_width_font_regexp = Qnil;
+ DEFVAR_BOOL ("unibyte-display-via-language-environment",
+ &unibyte_display_via_language_environment,
+ "*Non-nil means display unibyte text according to language environment.\n\
+Specifically this means that unibyte non-ASCII characters\n\
+are displayed by converting them to the equivalent multibyte characters\n\
+according to the current language environment. As a result, they are\n\
+displayed according to the current fontset.");
+ unibyte_display_via_language_environment = 0;
+
#ifdef USE_X_TOOLKIT
Fprovide (intern ("x-toolkit"));
#endif
get_font_info_func = x_get_font_info;
list_fonts_func = x_list_fonts;
load_font_func = x_load_font;
+ find_ccl_program_func = x_find_ccl_program;
query_font_func = x_query_font;
set_frame_fontset_func = x_set_font;
check_window_system_func = check_x;