(xg_get_image_for_pixmap): Add workaround for monochrome displays

so insensitive and activated icons look ok.
This commit is contained in:
Jan Djärv 2004-06-28 14:36:48 +00:00
parent 74cdfe05c6
commit 03ecb80fd6
2 changed files with 47 additions and 1 deletions

View file

@ -2,6 +2,8 @@
* gtkutil.c (xg_get_image_for_pixmap): Call g_object_unref on
gpix and gmask just before return to avoid memory leak.
(xg_get_image_for_pixmap): Add workaround for monochrome displays
so insensitive and activated icons look ok.
2004-06-27 Jason Rumney <jasonr@gnu.org>

View file

@ -248,8 +248,46 @@ xg_get_image_for_pixmap (f, img, widget, old_widget)
{
GdkPixmap *gpix;
GdkPixmap *gmask;
GdkDisplay *gdpy = gdk_x11_lookup_xdisplay (FRAME_X_DISPLAY (f));
GdkDisplay *gdpy;
/* If we are on a one bit display, let GTK do all the image handling.
This seems to be the only way to make insensitive and activated icons
look good. */
if (x_screen_planes (f) == 1)
{
Lisp_Object specified_file = Qnil;
Lisp_Object tail;
extern Lisp_Object QCfile;
for (tail = XCDR (img->spec);
NILP (specified_file) && CONSP (tail) && CONSP (XCDR (tail));
tail = XCDR (XCDR (tail)))
if (EQ (XCAR (tail), QCfile))
specified_file = XCAR (XCDR (tail));
if (STRINGP (specified_file))
{
Lisp_Object file = Qnil;
struct gcpro gcpro1;
GCPRO1 (file);
file = x_find_image_file (specified_file);
/* We already loaded the image once before calling this
function, so this should not fail. */
xassert (STRINGP (file) != 0);
if (! old_widget)
old_widget = GTK_IMAGE (gtk_image_new_from_file (SDATA (file)));
else
gtk_image_set_from_file (old_widget, SDATA (file));
UNGCPRO;
return GTK_WIDGET (old_widget);
}
}
gdpy = gdk_x11_lookup_xdisplay (FRAME_X_DISPLAY (f));
gpix = gdk_pixmap_foreign_new_for_display (gdpy, img->pixmap);
gmask = img->mask ? gdk_pixmap_foreign_new_for_display (gdpy, img->mask) : 0;
@ -262,6 +300,12 @@ xg_get_image_for_pixmap (f, img, widget, old_widget)
}
else
{
/* This is a workaround to make icons look good on pseudo color
displays. Apparently GTK expects the images to have an alpha
channel. If they don't, insensitive and activated icons will
look bad. This workaround does not work on monochrome displays,
and is not needed on true color/static color displays (i.e.
16 bits and higher). */
int x, y, width, height, rowstride, mask_rowstride;
GdkPixbuf *icon_buf, *tmp_buf;
guchar *pixels;