validify_resource_component (Dynarr_atp (cda, Dynarr_length (cda) - len), len);
}
+#if 0
+/* compare visual info for qsorting */
+static int
+x_comp_visual_info (const void *elem1, const void *elem2)
+{
+ XVisualInfo *left, *right;
+
+ left = (XVisualInfo *)elem1;
+ right = (XVisualInfo *)elem2;
+
+ if ( left == NULL )
+ return -1;
+ if ( right == NULL )
+ return 1;
+
+ if ( left->depth > right->depth ) {
+ return 1;
+ }
+ else if ( left->depth == right->depth ) {
+ if ( left->colormap_size > right->colormap_size )
+ return 1;
+ if ( left->class > right->class )
+ return 1;
+ else if ( left->class < right->class )
+ return -1;
+ else
+ return 0;
+ }
+ else {
+ return -1;
+ }
+
+}
+#endif /* if 0 */
+
+#define XXX_IMAGE_LIBRARY_IS_SOMEWHAT_BROKEN
+static Visual *
+x_try_best_visual_class (Screen *screen, int scrnum, int visual_class)
+{
+ Display *dpy = DisplayOfScreen (screen);
+ XVisualInfo vi_in;
+ XVisualInfo *vi_out = NULL;
+ int out_count;
+
+ vi_in.class = visual_class;
+ vi_in.screen = scrnum;
+ vi_out = XGetVisualInfo (dpy, (VisualClassMask | VisualScreenMask),
+ &vi_in, &out_count);
+ if ( vi_out )
+ {
+ int i, best;
+ Visual *visual;
+ for (i = 0, best = 0; i < out_count; i++)
+ /* It's better if it's deeper, or if it's the same depth with
+ more cells (does that ever happen? Well, it could...)
+ NOTE: don't allow pseudo color to get larger than 8! */
+ if (((vi_out [i].depth > vi_out [best].depth) ||
+ ((vi_out [i].depth == vi_out [best].depth) &&
+ (vi_out [i].colormap_size > vi_out [best].colormap_size)))
+#ifdef XXX_IMAGE_LIBRARY_IS_SOMEWHAT_BROKEN
+ /* For now, the image library doesn't like PseudoColor visuals
+ of depths other than 1 or 8. Depths greater than 8 only occur
+ on machines which have TrueColor anyway, so probably we'll end
+ up using that (it is the one that `Best' would pick) but if a
+ PseudoColor visual is explicitly specified, pick the 8 bit one.
+ */
+ && (visual_class != PseudoColor ||
+ vi_out [i].depth == 1 ||
+ vi_out [i].depth == 8)
+#endif
+
+ /* SGI has 30-bit deep visuals. Ignore them.
+ (We only have 24-bit data anyway.)
+ */
+ && (vi_out [i].depth <= 24)
+ )
+ best = i;
+ visual = vi_out[best].visual;
+ XFree ((char *) vi_out);
+ return visual;
+ }
+ else
+ return 0;
+}
+
+static int
+x_get_visual_depth (Display *dpy, Visual *visual)
+{
+ XVisualInfo vi_in;
+ XVisualInfo *vi_out;
+ int out_count, d;
+
+ vi_in.visualid = XVisualIDFromVisual (visual);
+ vi_out = XGetVisualInfo (dpy, /*VisualScreenMask|*/VisualIDMask,
+ &vi_in, &out_count);
+ if (! vi_out) abort ();
+ d = vi_out [0].depth;
+ XFree ((char *) vi_out);
+ return d;
+}
+
+static Visual *
+x_try_best_visual (Display *dpy, int scrnum)
+{
+ Visual *visual = NULL;
+ Screen *screen = ScreenOfDisplay (dpy, scrnum);
+ if ((visual = x_try_best_visual_class (screen, scrnum, TrueColor))
+ && x_get_visual_depth (dpy, visual) >= 16 )
+ return visual;
+ if ((visual = x_try_best_visual_class (screen, scrnum, PseudoColor)))
+ return visual;
+ if ((visual = x_try_best_visual_class (screen, scrnum, TrueColor)))
+ return visual;
+#ifdef DIRECTCOLOR_WORKS
+ if ((visual = x_try_best_visual_class (screen, scrnum, DirectColor)))
+ return visual;
+#endif
+
+ visual = DefaultVisualOfScreen (screen);
+ if ( x_get_visual_depth (dpy, visual) >= 8 )
+ return visual;
+
+ if ((visual = x_try_best_visual_class (screen, scrnum, StaticGray)))
+ return visual;
+ if ((visual = x_try_best_visual_class (screen, scrnum, GrayScale)))
+ return visual;
+ return DefaultVisualOfScreen (screen);
+}
+
+
static void
x_init_device (struct device *d, Lisp_Object props)
{
int depth = 8; /* shut up the compiler */
Colormap cmap;
int screen;
+ /* */
+ int best_visual_found = 0;
XSETDEVICE (device, d);
display = DEVICE_CONNECTION (d);
* Break apart the old XtOpenDisplay call into XOpenDisplay and
* XtDisplayInitialize so we can figure out whether there
* are any XEmacs resources in the resource database before
- * we intitialize Xt. This is so we can automagically support
+ * we initialize Xt. This is so we can automagically support
* both `Emacs' and `XEmacs' application classes.
*/
slow_down_interrupts ();
XtGetApplicationNameAndClass (dpy, (char **) &app_name, (char **) &app_class);
/* search for a matching visual if requested by the user, or setup the display default */
{
- char *buf1 = (char *)alloca (strlen (app_name) + 17);
- char *buf2 = (char *)alloca (strlen (app_class) + 17);
+ int resource_name_length = max (sizeof (".emacsVisual"),
+ sizeof (".privateColormap"));
+ char *buf1 = alloca_array (char, strlen (app_name) + resource_name_length);
+ char *buf2 = alloca_array (char, strlen (app_class) + resource_name_length);
char *type;
XrmValue value;
sprintf (buf2, "%s.EmacsVisual", app_class);
if (XrmGetResource (XtDatabase (dpy), buf1, buf2, &type, &value) == True)
{
- int cnt = 0, vis_class = PseudoColor;
+ int cnt = 0;
+ int vis_class = PseudoColor;
XVisualInfo vinfo;
- char *res, *str = (char*)value.addr;
+ char *str = (char*) value.addr;
-#define CHECK_VIS_CLASS(class) \
- else if (strncmp (str, #class, sizeof (#class) - 1) == 0) \
- cnt = sizeof (#class) - 1, vis_class = class
+#define CHECK_VIS_CLASS(visual_class) \
+ else if (memcmp (str, #visual_class, sizeof (#visual_class) - 1) == 0) \
+ cnt = sizeof (#visual_class) - 1, vis_class = visual_class
if (1)
;
if (cnt)
{
- res = str + cnt;
- depth = atoi (res);
+ depth = atoi (str + cnt);
if (depth == 0)
{
stderr_out ("Invalid Depth specification in %s... ignoring...\n", str);
}
if (visual == NULL)
{
- visual = DefaultVisual (dpy, screen);
- depth = DefaultDepth (dpy, screen);
+ /*
+ visual = DefaultVisual(dpy, screen);
+ depth = DefaultDepth(dpy, screen);
+ */
+ visual = x_try_best_visual (dpy, screen);
+ depth = x_get_visual_depth (dpy, visual);
+ best_visual_found = (visual != DefaultVisual (dpy, screen));
}
/* If we've got the same visual as the default and it's PseudoColor,
}
else
{
- /* We have to create a matching colormap anyway...
- ### think about using standard colormaps (need the Xmu libs?) */
- cmap = XCreateColormap (dpy, RootWindow(dpy, screen), visual, AllocNone);
- XInstallColormap (dpy, cmap);
+ if ( best_visual_found )
+ {
+ cmap = XCreateColormap (dpy, RootWindow (dpy, screen), visual, AllocNone);
+ }
+ else
+ {
+ /* We have to create a matching colormap anyway...
+ ### think about using standard colormaps (need the Xmu libs?) */
+ cmap = XCreateColormap(dpy, RootWindow(dpy, screen), visual, AllocNone);
+ XInstallColormap(dpy, cmap);
+ }
}
}
XtRealizeWidget (app_shell);
}
-#ifdef HAVE_SESSION
+#ifdef HAVE_WMCOMMAND
{
int new_argc;
char **new_argv;
XSetCommand (XtDisplay (app_shell), XtWindow (app_shell), new_argv, new_argc);
free_argc_argv (new_argv);
}
-#endif /* HAVE_SESSION */
+#endif /* HAVE_WMCOMMAND */
#ifdef HAVE_OFFIX_DND
}
static void
-x_mark_device (struct device *d, void (*markobj) (Lisp_Object))
+x_mark_device (struct device *d)
{
- markobj (DEVICE_X_WM_COMMAND_FRAME (d));
- markobj (DEVICE_X_DATA (d)->x_keysym_map_hash_table);
+ mark_object (DEVICE_X_WM_COMMAND_FRAME (d));
+ mark_object (DEVICE_X_DATA (d)->x_keysym_map_hash_table);
}
\f
Lisp_Object device;
Display *display;
#ifdef FREE_CHECKING
- extern void (*__free_hook)();
+ extern void (*__free_hook) (void *);
int checking_free;
#endif
found. If the third arg is `string', a string is returned, and if it is
`integer', an integer is returned. If the third arg is `boolean', then the
returned value is the list (t) for true, (nil) for false, and is nil to
-mean ``unspecified.''
+mean ``unspecified''.
*/
(name, class, type, locale, device, no_error))
{
So long as the keyboard is grabbed, all keyboard events will be delivered
to emacs -- it is not possible for other X clients to eavesdrop on them.
Ungrab the keyboard with `x-ungrab-keyboard' (use an unwind-protect).
-Returns t if the grab was successful; nil otherwise.
+Returns t if the grab is successful, nil otherwise.
*/
(device))
{
return Qnil;
}
+DEFUN ("x-get-font-path", Fx_get_font_path, 0, 1, 0, /*
+Get the X Server's font path.
+
+See also `x-set-font-path'.
+*/
+ (device))
+{
+ Display *dpy = get_x_display (device);
+ int ndirs_return;
+ CONST char **directories = (CONST char **) XGetFontPath (dpy, &ndirs_return);
+ Lisp_Object font_path = Qnil;
+
+ if (!directories)
+ signal_simple_error ("Can't get X font path", device);
+
+ while (ndirs_return--)
+ font_path = Fcons (build_ext_string (directories[ndirs_return],
+ FORMAT_FILENAME), font_path);
+
+ return font_path;
+}
+
+DEFUN ("x-set-font-path", Fx_set_font_path, 1, 2, 0, /*
+Set the X Server's font path to FONT-PATH.
+
+There is only one font path per server, not one per client. Use this
+sparingly. It uncaches all of the X server's font information.
+
+Font directories should end in the path separator and should contain
+a file called fonts.dir usually created with the program mkfontdir.
+
+Setting the FONT-PATH to nil tells the X server to use the default
+font path.
+
+See also `x-get-font-path'.
+*/
+ (font_path, device))
+{
+ Display *dpy = get_x_display (device);
+ Lisp_Object path_entry;
+ CONST char **directories;
+ int i=0,ndirs=0;
+
+ EXTERNAL_LIST_LOOP (path_entry, font_path)
+ {
+ CHECK_STRING (XCAR (path_entry));
+ ndirs++;
+ }
+
+ directories = alloca_array (CONST char *, ndirs);
+
+ EXTERNAL_LIST_LOOP (path_entry, font_path)
+ {
+ GET_C_STRING_FILENAME_DATA_ALLOCA (XCAR (path_entry), directories[i++]);
+ }
+
+ expect_x_error (dpy);
+ XSetFontPath (dpy, (char **) directories, ndirs);
+ signal_if_x_error (dpy, 1/*resumable_p*/);
+
+ return Qnil;
+}
+
\f
/************************************************************************/
/* initialization */
DEFSUBR (Fx_grab_keyboard);
DEFSUBR (Fx_ungrab_keyboard);
+ DEFSUBR (Fx_get_font_path);
+ DEFSUBR (Fx_set_font_path);
+
defsymbol (&Qx_error, "x-error");
defsymbol (&Qinit_pre_x_win, "init-pre-x-win");
defsymbol (&Qinit_post_x_win, "init-post-x-win");
}
void
+reinit_console_type_create_device_x (void)
+{
+ /* Initialize variables to speed up X resource interactions */
+ CONST char *valid_resource_chars =
+ "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_";
+ while (*valid_resource_chars)
+ valid_resource_char_p[(unsigned int) (*valid_resource_chars++)] = 1;
+
+ name_char_dynarr = Dynarr_new (char);
+ class_char_dynarr = Dynarr_new (char);
+}
+
+void
console_type_create_device_x (void)
{
+ reinit_console_type_create_device_x ();
CONSOLE_HAS_METHOD (x, init_device);
CONSOLE_HAS_METHOD (x, finish_init_device);
CONSOLE_HAS_METHOD (x, mark_device);
CONSOLE_HAS_METHOD (x, delete_device);
CONSOLE_HAS_METHOD (x, device_system_metrics);
+}
- {
- /* Initialize variables to speed up X resource interactions */
- CONST char *valid_resource_chars =
- "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_";
- while (*valid_resource_chars)
- valid_resource_char_p[(unsigned int) (*valid_resource_chars++)] = 1;
-
- name_char_dynarr = Dynarr_new (char);
- class_char_dynarr = Dynarr_new (char);
- }
+void
+reinit_vars_of_device_x (void)
+{
+ error_expected = 0;
+ error_occurred = 0;
+
+ in_resource_setting = 0;
}
void
vars_of_device_x (void)
{
+ reinit_vars_of_device_x ();
+
DEFVAR_LISP ("x-emacs-application-class", &Vx_emacs_application_class /*
The X application class of the XEmacs process.
This controls, among other things, the name of the `app-defaults' file
staticpro (&Vdefault_x_device);
Vdefault_x_device = Qnil;
-
- error_expected = 0;
- error_occurred = 0;
-
- in_resource_setting = 0;
}