Mercurial > hg > xemacs-beta
diff src/toolbar-x.c @ 744:8ae895c67ce7
[xemacs-hg @ 2002-02-04 15:44:37 by wmperry]
Enable generic toolbar support for X11. Added new toolbar-shadow-thickness specifier.
author | wmperry |
---|---|
date | Mon, 04 Feb 2002 15:44:52 +0000 |
parents | fdefd0186b75 |
children | 79c6ff3eef26 |
line wrap: on
line diff
--- a/src/toolbar-x.c Mon Feb 04 13:19:17 2002 +0000 +++ b/src/toolbar-x.c Mon Feb 04 15:44:52 2002 +0000 @@ -39,730 +39,16 @@ #include "toolbar.h" #include "window.h" -static void -x_draw_blank_toolbar_button (struct frame *f, int x, int y, int width, - int height, int threed, int border_width, - int vertical) -{ - struct device *d = XDEVICE (f->device); - EmacsFrame ef = (EmacsFrame) FRAME_X_TEXT_WIDGET (f); - int shadow_thickness = ef->emacs_frame.toolbar_shadow_thickness; - int sx = x, sy = y, swidth = width, sheight = height; - - Display *dpy = DEVICE_X_DISPLAY (d); - Window x_win = XtWindow (FRAME_X_TEXT_WIDGET (f)); - GC top_shadow_gc, bottom_shadow_gc, background_gc; - - background_gc = FRAME_X_TOOLBAR_BLANK_BACKGROUND_GC (f); - - if (threed) - { - top_shadow_gc = FRAME_X_TOOLBAR_TOP_SHADOW_GC (f); - bottom_shadow_gc = FRAME_X_TOOLBAR_BOTTOM_SHADOW_GC (f); - } - else - { - top_shadow_gc = background_gc; - bottom_shadow_gc = background_gc; - } - - if (vertical) - { - sx += border_width; - swidth -= 2 * border_width; - } - else - { - sy += border_width; - sheight -= 2 * border_width; - } - - /* Draw the outline. */ - x_output_shadows (f, sx, sy, swidth, sheight, top_shadow_gc, - bottom_shadow_gc, background_gc, shadow_thickness, - EDGE_ALL); - - /* Blank the middle. */ - XFillRectangle (dpy, x_win, background_gc, sx + shadow_thickness, - sy + shadow_thickness, swidth - shadow_thickness * 2, - sheight - shadow_thickness * 2); - - /* Do the border */ - XFillRectangle (dpy, x_win, background_gc, x, y, - (vertical ? border_width : width), - (vertical ? height : border_width)); - XFillRectangle (dpy, x_win, background_gc, - (vertical ? sx + swidth : x), - (vertical ? y : sy + sheight), - (vertical ? border_width : width), - (vertical ? height : border_width)); -} - -static void -x_output_toolbar_button (struct frame *f, Lisp_Object button) -{ - struct device *d = XDEVICE (f->device); - EmacsFrame ef = (EmacsFrame) FRAME_X_TEXT_WIDGET (f); - int shadow_thickness = ef->emacs_frame.toolbar_shadow_thickness; - int x_adj, y_adj, width_adj, height_adj; - - Display *dpy = DEVICE_X_DISPLAY (d); - Window x_win = XtWindow (FRAME_X_TEXT_WIDGET (f)); - GC top_shadow_gc, bottom_shadow_gc, background_gc; - Lisp_Object instance, frame, window, glyph; - struct toolbar_button *tb = XTOOLBAR_BUTTON (button); - Lisp_Image_Instance *p; - struct window *w; - int vertical = tb->vertical; - int border_width = tb->border_width; - - if (vertical) - { - x_adj = border_width; - width_adj = - 2 * border_width; - y_adj = 0; - height_adj = 0; - } - else - { - x_adj = 0; - width_adj = 0; - y_adj = border_width; - height_adj = - 2 * border_width; - } - - XSETFRAME (frame, f); - window = FRAME_LAST_NONMINIBUF_WINDOW (f); - w = XWINDOW (window); - - glyph = get_toolbar_button_glyph (w, tb); - - if (tb->enabled) - { - if (tb->down) - { - top_shadow_gc = FRAME_X_TOOLBAR_BOTTOM_SHADOW_GC (f); - bottom_shadow_gc = FRAME_X_TOOLBAR_TOP_SHADOW_GC (f); - } - else - { - top_shadow_gc = FRAME_X_TOOLBAR_TOP_SHADOW_GC (f); - bottom_shadow_gc = FRAME_X_TOOLBAR_BOTTOM_SHADOW_GC (f); - } - } - else - { - top_shadow_gc = FRAME_X_TOOLBAR_BLANK_BACKGROUND_GC (f); - bottom_shadow_gc = FRAME_X_TOOLBAR_BLANK_BACKGROUND_GC (f); - } - background_gc = FRAME_X_TOOLBAR_BLANK_BACKGROUND_GC (f); - - /* Draw the outline. */ - x_output_shadows (f, tb->x + x_adj, tb->y + y_adj, - tb->width + width_adj, tb->height + height_adj, - top_shadow_gc, - bottom_shadow_gc, background_gc, shadow_thickness, - EDGE_ALL); - - /* Clear the pixmap area. */ - XFillRectangle (dpy, x_win, background_gc, tb->x + x_adj + shadow_thickness, - tb->y + y_adj + shadow_thickness, - tb->width + width_adj - shadow_thickness * 2, - tb->height + height_adj - shadow_thickness * 2); - - /* Do the border. */ - XFillRectangle (dpy, x_win, background_gc, tb->x, tb->y, - (vertical ? border_width : tb->width), - (vertical ? tb->height : border_width)); - - XFillRectangle (dpy, x_win, background_gc, - (vertical ? tb->x + tb->width - border_width : tb->x), - (vertical ? tb->y : tb->y + tb->height - border_width), - (vertical ? border_width : tb->width), - (vertical ? tb->height : border_width)); - - background_gc = FRAME_X_TOOLBAR_PIXMAP_BACKGROUND_GC (f); - - /* #### It is currently possible for users to trash us by directly - changing the toolbar glyphs. Avoid crashing in that case. */ - if (GLYPHP (glyph)) - instance = glyph_image_instance (glyph, window, ERROR_ME_NOT, 1); - else - instance = Qnil; - - if (IMAGE_INSTANCEP (instance)) - { - int width = tb->width + width_adj - shadow_thickness * 2; - int height = tb->height + height_adj - shadow_thickness * 2; - int x_offset = x_adj + shadow_thickness; - int y_offset = y_adj + shadow_thickness; - - p = XIMAGE_INSTANCE (instance); - - if (IMAGE_INSTANCE_PIXMAP_TYPE_P (p)) - { - if (width > (int) IMAGE_INSTANCE_PIXMAP_WIDTH (p)) - { - x_offset += ((int) (width - IMAGE_INSTANCE_PIXMAP_WIDTH (p)) - / 2); - width = IMAGE_INSTANCE_PIXMAP_WIDTH (p); - } - if (height > (int) IMAGE_INSTANCE_PIXMAP_HEIGHT (p)) - { - y_offset += ((int) (height - IMAGE_INSTANCE_PIXMAP_HEIGHT (p)) - / 2); - height = IMAGE_INSTANCE_PIXMAP_HEIGHT (p); - } - - x_output_x_pixmap (f, XIMAGE_INSTANCE (instance), tb->x + x_offset, - tb->y + y_offset, 0, 0, width, height, - 0, 0, background_gc); - } - else if (IMAGE_INSTANCE_TYPE (p) == IMAGE_TEXT) - { - /* #### We need to make the face used configurable. */ - struct face_cachel *cachel = - WINDOW_FACE_CACHEL (w, DEFAULT_INDEX); - struct display_line dl; - Lisp_Object string = IMAGE_INSTANCE_TEXT_STRING (p); - unsigned char charsets[NUM_LEADING_BYTES]; - Emchar_dynarr *buf; - struct font_metric_info fm; - - /* This could be true if we were called via the Expose event - handler. Mark the button as dirty and return - immediately. */ - if (f->window_face_cache_reset) - { - tb->dirty = 1; - MARK_TOOLBAR_CHANGED; - return; - } - buf = Dynarr_new (Emchar); - convert_intbyte_string_into_emchar_dynarr - (XSTRING_DATA (string), XSTRING_LENGTH (string), buf); - find_charsets_in_emchar_string (charsets, Dynarr_atp (buf, 0), - Dynarr_length (buf)); - ensure_face_cachel_complete (cachel, window, charsets); - face_cachel_charset_font_metric_info (cachel, charsets, &fm); - - dl.ascent = fm.ascent; - dl.descent = fm.descent; - dl.ypos = tb->y + y_offset + fm.ascent; - - if (fm.ascent + fm.descent <= height) - { - dl.ypos += (height - fm.ascent - fm.descent) / 2; - dl.clip = 0; - } - else - { - dl.clip = fm.ascent + fm.descent - height; - } - - x_output_string (w, &dl, buf, tb->x + x_offset, 0, 0, width, - DEFAULT_INDEX, 0, 0, 0, 0); - Dynarr_free (buf); - } - - /* We silently ignore the image if it isn't a pixmap or text. */ - } - - tb->dirty = 0; -} - -static int -x_get_button_size (struct frame *f, Lisp_Object window, - struct toolbar_button *tb, int vert, int pos) -{ - EmacsFrame ef = (EmacsFrame) FRAME_X_TEXT_WIDGET (f); - int shadow_thickness = ef->emacs_frame.toolbar_shadow_thickness; - int size; - - if (tb->blank) - { - if (!NILP (tb->down_glyph)) - size = XINT (tb->down_glyph); - else - size = DEFAULT_TOOLBAR_BLANK_SIZE; - } - else - { - struct window *w = XWINDOW (window); - Lisp_Object glyph = get_toolbar_button_glyph (w, tb); - - /* Unless, of course, the user has done something stupid like - change the glyph out from under us. Use a blank placeholder - in that case. */ - if (NILP (glyph)) - return XINT (f->toolbar_size[pos]); - - if (vert) - size = glyph_height (glyph, window); - else - size = glyph_width (glyph, window); - } - - if (!size) - { - /* If the glyph doesn't have a size we'll insert a blank - placeholder instead. */ - return XINT (f->toolbar_size[pos]); - } - - size += shadow_thickness * 2; - - return (size); -} - -#define X_OUTPUT_BUTTONS_LOOP(left) \ - do { \ - while (!NILP (button)) \ - { \ - struct toolbar_button *tb = XTOOLBAR_BUTTON (button); \ - int size, height, width; \ - \ - if (left && tb->pushright) \ - break; \ - \ - size = x_get_button_size (f, window, tb, vert, pos); \ - \ - if (vert) \ - { \ - width = bar_width; \ - if (y + size > max_pixpos) \ - height = max_pixpos - y; \ - else \ - height = size; \ - } \ - else \ - { \ - if (x + size > max_pixpos) \ - width = max_pixpos - x; \ - else \ - width = size; \ - height = bar_height; \ - } \ - \ - if (tb->x != x \ - || tb->y != y \ - || tb->width != width \ - || tb->height != height \ - || tb->dirty) \ - { \ - if (width && height) \ - { \ - tb->x = x; \ - tb->y = y; \ - tb->width = width; \ - tb->height = height; \ - tb->border_width = border_width; \ - tb->vertical = vert; \ - \ - if (tb->blank || NILP (tb->up_glyph)) \ - { \ - int threed = (EQ (Qt, tb->up_glyph) ? 1 : 0); \ - x_draw_blank_toolbar_button (f, x, y, width, \ - height, threed, \ - border_width, vert); \ - } \ - else \ - x_output_toolbar_button (f, button); \ - } \ - } \ - \ - if (vert) \ - y += height; \ - else \ - x += width; \ - \ - if ((vert && y == max_pixpos) || (!vert && x == max_pixpos)) \ - button = Qnil; \ - else \ - button = tb->next; \ - } \ - } while (0) +#include "toolbar-common.h" -#define SET_TOOLBAR_WAS_VISIBLE_FLAG(frame, pos, flag) \ - do { \ - switch (pos) \ - { \ - case TOP_TOOLBAR: \ - (frame)->top_toolbar_was_visible = flag; \ - break; \ - case BOTTOM_TOOLBAR: \ - (frame)->bottom_toolbar_was_visible = flag; \ - break; \ - case LEFT_TOOLBAR: \ - (frame)->left_toolbar_was_visible = flag; \ - break; \ - case RIGHT_TOOLBAR: \ - (frame)->right_toolbar_was_visible = flag; \ - break; \ - default: \ - abort (); \ - } \ - } while (0) - -static void -x_output_toolbar (struct frame *f, enum toolbar_pos pos) -{ - struct device *d = XDEVICE (f->device); - int x, y, bar_width, bar_height, vert; - int max_pixpos, right_size, right_start, blank_size; - int border_width = FRAME_REAL_TOOLBAR_BORDER_WIDTH (f, pos); - Lisp_Object button, window; - Display *dpy = DEVICE_X_DISPLAY (d); - Window x_win = XtWindow (FRAME_X_TEXT_WIDGET (f)); - GC background_gc = FRAME_X_TOOLBAR_BLANK_BACKGROUND_GC (f); - - get_toolbar_coords (f, pos, &x, &y, &bar_width, &bar_height, &vert, 1); - window = FRAME_LAST_NONMINIBUF_WINDOW (f); - - /* Do the border */ - XFillRectangle (dpy, x_win, background_gc, x, y, - (vert ? bar_width : border_width), - (vert ? border_width : bar_height)); - XFillRectangle (dpy, x_win, background_gc, - (vert ? x : x + bar_width - border_width), - (vert ? y + bar_height - border_width : y), - (vert ? bar_width : border_width), - (vert ? border_width : bar_height)); - - if (vert) - { - max_pixpos = y + bar_height - border_width; - y += border_width; - } - else - { - max_pixpos = x + bar_width - border_width; - x += border_width; - } - - button = FRAME_TOOLBAR_BUTTONS (f, pos); - right_size = 0; - - /* First loop over all of the buttons to determine how much room we - need for left hand and right hand buttons. This loop will also - make sure that all instances are instantiated so when we actually - output them they will come up immediately. */ - while (!NILP (button)) - { - struct toolbar_button *tb = XTOOLBAR_BUTTON (button); - int size = x_get_button_size (f, window, tb, vert, pos); - - if (tb->pushright) - right_size += size; - - button = tb->next; - } - - button = FRAME_TOOLBAR_BUTTONS (f, pos); - - /* Loop over the left buttons, updating and outputting them. */ - X_OUTPUT_BUTTONS_LOOP (1); - - /* Now determine where the right buttons start. */ - right_start = max_pixpos - right_size; - if (right_start < (vert ? y : x)) - right_start = (vert ? y : x); - - /* Output the blank which goes from the end of the left buttons to - the start of the right. */ - blank_size = right_start - (vert ? y : x); - if (blank_size) - { - int height, width; - - if (vert) - { - width = bar_width; - height = blank_size; - } - else - { - width = blank_size; - height = bar_height; - } - - /* - * Use a 3D pushright separator only if there isn't a toolbar - * border. A flat separator meshes with the border and looks - * better. - */ - x_draw_blank_toolbar_button (f, x, y, width, height, !border_width, - border_width, vert); - - if (vert) - y += height; - else - x += width; - } - - /* Loop over the right buttons, updating and outputting them. */ - X_OUTPUT_BUTTONS_LOOP (0); - - if (!vert) - { - Lisp_Object frame; - - XSETFRAME (frame, f); - redisplay_clear_region (frame, - DEFAULT_INDEX, FRAME_PIXWIDTH (f) - 1, y, 1, - bar_height); - } - - SET_TOOLBAR_WAS_VISIBLE_FLAG (f, pos, 1); - - XFlush (DEVICE_X_DISPLAY (d)); -} - -static void -x_clear_toolbar (struct frame *f, enum toolbar_pos pos, int thickness_change) -{ - Lisp_Object frame; - struct device *d = XDEVICE (f->device); - int x, y, width, height, vert; - - get_toolbar_coords (f, pos, &x, &y, &width, &height, &vert, 1); - XSETFRAME (frame, f); - - /* The thickness_change parameter is used by the toolbar resize routines - to clear any excess toolbar if the size shrinks. */ - if (thickness_change < 0) - { - if (pos == LEFT_TOOLBAR || pos == RIGHT_TOOLBAR) - { - x = x + width + thickness_change; - width = -thickness_change; - } - else - { - y = y + height + thickness_change; - height = -thickness_change; - } - } - - SET_TOOLBAR_WAS_VISIBLE_FLAG (f, pos, 0); - - redisplay_clear_region (frame, DEFAULT_INDEX, x, y, width, height); - XFlush (DEVICE_X_DISPLAY (d)); -} - -static void -x_output_frame_toolbars (struct frame *f) -{ - assert (FRAME_X_P (f)); - - if (FRAME_REAL_TOP_TOOLBAR_VISIBLE (f)) - x_output_toolbar (f, TOP_TOOLBAR); - else if (f->top_toolbar_was_visible) - x_clear_toolbar (f, TOP_TOOLBAR, 0); - - if (FRAME_REAL_BOTTOM_TOOLBAR_VISIBLE (f)) - x_output_toolbar (f, BOTTOM_TOOLBAR); - else if (f->bottom_toolbar_was_visible) - x_clear_toolbar (f, BOTTOM_TOOLBAR, 0); - - if (FRAME_REAL_LEFT_TOOLBAR_VISIBLE (f)) - x_output_toolbar (f, LEFT_TOOLBAR); - else if (f->left_toolbar_was_visible) - x_clear_toolbar (f, LEFT_TOOLBAR, 0); - - if (FRAME_REAL_RIGHT_TOOLBAR_VISIBLE (f)) - x_output_toolbar (f, RIGHT_TOOLBAR); - else if (f->right_toolbar_was_visible) - x_clear_toolbar (f, RIGHT_TOOLBAR, 0); -} - -static void -x_redraw_exposed_toolbar (struct frame *f, enum toolbar_pos pos, int x, int y, - int width, int height) -{ - int bar_x, bar_y, bar_width, bar_height, vert; - Lisp_Object button = FRAME_TOOLBAR_BUTTONS (f, pos); - - get_toolbar_coords (f, pos, &bar_x, &bar_y, &bar_width, &bar_height, - &vert, 1); - - if (((y + height) < bar_y) || (y > (bar_y + bar_height))) - return; - if (((x + width) < bar_x) || (x > (bar_x + bar_width))) - return; - - while (!NILP (button)) - { - struct toolbar_button *tb = XTOOLBAR_BUTTON (button); - - if (vert) - { - if (((tb->y + tb->height) > y) && (tb->y < (y + height))) - tb->dirty = 1; - - /* If this is true we have gone past the exposed region. */ - if (tb->y > (y + height)) - break; - } - else - { - if (((tb->x + tb->width) > x) && (tb->x < (x + width))) - tb->dirty = 1; - - /* If this is true we have gone past the exposed region. */ - if (tb->x > (x + width)) - break; - } - - button = tb->next; - } - - /* Even if none of the buttons is in the area, the blank region at - the very least must be because the first thing we did is verify - that some portion of the toolbar is in the exposed region. */ - x_output_toolbar (f, pos); -} - -static void -x_redraw_exposed_toolbars (struct frame *f, int x, int y, int width, - int height) -{ - assert (FRAME_X_P (f)); - - if (FRAME_REAL_TOP_TOOLBAR_VISIBLE (f)) - x_redraw_exposed_toolbar (f, TOP_TOOLBAR, x, y, width, height); - - if (FRAME_REAL_BOTTOM_TOOLBAR_VISIBLE (f)) - x_redraw_exposed_toolbar (f, BOTTOM_TOOLBAR, x, y, width, height); - - if (FRAME_REAL_LEFT_TOOLBAR_VISIBLE (f)) - x_redraw_exposed_toolbar (f, LEFT_TOOLBAR, x, y, width, height); - - if (FRAME_REAL_RIGHT_TOOLBAR_VISIBLE (f)) - x_redraw_exposed_toolbar (f, RIGHT_TOOLBAR, x, y, width, height); -} - -static void -x_redraw_frame_toolbars (struct frame *f) -{ - /* There are certain startup paths that lead to update_EmacsFrame in - faces.c being called before a new frame is fully initialized. In - particular before we have actually mapped it. That routine can - call this one. So, we need to make sure that the frame is - actually ready before we try and draw all over it. */ - - if (XtIsRealized (FRAME_X_SHELL_WIDGET (f))) - x_redraw_exposed_toolbars (f, 0, 0, FRAME_PIXWIDTH (f), - FRAME_PIXHEIGHT (f)); -} - - -static void -x_initialize_frame_toolbar_gcs (struct frame *f) -{ - EmacsFrame ef = (EmacsFrame) FRAME_X_TEXT_WIDGET (f); - EmacsFramePart *efp = &(ef->emacs_frame); - XGCValues gcv; - unsigned long flags = (GCForeground | GCBackground | GCGraphicsExposures); - - /* - * If backgroundToolBarColor is specified, use it. - * Otherwise use the background resource. - */ - if (efp->background_toolbar_pixel == (Pixel) (-1)) - efp->background_toolbar_pixel = efp->background_pixel; - - /* - * #### - * If foregroundToolBarColor is specified, use it. - * Otherwise use the foreground resource. - * - * The foreground pixel is currently unused, but will likely be - * used when toolbar captions are generated by the toolbar code - * instead being incorporated into the icon image. - */ - if (efp->foreground_toolbar_pixel == (Pixel) (-1)) - efp->foreground_toolbar_pixel = efp->foreground_pixel; - - gcv.foreground = efp->background_toolbar_pixel; - gcv.background = ef->core.background_pixel; - gcv.graphics_exposures = False; - FRAME_X_TOOLBAR_BLANK_BACKGROUND_GC (f) = - XtGetGC ((Widget) ef, flags, &gcv); - - if (efp->top_toolbar_shadow_pixel == efp->bottom_toolbar_shadow_pixel) - { - efp->top_toolbar_shadow_pixel = efp->background_toolbar_pixel; - efp->bottom_toolbar_shadow_pixel = efp->background_toolbar_pixel; - } - - x_generate_shadow_pixels (f, &efp->top_toolbar_shadow_pixel, - &efp->bottom_toolbar_shadow_pixel, - efp->background_toolbar_pixel, - ef->core.background_pixel); - - gcv.foreground = efp->top_toolbar_shadow_pixel; - gcv.background = ef->core.background_pixel; - gcv.graphics_exposures = False; - flags = GCForeground | GCBackground | GCGraphicsExposures; - if (efp->top_toolbar_shadow_pixmap) - { - gcv.fill_style = FillOpaqueStippled; - gcv.stipple = efp->top_toolbar_shadow_pixmap; - flags |= GCStipple | GCFillStyle; - } - FRAME_X_TOOLBAR_TOP_SHADOW_GC (f) = XtGetGC ((Widget) ef, flags, &gcv); - - gcv.foreground = efp->bottom_toolbar_shadow_pixel; - gcv.background = ef->core.background_pixel; - gcv.graphics_exposures = False; - flags = GCForeground | GCBackground | GCGraphicsExposures; - if (efp->bottom_toolbar_shadow_pixmap) - { - gcv.fill_style = FillOpaqueStippled; - gcv.stipple = efp->bottom_toolbar_shadow_pixmap; - flags |= GCStipple | GCFillStyle; - } - FRAME_X_TOOLBAR_BOTTOM_SHADOW_GC (f) = XtGetGC ((Widget) ef, flags, &gcv); - -#ifdef HAVE_XPM - FRAME_X_TOOLBAR_PIXMAP_BACKGROUND_GC (f) = - FRAME_X_TOOLBAR_BLANK_BACKGROUND_GC (f); -#else - { - struct device *d = XDEVICE (f->device); - Display *dpy = DEVICE_X_DISPLAY (d); - - gcv.background = WhitePixelOfScreen (DefaultScreenOfDisplay (dpy)); - gcv.foreground = BlackPixelOfScreen (DefaultScreenOfDisplay (dpy)); - gcv.graphics_exposures = False; - flags = GCForeground | GCBackground | GCGraphicsExposures; - FRAME_X_TOOLBAR_PIXMAP_BACKGROUND_GC (f) = - XtGetGC ((Widget) ef, flags, &gcv); - } -#endif -} - -static void -x_release_frame_toolbar_gcs (struct frame *f) -{ - Widget ew = (Widget) FRAME_X_TEXT_WIDGET (f); - XtReleaseGC (ew, FRAME_X_TOOLBAR_BLANK_BACKGROUND_GC (f)); - /* If compiled with XPM support, this is a pointer to the same GC as - FRAME_X_BLANK_BACKGROUND_GC so we need to make sure we don't - release it twice. */ -#ifndef HAVE_XPM - XtReleaseGC (ew, FRAME_X_TOOLBAR_PIXMAP_BACKGROUND_GC (f)); -#endif - XtReleaseGC (ew, FRAME_X_TOOLBAR_TOP_SHADOW_GC (f)); - XtReleaseGC (ew, FRAME_X_TOOLBAR_BOTTOM_SHADOW_GC (f)); - - /* Seg fault if we try and use these again. */ - FRAME_X_TOOLBAR_BLANK_BACKGROUND_GC (f) = (GC) - 1; - FRAME_X_TOOLBAR_PIXMAP_BACKGROUND_GC (f) = (GC) - 1; - FRAME_X_TOOLBAR_TOP_SHADOW_GC (f) = (GC) - 1; - FRAME_X_TOOLBAR_BOTTOM_SHADOW_GC (f) = (GC) - 1; -} +/* We should really create a 'common' console type and fill it with +** all the shared code. We would then just use +** CONSOLE_INHERITS_METHOD(x,common,blah) +*/ +#define x_output_frame_toolbars common_output_frame_toolbars +#define x_output_toolbar_button common_output_toolbar_button +#define x_redraw_exposed_toolbars common_redraw_exposed_toolbars +#define x_redraw_frame_toolbars common_redraw_frame_toolbars static void x_initialize_frame_toolbars (struct frame *f) @@ -772,8 +58,6 @@ if (ef->emacs_frame.toolbar_shadow_thickness < MINIMUM_SHADOW_THICKNESS) Xt_SET_VALUE (FRAME_X_TEXT_WIDGET (f), XtNtoolBarShadowThickness, MINIMUM_SHADOW_THICKNESS); - - x_initialize_frame_toolbar_gcs (f); } /* This only calls one function but we go ahead and create this in @@ -781,7 +65,6 @@ static void x_free_frame_toolbars (struct frame *f) { - x_release_frame_toolbar_gcs (f); }