]> git.eshelyaron.com Git - emacs.git/commitdiff
Fix startup failure on svg-unsupported environments
authorYuuki Harano <masm+github@masm11.me>
Mon, 26 Oct 2020 13:05:55 +0000 (22:05 +0900)
committerJeff Walsh <jeff.walsh@drtusers-MacBook-Pro.local>
Tue, 24 Nov 2020 01:24:40 +0000 (12:24 +1100)
* src/pgtkterm.c (pgtk_bitmap_icon): Re-port X-code.
(pgtk_term_init): Add member initialization.
* src/pgtkterm.h (struct pgtk_display_info): Add member.
(struct pgtk_output): Add member.

src/pgtkterm.c
src/pgtkterm.h

index 6e2c87f8210d6abe612e3db6b254e7622952bd34..5527b7fc2a0a2604743b874af662071ef210b3e3 100644 (file)
@@ -52,6 +52,7 @@ along with GNU Emacs.  If not, see <https://www.gnu.org/licenses/>.  */
 #include "termhooks.h"
 #include "termopts.h"
 #include "termchar.h"
+#include "emacs-icon.h"
 #include "menu.h"
 #include "window.h"
 #include "keyboard.h"
@@ -3029,25 +3030,69 @@ pgtk_scroll_run (struct window *w, struct run *run)
 static bool
 pgtk_bitmap_icon (struct frame *f, Lisp_Object file)
 {
+  ptrdiff_t bitmap_id;
+
   if (FRAME_GTK_WIDGET (f) == 0)
     return true;
 
+  /* Free up our existing icon bitmap and mask if any.  */
+  if (f->output_data.pgtk->icon_bitmap > 0)
+    image_destroy_bitmap (f, f->output_data.pgtk->icon_bitmap);
+  f->output_data.pgtk->icon_bitmap = 0;
+
   if (STRINGP (file))
     {
       /* Use gtk_window_set_icon_from_file () if available,
-         It's not restricted to bitmaps */
+        It's not restricted to bitmaps */
       if (xg_set_icon (f, file))
        return false;
+      bitmap_id = image_create_bitmap_from_file (f, file);
+    }
+  else
+    {
+      /* Create the GNU bitmap and mask if necessary.  */
+      if (FRAME_DISPLAY_INFO (f)->icon_bitmap_id < 0)
+       {
+         ptrdiff_t rc = -1;
 
-      return true;
+          if (xg_set_icon (f, xg_default_icon_file)
+              || xg_set_icon_from_xpm_data (f, gnu_xpm_bits))
+            {
+              FRAME_DISPLAY_INFO (f)->icon_bitmap_id = -2;
+              return false;
+            }
+
+         /* If all else fails, use the (black and white) xbm image. */
+         if (rc == -1)
+           {
+              rc = image_create_bitmap_from_data (f,
+                                                  (char *) gnu_xbm_bits,
+                                                  gnu_xbm_width,
+                                                  gnu_xbm_height);
+             if (rc == -1)
+               return true;
+
+             FRAME_DISPLAY_INFO (f)->icon_bitmap_id = rc;
+           }
+       }
+
+      /* The first time we create the GNU bitmap and mask,
+        this increments the ref-count one extra time.
+        As a result, the GNU bitmap and mask are never freed.
+        That way, we don't have to worry about allocating it again.  */
+      image_reference_bitmap (f, FRAME_DISPLAY_INFO (f)->icon_bitmap_id);
+
+      bitmap_id = FRAME_DISPLAY_INFO (f)->icon_bitmap_id;
     }
 
-  if (xg_set_icon (f, xg_default_icon_file))
+  if (FRAME_DISPLAY_INFO (f)->bitmaps[bitmap_id - 1].img != NULL)
     {
-      return false;
+      gtk_window_set_icon (GTK_WINDOW (FRAME_GTK_OUTER_WIDGET (f)),
+                          FRAME_DISPLAY_INFO (f)->bitmaps[bitmap_id - 1].img);
     }
+  f->output_data.pgtk->icon_bitmap = bitmap_id;
 
-  return true;
+  return false;
 }
 
 
@@ -6837,6 +6882,8 @@ pgtk_term_init (Lisp_Object display_name, char *resource_name)
   dpyinfo->horizontal_scroll_bar_cursor
     = gdk_cursor_new_for_display (dpyinfo->gdpy, GDK_SB_H_DOUBLE_ARROW);
 
+  dpyinfo->icon_bitmap_id = -1;
+
   reset_mouse_highlight (&dpyinfo->mouse_highlight);
 
   {
index ad66039648b40631289ee1caa1a50bdd9bccb3f2..a2714a3afe037179fd8e3b8a8627038ae4562538 100644 (file)
@@ -172,6 +172,10 @@ struct pgtk_display_info
 
   int color_p;
 
+  /* Emacs bitmap-id of the default icon bitmap for this frame.
+     Or -1 if none has been allocated yet.  */
+  ptrdiff_t icon_bitmap_id;
+
   Window root_window;
 
   /* Xism */
@@ -296,6 +300,10 @@ struct pgtk_output
   Window window_desc, parent_desc;
   char explicit_parent;
 
+  /* If >=0, a bitmap index.  The indicated bitmap is used for the
+     icon. */
+  ptrdiff_t icon_bitmap;
+
   struct font *font;
   int baseline_offset;