diff options
| author | Gerd Moellmann | 2000-06-12 19:12:11 +0000 |
|---|---|---|
| committer | Gerd Moellmann | 2000-06-12 19:12:11 +0000 |
| commit | fc8fefedf3125f02de73c9c7756edf611d68d594 (patch) | |
| tree | fa5681cc299ba6bc5cc45c77d39776a59a9dc67e | |
| parent | 4cc436ed3b6e2c422e70d5a4216fa4b244d637bc (diff) | |
| download | emacs-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.c | 41 |
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. */ |
| 39 | extern int x_alloc_nearest_color_for_widget __P ((Widget, Colormap, XColor*)); | 40 | extern int x_alloc_nearest_color_for_widget __P ((Widget, Colormap, XColor*)); |
| @@ -41,6 +42,12 @@ extern int x_catch_errors __P ((Display*)); | |||
| 41 | extern int x_uncatch_errors __P ((Display*, int)); | 42 | extern int x_uncatch_errors __P ((Display*, int)); |
| 42 | extern int x_had_errors_p __P ((Display*)); | 43 | extern int x_had_errors_p __P ((Display*)); |
| 43 | extern int x_clear_errors __P ((Display*)); | 44 | extern int x_clear_errors __P ((Display*)); |
| 45 | extern unsigned long x_copy_dpy_color __P ((Display *, Colormap, | ||
| 46 | unsigned long)); | ||
| 47 | |||
| 48 | /* Defined in xfaces.c. */ | ||
| 49 | extern void x_free_dpy_colors __P ((Display *, Screen *, Colormap, | ||
| 50 | unsigned long *pixels, int npixels)); | ||
| 44 | #endif | 51 | #endif |
| 45 | 52 | ||
| 46 | static int pointer_grabbed; | 53 | static 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 | |||
| 1530 | release_shadow_gcs (mw) | 1553 | release_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 | } |