/* The emacs frame widget.
Copyright (C) 1992, 1993, 2000, 2001, 2002, 2003, 2004,
- 2005, 2006, 2007 Free Software Foundation, Inc.
+ 2005, 2006, 2007, 2008, 2009, 2010 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
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 <http://www.gnu.org/licenses/>. */
/* Emacs 19 face widget ported by Fred Pierresteguy */
#include <config.h>
#include <stdio.h>
+#include <setjmp.h>
#include "lisp.h"
#include "xterm.h"
#include <signal.h>
#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
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"},
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
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;
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
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); */
}
Dimension pixel_width;
Dimension pixel_height;
+ /* AFAIK, this function is never called. -- Jan D, Oct 2009. */
has_to_recompute_gcs = (cur->emacs_frame.font != new->emacs_frame.font
|| (cur->emacs_frame.foreground_pixel
!= new->emacs_frame.foreground_pixel)
int rows;
{
EmacsFrame ew = (EmacsFrame) widget;
- Dimension pixel_width, pixel_height;
struct frame *f = ew->emacs_frame.frame;
- if (columns < 3) columns = 3; /* no way buddy */
-
- check_frame_size (f, &rows, &columns);
- f->scroll_bar_actual_width
- = FRAME_SCROLL_BAR_COLS (f) * FRAME_COLUMN_WIDTH (f);
-
- compute_fringe_widths (f, 0);
-
- char_to_pixel_size (ew, columns, rows, &pixel_width, &pixel_height);
-
-#if 0 /* This doesn't seem to be right. The frame gets too wide. --gerd. */
- /* Something is really strange here wrt to the border width:
- Apparently, XtNwidth and XtNheight include the border, so we have
- to add it here. But the XtNborderWidth set for the widgets has
- no similarity to what f->border_width is set to. */
- XtVaGetValues (widget, XtNborderWidth, &border_width, NULL);
- pixel_height += 2 * border_width;
- pixel_width += 2 * border_width;
-#endif
-
- /* Manually change the height and width of all our widgets,
- adjusting each widget by the same increments. */
- if (ew->core.width != pixel_width
- || ew->core.height != pixel_height)
- {
- int hdelta = pixel_height - ew->core.height;
- int wdelta = pixel_width - ew->core.width;
- int column_widget_height = f->output_data.x->column_widget->core.height;
- int column_widget_width = f->output_data.x->column_widget->core.width;
- int outer_widget_height = f->output_data.x->widget->core.height;
- int outer_widget_width = f->output_data.x->widget->core.width;
- int old_left = f->output_data.x->widget->core.x;
- int old_top = f->output_data.x->widget->core.y;
-
- /* Input is blocked here, and Xt waits for some event to
- occur. */
-
- lw_refigure_widget (f->output_data.x->column_widget, False);
- update_hints_inhibit = 1;
-
- /* Xt waits for a ConfigureNotify event from the window manager
- in EmacsFrameSetCharSize when the shell widget is resized.
- For some window managers like fvwm2 2.2.5 and KDE 2.1 this
- event doesn't arrive for an unknown reason and Emacs hangs in
- Xt when the default font is changed. Tell Xt not to wait,
- depending on the value of the frame parameter
- `wait-for-wm'. */
- x_catch_errors (FRAME_X_DISPLAY (f));
- XtVaSetValues (f->output_data.x->widget,
- XtNwaitForWm, (XtArgVal) f->output_data.x->wait_for_wm,
- NULL);
- x_uncatch_errors ();
-
- /* Workaround: When a SIGIO or SIGALRM occurs while Xt is
- waiting for a ConfigureNotify event (see above), this leads
- to Xt waiting indefinitely instead of using its default
- timeout (5 seconds). */
- turn_on_atimers (0);
-#ifdef SIGIO
- sigblock (sigmask (SIGIO));
-#endif
-
- /* Do parents first, otherwise LessTif's geometry management
- enters an infinite loop (as of 2000-01-15). This is fixed in
- later versions of LessTif (as of 2001-03-13); I'll leave it
- as is because I think it can't do any harm. */
- /* In April 2002, simon.marshall@misys.com reports the problem
- seems not to occur any longer. */
- x_catch_errors (FRAME_X_DISPLAY (f));
- XtVaSetValues (f->output_data.x->widget,
- XtNheight, (XtArgVal) (outer_widget_height + hdelta),
- XtNwidth, (XtArgVal) (outer_widget_width + wdelta),
- NULL);
- XtVaSetValues (f->output_data.x->column_widget,
- XtNheight, (XtArgVal) (column_widget_height + hdelta),
- XtNwidth, (XtArgVal) column_widget_width + wdelta,
- NULL);
- XtVaSetValues ((Widget) ew,
- XtNheight, (XtArgVal) pixel_height,
- XtNwidth, (XtArgVal) pixel_width,
- NULL);
- x_uncatch_errors ();
-
-#ifdef SIGIO
- sigunblock (sigmask (SIGIO));
-#endif
- turn_on_atimers (1);
-
- lw_refigure_widget (f->output_data.x->column_widget, True);
-
- update_hints_inhibit = 0;
- update_wm_hints (ew);
-
- /* These seem to get clobbered. I don't know why. - rms. */
- f->output_data.x->widget->core.x = old_left;
- f->output_data.x->widget->core.y = old_top;
- }
-
- /* We've set {FRAME,PIXEL}_{WIDTH,HEIGHT} to the values we hope to
- receive in the ConfigureNotify event; if we get what we asked
- for, then the event won't cause the screen to become garbaged, so
- we have to make sure to do it here. */
- SET_FRAME_GARBAGED (f);
+ x_set_window_size (f, 0, columns, rows);
}
\f