aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorGerd Moellmann2000-06-12 19:12:11 +0000
committerGerd Moellmann2000-06-12 19:12:11 +0000
commitfc8fefedf3125f02de73c9c7756edf611d68d594 (patch)
treefa5681cc299ba6bc5cc45c77d39776a59a9dc67e
parent4cc436ed3b6e2c422e70d5a4216fa4b244d637bc (diff)
downloademacs-fc8fefedf3125f02de73c9c7756edf611d68d594.tar.gz
emacs-fc8fefedf3125f02de73c9c7756edf611d68d594.zip
(make_shadow_gcs): Free and copy colors so that
color reference counts are right. (release_shadow_gcs): Free colors.
-rw-r--r--lwlib/xlwmenu.c41
1 files changed, 36 insertions, 5 deletions
diff --git a/lwlib/xlwmenu.c b/lwlib/xlwmenu.c
index 847997c24fa..034875f53ca 100644
--- a/lwlib/xlwmenu.c
+++ b/lwlib/xlwmenu.c
@@ -34,6 +34,7 @@ Boston, MA 02111-1307, USA. */
34#include <X11/cursorfont.h> 34#include <X11/cursorfont.h>
35#include <X11/bitmaps/gray> 35#include <X11/bitmaps/gray>
36#include "xlwmenuP.h" 36#include "xlwmenuP.h"
37
37#ifdef emacs 38#ifdef emacs
38/* Defined in xterm.c. */ 39/* Defined in xterm.c. */
39extern int x_alloc_nearest_color_for_widget __P ((Widget, Colormap, XColor*)); 40extern int x_alloc_nearest_color_for_widget __P ((Widget, Colormap, XColor*));
@@ -41,6 +42,12 @@ extern int x_catch_errors __P ((Display*));
41extern int x_uncatch_errors __P ((Display*, int)); 42extern int x_uncatch_errors __P ((Display*, int));
42extern int x_had_errors_p __P ((Display*)); 43extern int x_had_errors_p __P ((Display*));
43extern int x_clear_errors __P ((Display*)); 44extern int x_clear_errors __P ((Display*));
45extern unsigned long x_copy_dpy_color __P ((Display *, Colormap,
46 unsigned long));
47
48/* Defined in xfaces.c. */
49extern void x_free_dpy_colors __P ((Display *, Screen *, Colormap,
50 unsigned long *pixels, int npixels));
44#endif 51#endif
45 52
46static int pointer_grabbed; 53static int pointer_grabbed;
@@ -621,7 +628,6 @@ draw_shadow_rhombus (mw, window, x, y, width, height, erase_p, down_p)
621 GC bottom_gc = !erase_p ? mw->menu.shadow_bottom_gc : mw->menu.background_gc; 628 GC bottom_gc = !erase_p ? mw->menu.shadow_bottom_gc : mw->menu.background_gc;
622 int thickness = mw->menu.shadow_thickness; 629 int thickness = mw->menu.shadow_thickness;
623 XPoint points [4]; 630 XPoint points [4];
624 double sqrt2 = 1.4142;
625 631
626 if (!erase_p && down_p) 632 if (!erase_p && down_p)
627 { 633 {
@@ -1494,9 +1500,19 @@ make_shadow_gcs (mw)
1494 else if (topc.pixel == botc.pixel) 1500 else if (topc.pixel == botc.pixel)
1495 { 1501 {
1496 if (botc.pixel == mw->menu.foreground) 1502 if (botc.pixel == mw->menu.foreground)
1497 mw->menu.top_shadow_color = mw->core.background_pixel; 1503 {
1504 x_free_dpy_colors (dpy, screen, cmap,
1505 &mw->menu.top_shadow_color, 1);
1506 mw->menu.top_shadow_color
1507 = x_copy_dpy_color (dpy, cmap, mw->core.background_pixel);
1508 }
1498 else 1509 else
1499 mw->menu.bottom_shadow_color = mw->menu.foreground; 1510 {
1511 x_free_dpy_colors (dpy, screen, cmap,
1512 &mw->menu.bottom_shadow_color, 1);
1513 mw->menu.bottom_shadow_color
1514 = x_copy_dpy_color (dpy, cmap, mw->menu.foreground);
1515 }
1500 } 1516 }
1501 } 1517 }
1502 1518
@@ -1504,13 +1520,20 @@ make_shadow_gcs (mw)
1504 mw->menu.top_shadow_color == mw->core.background_pixel) 1520 mw->menu.top_shadow_color == mw->core.background_pixel)
1505 { 1521 {
1506 mw->menu.top_shadow_pixmap = mw->menu.gray_pixmap; 1522 mw->menu.top_shadow_pixmap = mw->menu.gray_pixmap;
1507 mw->menu.top_shadow_color = mw->menu.foreground; 1523 if (top_frobbed)
1524 x_free_dpy_colors (dpy, screen, cmap, &mw->menu.top_shadow_color, 1);
1525 mw->menu.top_shadow_color = x_copy_dpy_color (dpy, cmap,
1526 mw->menu.foreground);
1508 } 1527 }
1509 if (!mw->menu.bottom_shadow_pixmap && 1528 if (!mw->menu.bottom_shadow_pixmap &&
1510 mw->menu.bottom_shadow_color == mw->core.background_pixel) 1529 mw->menu.bottom_shadow_color == mw->core.background_pixel)
1511 { 1530 {
1512 mw->menu.bottom_shadow_pixmap = mw->menu.gray_pixmap; 1531 mw->menu.bottom_shadow_pixmap = mw->menu.gray_pixmap;
1513 mw->menu.bottom_shadow_color = mw->menu.foreground; 1532 if (bottom_frobbed)
1533 x_free_dpy_colors (dpy, screen, cmap,
1534 &mw->menu.bottom_shadow_color, 1);
1535 mw->menu.bottom_shadow_color = x_copy_dpy_color (dpy, cmap,
1536 mw->menu.foreground);
1514 } 1537 }
1515 1538
1516 xgcv.fill_style = FillStippled; 1539 xgcv.fill_style = FillStippled;
@@ -1530,6 +1553,14 @@ static void
1530release_shadow_gcs (mw) 1553release_shadow_gcs (mw)
1531 XlwMenuWidget mw; 1554 XlwMenuWidget mw;
1532{ 1555{
1556 Display *dpy = XtDisplay ((Widget) mw);
1557 Screen *screen = XtScreen ((Widget) mw);
1558 Colormap cmap = mw->core.colormap;
1559 Pixel px[2];
1560
1561 px[0] = mw->menu.top_shadow_color;
1562 px[1] = mw->menu.bottom_shadow_color;
1563 x_free_dpy_colors (dpy, screen, cmap, px, 2);
1533 XtReleaseGC ((Widget) mw, mw->menu.shadow_top_gc); 1564 XtReleaseGC ((Widget) mw, mw->menu.shadow_top_gc);
1534 XtReleaseGC ((Widget) mw, mw->menu.shadow_bottom_gc); 1565 XtReleaseGC ((Widget) mw, mw->menu.shadow_bottom_gc);
1535} 1566}