diff --git a/src/widget.c b/src/widget.c index d22732ff93a..cc1aeeb25a9 100644 --- a/src/widget.c +++ b/src/widget.c @@ -32,6 +32,7 @@ #include "sysstdio.h" #include "xterm.h" #include "frame.h" +#include "igc.h" #include #include @@ -61,7 +62,7 @@ #define offset(field) offsetof (EmacsFrameRec, emacs_frame.field) {(char *) XtNemacsFrame, (char *) XtCEmacsFrame, XtRPointer, sizeof (XtPointer), - offset (frame), XtRImmediate, 0}, + offset (framep), XtRImmediate, 0}, {(char *) XtNminibuffer, (char *) XtCMinibuffer, XtRInt, sizeof (int), offset (minibuffer), XtRImmediate, (XtPointer)0}, @@ -157,7 +158,7 @@ emacsFrameClass (void) static void get_default_char_pixel_size (EmacsFrame ew, int *pixel_width, int *pixel_height) { - struct frame *f = ew->emacs_frame.frame; + struct frame *f = *ew->emacs_frame.framep; *pixel_width = FRAME_COLUMN_WIDTH (f); *pixel_height = FRAME_LINE_HEIGHT (f); @@ -167,7 +168,7 @@ get_default_char_pixel_size (EmacsFrame ew, int *pixel_width, int *pixel_height) pixel_to_char_size (EmacsFrame ew, Dimension pixel_width, Dimension pixel_height, int *char_width, int *char_height) { - struct frame *f = ew->emacs_frame.frame; + struct frame *f = *ew->emacs_frame.framep; *char_width = FRAME_PIXEL_WIDTH_TO_TEXT_COLS (f, (int) pixel_width); *char_height = FRAME_PIXEL_HEIGHT_TO_TEXT_LINES (f, (int) pixel_height); @@ -177,7 +178,7 @@ pixel_to_char_size (EmacsFrame ew, Dimension pixel_width, char_to_pixel_size (EmacsFrame ew, int char_width, int char_height, Dimension *pixel_width, Dimension *pixel_height) { - struct frame *f = ew->emacs_frame.frame; + struct frame *f = *ew->emacs_frame.framep; *pixel_width = FRAME_TEXT_COLS_TO_PIXEL_WIDTH (f, char_width); *pixel_height = FRAME_TEXT_LINES_TO_PIXEL_HEIGHT (f, char_height); @@ -259,7 +260,7 @@ set_frame_size (EmacsFrame ew) */ - struct frame *f = ew->emacs_frame.frame; + struct frame *f = *ew->emacs_frame.framep; ew->core.width = FRAME_PIXEL_WIDTH (f); ew->core.height = FRAME_PIXEL_HEIGHT (f); @@ -326,7 +327,7 @@ widget_update_wm_size_hints (Widget widget, Widget frame) static void update_various_frame_slots (EmacsFrame ew) { - struct frame *f = ew->emacs_frame.frame; + struct frame *f = *ew->emacs_frame.framep; f->internal_border_width = ew->emacs_frame.internal_border_width; } @@ -334,7 +335,7 @@ update_various_frame_slots (EmacsFrame ew) static void update_from_various_frame_slots (EmacsFrame ew) { - struct frame *f = ew->emacs_frame.frame; + struct frame *f = *ew->emacs_frame.framep; struct x_output *x = f->output_data.x; ew->core.height = FRAME_PIXEL_HEIGHT (f) - x->menubar_height; @@ -359,7 +360,7 @@ EmacsFrameInitialize (Widget request, Widget new, { EmacsFrame ew = (EmacsFrame) new; - if (!ew->emacs_frame.frame) + if (!*ew->emacs_frame.framep) { fputs ("can't create an emacs frame widget without a frame\n", stderr); exit (1); @@ -384,7 +385,7 @@ EmacsFrameRealize (Widget widget, XtValueMask *mask, XSetWindowAttributes *attrs) { EmacsFrame ew = (EmacsFrame) widget; - struct frame *f = ew->emacs_frame.frame; + struct frame *f = *ew->emacs_frame.framep; /* This used to contain SubstructureRedirectMask, but this turns out to be a problem with XIM on Solaris, and events from that mask @@ -410,14 +411,21 @@ EmacsFrameRealize (Widget widget, XtValueMask *mask, static void EmacsFrameDestroy (Widget widget) { - /* All GCs are now freed in x_free_frame_resources. */ + EmacsFrame ew = (EmacsFrame) widget; + struct frame **fp = ew->emacs_frame.framep; + +#ifdef HAVE_MPS + igc_xfree (fp); +#else + xfree (fp); +#endif } static void EmacsFrameResize (Widget widget) { EmacsFrame ew = (EmacsFrame) widget; - struct frame *f = ew->emacs_frame.frame; + struct frame *f = *ew->emacs_frame.framep; if (CONSP (frame_size_history)) frame_size_history_extra @@ -470,7 +478,7 @@ EmacsFrameQueryGeometry (Widget widget, XtWidgetGeometry *request, EmacsFrameSetCharSize (Widget widget, int columns, int rows) { EmacsFrame ew = (EmacsFrame) widget; - struct frame *f = ew->emacs_frame.frame; + struct frame *f = *ew->emacs_frame.framep; if (CONSP (frame_size_history)) frame_size_history_extra @@ -489,7 +497,7 @@ EmacsFrameSetCharSize (Widget widget, int columns, int rows) EmacsFrameExpose (Widget widget, XEvent *event, Region region) { EmacsFrame ew = (EmacsFrame) widget; - struct frame *f = ew->emacs_frame.frame; + struct frame *f = *ew->emacs_frame.framep; expose_frame (f, event->xexpose.x, event->xexpose.y, event->xexpose.width, event->xexpose.height); @@ -501,7 +509,7 @@ EmacsFrameExpose (Widget widget, XEvent *event, Region region) widget_store_internal_border (Widget widget) { EmacsFrame ew = (EmacsFrame) widget; - struct frame *f = ew->emacs_frame.frame; + struct frame *f = *ew->emacs_frame.framep; ew->emacs_frame.internal_border_width = f->internal_border_width; } diff --git a/src/widgetprv.h b/src/widgetprv.h index b9cd72a4bc2..e63bbda1fe3 100644 --- a/src/widgetprv.h +++ b/src/widgetprv.h @@ -25,7 +25,7 @@ #define _EmacsFrameP_h #include typedef struct { - struct frame *frame; /* the *emacs* frame object */ + struct frame **framep; /* the *emacs* frame object */ /* Resources that can't be done from lisp. */ diff --git a/src/xfns.c b/src/xfns.c index 3f0d8f3fcd0..53ad460903b 100644 --- a/src/xfns.c +++ b/src/xfns.c @@ -24,6 +24,7 @@ Copyright (C) 1989, 1992-2024 Free Software Foundation, Inc. #include #include "lisp.h" +#include "igc.h" #include "character.h" #include "xterm.h" #include "frame.h" @@ -4195,12 +4196,20 @@ x_window (struct frame *f, long window_prompting) /* mappedWhenManaged to false tells to the paned window to not map/unmap the emacs screen when changing menubar. This reduces flickering. */ + struct frame **framep; +#ifdef HAVE_MPS + framep = igc_xzalloc_ambig (sizeof *framep); +#else + framep = xmalloc (sizeof *framep); +#endif + *framep = f; + ac = 0; XtSetArg (al[ac], XtNmappedWhenManaged, 0); ac++; XtSetArg (al[ac], (char *) XtNshowGrip, 0); ac++; XtSetArg (al[ac], (char *) XtNallowResize, 1); ac++; XtSetArg (al[ac], (char *) XtNresizeToPreferred, 1); ac++; - XtSetArg (al[ac], (char *) XtNemacsFrame, f); ac++; + XtSetArg (al[ac], (char *) XtNemacsFrame, framep); ac++; XtSetArg (al[ac], XtNvisual, FRAME_X_VISUAL (f)); ac++; XtSetArg (al[ac], XtNdepth, FRAME_DISPLAY_INFO (f)->n_planes); ac++; XtSetArg (al[ac], XtNcolormap, FRAME_X_COLORMAP (f)); ac++;