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, 675 Mass Ave, Cambridge, MA 02139, USA. */
+the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+Boston, MA 02111-1307, USA. */
/* Emacs 19 face widget ported by Fred Pierresteguy */
+/* This file has been censored by the Communications Decency Act.
+ That law was passed under the guise of a ban on pornography, but
+ it bans far more than that. This file did not contain pornography,
+ but it was censored nonetheless.
+
+ For information on US government censorship of the Internet, and
+ what you can do to bring back freedom of the press, see the web
+ site http://www.vtw.org/
+ */
+
+#include <config.h>
#include <stdio.h>
-#include "config.h"
#include "lisp.h"
#include "xterm.h"
#include "frame.h"
#include "dispextern.h"
-
+#include "blockinput.h"
#include <X11/StringDefs.h>
#include <X11/IntrinsicP.h>
#include <X11/ObjectP.h>
#include <X11/Shell.h>
#include <X11/ShellP.h>
+#include "../lwlib/lwlib.h"
#define max(a, b) ((a) > (b) ? (a) : (b))
int* pixel_width;
int* pixel_height;
{
-/*
- *pixel_width = XTextWidth (ew->emacs_frame.font, "n", 1);
- *pixel_height =
- ew->emacs_frame.font->ascent + ew->emacs_frame.font->descent;
-*/
struct frame* f = ew->emacs_frame.frame;
- *pixel_width = FONT_WIDTH (f->display.x->font);
- *pixel_height = FONT_HEIGHT (f->display.x->font);
+ *pixel_width = FONT_WIDTH (f->output_data.x->font);
+ *pixel_height = f->output_data.x->line_height;
}
static void
int* char_height;
{
struct frame* f = ew->emacs_frame.frame;
- *char_width = PIXEL_TO_CHAR_WIDTH (f, pixel_width);
- *char_height = PIXEL_TO_CHAR_HEIGHT (f, pixel_height);
+ *char_width = PIXEL_TO_CHAR_WIDTH (f, (int) pixel_width);
+ *char_height = PIXEL_TO_CHAR_HEIGHT (f, (int) pixel_height);
}
static void
-char_to_pixel_size (EmacsFrame ew, int char_width, int char_height,
- Dimension* pixel_width, Dimension* pixel_height)
+char_to_pixel_size (ew, char_width, char_height, pixel_width, pixel_height)
+ EmacsFrame ew;
+ int char_width;
+ int char_height;
+ Dimension* pixel_width;
+ Dimension* pixel_height;
{
struct frame* f = ew->emacs_frame.frame;
*pixel_width = CHAR_TO_PIXEL_WIDTH (f, char_width);
}
static void
-round_size_to_char (EmacsFrame ew,
- Dimension in_width, Dimension in_height,
- Dimension* out_width, Dimension* out_height)
+round_size_to_char (ew, in_width, in_height, out_width, out_height)
+ EmacsFrame ew;
+ Dimension in_width;
+ Dimension in_height;
+ Dimension* out_width;
+ Dimension* out_height;
{
int char_width;
int char_height;
}
static Widget
-get_wm_shell (Widget w)
+get_wm_shell (w)
+ Widget w;
{
Widget wmshell;
}
static void
-mark_shell_size_user_specified (Widget wmshell)
+mark_shell_size_user_specified (wmshell)
+ Widget wmshell;
{
if (! XtIsWMShell (wmshell)) abort ();
/* This is kind of sleazy, but I can't see how else to tell it to make it
static Boolean first_frame_p = True;
static void
-set_frame_size (EmacsFrame ew)
+set_frame_size (ew)
+ EmacsFrame ew;
{
/* The widget hierarchy is
int flags = 0;
Widget wmshell = get_wm_shell ((Widget) ew);
- Widget app_shell = XtParent ((Widget) wmshell);
-
+ /* Each Emacs shell is now independent and top-level. */
+ Widget app_shell = wmshell;
if (! XtIsSubclass (wmshell, shellWidgetClass)) abort ();
- if (! XtIsSubclass (app_shell, shellWidgetClass)) abort ();
+ /* We don't need this for the moment. The geometry is computed in
+ xfns.c. */
+#if 0
/* If the EmacsFrame doesn't have a geometry but the shell does,
treat that as the geometry of the frame. (Is this bogus?
I'm not sure.) */
flags |= (app_flags & (WidthValue | HeightValue));
}
}
-
+#endif /* 0 */
{
struct frame* frame = ew->emacs_frame.frame;
Dimension pixel_width, pixel_height;
char shell_position [32];
/* Take into account the size of the scrollbar */
- frame->display.x->vertical_scroll_bar_extra
- = (FRAME_HAS_VERTICAL_SCROLL_BARS (frame)
- ? VERTICAL_SCROLL_BAR_PIXEL_WIDTH (frame)
- : 0);
-
+ frame->output_data.x->vertical_scroll_bar_extra
+ = (!FRAME_HAS_VERTICAL_SCROLL_BARS (frame)
+ ? 0
+ : FRAME_SCROLL_BAR_PIXEL_WIDTH (frame) > 0
+ ? FRAME_SCROLL_BAR_PIXEL_WIDTH (frame)
+ : (FRAME_SCROLL_BAR_COLS (frame)
+ * FONT_WIDTH (frame->output_data.x->font)));
change_frame_size (frame, h, w, 1, 0);
char_to_pixel_size (ew, w, h, &pixel_width, &pixel_height);
ew->core.width = pixel_width;
ew->core.height = pixel_height;
-
+#if 0 /* xfns.c takes care of this now. */
/* If a position was specified, assign it to the shell widget.
(Else WM won't do anything with it.)
*/
/* Also assign the iconic status of the frame to the Shell, so that
the WM sees it. */
XtVaSetValues (wmshell, XtNiconic, ew->emacs_frame.iconic, 0);
+#endif /* 0 */
}
}
+/* Nonzero tells update_wm_hints not to do anything
+ (the caller should call update_wm_hints explicitly later.) */
+int update_hints_inhibit;
static void
-update_wm_hints (EmacsFrame ew)
+update_wm_hints (ew)
+ EmacsFrame ew;
{
Widget wmshell = get_wm_shell ((Widget)ew);
int cw;
int base_height;
int min_rows = 0, min_cols = 0;
+ if (update_hints_inhibit)
+ return;
+
+#if 0
check_frame_size (ew->emacs_frame.frame, &min_rows, &min_cols);
+#endif
pixel_to_char_size (ew, ew->core.width, ew->core.height,
&char_width, &char_height);
}
static void
-create_frame_gcs (EmacsFrame ew)
+create_frame_gcs (ew)
+ EmacsFrame ew;
{
- struct frame* s = ew->emacs_frame.frame;
-
- s->display.x->normal_gc =
- XCreateGC (XtDisplay (ew), RootWindowOfScreen (XtScreen (ew)), 0, 0);
- s->display.x->reverse_gc =
- XCreateGC (XtDisplay (ew), RootWindowOfScreen (XtScreen (ew)), 0, 0);
- s->display.x->cursor_gc =
- XCreateGC (XtDisplay (ew), RootWindowOfScreen (XtScreen (ew)), 0, 0);
+ struct frame *s = ew->emacs_frame.frame;
+
+ s->output_data.x->normal_gc
+ = XCreateGC (XtDisplay (ew), RootWindowOfScreen (XtScreen (ew)),
+ (unsigned long)0, (XGCValues *)0);
+ s->output_data.x->reverse_gc
+ = XCreateGC (XtDisplay (ew), RootWindowOfScreen (XtScreen (ew)),
+ (unsigned long)0, (XGCValues *)0);
+ s->output_data.x->cursor_gc
+ = XCreateGC (XtDisplay (ew), RootWindowOfScreen (XtScreen (ew)),
+ (unsigned long)0, (XGCValues *)0);
}
+static char setup_frame_cursor_bits[] =
+{
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
+};
+
static void
-setup_frame_gcs (EmacsFrame ew)
+setup_frame_gcs (ew)
+ EmacsFrame ew;
{
XGCValues gc_values;
struct frame* s = ew->emacs_frame.frame;
Pixmap blank_stipple, blank_tile;
- static char cursor_bits[] =
- {
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
- };
-
/* We have to initialize all of our GCs to have a stipple/tile, otherwise
XGetGCValues returns uninitialized data when we query the stipple
(instead of None or something sensible) and it makes things hard.
effectively cache all of the GC settings we need to use.
*/
- blank_stipple =
- XCreateBitmapFromData (XtDisplay (ew), RootWindowOfScreen (XtScreen (ew)),
- cursor_bits, 2, 2);
+ blank_stipple
+ = XCreateBitmapFromData (XtDisplay (ew),
+ RootWindowOfScreen (XtScreen (ew)),
+ setup_frame_cursor_bits, 2, 2);
/* use fg = 0, bg = 1 below, but it's irrelevant since this pixmap should
never actually get used as a background tile!
*/
- blank_tile =
- XCreatePixmapFromBitmapData (XtDisplay(ew),
- RootWindowOfScreen (XtScreen (ew)),
- cursor_bits, 2, 2, 0, 1, ew->core.depth);
+ blank_tile
+ = XCreatePixmapFromBitmapData (XtDisplay(ew),
+ RootWindowOfScreen (XtScreen (ew)),
+ setup_frame_cursor_bits, 2, 2,
+ (unsigned long)0, (unsigned long)1,
+ ew->core.depth);
/* Normal video */
gc_values.font = ew->emacs_frame.font->fid;
gc_values.graphics_exposures = False;
gc_values.stipple = blank_stipple;
gc_values.tile = blank_tile;
- XChangeGC (XtDisplay (ew), s->display.x->normal_gc,
+ XChangeGC (XtDisplay (ew), s->output_data.x->normal_gc,
(GCFont | GCForeground | GCBackground | GCGraphicsExposures
| GCStipple | GCTile),
&gc_values);
gc_values.graphics_exposures = False;
gc_values.stipple = blank_stipple;
gc_values.tile = blank_tile;
- XChangeGC (XtDisplay (ew), s->display.x->reverse_gc,
+ XChangeGC (XtDisplay (ew), s->output_data.x->reverse_gc,
(GCFont | GCForeground | GCBackground | GCGraphicsExposures
| GCStipple | GCTile),
&gc_values);
gc_values.background = ew->emacs_frame.cursor_color;
gc_values.graphics_exposures = False;
gc_values.tile = blank_tile;
- gc_values.stipple =
- XCreateBitmapFromData (XtDisplay (ew),
- RootWindowOfScreen (XtScreen (ew)),
- cursor_bits, 16, 16);
- XChangeGC (XtDisplay (ew), s->display.x->cursor_gc,
+ gc_values.stipple
+ = XCreateBitmapFromData (XtDisplay (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);
}
static void
-update_various_frame_slots (EmacsFrame ew)
+update_various_frame_slots (ew)
+ EmacsFrame ew;
{
- struct x_display* x = ew->emacs_frame.frame->display.x;
- x->pixel_height = ew->core.height;
+ struct x_output *x = ew->emacs_frame.frame->output_data.x;
+ x->pixel_height = ew->core.height + x->menubar_height;
x->pixel_width = ew->core.width;
x->internal_border_width = ew->emacs_frame.internal_border_width;
}
static void
-update_from_various_frame_slots (EmacsFrame ew)
+update_from_various_frame_slots (ew)
+ EmacsFrame ew;
{
- struct x_display* x = ew->emacs_frame.frame->display.x;
- ew->core.height = x->pixel_height;
+ struct x_output *x = ew->emacs_frame.frame->output_data.x;
+ ew->core.height = x->pixel_height - x->menubar_height;
ew->core.width = x->pixel_width;
ew->core.background_pixel = x->background_pixel;
ew->emacs_frame.internal_border_width = x->internal_border_width;
}
static void
-EmacsFrameInitialize (Widget request, Widget new,
- ArgList dum1, Cardinal *dum2)
+EmacsFrameInitialize (request, new, dum1, dum2)
+ Widget request;
+ Widget new;
+ ArgList dum1;
+ Cardinal *dum2;
{
EmacsFrame ew = (EmacsFrame)new;
}
/* Update the font field in frame */
- ew->emacs_frame.frame->display.x->font = ew->emacs_frame.font;
+ ew->emacs_frame.frame->output_data.x->font = ew->emacs_frame.font;
#endif
update_from_various_frame_slots (ew);
static void
-EmacsFrameRealize (Widget widget, XtValueMask *mask,
- XSetWindowAttributes *attrs)
+EmacsFrameRealize (widget, mask, attrs)
+ Widget widget;
+ XtValueMask *mask;
+ XSetWindowAttributes *attrs;
{
EmacsFrame ew = (EmacsFrame)widget;
- attrs->event_mask = (KeyPressMask | ExposureMask | ButtonPressMask |
- ButtonReleaseMask | StructureNotifyMask |
- FocusChangeMask | PointerMotionHintMask |
- PointerMotionMask | LeaveWindowMask | EnterWindowMask |
- VisibilityChangeMask | PropertyChangeMask |
- StructureNotifyMask | SubstructureNotifyMask |
- SubstructureRedirectMask);
+ attrs->event_mask = (STANDARD_EVENT_SET | PropertyChangeMask
+ | SubstructureNotifyMask | SubstructureRedirectMask);
*mask |= CWEventMask;
XtCreateWindow (widget, InputOutput, (Visual *)CopyFromParent, *mask,
attrs);
update_wm_hints (ew);
}
-extern void free_frame_faces (struct frame *);
+extern void free_frame_faces (/* struct frame * */);
static void
-EmacsFrameDestroy (Widget widget)
+EmacsFrameDestroy (widget)
+ Widget widget;
{
EmacsFrame ew = (EmacsFrame) widget;
struct frame* s = ew->emacs_frame.frame;
if (! s) abort ();
- if (! s->display.x) abort ();
- if (! s->display.x->normal_gc) abort ();
+ if (! s->output_data.x) abort ();
+ if (! s->output_data.x->normal_gc) abort ();
/* this would be called from Fdelete_frame() but it needs to free some
stuff after the widget has been finalized but before the widget has
been freed. */
free_frame_faces (s);
+ BLOCK_INPUT;
/* need to be careful that the face-freeing code doesn't free these too */
- XFreeGC (XtDisplay (widget), s->display.x->normal_gc);
- XFreeGC (XtDisplay (widget), s->display.x->reverse_gc);
- XFreeGC (XtDisplay (widget), s->display.x->cursor_gc);
+ XFreeGC (XtDisplay (widget), s->output_data.x->normal_gc);
+ XFreeGC (XtDisplay (widget), s->output_data.x->reverse_gc);
+ XFreeGC (XtDisplay (widget), s->output_data.x->cursor_gc);
+ UNBLOCK_INPUT;
}
void
-EmacsFrameResize (Widget widget)
+EmacsFrameResize (widget)
+ Widget widget;
{
EmacsFrame ew = (EmacsFrame)widget;
struct frame *f = ew->emacs_frame.frame;
int rows;
pixel_to_char_size (ew, ew->core.width, ew->core.height, &columns, &rows);
- change_frame_size (f, rows, columns, 1, 0);
+ change_frame_size (f, rows, columns, 0, 1);
update_wm_hints (ew);
- {
- Window win, child;
- int win_x, win_y;
-
- /* Find the position of the outside upper-left corner of
- the window, in the root coordinate system. Don't
- refer to the parent window here; we may be processing
- this event after the window manager has changed our
- parent, but before we have reached the ReparentNotify. */
- XTranslateCoordinates (x_current_display,
-
- /* From-window, to-window. */
- XtWindow(XtParent(ew)),
- ROOT_WINDOW,
-
- /* From-position, to-position. */
- -f->display.x->widget->core.border_width,
- -f->display.x->widget->core.border_width,
- &win_x, &win_y,
-
- /* Child of win. */
- &child);
- f->display.x->widget->core.x = win_x;
- f->display.x->widget->core.y = win_y;
- }
update_various_frame_slots (ew);
+
+ cancel_mouse_face (f);
}
static Boolean
-EmacsFrameSetValues (Widget cur_widget, Widget req_widget, Widget new_widget,
- ArgList dum1, Cardinal *dum2)
+EmacsFrameSetValues (cur_widget, req_widget, new_widget, dum1, dum2)
+ Widget cur_widget;
+ Widget req_widget;
+ Widget new_widget;
+ ArgList dum1;
+ Cardinal *dum2;
{
EmacsFrame cur = (EmacsFrame)cur_widget;
EmacsFrame new = (EmacsFrame)new_widget;
/* #### This doesn't work, I haven't been able to find ANY kludge that
will let (x-create-frame '((iconic . t))) work. It seems that changes
to wm_shell's iconic slot have no effect after it has been realized,
- and calling XIconifyWindow doesn't work either (even thought the window
+ and calling XIconifyWindow doesn't work either (even though the window
has been created.) Perhaps there is some property we could smash
- directly, but I'm sick of this for now. Xt is a steaming pile of shit!
+ directly, but I'm sick of this for now.
*/
if (cur->emacs_frame.iconic != new->emacs_frame.iconic)
{
}
static XtGeometryResult
-EmacsFrameQueryGeometry (Widget widget, XtWidgetGeometry* request,
- XtWidgetGeometry* result)
+EmacsFrameQueryGeometry (widget, request, result)
+ Widget widget;
+ XtWidgetGeometry* request;
+ XtWidgetGeometry* result;
{
EmacsFrame ew = (EmacsFrame)widget;
return result->request_mode ? XtGeometryAlmost : XtGeometryYes;
}
-#if 0
-/* I don't know why this is necessary; Matthieu said he had to do
- it to make the focus handlers work??
- */
-static void
-key_press (Widget w, XEvent* event, String *params, Cardinal *n_params)
-{
-}
-
-static void
-emacs_frame_focus_handler (Widget w, XEvent *event, String *params,
- Cardinal *n_params)
-{
- emacs_Xt_focus_event_handler (event, 0);
-}
-#endif
-
/* Special entrypoints */
void
-EmacsFrameSetCharSize (Widget widget, int columns, int rows)
+EmacsFrameSetCharSize (widget, columns, rows)
+ Widget widget;
+ int columns;
+ int rows;
{
EmacsFrame ew = (EmacsFrame) widget;
Dimension pixel_width, pixel_height, granted_width, granted_height;
XtGeometryResult result;
+ struct frame *f = ew->emacs_frame.frame;
+ Arg al[2];
+ int ac = 0;
+
if (columns < 3) columns = 3; /* no way buddy */
- if (rows < 3) rows = 3;
+
+ check_frame_size (f, &rows, &columns);
+ f->output_data.x->vertical_scroll_bar_extra
+ = (!FRAME_HAS_VERTICAL_SCROLL_BARS (f)
+ ? 0
+ : FRAME_SCROLL_BAR_PIXEL_WIDTH (f) > 0
+ ? FRAME_SCROLL_BAR_PIXEL_WIDTH (f)
+ : (FRAME_SCROLL_BAR_COLS (f) * FONT_WIDTH (f->output_data.x->font)));
char_to_pixel_size (ew, columns, rows, &pixel_width, &pixel_height);
- result = XtMakeResizeRequest ((Widget)ew,
- pixel_width, pixel_height,
- &granted_width, &granted_height);
- if (result == XtGeometryAlmost)
- XtMakeResizeRequest ((Widget) ew, granted_width, granted_height,
- NULL, NULL);
- /* damn Paned widget won't ever change its width. Force it. */
- if (ew->core.width != pixel_width)
+
+ /* 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)
{
- XtVaSetValues (XtParent ((Widget) ew), XtNwidth, pixel_width, 0);
- XtVaSetValues ((Widget) ew, XtNwidth, pixel_width, 0);
+ 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;
+
+ lw_refigure_widget (f->output_data.x->column_widget, False);
+ update_hints_inhibit = 1;
+
+ ac = 0;
+ XtSetArg (al[ac], XtNheight, pixel_height); ac++;
+ XtSetArg (al[ac], XtNwidth, pixel_width); ac++;
+ XtSetValues ((Widget) ew, al, ac);
+
+ ac = 0;
+ XtSetArg (al[ac], XtNheight, column_widget_height + hdelta); ac++;
+ XtSetArg (al[ac], XtNwidth, column_widget_width + wdelta); ac++;
+ XtSetValues (f->output_data.x->column_widget, al, ac);
+
+ ac = 0;
+ XtSetArg (al[ac], XtNheight, outer_widget_height + hdelta); ac++;
+ XtSetArg (al[ac], XtNwidth, outer_widget_width + wdelta); ac++;
+ XtSetValues (f->output_data.x->widget, al, ac);
+
+ lw_refigure_widget (f->output_data.x->column_widget, True);
+
+ update_hints_inhibit = 0;
+ update_wm_hints (ew);
+
+ do_pending_window_change ();
+
+ /* 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);
+}
+\f
+widget_store_internal_border (widget)
+ Widget widget;
+{
+ EmacsFrame ew = (EmacsFrame) widget;
+ FRAME_PTR f = ew->emacs_frame.frame;
+
+ ew->emacs_frame.internal_border_width
+ = f->output_data.x->internal_border_width;
}