← Back to team overview

elementaryart team mailing list archive

[Merge] lp:~tombeckmann/granite/new-about into lp:granite

 

Tom Beckmann has proposed merging lp:~tombeckmann/granite/new-about into lp:granite.

Requested reviews:
  elementary Pantheon team (elementary-pantheon)

For more details, see:
https://code.launchpad.net/~tombeckmann/granite/new-about/+merge/103882

This branch changes the AboutDialog to look like on Dan's mockups. Furthermore it adds a LightWindow class as seen on Dan's Marlin File Properties mockup.
-- 
https://code.launchpad.net/~tombeckmann/granite/new-about/+merge/103882
Your team elementaryart (old) is subscribed to branch lp:granite.
=== modified file 'demo/main.vala'
--- demo/main.vala	2012-03-20 18:36:52 +0000
+++ demo/main.vala	2012-04-27 14:08:20 +0000
@@ -214,6 +214,70 @@
         dynamic_notebook.append_page (new Gtk.Label ("Page 3"), "Page 3");
         dynamic_notebook.add_button_clicked.connect ( () => { dynamic_notebook.append_page (new Gtk.Label("New page"), "New tab"); });
 
+        /*Light window*/
+        var light_window_button = new Gtk.Button.with_label ("Show LightWindow");
+        
+        light_window_button.clicked.connect ( () => { 
+            var light_window = new Granite.Widgets.LightWindow ();
+            
+            var light_window_notebook = new Granite.Widgets.StaticNotebook ();
+            var entry = new Gtk.Entry ();
+            var open_drop = new Gtk.ComboBoxText ();
+            var open_lbl = new LLabel ("Alwas Open Mpeg Video Files with Audience");
+            
+            var grid = new Gtk.Grid ();
+            grid.attach (new Gtk.Image.from_icon_name ("video-x-generic", Gtk.IconSize.DIALOG), 0, 0, 1, 2);
+            grid.attach (entry, 1, 0, 1, 1);
+            grid.attach (new LLabel ("1.13 GB, Mpeg Video File"), 1, 1, 1, 1);
+            
+            grid.attach (light_window_notebook, 0, 2, 2, 1);
+            
+            var general = new Gtk.Grid ();
+            general.attach (new LLabel.markup ("<b>Info:</b>"), 0, 0, 2, 1);
+            
+            general.attach (new LLabel.right ("Created:"), 0, 1, 1, 1);
+            general.attach (new LLabel.right ("Modified:"), 0, 2, 1, 1);
+            general.attach (new LLabel.right ("Opened:"), 0, 3, 1, 1);
+            general.attach (new LLabel.right ("Mimetype:"), 0, 4, 1, 1);
+            general.attach (new LLabel.right ("Location:"), 0, 5, 1, 1);
+            
+            general.attach (new LLabel ("Today at 9:50 PM"), 1, 1, 1, 1);
+            general.attach (new LLabel ("Today at 9:50 PM"), 1, 2, 1, 1);
+            general.attach (new LLabel ("Today at 10:00 PM"), 1, 3, 1, 1);
+            general.attach (new LLabel ("video/mpeg"), 1, 4, 1, 1);
+            general.attach (new LLabel ("/home/daniel/Downloads"), 1, 5, 1, 1);
+            
+            general.attach (new LLabel.markup ("<b>Open with:</b>"), 0, 6, 2, 1);
+            general.attach (open_drop, 0, 7, 2, 1);
+            general.attach (open_lbl, 0, 8, 2, 1);
+            
+            light_window_notebook.append_page (general, new Gtk.Label ("General"));
+            light_window_notebook.append_page (new Gtk.Label ("More"), new Gtk.Label ("More"));
+            light_window_notebook.append_page (new Gtk.Label ("Sharing"), new Gtk.Label ("Sharing"));
+            
+            open_lbl.margin_left = 24;
+            open_drop.margin_left = 12;
+            open_drop.append ("audience", "Audience");
+            open_drop.active = 0;
+            grid.margin = 12;
+            grid.margin_top = 24;
+            grid.margin_bottom = 24;
+            entry.text = "Cool Hand Luke";
+            general.column_spacing = 6;
+            general.row_spacing = 6;
+            
+            var c = new Gtk.CssProvider ();
+            try {
+                c.load_from_data ("*{background-image:none;background-color:alpha (#fff, 0);}", -1);
+            } catch (Error e) { warning (e.message); }
+            general.get_parent ().get_style_context ().add_provider (c, 20000);
+            
+            light_window.add (grid);
+            light_window.show_all ();
+        });
+        
+        notebook.append_page (light_window_button, new Gtk.Label ("Light Window"));
+
         /* window properties */
         win.show_all();
         win.resize(800, 600);
@@ -229,3 +293,29 @@
     }
 }
 
+/*little helper class for constructing labels a bit faster*/
+
+class LLabel : Gtk.Label{
+    public LLabel (string label){
+        this.set_halign (Gtk.Align.START);
+        this.label = label;
+    }
+    public LLabel.indent (string label){
+        this (label);
+        this.margin_left = 10;
+    }
+    public LLabel.markup (string label){
+        this (label);
+        this.use_markup = true;
+    }
+    public LLabel.right (string label){
+        this.set_halign (Gtk.Align.END);
+        this.label = label;
+    }
+    public LLabel.right_with_markup (string label){
+        this.set_halign (Gtk.Align.END);
+        this.use_markup = true;
+        this.label = label;
+    }
+}
+

=== modified file 'lib/CMakeLists.txt'
--- lib/CMakeLists.txt	2012-04-06 05:12:38 +0000
+++ lib/CMakeLists.txt	2012-04-27 14:08:20 +0000
@@ -76,6 +76,7 @@
     Widgets/PopOver.vala
     Widgets/ContractorView.vala
     Widgets/ContractorMenu.vala
+    Widgets/LightWindow.vala
     Main.vala
     config.vapi
 CUSTOM_VAPIS
@@ -98,6 +99,7 @@
 add_library (${PKGNAME} SHARED
     GtkPatch/gtkpatch-utils.c
     Widgets/widgets-utils.c
+    Widgets/close-button.c
     ${VALA_C}
 )
 target_link_libraries(${PKGNAME} ${LIBS})

=== modified file 'lib/GtkPatch/AboutDialog.vala'
--- lib/GtkPatch/AboutDialog.vala	2012-03-25 06:42:59 +0000
+++ lib/GtkPatch/AboutDialog.vala	2012-04-27 14:08:20 +0000
@@ -236,9 +236,10 @@
     private Button close_button;
 
     // Set the markup used for big text (program name and version)
-    private const string BIG_TEXT_MARKUP_START = "<span weight='heavy' size='18500'>";
-    private const string BIG_TEXT_MARKUP_END = "</span>";
-
+    private const string BIG_TEXT_CSS = """
+    .h2 { font: open sans light 18; }
+    """;
+    
     private const string STYLESHEET = """
         * {
             -GtkDialog-action-area-border: 12px;
@@ -268,6 +269,11 @@
 
         get_style_context().add_provider(style_provider, STYLE_PROVIDER_PRIORITY_APPLICATION);
 
+        var title_css = new Gtk.CssProvider ();
+        try {
+            title_css.load_from_data (BIG_TEXT_CSS, -1);
+        } catch (Error e) { warning (e.message); }
+
         // Set the default containers
         Box content_area = (Box)get_content_area();
         Box action_area = (Box)get_action_area();
@@ -298,6 +304,8 @@
         name_label.halign = Gtk.Align.START;
         name_label.set_line_wrap(true);
         name_label.set_selectable(true);
+        name_label.get_style_context ().add_provider (title_css, Gtk.STYLE_PROVIDER_PRIORITY_APPLICATION);
+        name_label.get_style_context ().add_class ("h2");
 
         copyright_label = new Label("");
         copyright_label.set_selectable(true);
@@ -444,7 +452,6 @@
             name_label.set_text(program_name);
             if (version != null && version != "")
                 name_label.set_text(name_label.get_text() + " " + version);
-            name_label.set_markup(BIG_TEXT_MARKUP_START + name_label.get_text().replace("&", "&amp;") + BIG_TEXT_MARKUP_END);
             name_label.show();
         }
         else

=== modified file 'lib/Widgets/AboutDialog.vala'
--- lib/Widgets/AboutDialog.vala	2012-03-26 20:46:24 +0000
+++ lib/Widgets/AboutDialog.vala	2012-04-27 14:08:20 +0000
@@ -66,19 +66,39 @@
         private Button translate_button;
         private Button bug_button;
 
+        private Granite.Drawing.BufferSurface buffer;
+
         private const string HELP_BUTTON_STYLESHEET = """
             .help_button {
                 border-radius: 200px;
             }
         """;
 
+        private const string WINDOW_STYLESHEET = """
+            .window {
+                background-image:none;
+                background-color:@bg_color;
+                
+                border-radius: 6px;
+                
+                border-width:1px;
+                border-style: solid;
+                border-color: alpha (#000, 0.25);
+            }
+        """;
+        
+        int shadow_blur = 15;
+        int shadow_x    = 0;
+        int shadow_y    = 2;
+        double shadow_alpha = 0.3;
+        
         /**
          * Creates a new Granite.Widgets.AboutDialog
          */
         public AboutDialog()
         {
             Box action_area = (Box) get_action_area ();
-
+            
             /* help button style */
             var help_button_style_provider = new CssProvider();
             try {
@@ -87,6 +107,25 @@
             catch (Error e) {
                 warning ("GraniteWidgetsAboutDialog: %s. Some widgets will not look as intended", e.message);
             }
+            
+            var draw_ref = new Gtk.Window ();
+            var window_style_provider = new Gtk.CssProvider ();
+            try {
+                window_style_provider.load_from_data (WINDOW_STYLESHEET, -1);
+            } catch (Error e) { warning (e.message); }
+            draw_ref.get_style_context ().add_provider (window_style_provider, STYLE_PROVIDER_PRIORITY_FALLBACK);
+            draw_ref.get_style_context ().add_class ("content-view-window");
+            
+            this.decorated = false;
+            this.set_visual (this.get_screen ().get_rgba_visual ());
+            this.app_paintable = true;
+
+            action_area.get_style_context ().add_class ("content-view");
+            action_area.margin = 4;
+            action_area.margin_bottom = 8;
+            this.get_content_area ().margin = 10;
+            this.get_content_area ().margin_top = 27;
+            this.get_content_area ().margin_bottom = 3;
 
             /* help button */
             help_button = new Button.with_label("?");
@@ -118,6 +157,51 @@
             action_area.reorder_child (translate_button, 0);
 
             show_all ();
+
+            this.height_request = 282;
+            
+            var w = -1; var h = -1;
+            this.size_allocate.connect ( () => {
+                if (this.get_allocated_width () == w && this.get_allocated_height () == h)
+                    return;
+                w = this.get_allocated_width ();
+                h = this.get_allocated_height ();
+                
+                this.buffer = new Granite.Drawing.BufferSurface (w, h);
+                
+                this.buffer.context.rectangle (shadow_blur + shadow_x, 
+                    shadow_blur + shadow_y, w - shadow_blur*2 + shadow_x, h - shadow_blur*2 + shadow_y);
+                this.buffer.context.set_source_rgba (0, 0, 0, shadow_alpha);
+                this.buffer.context.fill ();
+                this.buffer.exponential_blur (shadow_blur / 2);
+                
+                draw_ref.get_style_context ().render_activity (this.buffer.context, shadow_blur + shadow_x, 
+                    shadow_blur + shadow_y, w - shadow_blur*2 + shadow_x, h - shadow_blur*2 + shadow_y);
+                
+            });
+            /*draw the buffer*/
+            this.draw.connect ( (ctx) => {
+                if (buffer == null)
+                    return false;
+                
+                ctx.set_operator (Cairo.Operator.SOURCE);
+                ctx.rectangle (0, 0, w, h);
+                ctx.set_source_rgba (0, 0, 0, 0);
+                ctx.fill ();
+                
+                ctx.set_source_surface (this.buffer.surface, 0, 0);
+                ctx.paint ();
+                
+                return false;
+            });
+            /*allow moving the window*/
+            this.button_press_event.connect ( (e) => {
+                if (e.button == 1) {
+                    this.begin_move_drag ((int)e.button, (int)e.x_root, (int)e.y_root, e.time);
+                    return true;
+                }
+                return false;
+            });
         }
     }
 

=== added file 'lib/Widgets/LightWindow.vala'
--- lib/Widgets/LightWindow.vala	1970-01-01 00:00:00 +0000
+++ lib/Widgets/LightWindow.vala	2012-04-27 14:08:20 +0000
@@ -0,0 +1,118 @@
+
+
+namespace Granite.Widgets {
+    
+    [CCode (cname="get_close_pixbuf")]
+    internal extern Gdk.Pixbuf get_close_pixbuf ();
+    
+    public class LightWindow : Granite.Widgets.CompositedWindow {
+        
+        public const string LIGHT_WINDOW_STYLE = """
+            .content-view-window {
+                background-image:none;
+                background-color:@bg_color;
+                
+                border-radius: 6px;
+                
+                border-width:1px;
+                border-style: solid;
+                border-color: alpha (#000, 0.25);
+            }
+        """;
+        
+        Granite.Drawing.BufferSurface buffer;
+        
+        Gtk.Box box;
+        
+        int shadow_blur = 15;
+        int shadow_x    = 0;
+        int shadow_y    = 0;
+        double shadow_alpha = 0.3;
+        
+        int close_button_x = -3;
+        int close_button_y = -3;
+        
+        public LightWindow () {
+            
+            var css = new Gtk.CssProvider ();
+            try {
+                css.load_from_data (LIGHT_WINDOW_STYLE, -1);
+            } catch (Error e) { warning (e.message); }
+            
+            this.resizable = true;
+            this.has_resize_grip = false;
+            
+            this.box = new Gtk.Box (Gtk.Orientation.VERTICAL, 0);
+            this.box.get_style_context ().add_class ("content-view");
+            
+            var draw_ref = new Gtk.Window ();
+            draw_ref.get_style_context ().add_class ("content-view-window");
+            draw_ref.get_style_context ().add_provider (css, Gtk.STYLE_PROVIDER_PRIORITY_FALLBACK);
+            
+            var close_img = get_close_pixbuf ();
+            var w = -1; var h = -1;
+            this.size_allocate.connect ( () => {
+                if (this.get_allocated_width () == w && this.get_allocated_height () == h)
+                    return;
+                w = this.get_allocated_width ();
+                h = this.get_allocated_height ();
+                
+                this.buffer = new Granite.Drawing.BufferSurface (w, h);
+                
+                this.buffer.context.rectangle (shadow_blur + shadow_x, 
+                    shadow_blur + shadow_y, w - shadow_blur*2 + shadow_x, h - shadow_blur*2 + shadow_y);
+                this.buffer.context.set_source_rgba (0, 0, 0, shadow_alpha);
+                this.buffer.context.fill ();
+                this.buffer.exponential_blur (shadow_blur / 2);
+                
+                draw_ref.get_style_context ().render_activity (this.buffer.context, shadow_blur + shadow_x, 
+                    shadow_blur + shadow_y, w - shadow_blur*2 + shadow_x, h - shadow_blur*2 + shadow_y);
+                
+                Gdk.cairo_set_source_pixbuf (this.buffer.context, close_img, shadow_blur/2 + close_button_x, 
+                    shadow_blur/2 + close_button_y);
+                this.buffer.context.paint ();
+            });
+            
+            this.draw.connect ( (ctx) => {
+                ctx.set_source_surface (this.buffer.surface, 0, 0);
+                ctx.paint ();
+                return false;
+            });
+            
+            this.add_events (Gdk.EventMask.BUTTON_PRESS_MASK | Gdk.EventMask.POINTER_MOTION_MASK);
+            this.button_press_event.connect ( (e) => {
+                if (e.x > (shadow_blur/2+close_button_x) && 
+                    e.x < (close_img.get_width  () + shadow_blur/2+close_button_x) &&
+                    e.y > (shadow_blur/2+close_button_y) && 
+                    e.y < (close_img.get_height () + shadow_blur/2+close_button_y)) {
+                    this.destroy ();
+                } else {
+                    this.begin_move_drag ((int)e.button, (int)e.x_root, (int)e.y_root, e.time);
+                }
+                return true;
+            });
+            this.motion_notify_event.connect ( (e) => {
+                if (e.x > (shadow_blur/2+close_button_x) && 
+                    e.x < (close_img.get_width  () + shadow_blur/2+close_button_x) &&
+                    e.y > (shadow_blur/2+close_button_y) && 
+                    e.y < (close_img.get_height () + shadow_blur/2+close_button_y)) {
+                    this.get_window ().set_cursor (new Gdk.Cursor (Gdk.CursorType.HAND1));
+                } else {
+                    this.get_window ().set_cursor (null);
+                }
+                return true;
+            });
+            
+            base.add (this.box);
+            this.box.margin = shadow_blur;
+        }
+        
+        public new void add (Gtk.Widget w) {
+            this.box.pack_start (w);
+        }
+        public new void remove (Gtk.Widget w) {
+            this.box.remove (w);
+        }
+        
+    }
+}

=== added file 'lib/Widgets/close-button.c'
--- lib/Widgets/close-button.c	1970-01-01 00:00:00 +0000
+++ lib/Widgets/close-button.c	2012-04-27 14:08:20 +0000
@@ -0,0 +1,168 @@
+
+/*FIXME inline pixbuf image data for close button. not sure if it would be better to put it in 
+some data folder*/
+
+#include <glib.h>
+#include <gtk/gtk.h>
+
+#ifdef __SUNPRO_C
+#pragma align 4 (close)
+#endif
+#ifdef __GNUC__
+static const guint8 close_button_data[] __attribute__ ((__aligned__ (4))) = 
+#else
+static const guint8 close_button_data[] = 
+#endif
+{ ""
+  /* Pixbuf magic (0x47646b50) */
+  "GdkP"
+  /* length: header (24) + pixel_data (3600) */
+  "\0\0\16("
+  /* pixdata_type (0x1010002) */
+  "\1\1\0\2"
+  /* rowstride (120) */
+  "\0\0\0x"
+  /* width (30) */
+  "\0\0\0\36"
+  /* height (30) */
+  "\0\0\0\36"
+  /* pixel_data: */
+  "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\1\0\0"
+  "\0\2\0\0\0\2@@@\4""333\5+++\6$$$\7\213\213\213\13\225\225\225\14+++\6"
+  "+++\6""333\5@@@\4\0\0\0\2\0\0\0\2\0\0\0\1\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+  "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+  "\0\0\0\1\0\0\0\3\0\0\0\5\0\0\0\10'''\15hhh\26\217\217\217\40\207\207"
+  "\207$mmm#\216\216\2164\231\231\2317555\35aaa\35\200\200\200\34aaa\25"
+  "\25\25\25\14\0\0\0\10\0\0\0\5\0\0\0\3\0\0\0\1\0\0\0\0\0\0\0\0\0\0\0\0"
+  "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\1\0\0\0\4\0\0"
+  "\0\7\25\25\25\14FFF\26\221\221\221,\276\276\276J\353\353\353\211\372"
+  "\372\372\307\377\377\377\377\377\377\377\377\377\377\377\377\377\377"
+  "\377\377\373\373\373\317\356\356\356\232\275\275\275MRRR\37\34\34\34"
+  "\22\25\25\25\14\0\0\0\7\0\0\0\4\0\0\0\1\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+  "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\2\0\0\0\4\0\0\0\11\40\40\40\20UUU\36"
+  "\235\235\235<\363\363\363\255\377\377\377\377\377\377\377\377\377\377"
+  "\377\377\377\377\377\377\350\350\350\375\340\340\340\375\377\377\377"
+  "\377\377\377\377\377\377\377\377\377\377\377\377\377\361\361\361\250"
+  "'''!111\32\21\21\21\17\0\0\0\11\0\0\0\4\0\0\0\2\0\0\0\0\0\0\0\0\0\0\0"
+  "\0\0\0\0\0\0\0\0\0\0\0\0\1\0\0\0\4\0\0\0\12\34\34\34\22\\\\\\$\261\261"
+  "\261N\375\375\375\340\377\377\377\377\372\372\372\376\231\231\231\372"
+  "FFF\366\0\0\0\363\0\0\0\363\0\0\0\363\0\0\0\363555\365\215\215\215\372"
+  "\367\367\367\376\377\377\377\377\372\372\372\320\275\275\275Y333\36\17"
+  "\17\17\21\0\0\0\12\0\0\0\4\0\0\0\1\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\1\0"
+  "\0\0\4\0\0\0\11\16\16\16\22GGG$\252\252\252Q\377\377\377\371\377\377"
+  "\377\377\271\271\271\374\37\37\37\364\0\0\0\363\0\0\0\363\0\0\0\363\0"
+  "\0\0\363\0\0\0\363\0\0\0\363\0\0\0\363\0\0\0\363(((\365\314\314\314\374"
+  "\377\377\377\377\377\377\377\377\271\271\271[(((\40\17\17\17\21\0\0\0"
+  "\11\0\0\0\4\0\0\0\1\0\0\0\0\0\0\0\0\0\0\0\3\0\0\0\7\0\0\0\17...!\212"
+  "\212\212H\374\374\374\341\377\377\377\377\237\237\237\372\3\3\3\363\0"
+  "\0\0\363\0\0\0\363\0\0\0\363\0\0\0\363\0\0\0\363\0\0\0\363\0\0\0\363"
+  "\0\0\0\363\0\0\0\363\0\0\0\363\3\3\3\363\205\205\205\371\377\377\377"
+  "\377\377\377\377\377\227\227\227Q\32\32\32\35\0\0\0\17\0\0\0\7\0\0\0"
+  "\3\0\0\0\1\0\0\0\1\0\0\0\5\0\0\0\14\24\24\24\32jjj<\356\356\356\264\377"
+  "\377\377\377\271\271\271\374\3\3\3\363\0\0\0\363\0\0\0\363\0\0\0\363"
+  "\0\0\0\363\0\0\0\363\0\0\0\363\0\0\0\363\0\0\0\363\0\0\0\363\0\0\0\363"
+  "\0\0\0\363\0\0\0\363\0\0\0\363\226\226\226\372\377\377\377\377\363\363"
+  "\363\306\0\0\0*\0\0\0\30\0\0\0\14\0\0\0\5\0\0\0\2\0\0\0\2\0\0\0\10\16"
+  "\16\16\22>>>)\240\240\240a\377\377\377\377\365\365\365\375\34\34\34\364"
+  "\0\0\0\363\0\0\0\363\0\0\0\363222\365;;;\366\0\0\0\363\0\0\0\363\0\0"
+  "\0\363\0\0\0\363\26\26\26\364ccc\370\12\12\12\363\0\0\0\363\0\0\0\363"
+  "\6\6\6\363\345\345\345\373\377\377\377\377\301\301\301\177\34\34\34%"
+  "\0\0\0\22\0\0\0\10\0\0\0\3\0\0\0\2\0\0\0\13\12\12\12\32UUU<\337\337\337"
+  "\241\377\377\377\377\223\223\223\372\0\0\0\363\0\0\0\363\0\0\0\363,,"
+  ",\365\377\377\377\377\377\377\377\377\201\201\201\371\0\0\0\363\0\0\0"
+  "\363\"\"\"\365\345\345\345\376\377\377\377\377\231\231\231\372\0\0\0"
+  "\363\0\0\0\363\0\0\0\363fff\370\377\377\377\377\354\354\354\277\0\0\0"
+  ".\0\0\0\31\0\0\0\14\0\0\0\4\0\0\0\3\0\0\0\17\17\17\17\"JJJH\366\366\366"
+  "\320\377\377\377\377888\366\0\0\0\363\0\0\0\363\0\0\0\363\37\37\37\364"
+  "\366\366\366\377\377\377\377\377\377\377\377\377\201\201\201\371%%%\365"
+  "\345\345\345\376\377\377\377\377\377\377\377\377\213\213\213\371\0\0"
+  "\0\363\0\0\0\363\0\0\0\363\23\23\23\364\374\374\374\377\377\377\377\377"
+  "\20\20\20>\0\0\0!\0\0\0\20\0\0\0\6\0\0\0\4\0\0\0\23\27\27\27,OOOZ\377"
+  "\377\377\377\362\362\362\375\0\0\0\363\0\0\0\363\0\0\0\363\0\0\0\363"
+  "\0\0\0\363KKK\366\366\366\366\377\377\377\377\377\377\377\377\377\362"
+  "\362\362\376\377\377\377\377\377\377\377\377\256\256\256\373\3\3\3\363"
+  "\0\0\0\363\0\0\0\363\0\0\0\363\0\0\0\363\321\321\321\371\377\377\377"
+  "\377wwwm\15\15\15(\0\0\0\24\0\0\0\10\0\0\0\5\14\14\14\26+++5dddn\377"
+  "\377\377\377\332\332\332\374\0\0\0\363\0\0\0\363\0\0\0\363\0\0\0\363"
+  "\0\0\0\363\0\0\0\363KKK\366\370\370\370\377\377\377\377\377\377\377\377"
+  "\377\377\377\377\377\256\256\256\373\3\3\3\363\0\0\0\363\0\0\0\363\0"
+  "\0\0\363\0\0\0\363\0\0\0\363\262\262\262\371\377\377\377\377\227\227"
+  "\227\211\13\13\13/\0\0\0\27\0\0\0\11\0\0\0\5\12\12\12\31,,,:aaav\377"
+  "\377\377\377\325\325\325\374\0\0\0\363\0\0\0\363\0\0\0\363\0\0\0\363"
+  "\0\0\0\363\0\0\0\363(((\365\354\354\354\376\377\377\377\377\377\377\377"
+  "\377\377\377\377\377\202\202\202\371\0\0\0\363\0\0\0\363\0\0\0\363\0"
+  "\0\0\363\0\0\0\363\0\0\0\363\257\257\257\371\377\377\377\377\225\225"
+  "\225\220\0\0\0""2\0\0\0\32\0\0\0\13\0\0\0\5\0\0\0\32\26\26\26:===m\377"
+  "\377\377\377\355\355\355\374\0\0\0\363\0\0\0\363\0\0\0\363\0\0\0\363"
+  "\0\0\0\363(((\365\350\350\350\376\377\377\377\377\377\377\377\377\374"
+  "\374\374\377\377\377\377\377\377\377\377\377\201\201\201\371\0\0\0\363"
+  "\0\0\0\363\0\0\0\363\0\0\0\363\0\0\0\363\311\311\311\367\377\377\377"
+  "\377uuu\203\11\11\11""6\0\0\0\33\0\0\0\13\0\0\0\5\0\0\0\32\5\5\5""7!"
+  "!!c\372\372\372\352\377\377\377\377\34\34\34\364\0\0\0\363\0\0\0\363"
+  "\0\0\0\363\17\17\17\364\350\350\350\376\377\377\377\377\377\377\377\377"
+  "\256\256\256\373MMM\366\366\366\366\377\377\377\377\377\377\377\377\377"
+  "lll\370\0\0\0\363\0\0\0\363\0\0\0\363\3\3\3\363\361\361\361\373\377\377"
+  "\377\377...i\5\5\5""6\0\0\0\33\0\0\0\13\0\0\0\5\0\0\0\31\5\5\5""5+++"
+  "_\335\335\335\302\377\377\377\377ooo\370\0\0\0\363\0\0\0\363\0\0\0\363"
+  "888\366\377\377\377\377\377\377\377\377\256\256\256\373\3\3\3\363\0\0"
+  "\0\363KKK\366\366\366\366\377\377\377\377\377\252\252\252\373\0\0\0\363"
+  "\0\0\0\363\0\0\0\363FFF\366\377\377\377\377\350\350\350\323\0\0\0Y\0"
+  "\0\0""3\0\0\0\32\0\0\0\13\0\0\0\5\0\0\0\26\5\5\5""0&&&W\216\216\216\234"
+  "\377\377\377\377\350\350\350\373\12\12\12\363\0\0\0\363\0\0\0\363\0\0"
+  "\0\363fff\370lll\370\3\3\3\363\0\0\0\363\0\0\0\363\0\0\0\363555\365\201"
+  "\201\201\371\34\34\34\364\0\0\0\363\0\0\0\363\0\0\0\363\302\302\302\365"
+  "\377\377\377\377\263\263\263\263\0\0\0R\0\0\0/\0\0\0\27\0\0\0\11\0\0"
+  "\0\4\0\0\0\23\0\0\0)\7\7\7J\34\34\34v\345\345\345\317\377\377\377\377"
+  "\213\213\213\371\0\0\0\363\0\0\0\363\0\0\0\363\0\0\0\363\0\0\0\363\0"
+  "\0\0\363\0\0\0\363\0\0\0\363\0\0\0\363\0\0\0\363\0\0\0\363\0\0\0\363"
+  "\0\0\0\363\0\0\0\363```\367\377\377\377\377\363\363\363\346\23\23\23"
+  "w\0\0\0H\0\0\0)\0\0\0\24\0\0\0\10\0\0\0\3\0\0\0\17\0\0\0!\4\4\4=\22\22"
+  "\22cddd\231\377\377\377\377\377\377\377\377```\367\0\0\0\363\0\0\0\363"
+  "\0\0\0\363\0\0\0\363\0\0\0\363\0\0\0\363\0\0\0\363\0\0\0\363\0\0\0\363"
+  "\0\0\0\363\0\0\0\363\0\0\0\363;;;\366\373\373\373\375\377\377\377\377"
+  "\225\225\225\257\0\0\0a\0\0\0=\0\0\0!\0\0\0\20\0\0\0\6\0\0\0\2\0\0\0"
+  "\13\0\0\0\31\0\0\0""0\3\3\3Q\27\27\27x\226\226\226\255\377\377\377\377"
+  "\377\377\377\377~~~\371\0\0\0\363\0\0\0\363\0\0\0\363\0\0\0\363\0\0\0"
+  "\363\0\0\0\363\0\0\0\363\0\0\0\363\0\0\0\363\0\0\0\363]]]\367\370\370"
+  "\370\375\377\377\377\377\305\305\305\312\0\0\0v\0\0\0O\0\0\0""0\0\0\0"
+  "\31\0\0\0\14\0\0\0\4\0\0\0\2\0\0\0\10\0\0\0\22\0\0\0$\0\0\0>\3\3\3_\21"
+  "\21\21\204\223\223\223\261\377\377\377\377\377\377\377\377\330\330\330"
+  "\370WWW\367\12\12\12\363\0\0\0\363\0\0\0\363\0\0\0\363\0\0\0\363\0\0"
+  "\0\363FFF\366\307\307\307\366\377\377\377\377\377\377\377\377\305\305"
+  "\305\316\0\0\0\203\0\0\0^\0\0\0>\0\0\0$\0\0\0\22\0\0\0\10\0\0\0\3\0\0"
+  "\0\1\0\0\0\5\0\0\0\14\0\0\0\30\0\0\0,\0\0\0G\3\3\3f\17\17\17\210hhh\261"
+  "\344\344\344\332\377\377\377\377\377\377\377\377\370\370\370\375\321"
+  "\321\321\371\235\235\235\370\235\235\235\370\313\313\313\370\361\361"
+  "\361\373\377\377\377\377\377\377\377\377\355\355\355\345\214\214\214"
+  "\277\0\0\0\210\0\0\0f\0\0\0G\0\0\0,\0\0\0\30\0\0\0\14\0\0\0\5\0\0\0\2"
+  "\0\0\0\0\0\0\0\3\0\0\0\7\0\0\0\17\0\0\0\35\0\0\0""1\0\0\0J\3\3\3f\12"
+  "\12\12\203\0\0\0\236\220\220\220\304\334\334\334\330\377\377\377\377"
+  "\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377"
+  "\377\377\377\341\341\341\335\237\237\237\312\5\5\5\237\0\0\0\203\0\0"
+  "\0f\0\0\0J\0\0\0""1\0\0\0\35\0\0\0\17\0\0\0\7\0\0\0\3\0\0\0\1\0\0\0\0"
+  "\0\0\0\1\0\0\0\4\0\0\0\11\0\0\0\21\0\0\0\36\0\0\0""0\0\0\0G\0\0\0^\0"
+  "\0\0v\11\11\11\214\0\0\0\236\17\17\17\256CCC\303{{{\324{{{\324JJJ\305"
+  "\33\33\33\261\0\0\0\236\0\0\0\214\0\0\0v\0\0\0^\0\0\0G\0\0\0""0\0\0\0"
+  "\36\0\0\0\21\0\0\0\11\0\0\0\4\0\0\0\1\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\1"
+  "\0\0\0\4\0\0\0\12\0\0\0\21\0\0\0\35\0\0\0,\0\0\0=\0\0\0P\0\0\0b\0\0\0"
+  "r\0\0\0~\4\4\4\207\4\4\4\213\0\0\0\213\4\4\4\207\2\2\2~\0\0\0r\0\0\0"
+  "b\0\0\0P\0\0\0=\0\0\0,\0\0\0\35\0\0\0\21\0\0\0\12\0\0\0\4\0\0\0\1\0\0"
+  "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\2\0\0\0\4\0\0\0\11\0\0\0\17"
+  "\0\0\0\30\0\0\0#\0\0\0""0\0\0\0=\0\0\0I\0\0\0S\0\0\0Z\0\0\0]\0\0\0]\0"
+  "\0\0Z\0\0\0S\0\0\0I\0\0\0=\0\0\0""0\0\0\0#\0\0\0\30\0\0\0\17\0\0\0\11"
+  "\0\0\0\4\0\0\0\2\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+  "\0\0\0\0\0\1\0\0\0\3\0\0\0\7\0\0\0\13\0\0\0\21\0\0\0\30\0\0\0\37\0\0"
+  "\0&\0\0\0,\0\0\0""0\0\0\0""2\0\0\0""2\0\0\0""0\0\0\0,\0\0\0&\0\0\0\37"
+  "\0\0\0\30\0\0\0\21\0\0\0\13\0\0\0\7\0\0\0\3\0\0\0\1\0\0\0\0\0\0\0\0\0"
+  "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\1\0\0\0"
+  "\1\0\0\0\2\0\0\0\4\0\0\0\5\0\0\0\7\0\0\0\11\0\0\0\12\0\0\0\13\0\0\0\13"
+  "\0\0\0\13\0\0\0\13\0\0\0\12\0\0\0\11\0\0\0\7\0\0\0\5\0\0\0\4\0\0\0\2"
+  "\0\0\0\1\0\0\0\1\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+  "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+  "\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0"
+  "\0\1\0\0\0\1\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+  "\0\0\0\0\0\0\0\0\0\0\0\0"};
+
+GdkPixbuf *get_close_pixbuf () {
+    return gdk_pixbuf_new_from_inline (-1, close_button_data, FALSE, NULL);
+}


Follow ups