- if (widget)
- {
- display = XtDisplay (widget);
- screen_num = XScreenNumberOfScreen (XtScreen (widget));
- depth = DefaultDepth (display, screen_num);
- }
- else if (drawable)
- {
- Window root_window;
- int x, y;
- unsigned width, height, border_width;
-
- if (! display)
- MERROR (MERROR_WIN, NULL);
- XGetGeometry (display, drawable, &root_window,
- &x, &y, &width, &height, &border_width, &depth);
- XGetWindowAttributes (display, root_window, &attr);
- screen_num = XScreenNumberOfScreen (attr.screen);
- }
- else
- {
- if (screen)
- display = DisplayOfScreen (screen);
- else
- {
- if (! display)
- {
- display = XOpenDisplay (NULL);
- if (! display)
- MERROR (MERROR_WIN, NULL);
- auto_display = 1;
- }
- screen = DefaultScreenOfDisplay (display);
- }
- screen_num = XScreenNumberOfScreen (screen);
- if (! depth)
- depth = DefaultDepth (display, screen_num);
- }
-
- if (! cmap)
- cmap = DefaultColormap (display, screen_num);
-
- for (plist = display_info_list; mplist_key (plist) != Mnil;
- plist = mplist_next (plist))
- {
- disp_info = (MDisplayInfo *) mplist_value (plist);
- if (disp_info->display == display)
- break;
- }
-
- if (mplist_key (plist) != Mnil)
- M17N_OBJECT_REF (disp_info);
- else
- {
- M17N_OBJECT (disp_info, free_display_info, MERROR_WIN);
- disp_info->display = display;
- disp_info->auto_display = auto_display;
- disp_info->font_registry_list = mplist ();
- disp_info->iso8859_1_family_list = mplist ();
- disp_info->iso10646_1_family_list = mplist ();
- disp_info->realized_font_list = mplist ();
- find_modifier_bits (disp_info);
- mplist_add (display_info_list, Mt, disp_info);
- }
-
- for (plist = device_list; mplist_key (plist) != Mnil;
- plist = mplist_next (plist))
- {
- device = (MWDevice *) mplist_value (plist);
- if (device->display_info == disp_info
- && device->depth == depth
- && device->cmap == cmap)
- break;
- }
-
- if (mplist_key (plist) != Mnil)
- M17N_OBJECT_REF (device);
- else
- {
- unsigned long valuemask = GCForeground;
- XGCValues values;
-
- M17N_OBJECT (device, free_device, MERROR_WIN);
- device->display_info = disp_info;
- device->screen_num = screen_num;
- /* A drawable on which to create GCs. */
- device->drawable = XCreatePixmap (display,
- RootWindow (display, screen_num),
- 1, 1, depth);
- device->depth = depth;
- device->cmap = cmap;
- device->realized_face_list = mplist ();
- device->realized_fontset_list = mplist ();
- device->gc_list = mplist ();
- values.foreground = BlackPixel (display, screen_num);
- device->scratch_gc = XCreateGC (display, device->drawable,
- valuemask, &values);
-#ifdef HAVE_XFT2
- device->xft_draw = XftDrawCreate (display, device->drawable,
- DefaultVisual (display, screen_num),
- cmap);
-#endif
- }
-
- frame->realized_font_list = disp_info->realized_font_list;
- frame->realized_face_list = device->realized_face_list;
- frame->realized_fontset_list = device->realized_fontset_list;
-
- if (widget)
- {
- XtResource resources[] = {
- { XtNfont, XtCFont, XtRString, sizeof (String),
- XtOffset (AppDataPtr, font), XtRString, DEFAULT_FONT },
- { XtNforeground, XtCForeground, XtRString, sizeof (String),
- XtOffset (AppDataPtr, foreground), XtRString, "black" },
- { XtNbackground, XtCBackground, XtRString, sizeof (String),
- XtOffset (AppDataPtr, background), XtRString, "white" },
- { XtNreverseVideo, XtCReverseVideo, XtRBoolean, sizeof (Boolean),
- XtOffset (AppDataPtr, reverse_video), XtRImmediate, (caddr_t) FALSE }
- };
-
- XtGetApplicationResources (widget, &app_data,
- resources, XtNumber (resources), NULL, 0);
- frame->foreground = msymbol (app_data.foreground);
- frame->background = msymbol (app_data.background);
- frame->videomode = app_data.reverse_video == True ? Mreverse : Mnormal;
- }
- else
- {
- app_data.font = DEFAULT_FONT;
- frame->foreground = msymbol ("black");
- frame->background = msymbol ("white");
- frame->videomode = Mnormal;
- }
-
- frame->font = mfont ();
- {
- int nfonts;
- char **names = XListFonts (display, app_data.font, 1, &nfonts);
-
- if (nfonts > 0)
- {
- if (mwin__parse_font_name (names[0], frame->font) < 0)
- {
- /* The font name does not conform to XLFD. Try to open the
- font and get XA_FONT property. */
- XFontStruct *xfont = XLoadQueryFont (display, names[0]);
-
- nfonts = 0;
- if (xfont)
- {
- unsigned long value;
- char *name;
-
- if (XGetFontProperty (xfont, XA_FONT, &value)
- && (name = ((char *)
- XGetAtomName (display, (Atom) value))))
- {
- if (mwin__parse_font_name (name, frame->font) >= 0)
- nfonts = 1;
- }
- XFreeFont (display, xfont);
- }
- }
- XFreeFontNames (names);
- }
- if (! nfonts)
- mwin__parse_font_name (FALLBACK_FONT, frame->font);
- }
-
- face = mface_from_font (frame->font);
- face->property[MFACE_FONTSET] = mfontset (NULL);
- face->property[MFACE_FOREGROUND] = frame->foreground;
- face->property[MFACE_BACKGROUND] = frame->background;
- mface_put_prop (face, Mhline, mface_get_prop (mface__default, Mhline));
- mface_put_prop (face, Mbox, mface_get_prop (mface__default, Mbox));
- face->property[MFACE_VIDEOMODE] = frame->videomode;
- mface_put_prop (face, Mhook_func,
- mface_get_prop (mface__default, Mhook_func));
- face->property[MFACE_RATIO] = (void *) 100;
- mplist_push (param, Mface, face);
- M17N_OBJECT_UNREF (face);
-
-#ifdef X_SET_ERROR_HANDLER
- XSetErrorHandler (x_error_handler);
- XSetIOErrorHandler (x_io_error_handler);
-#endif
-
- return device;
-}
-
-void
-mwin__close_device (MFrame *frame)