elementaryart team mailing list archive
-
elementaryart team
-
Mailing list archive
-
Message #02021
[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("&", "&") + 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