X-Git-Url: https://git.hcoop.net/bpt/emacs.git/blobdiff_plain/5bc6ddff00c50acf546530ef0e08a27140614d27..8d106ea001f5a258da2a36a70587cc8fc9695b1c:/src/widget.c diff --git a/src/widget.c b/src/widget.c index 665964034e..32b3649be5 100644 --- a/src/widget.c +++ b/src/widget.c @@ -1,13 +1,13 @@ /* The emacs frame widget. Copyright (C) 1992, 1993, 2000, 2001, 2002, 2003, 2004, - 2005, 2006, 2007, 2008 Free Software Foundation, Inc. + 2005, 2006, 2007, 2008, 2009 Free Software Foundation, Inc. This file is part of GNU Emacs. -GNU Emacs is free software; you can redistribute it and/or modify +GNU Emacs is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by -the Free Software Foundation; either version 3, or (at your option) -any later version. +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. GNU Emacs is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of @@ -15,9 +15,7 @@ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License -along with GNU Emacs; see the file COPYING. If not, write to -the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, -Boston, MA 02110-1301, USA. */ +along with GNU Emacs. If not, see . */ /* Emacs 19 face widget ported by Fred Pierresteguy */ @@ -33,6 +31,7 @@ Boston, MA 02110-1301, USA. */ #include #include +#include #include "lisp.h" #include "xterm.h" @@ -55,6 +54,9 @@ Boston, MA 02110-1301, USA. */ #include #include "syssignal.h" +#include "character.h" +#include "font.h" + /* This sucks: this is the first default that x-faces.el tries. This won't be used unless neither the "Emacs.EmacsFrame" resource nor the "Emacs.EmacsFrame" resource is set; the frame @@ -106,7 +108,7 @@ static XtResource resources[] = { offset (internal_border_width), XtRImmediate, (XtPointer)4}, {XtNinterline, XtCInterline, XtRInt, sizeof (int), offset (interline), XtRImmediate, (XtPointer)0}, - {XtNfont, XtCFont, XtRFontStruct, sizeof(XFontStruct *), + {XtNfont, XtCFont, XtRFontStruct, sizeof(struct font *), offset(font),XtRString, DEFAULT_FACE_FONT}, {XtNforeground, XtCForeground, XtRPixel, sizeof(Pixel), offset(foreground_pixel), XtRString, "XtDefaultForeground"}, @@ -574,6 +576,22 @@ setup_frame_gcs (ew) XGCValues gc_values; struct frame* s = ew->emacs_frame.frame; Pixmap blank_stipple, blank_tile; + unsigned long valuemask = (GCForeground | GCBackground | GCGraphicsExposures + | GCStipple | GCTile); + Lisp_Object font; + + XSETFONT (font, ew->emacs_frame.font); + font = Ffont_xlfd_name (font, Qnil); + if (STRINGP (font)) + { + XFontStruct *xfont = XLoadQueryFont (FRAME_X_DISPLAY_INFO (s)->display, + SDATA (font)); + if (xfont) + { + gc_values.font = xfont->fid; + valuemask |= GCFont; + } + } /* We have to initialize all of our GCs to have a stipple/tile, otherwise XGetGCValues returns uninitialized data when we query the stipple @@ -600,31 +618,24 @@ setup_frame_gcs (ew) ew->core.depth); /* Normal video */ - gc_values.font = ew->emacs_frame.font->fid; gc_values.foreground = ew->emacs_frame.foreground_pixel; gc_values.background = ew->core.background_pixel; gc_values.graphics_exposures = False; gc_values.stipple = blank_stipple; gc_values.tile = blank_tile; XChangeGC (XtDisplay (ew), s->output_data.x->normal_gc, - (GCFont | GCForeground | GCBackground | GCGraphicsExposures - | GCStipple | GCTile), - &gc_values); + valuemask, &gc_values); /* Reverse video style. */ - gc_values.font = ew->emacs_frame.font->fid; gc_values.foreground = ew->core.background_pixel; gc_values.background = ew->emacs_frame.foreground_pixel; gc_values.graphics_exposures = False; gc_values.stipple = blank_stipple; gc_values.tile = blank_tile; XChangeGC (XtDisplay (ew), s->output_data.x->reverse_gc, - (GCFont | GCForeground | GCBackground | GCGraphicsExposures - | GCStipple | GCTile), - &gc_values); + valuemask, &gc_values); /* Cursor has to have an empty stipple. */ - gc_values.font = ew->emacs_frame.font->fid; gc_values.foreground = ew->core.background_pixel; gc_values.background = ew->emacs_frame.cursor_color; gc_values.graphics_exposures = False; @@ -634,9 +645,7 @@ setup_frame_gcs (ew) RootWindowOfScreen (XtScreen (ew)), setup_frame_cursor_bits, 16, 16); XChangeGC (XtDisplay (ew), s->output_data.x->cursor_gc, - (GCFont | GCForeground | GCBackground | GCGraphicsExposures - | GCStipple | GCTile), - &gc_values); + valuemask, &gc_values); } static void @@ -683,48 +692,8 @@ EmacsFrameInitialize (request, new, dum1, dum2) exit (1); } -#if 0 /* done in xfns.c */ - /* If the "Emacs.EmacsFrame.{default,Face}.{attributeFont,AttributeFont}" - resource is set, then it always overrides "Emacs.EmacsFrame.{font,Font}". - It's unfortunate that we have to do this, but we need to know the font - size for frame-sizing purposes before the faces get initialized. If - the "default.attributeFont" isn't set, then we use the font of this - EmacsFrame itself, defaulting to XtDefaultFont. Up in the lisp code, - the "default" face will use the frame's font if its own is not set, - so everything stays in sync -- it's not possible for the frame's font - and the default face's font to be different. - */ - { - XFontStruct *f = 0; - XtResource face_res; - face_res.resource_name = "attributeFont"; - face_res.resource_class = "AttributeFont"; - face_res.resource_type = XtRFontStruct; - face_res.resource_size = sizeof (XFontStruct *); - face_res.resource_offset = 0; - face_res.default_type = XtRImmediate; - face_res.default_addr = 0; - XtGetSubresources ((Widget) ew, (XtPointer) &f, "default", "Face", - &face_res, 1, NULL, 0); - - if (f) - ew->emacs_frame.font = f; - else if (! ew->emacs_frame.font) - { - fprintf (stderr, "emacs frame widget could not load a font\n"); - exit (1); - } - } - -/* Update the font field in frame */ - FRAME_FONT (ew->emacs_frame.frame) = ew->emacs_frame.font; -#endif - update_from_various_frame_slots (ew); set_frame_size (ew); -/*create_frame_gcs (ew); - setup_frame_gcs (ew); - update_various_frame_slots (ew); */ }