From a76206dcc37bf420bded365c02e89a2192422154 Mon Sep 17 00:00:00 2001 From: "Richard M. Stallman" Date: Sun, 26 Apr 1998 22:36:29 +0000 Subject: [PATCH] (x_set_foreground_color, x_set_background_color) (x_set_mouse_color, x_set_cursor_color): Don't call unload_color if same pixel is used in another slot in the frame. (x_set_foreground_color): Call unload_color on the old color. (x_set_background_color, x_set_mouse_color): Likewise. (x_set_cursor_color, x_set_border_pixel): Likewise. --- src/xfns.c | 63 ++++++++++++++++++++++++++++++++++++++++++------------ 1 file changed, 49 insertions(+), 14 deletions(-) diff --git a/src/xfns.c b/src/xfns.c index 68a0e63104..4f4e26fac1 100644 --- a/src/xfns.c +++ b/src/xfns.c @@ -1203,8 +1203,15 @@ x_set_foreground_color (f, arg, oldval) struct frame *f; Lisp_Object arg, oldval; { - f->output_data.x->foreground_pixel + unsigned long pixel = x_decode_color (f, arg, BLACK_PIX_DEFAULT (f)); + + if (f->output_data.x->foreground_pixel != f->output_data.x->mouse_pixel + && f->output_data.x->foreground_pixel != f->output_data.x->cursor_pixel + && f->output_data.x->foreground_pixel != f->output_data.x->cursor_foreground_pixel) + unload_color (f, f->output_data.x->foreground_pixel); + f->output_data.x->foreground_pixel = pixel; + if (FRAME_X_WINDOW (f) != 0) { BLOCK_INPUT; @@ -1227,9 +1234,15 @@ x_set_background_color (f, arg, oldval) Pixmap temp; int mask; - f->output_data.x->background_pixel + unsigned long pixel = x_decode_color (f, arg, WHITE_PIX_DEFAULT (f)); + if (f->output_data.x->background_pixel != f->output_data.x->mouse_pixel + && f->output_data.x->background_pixel != f->output_data.x->cursor_pixel + && f->output_data.x->background_pixel != f->output_data.x->cursor_foreground_pixel) + unload_color (f, f->output_data.x->background_pixel); + f->output_data.x->background_pixel = pixel; + if (FRAME_X_WINDOW (f) != 0) { BLOCK_INPUT; @@ -1267,15 +1280,23 @@ x_set_mouse_color (f, arg, oldval) Cursor cursor, nontext_cursor, mode_cursor, cross_cursor; int count; int mask_color; - + unsigned long pixel = f->output_data.x->mouse_pixel; + if (!EQ (Qnil, arg)) - f->output_data.x->mouse_pixel - = x_decode_color (f, arg, BLACK_PIX_DEFAULT (f)); + pixel = x_decode_color (f, arg, BLACK_PIX_DEFAULT (f)); + mask_color = f->output_data.x->background_pixel; /* No invisible pointers. */ - if (mask_color == f->output_data.x->mouse_pixel - && mask_color == f->output_data.x->background_pixel) - f->output_data.x->mouse_pixel = f->output_data.x->foreground_pixel; + if (mask_color == pixel + && mask_color == f->output_data.x->background_pixel) + pixel = f->output_data.x->foreground_pixel; + + if (f->output_data.x->background_pixel != f->output_data.x->mouse_pixel + && f->output_data.x->foreground_pixel != f->output_data.x->mouse_pixel + && f->output_data.x->cursor_pixel != f->output_data.x->mouse_pixel + && f->output_data.x->cursor_foreground_pixel != f->output_data.x->mouse_pixel) + unload_color (f, f->output_data.x->mouse_pixel); + f->output_data.x->mouse_pixel = pixel; BLOCK_INPUT; @@ -1380,24 +1401,37 @@ x_set_cursor_color (f, arg, oldval) struct frame *f; Lisp_Object arg, oldval; { - unsigned long fore_pixel; + unsigned long fore_pixel, pixel; if (!EQ (Vx_cursor_fore_pixel, Qnil)) fore_pixel = x_decode_color (f, Vx_cursor_fore_pixel, WHITE_PIX_DEFAULT (f)); else fore_pixel = f->output_data.x->background_pixel; - f->output_data.x->cursor_pixel = x_decode_color (f, arg, BLACK_PIX_DEFAULT (f)); - + pixel = x_decode_color (f, arg, BLACK_PIX_DEFAULT (f)); + /* Make sure that the cursor color differs from the background color. */ - if (f->output_data.x->cursor_pixel == f->output_data.x->background_pixel) + if (pixel == f->output_data.x->background_pixel) { - f->output_data.x->cursor_pixel = f->output_data.x->mouse_pixel; - if (f->output_data.x->cursor_pixel == fore_pixel) + pixel = f->output_data.x->mouse_pixel; + if (pixel == fore_pixel) fore_pixel = f->output_data.x->background_pixel; } + + if (f->output_data.x->background_pixel != f->output_data.x->cursor_foreground_pixel + && f->output_data.x->foreground_pixel != f->output_data.x->cursor_foreground_pixel + && f->output_data.x->mouse_pixel != f->output_data.x->cursor_foreground_pixel + && f->output_data.x->cursor_pixel != f->output_data.x->cursor_foreground_pixel) + unload_color (f, f->output_data.x->cursor_foreground_pixel); f->output_data.x->cursor_foreground_pixel = fore_pixel; + if (f->output_data.x->background_pixel != f->output_data.x->cursor_pixel + && f->output_data.x->foreground_pixel != f->output_data.x->cursor_pixel + && f->output_data.x->mouse_pixel != f->output_data.x->cursor_pixel + && f->output_data.x->cursor_foreground_pixel != f->output_data.x->cursor_pixel) + unload_color (f, f->output_data.x->cursor_pixel); + f->output_data.x->cursor_pixel = pixel; + if (FRAME_X_WINDOW (f) != 0) { BLOCK_INPUT; @@ -1451,6 +1485,7 @@ x_set_border_pixel (f, pix) struct frame *f; int pix; { + unload_color (f, f->output_data.x->border_pixel); f->output_data.x->border_pixel = pix; if (FRAME_X_WINDOW (f) != 0 && f->output_data.x->border_width > 0) -- 2.20.1