emacs-diffs
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Emacs-diffs] Changes to emacs/src/gtkutil.c [lexbind]


From: Miles Bader
Subject: [Emacs-diffs] Changes to emacs/src/gtkutil.c [lexbind]
Date: Tue, 06 Jul 2004 06:58:56 -0400

Index: emacs/src/gtkutil.c
diff -c emacs/src/gtkutil.c:1.26.2.6 emacs/src/gtkutil.c:1.26.2.7
*** emacs/src/gtkutil.c:1.26.2.6        Tue Jul  6 10:14:28 2004
--- emacs/src/gtkutil.c Tue Jul  6 10:23:40 2004
***************
*** 248,255 ****
  {
    GdkPixmap *gpix;
    GdkPixmap *gmask;
!   GdkDisplay *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;
  
--- 248,293 ----
  {
    GdkPixmap *gpix;
    GdkPixmap *gmask;
!   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,267 ****
--- 300,311 ----
      }
    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;
***************
*** 308,319 ****
                  }
              }
  
-           g_object_unref (G_OBJECT (gmask));
            g_object_unref (G_OBJECT (mask_buf));
          }
  
-       g_object_unref (G_OBJECT (gpix));
- 
        if (! old_widget)
          old_widget = GTK_IMAGE (gtk_image_new_from_pixbuf (icon_buf));
        else
--- 352,360 ----
***************
*** 322,327 ****
--- 363,371 ----
        g_object_unref (G_OBJECT (icon_buf));
      }
  
+   g_object_unref (G_OBJECT (gpix));
+   if (gmask) g_object_unref (G_OBJECT (gmask));
+ 
    return GTK_WIDGET (old_widget);
  }
  




reply via email to

[Prev in Thread] Current Thread [Next in Thread]