Index: console-msw.h =================================================================== RCS file: /usr/CVSroot/XEmacs/xemacs/src/console-msw.h,v retrieving revision 1.22.2.5 diff -u -r1.22.2.5 console-msw.h --- console-msw.h 1999/08/31 17:38:22 1.22.2.5 +++ console-msw.h 1999/09/16 16:25:08 @@ -66,6 +66,7 @@ /* The name of the main window class */ #define XEMACS_CLASS "XEmacs" +#define XEMACS_CONTROL_CLASS "XEmacsControl" /* * Console @@ -224,6 +225,9 @@ /* win32 "Windows" procedure */ LRESULT WINAPI mswindows_wnd_proc (HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam); +LRESULT WINAPI mswindows_control_wnd_proc (HWND hwnd, + UINT msg, WPARAM wParam, + LPARAM lParam); void mswindows_redraw_exposed_area (struct frame *f, int x, int y, int width, int height); Index: console.h =================================================================== RCS file: /usr/CVSroot/XEmacs/xemacs/src/console.h,v retrieving revision 1.22.2.10 diff -u -r1.22.2.10 console.h --- console.h 1999/08/31 17:38:22 1.22.2.10 +++ console.h 1999/09/16 16:25:10 @@ -220,7 +220,8 @@ int escapeflag); void (*finalize_image_instance_method) (struct Lisp_Image_Instance *); void (*unmap_subwindow_method) (struct Lisp_Image_Instance *); - void (*map_subwindow_method) (struct Lisp_Image_Instance *, int x, int y); + void (*map_subwindow_method) (struct Lisp_Image_Instance *, int x, int y, + struct display_glyph_area* dga); void (*resize_subwindow_method) (struct Lisp_Image_Instance *, int w, int h); void (*update_subwindow_method) (struct Lisp_Image_Instance *); int (*image_instance_equal_method) (struct Lisp_Image_Instance *, Index: device-msw.c =================================================================== RCS file: /usr/CVSroot/XEmacs/xemacs/src/device-msw.c,v retrieving revision 1.20.2.4 diff -u -r1.20.2.4 device-msw.c --- device-msw.c 1999/06/03 07:53:06 1.20.2.4 +++ device-msw.c 1999/09/16 16:25:10 @@ -139,7 +139,9 @@ wc.lpfnWndProc = (WNDPROC) mswindows_wnd_proc; wc.cbClsExtra = 0; wc.cbWndExtra = MSWINDOWS_WINDOW_EXTRA_BYTES; - wc.hInstance = NULL; /* ? */ + /* This must match whatever is passed to CreateWIndowEx, NULL is ok + for this. */ + wc.hInstance = NULL; wc.hIcon = LoadIcon (GetModuleHandle(NULL), XEMACS_CLASS); wc.hCursor = LoadCursor (NULL, IDC_ARROW); /* Background brush is only used during sizing, when XEmacs cannot @@ -151,6 +153,17 @@ wc.hIconSm = LoadImage (GetModuleHandle (NULL), XEMACS_CLASS, IMAGE_ICON, 16, 16, 0); RegisterClassEx (&wc); + +#ifdef HAVE_WIDGETS + xzero (wc); + /* Register the main window class */ + wc.cbSize = sizeof (WNDCLASSEX); + wc.lpfnWndProc = (WNDPROC) mswindows_control_wnd_proc; + wc.lpszClassName = XEMACS_CONTROL_CLASS; + wc.hInstance = NULL; + RegisterClassEx (&wc); +#endif + #ifdef HAVE_TOOLBARS InitCommonControls (); #endif Index: glyphs-msw.c =================================================================== RCS file: /usr/CVSroot/XEmacs/xemacs/src/glyphs-msw.c,v retrieving revision 1.21.2.22 diff -u -r1.21.2.22 glyphs-msw.c --- glyphs-msw.c 1999/08/24 08:38:41 1.21.2.22 +++ glyphs-msw.c 1999/09/16 16:25:18 @@ -79,9 +79,6 @@ #endif DEFINE_DEVICE_IIFORMAT (mswindows, button); DEFINE_DEVICE_IIFORMAT (mswindows, edit_field); -#if 0 -DEFINE_DEVICE_IIFORMAT (mswindows, group); -#endif DEFINE_DEVICE_IIFORMAT (mswindows, subwindow); DEFINE_DEVICE_IIFORMAT (mswindows, widget); DEFINE_DEVICE_IIFORMAT (mswindows, label); @@ -2002,8 +1999,11 @@ stderr_out ("widget destroyed, %d left\n", debug_widget_instances); #endif if (IMAGE_INSTANCE_SUBWINDOW_ID (p)) - DestroyWindow (WIDGET_INSTANCE_MSWINDOWS_HANDLE (p)); - IMAGE_INSTANCE_SUBWINDOW_ID (p) = 0; + { + DestroyWindow (WIDGET_INSTANCE_MSWINDOWS_HANDLE (p)); + DestroyWindow (IMAGE_INSTANCE_MSWINDOWS_CLIPWINDOW (p)); + IMAGE_INSTANCE_SUBWINDOW_ID (p) = 0; + } } else if (p->data) { @@ -2037,7 +2037,7 @@ { if (IMAGE_INSTANCE_SUBWINDOW_ID (p)) { - SetWindowPos (WIDGET_INSTANCE_MSWINDOWS_HANDLE (p), + SetWindowPos (IMAGE_INSTANCE_MSWINDOWS_CLIPWINDOW (p), NULL, 0, 0, 0, 0, SWP_HIDEWINDOW | SWP_NOMOVE | SWP_NOSIZE @@ -2048,16 +2048,23 @@ /* map the subwindow. This is used by redisplay via redisplay_output_subwindow */ static void -mswindows_map_subwindow (struct Lisp_Image_Instance *p, int x, int y) +mswindows_map_subwindow (struct Lisp_Image_Instance *p, int x, int y, + struct display_glyph_area* dga) { /* move the window before mapping it ... */ - SetWindowPos (WIDGET_INSTANCE_MSWINDOWS_HANDLE (p), + SetWindowPos (IMAGE_INSTANCE_MSWINDOWS_CLIPWINDOW (p), + NULL, + x, y, dga->width, dga->height, + SWP_NOZORDER + | SWP_NOCOPYBITS | SWP_NOSENDCHANGING); + /* ... adjust the child ... */ + SetWindowPos (WIDGET_INSTANCE_MSWINDOWS_HANDLE (p), NULL, - x, y, 0, 0, - SWP_NOZORDER | SWP_NOSIZE + -dga->xoffset, -dga->yoffset, 0, 0, + SWP_NOZORDER | SWP_NOSIZE | SWP_NOCOPYBITS | SWP_NOSENDCHANGING); /* ... now map it - we are not allowed to move it at the same time. */ - SetWindowPos (WIDGET_INSTANCE_MSWINDOWS_HANDLE (p), + SetWindowPos (IMAGE_INSTANCE_MSWINDOWS_CLIPWINDOW (p), NULL, 0, 0, 0, 0, SWP_NOZORDER | SWP_NOSIZE | SWP_NOMOVE @@ -2069,6 +2076,7 @@ static void mswindows_resize_subwindow (struct Lisp_Image_Instance* ii, int w, int h) { + /* Set the size of the control .... */ SetWindowPos (WIDGET_INSTANCE_MSWINDOWS_HANDLE (ii), NULL, 0, 0, w, h, @@ -2137,6 +2145,26 @@ /* have to set the type this late in case there is no device instantiation for a widget */ IMAGE_INSTANCE_TYPE (ii) = IMAGE_SUBWINDOW; + /* Allocate space for the clip window */ + ii->data = xnew_and_zero (struct mswindows_subwindow_data); + + if ((IMAGE_INSTANCE_MSWINDOWS_CLIPWINDOW (ii) + = CreateWindowEx( + 0, /* EX flags */ + XEMACS_CONTROL_CLASS, + 0, /* text */ + WS_CLIPCHILDREN | WS_CLIPSIBLINGS | WS_CHILD, + 0, /* starting x position */ + 0, /* starting y position */ + IMAGE_INSTANCE_WIDGET_WIDTH (ii), + IMAGE_INSTANCE_WIDGET_HEIGHT (ii), + /* parent window */ + FRAME_MSWINDOWS_HANDLE (XFRAME (frame)), + NULL, /* No menu */ + NULL, /* must be null for this class */ + NULL)) == NULL) + signal_simple_error ("window creation failed with code", + make_int (GetLastError())); wnd = CreateWindow( "STATIC", "", @@ -2145,7 +2173,7 @@ 0, /* starting y position */ IMAGE_INSTANCE_WIDGET_WIDTH (ii), IMAGE_INSTANCE_WIDGET_HEIGHT (ii), - FRAME_MSWINDOWS_HANDLE (XFRAME (frame)), /* parent window */ + IMAGE_INSTANCE_MSWINDOWS_CLIPWINDOW (ii), 0, (HINSTANCE) GetWindowLong (FRAME_MSWINDOWS_HANDLE (XFRAME (frame)), @@ -2226,10 +2254,6 @@ { /* this function can call lisp */ struct Lisp_Image_Instance *ii = XIMAGE_INSTANCE (image_instance); -#if 0 - struct Lisp_Image_Instance *groupii = 0; - Lisp_Object group = find_keyword_in_vector (instantiator, Q_group); -#endif Lisp_Object device = IMAGE_INSTANCE_DEVICE (ii), style; struct device* d = XDEVICE (device); Lisp_Object frame = FW_FRAME (domain); @@ -2241,17 +2265,7 @@ if (!DEVICE_MSWINDOWS_P (d)) signal_simple_error ("Not an mswindows device", device); -#if 0 - /* if the user specified another glyph as a group pick up the - instance in our domain. */ - if (!NILP (group)) - { - if (SYMBOLP (group)) - group = XSYMBOL (group)->value; - group = glyph_image_instance (group, domain, ERROR_ME, 1); - groupii = XIMAGE_INSTANCE (group); - } -#endif + if (!gui_item_active_p (gui)) flags |= WS_DISABLED; @@ -2267,23 +2281,47 @@ if (!NILP (IMAGE_INSTANCE_WIDGET_TEXT (ii))) GET_C_STRING_OS_DATA_ALLOCA (IMAGE_INSTANCE_WIDGET_TEXT (ii), nm); - wnd = CreateWindowEx( - exflags /* | WS_EX_NOPARENTNOTIFY*/, - class, - nm, - flags | WS_CHILD, - 0, /* starting x position */ - 0, /* starting y position */ - IMAGE_INSTANCE_WIDGET_WIDTH (ii), - IMAGE_INSTANCE_WIDGET_HEIGHT (ii), - /* parent window */ - FRAME_MSWINDOWS_HANDLE (XFRAME (frame)), - (HMENU)id, /* No menu */ - (HINSTANCE) - GetWindowLong (FRAME_MSWINDOWS_HANDLE (XFRAME (frame)), - GWL_HINSTANCE), - NULL); + /* allocate space for the clip window and then allocate the clip window */ + ii->data = xnew_and_zero (struct mswindows_subwindow_data); + if ((IMAGE_INSTANCE_MSWINDOWS_CLIPWINDOW (ii) + = CreateWindowEx( + 0, /* EX flags */ + XEMACS_CONTROL_CLASS, + 0, /* text */ + WS_CLIPCHILDREN | WS_CLIPSIBLINGS | WS_CHILD, + 0, /* starting x position */ + 0, /* starting y position */ + IMAGE_INSTANCE_WIDGET_WIDTH (ii), + IMAGE_INSTANCE_WIDGET_HEIGHT (ii), + /* parent window */ + FRAME_MSWINDOWS_HANDLE (XFRAME (frame)), + (HMENU)id, /* No menu */ + NULL, /* must be null for this class */ + NULL)) == NULL) + signal_simple_error ("window creation failed with code", + make_int (GetLastError())); + + if ((wnd = CreateWindowEx( + exflags /* | WS_EX_NOPARENTNOTIFY*/, + class, + nm, + flags | WS_CHILD | WS_VISIBLE, + 0, /* starting x position */ + 0, /* starting y position */ + IMAGE_INSTANCE_WIDGET_WIDTH (ii), + IMAGE_INSTANCE_WIDGET_HEIGHT (ii), + /* parent window */ + IMAGE_INSTANCE_MSWINDOWS_CLIPWINDOW (ii), + (HMENU)id, /* No menu */ + (HINSTANCE) + GetWindowLong + (FRAME_MSWINDOWS_HANDLE (XFRAME (frame)), + GWL_HINSTANCE), + NULL)) == NULL) + signal_simple_error ("window creation failed with code", + make_int (GetLastError())); + IMAGE_INSTANCE_SUBWINDOW_ID (ii) = wnd; SetWindowLong (wnd, GWL_USERDATA, (LONG)LISP_TO_VOID(image_instance)); /* set the widget font from the widget face */ @@ -2592,20 +2630,6 @@ 0, WS_EX_STATICEDGE); } -#if 0 -/* instantiate a static control possible for putting other things in */ -static void -mswindows_group_instantiate (Lisp_Object image_instance, Lisp_Object instantiator, - Lisp_Object pointer_fg, Lisp_Object pointer_bg, - int dest_mask, Lisp_Object domain) -{ - mswindows_widget_instantiate (image_instance, instantiator, pointer_fg, - pointer_bg, dest_mask, domain, "BUTTON", - WS_GROUP | BS_GROUPBOX | WS_BORDER, - WS_EX_CLIENTEDGE ); -} -#endif - /* instantiate a scrollbar control */ static void mswindows_scrollbar_instantiate (Lisp_Object image_instance, Lisp_Object instantiator, @@ -2751,6 +2775,27 @@ } return Qunbound; } + +LRESULT WINAPI +mswindows_control_wnd_proc (HWND hwnd, UINT message, + WPARAM wParam, LPARAM lParam) +{ + switch (message) + { + case WM_NOTIFY: + case WM_COMMAND: + case WM_CTLCOLORBTN: + case WM_CTLCOLORLISTBOX: + case WM_CTLCOLOREDIT: + case WM_CTLCOLORSTATIC: + case WM_CTLCOLORSCROLLBAR: + + return mswindows_wnd_proc (GetParent (hwnd), message, wParam, lParam); + default: + return DefWindowProc (hwnd, message, wParam, lParam); + } +} + #endif /* HAVE_WIDGETS */ @@ -2828,10 +2873,7 @@ INITIALIZE_DEVICE_IIFORMAT (mswindows, widget); IIFORMAT_HAS_DEVMETHOD (mswindows, widget, property); IIFORMAT_HAS_DEVMETHOD (mswindows, widget, set_property); -#if 0 - INITIALIZE_DEVICE_IIFORMAT (mswindows, group); - IIFORMAT_HAS_DEVMETHOD (mswindows, group, instantiate); -#endif + /* label */ INITIALIZE_DEVICE_IIFORMAT (mswindows, label); IIFORMAT_HAS_DEVMETHOD (mswindows, label, instantiate); Index: glyphs-msw.h =================================================================== RCS file: /usr/CVSroot/XEmacs/xemacs/src/glyphs-msw.h,v retrieving revision 1.7.2.2 diff -u -r1.7.2.2 glyphs-msw.h --- glyphs-msw.h 1999/08/24 08:38:41 1.7.2.2 +++ glyphs-msw.h 1999/09/16 16:25:18 @@ -77,5 +77,19 @@ #define XWIDGET_INSTANCE_MSWINDOWS_HANDLE(i) \ WIDGET_INSTANCE_MSWINDOWS_HANDLE (XIMAGE_INSTANCE (i)) +struct mswindows_subwindow_data +{ + HWND clip_window; +}; + +#define MSWINDOWS_SUBWINDOW_DATA(i) \ +((struct mswindows_subwindow_data *) (i)->data) + +#define IMAGE_INSTANCE_MSWINDOWS_CLIPWINDOW(i) \ + (MSWINDOWS_SUBWINDOW_DATA (i)->clip_window) + +#define XIMAGE_INSTANCE_MSWINDOWS_CLIPWINDOW(i) \ + IMAGE_INSTANCE_MSWINDOWS_CLIPWINDOW (XIMAGE_INSTANCE (i)) + #endif /* HAVE_MS_WINDOWS */ #endif /* _XEMACS_GLYPHS_MSW_H_ */ Index: glyphs-widget.c =================================================================== RCS file: /usr/CVSroot/XEmacs/xemacs/src/Attic/glyphs-widget.c,v retrieving revision 1.1.2.11 diff -u -r1.1.2.11 glyphs-widget.c --- glyphs-widget.c 1999/09/07 14:48:23 1.1.2.11 +++ glyphs-widget.c 1999/09/16 16:25:20 @@ -45,10 +45,6 @@ DEFINE_IMAGE_INSTANTIATOR_FORMAT (scrollbar); Lisp_Object Qscrollbar; DEFINE_IMAGE_INSTANTIATOR_FORMAT (widget); -#if 0 -DEFINE_IMAGE_INSTANTIATOR_FORMAT (group); -Lisp_Object Qgroup; -#endif DEFINE_IMAGE_INSTANTIATOR_FORMAT (label); Lisp_Object Qlabel; DEFINE_IMAGE_INSTANTIATOR_FORMAT (progress_gauge); @@ -912,21 +908,6 @@ IIFORMAT_VALID_KEYWORD (layout, Q_border, check_valid_border); IIFORMAT_VALID_KEYWORD (layout, Q_items, check_valid_glyph_or_instantiator_list); - -#if 0 - /* group */ - INITIALIZE_IMAGE_INSTANTIATOR_FORMAT (group, "group"); - IIFORMAT_HAS_SHARED_METHOD (group, possible_dest_types, widget); - IIFORMAT_HAS_METHOD (group, instantiate); - - IIFORMAT_VALID_KEYWORD (group, Q_width, check_valid_int); - IIFORMAT_VALID_KEYWORD (group, Q_height, check_valid_int); - IIFORMAT_VALID_KEYWORD (group, Q_pixel_width, check_valid_int); - IIFORMAT_VALID_KEYWORD (group, Q_pixel_height, check_valid_int); - IIFORMAT_VALID_KEYWORD (group, Q_face, check_valid_face); - IIFORMAT_VALID_KEYWORD (group, Q_background, check_valid_string); - IIFORMAT_VALID_KEYWORD (group, Q_descriptor, check_valid_string); -#endif } void Index: glyphs-x.c =================================================================== RCS file: /usr/CVSroot/XEmacs/xemacs/src/glyphs-x.c,v retrieving revision 1.49.2.24 diff -u -r1.49.2.24 glyphs-x.c --- glyphs-x.c 1999/08/31 17:38:23 1.49.2.24 +++ glyphs-x.c 1999/09/16 16:25:25 @@ -78,6 +78,9 @@ #include #endif #include +#ifdef HAVE_WIDGETS +#include "EmacsManager.h" +#endif #if INTBITS == 32 # define FOUR_BYTE_TYPE unsigned int @@ -388,6 +391,7 @@ stderr_out ("widget destroyed, %d left\n", debug_widget_instances); #endif lw_destroy_widget (IMAGE_INSTANCE_X_WIDGET_ID (p)); + XtDestroyWidget (IMAGE_INSTANCE_X_CLIPWIDGET (p)); IMAGE_INSTANCE_SUBWINDOW_ID (p) = 0; } } @@ -2029,33 +2033,41 @@ if (IMAGE_INSTANCE_TYPE (p) == IMAGE_SUBWINDOW) { XUnmapWindow - (DisplayOfScreen (IMAGE_INSTANCE_X_SUBWINDOW_SCREEN (p)), - IMAGE_INSTANCE_X_SUBWINDOW_ID (p)); + (IMAGE_INSTANCE_X_SUBWINDOW_DISPLAY (p), + IMAGE_INSTANCE_X_CLIPWINDOW (p)); } else /* must be a widget */ { - XtUnmapWidget (IMAGE_INSTANCE_X_WIDGET_ID (p)); + XtUnmapWidget (IMAGE_INSTANCE_X_CLIPWIDGET (p)); } } /* map the subwindow. This is used by redisplay via redisplay_output_subwindow */ static void -x_map_subwindow (struct Lisp_Image_Instance *p, int x, int y) +x_map_subwindow (struct Lisp_Image_Instance *p, int x, int y, + struct display_glyph_area* dga) { if (IMAGE_INSTANCE_TYPE (p) == IMAGE_SUBWINDOW) { Window subwindow = IMAGE_INSTANCE_X_SUBWINDOW_ID (p); - Screen* screen = IMAGE_INSTANCE_X_SUBWINDOW_SCREEN (p); - XMoveWindow (DisplayOfScreen (screen), subwindow, x, y); - XMapWindow (DisplayOfScreen (screen), subwindow); + XMoveResizeWindow (IMAGE_INSTANCE_X_SUBWINDOW_DISPLAY (p), + IMAGE_INSTANCE_X_CLIPWINDOW (p), + x, y, dga->width, dga->height); + XMoveWindow (IMAGE_INSTANCE_X_SUBWINDOW_DISPLAY (p), + subwindow, -dga->xoffset, -dga->yoffset); + XMapWindow (IMAGE_INSTANCE_X_SUBWINDOW_DISPLAY (p), + IMAGE_INSTANCE_X_CLIPWINDOW (p)); } else /* must be a widget */ { - XtMoveWidget (IMAGE_INSTANCE_X_WIDGET_ID (p), - x + IMAGE_INSTANCE_X_WIDGET_XOFFSET (p), - y + IMAGE_INSTANCE_X_WIDGET_YOFFSET (p)); - XtMapWidget (IMAGE_INSTANCE_X_WIDGET_ID (p)); + XtConfigureWidget (IMAGE_INSTANCE_X_CLIPWIDGET (p), + x + IMAGE_INSTANCE_X_WIDGET_XOFFSET (p), + y + IMAGE_INSTANCE_X_WIDGET_YOFFSET (p), + dga->width, dga->height, 0); + XtMoveWidget (IMAGE_INSTANCE_X_WIDGET_ID (p), + -dga->xoffset, -dga->yoffset); + XtMapWidget (IMAGE_INSTANCE_X_CLIPWIDGET (p)); } } @@ -2112,14 +2124,22 @@ ii->data = xnew_and_zero (struct x_subwindow_data); IMAGE_INSTANCE_X_SUBWINDOW_PARENT (ii) = pw; - IMAGE_INSTANCE_X_SUBWINDOW_SCREEN (ii) = xs; + IMAGE_INSTANCE_X_SUBWINDOW_DISPLAY (ii) = DisplayOfScreen (xs); xswa.backing_store = Always; valueMask |= CWBackingStore; xswa.colormap = DefaultColormapOfScreen (xs); valueMask |= CWColormap; - win = XCreateWindow (dpy, pw, 0, 0, w, h, 0, CopyFromParent, + /* Create a window for clipping */ + IMAGE_INSTANCE_X_CLIPWINDOW (ii) = + XCreateWindow (dpy, pw, 0, 0, w, h, 0, CopyFromParent, + InputOutput, CopyFromParent, valueMask, + &xswa); + + /* Now put the subwindow inside the clip window. */ + win = XCreateWindow (dpy, IMAGE_INSTANCE_X_CLIPWINDOW (ii), + 0, 0, w, h, 0, CopyFromParent, InputOutput, CopyFromParent, valueMask, &xswa); @@ -2161,7 +2181,7 @@ { if (IMAGE_INSTANCE_TYPE (ii) == IMAGE_SUBWINDOW) { - XResizeWindow (DisplayOfScreen (IMAGE_INSTANCE_X_SUBWINDOW_SCREEN (ii)), + XResizeWindow (IMAGE_INSTANCE_X_SUBWINDOW_DISPLAY (ii), IMAGE_INSTANCE_X_SUBWINDOW_ID (ii), w, h); } @@ -2215,7 +2235,24 @@ ii->data = xnew_and_zero (struct x_subwindow_data); + /* Create a clip window to contain the subwidget. Incredibly the + XEmacs manager seems to be the most appropriate widget for + this. Nothing else is simple enough and yet does what is + required. */ + XtSetArg (al [ac], XtNresize, False); ac++; + XtSetArg (al [ac], XtNmappedWhenManaged, FALSE); ac++; + XtSetArg (al [ac], XtNwidth, + (Dimension)IMAGE_INSTANCE_SUBWINDOW_WIDTH (ii)); ac++; + XtSetArg (al [ac], XtNheight, + (Dimension)IMAGE_INSTANCE_SUBWINDOW_HEIGHT (ii)); ac++; + IMAGE_INSTANCE_X_CLIPWIDGET (ii) + = XtCreateManagedWidget ("clipwindow", + emacsManagerWidgetClass, + FRAME_X_CONTAINER_WIDGET (f), al, ac); + /* copy any args we were given */ + ac = 0; + if (wv->nargs) lw_add_value_args_to_args (wv, al, &ac); @@ -2236,8 +2273,8 @@ wv->nargs = ac; wv->args = al; - - wid = lw_create_widget (type, wv->name, id, wv, FRAME_X_CONTAINER_WIDGET (f), + + wid = lw_create_widget (type, wv->name, id, wv, IMAGE_INSTANCE_X_CLIPWIDGET (ii), False, 0, popup_selection_callback, 0); IMAGE_INSTANCE_X_WIDGET_LWID (ii) = id; @@ -2273,7 +2310,8 @@ XtSetArg (al [ac], XtNy, &IMAGE_INSTANCE_X_WIDGET_YOFFSET (ii)); ac++; XtGetValues (FRAME_X_TEXT_WIDGET (f), al, ac); - IMAGE_INSTANCE_SUBWINDOW_ID (ii) = (void*)wid; + IMAGE_INSTANCE_SUBWINDOW_ID (ii) = (void*)wid; + XtMapWidget (wid); free_widget_value_tree (wv); } Index: glyphs-x.h =================================================================== RCS file: /usr/CVSroot/XEmacs/xemacs/src/glyphs-x.h,v retrieving revision 1.4.2.4 diff -u -r1.4.2.4 glyphs-x.h --- glyphs-x.h 1999/08/24 08:38:42 1.4.2.4 +++ glyphs-x.h 1999/09/16 16:25:25 @@ -84,11 +84,13 @@ { struct { - Screen *xscreen; + Display *display; Window parent_window; + Window clip_window; } sub; struct { + Widget clip_window; Position x_offset; Position y_offset; LWLIB_ID id; @@ -98,26 +100,34 @@ #define X_SUBWINDOW_INSTANCE_DATA(i) ((struct x_subwindow_data *) (i)->data) -#define IMAGE_INSTANCE_X_SUBWINDOW_SCREEN(i) \ - (X_SUBWINDOW_INSTANCE_DATA (i)->data.sub.xscreen) +#define IMAGE_INSTANCE_X_SUBWINDOW_DISPLAY(i) \ + (X_SUBWINDOW_INSTANCE_DATA (i)->data.sub.display) #define IMAGE_INSTANCE_X_SUBWINDOW_PARENT(i) \ (X_SUBWINDOW_INSTANCE_DATA (i)->data.sub.parent_window) +#define IMAGE_INSTANCE_X_CLIPWINDOW(i) \ + (X_SUBWINDOW_INSTANCE_DATA (i)->data.sub.clip_window) #define IMAGE_INSTANCE_X_WIDGET_XOFFSET(i) \ (X_SUBWINDOW_INSTANCE_DATA (i)->data.wid.x_offset) #define IMAGE_INSTANCE_X_WIDGET_YOFFSET(i) \ (X_SUBWINDOW_INSTANCE_DATA (i)->data.wid.y_offset) #define IMAGE_INSTANCE_X_WIDGET_LWID(i) \ (X_SUBWINDOW_INSTANCE_DATA (i)->data.wid.id) +#define IMAGE_INSTANCE_X_CLIPWIDGET(i) \ + (X_SUBWINDOW_INSTANCE_DATA (i)->data.wid.clip_window) #define XIMAGE_INSTANCE_X_SUBWINDOW_PARENT(i) \ IMAGE_INSTANCE_X_SUBWINDOW_PARENT (XIMAGE_INSTANCE (i)) -#define XIMAGE_INSTANCE_X_SUBWINDOW_SCREEN(i) \ - IMAGE_INSTANCE_X_SUBWINDOW_SCREEN (XIMAGE_INSTANCE (i)) +#define XIMAGE_INSTANCE_X_SUBWINDOW_DISPLAY(i) \ + IMAGE_INSTANCE_X_SUBWINDOW_DISPLAY (XIMAGE_INSTANCE (i)) #define XIMAGE_INSTANCE_X_WIDGET_XOFFSET(i) \ IMAGE_INSTANCE_X_WIDGET_XOFFSET (XIMAGE_INSTANCE (i)) #define XIMAGE_INSTANCE_X_WIDGET_YOFFSET(i) \ IMAGE_INSTANCE_X_WIDGET_YOFFSET (XIMAGE_INSTANCE (i)) #define XIMAGE_INSTANCE_X_WIDGET_LWID(i) \ IMAGE_INSTANCE_X_WIDGET_LWID (XIMAGE_INSTANCE (i)) +#define XIMAGE_INSTANCE_X_CLIPWIDGET(i) \ + IMAGE_INSTANCE_X_CLIPWIDGET (XIMAGE_INSTANCE (i)) +#define XIMAGE_INSTANCE_X_CLIPWINDOW(i) \ + IMAGE_INSTANCE_X_CLIPWINDOW (XIMAGE_INSTANCE (i)) #define IMAGE_INSTANCE_X_SUBWINDOW_ID(i) \ ((Window) IMAGE_INSTANCE_SUBWINDOW_ID (i)) #define IMAGE_INSTANCE_X_WIDGET_ID(i) \ Index: glyphs.c =================================================================== RCS file: /usr/CVSroot/XEmacs/xemacs/src/glyphs.c,v retrieving revision 1.23.2.24 diff -u -r1.23.2.24 glyphs.c --- glyphs.c 1999/09/07 14:48:23 1.23.2.24 +++ glyphs.c 1999/09/16 16:25:34 @@ -3971,7 +3971,8 @@ } /* show a subwindow in its frame */ -void map_subwindow (Lisp_Object subwindow, int x, int y) +void map_subwindow (Lisp_Object subwindow, int x, int y, + struct display_glyph_area *dga) { struct Lisp_Image_Instance* ii = XIMAGE_INSTANCE (subwindow); int elt; @@ -3994,9 +3995,11 @@ cachel = Dynarr_atp (f->subwindow_cachels, elt); cachel->x = x; cachel->y = y; + cachel->width = dga->width; + cachel->height = dga->height; cachel->being_displayed = 1; - MAYBE_DEVMETH (XDEVICE (ii->device), map_subwindow, (ii, x, y)); + MAYBE_DEVMETH (XDEVICE (ii->device), map_subwindow, (ii, x, y, dga)); } static int @@ -4108,9 +4111,9 @@ (subwindow)) { CHECK_SUBWINDOW_IMAGE_INSTANCE (subwindow); - +#if 0 map_subwindow (subwindow, 0, 0); - +#endif return subwindow; } Index: glyphs.h =================================================================== RCS file: /usr/CVSroot/XEmacs/xemacs/src/glyphs.h,v retrieving revision 1.18.2.16 diff -u -r1.18.2.16 glyphs.h --- glyphs.h 1999/08/24 08:38:43 1.18.2.16 +++ glyphs.h 1999/09/16 16:25:36 @@ -479,7 +479,7 @@ struct { Lisp_Object children; /* managed children */ - Lisp_Object border; /* orientation */ + Lisp_Object border; /* Style of enclosing border or text. */ } layout; } s; } subwindow; @@ -814,7 +814,8 @@ void mark_subwindow_cachels_as_not_updated (struct frame *f); void reset_subwindow_cachels (struct frame *f); void unmap_subwindow (Lisp_Object subwindow); -void map_subwindow (Lisp_Object subwindow, int x, int y); +void map_subwindow (Lisp_Object subwindow, int x, int y, + struct display_glyph_area *dga); void update_frame_subwindows (struct frame *f); int find_matching_subwindow (struct frame* f, int x, int y, int width, int height); Index: redisplay-output.c =================================================================== RCS file: /usr/CVSroot/XEmacs/xemacs/src/redisplay-output.c,v retrieving revision 1.11.2.15 diff -u -r1.11.2.15 redisplay-output.c --- redisplay-output.c 1999/09/07 14:48:24 1.11.2.15 +++ redisplay-output.c 1999/09/16 16:25:41 @@ -1156,16 +1156,17 @@ sdga.yoffset = -dga->yoffset; sdga.height = IMAGE_INSTANCE_SUBWINDOW_HEIGHT (p); sdga.width = IMAGE_INSTANCE_SUBWINDOW_WIDTH (p); - + if (redisplay_display_boxes_in_window_p (w, db, &sdga) < 0) { - redisplay_clear_region (window, findex, db->xpos, db->ypos, - dga->width, dga->height); - unmap_subwindow (image_instance); + map_subwindow (image_instance, db->xpos, db->ypos, dga); } else - map_subwindow (image_instance, db->xpos - dga->xoffset, - db->ypos - dga->yoffset); + { + sdga.xoffset = sdga.yoffset = 0; + map_subwindow (image_instance, db->xpos - dga->xoffset, + db->ypos - dga->yoffset, &sdga); + } } /****************************************************************************