diff options
author | William Hua <william.hua@canonical.com> | 2013-07-17 11:24:27 -0400 |
---|---|---|
committer | William Hua <william.hua@canonical.com> | 2013-07-17 11:24:27 -0400 |
commit | 4d097b8eb4b6f527ec53b2faf778f0693cac0fa3 (patch) | |
tree | 36a751ba8274e5cfae7514266e48a0d9b2e243a9 /lib | |
parent | 6061e1de2a680b14b1a6e1eb2642d0a643910a73 (diff) | |
download | ayatana-indicator-keyboard-4d097b8eb4b6f527ec53b2faf778f0693cac0fa3.tar.gz ayatana-indicator-keyboard-4d097b8eb4b6f527ec53b2faf778f0693cac0fa3.tar.bz2 ayatana-indicator-keyboard-4d097b8eb4b6f527ec53b2faf778f0693cac0fa3.zip |
Add --use-gtk flag.
Diffstat (limited to 'lib')
-rw-r--r-- | lib/main.vala | 191 |
1 files changed, 106 insertions, 85 deletions
diff --git a/lib/main.vala b/lib/main.vala index 7e2a6f32..e429c9ea 100644 --- a/lib/main.vala +++ b/lib/main.vala @@ -1,6 +1,7 @@ [DBus (name = "com.canonical.indicator.keyboard")] public class Indicator.Keyboard.Service : Object { + private bool use_gtk; private MainLoop? loop; private Settings indicator_settings; private Settings source_settings; @@ -21,7 +22,7 @@ public class Indicator.Keyboard.Service : Object { private uint[]? icon_string_subscripts; [DBus (visible = false)] - public Service (bool force) { + public Service (bool force, bool use_gtk) { Bus.own_name (BusType.SESSION, "com.canonical.indicator.keyboard", BusNameOwnerFlags.ALLOW_REPLACEMENT | (force ? BusNameOwnerFlags.REPLACE : 0), @@ -29,6 +30,8 @@ public class Indicator.Keyboard.Service : Object { null, this.handle_name_lost); + this.use_gtk = use_gtk; + this.indicator_settings = new Settings ("com.canonical.indicator.keyboard"); this.indicator_settings.changed["visible"].connect (this.handle_changed_visible); @@ -158,100 +161,113 @@ public class Indicator.Keyboard.Service : Object { } [DBus (visible = false)] - private Gtk.StyleContext get_style_context () { - var context = new Gtk.StyleContext (); + private Gtk.StyleContext? get_style_context () { + Gtk.StyleContext? context = null; + Gdk.Screen? screen = Gdk.Screen.get_default (); - context.set_screen (Gdk.Screen.get_default ()); + if (screen != null) { + context = new Gtk.StyleContext (); + ((!) context).set_screen ((!) screen); - var path = new Gtk.WidgetPath (); - path.append_type (typeof (Gtk.MenuItem)); - context.set_path (path); + var path = new Gtk.WidgetPath (); + path.append_type (typeof (Gtk.MenuItem)); + ((!) context).set_path (path); + } return context; } [DBus (visible = false)] - protected virtual Icon create_icon (string? text, uint subscript) { - const int W = 22; - const int H = 22; - const int w = 20; - const int h = 20; - const double R = 2.0; - const double TEXT_SIZE = 12.0; - const double SUBSCRIPT_SIZE = 8.0; - - Pango.FontDescription description; - var style = get_style_context (); - var colour = style.get_color (Gtk.StateFlags.NORMAL); - colour = { 0.5, 0.5, 0.5, 1.0 }; - style.get (Gtk.StateFlags.NORMAL, Gtk.STYLE_PROPERTY_FONT, out description); - - var surface = new Cairo.ImageSurface (Cairo.Format.ARGB32, W, H); - var context = new Cairo.Context (surface); - - context.translate (0.5 * (W - w), 0.5 * (H - h)); - - context.new_sub_path (); - context.arc (R, R, R, Math.PI, -0.5 * Math.PI); - context.arc (w - R, R, R, -0.5 * Math.PI, 0); - context.arc (w - R, h - R, R, 0, 0.5 * Math.PI); - context.arc (R, h - R, R, 0.5 * Math.PI, Math.PI); - context.close_path (); - - context.set_source_rgba (colour.red, colour.green, colour.blue, colour.alpha); - context.fill (); - context.set_operator (Cairo.Operator.CLEAR); - - if (text != null) { - var text_layout = Pango.cairo_create_layout (context); - text_layout.set_alignment (Pango.Alignment.CENTER); - description.set_absolute_size (Pango.units_from_double (TEXT_SIZE)); - text_layout.set_font_description (description); - text_layout.set_text ((!) text, -1); - Pango.cairo_update_layout (context, text_layout); - int text_width; - int text_height; - text_layout.get_pixel_size (out text_width, out text_height); - - if (subscript > 0) { - var subscript_layout = Pango.cairo_create_layout (context); - subscript_layout.set_alignment (Pango.Alignment.CENTER); - description.set_absolute_size (Pango.units_from_double (SUBSCRIPT_SIZE)); - subscript_layout.set_font_description (description); - subscript_layout.set_text (@"$subscript", -1); - Pango.cairo_update_layout (context, subscript_layout); - int subscript_width; - int subscript_height; - subscript_layout.get_pixel_size (out subscript_width, out subscript_height); - - context.save (); - context.translate ((w - (text_width + subscript_width)) / 2, (h - text_height) / 2); - Pango.cairo_layout_path (context, text_layout); - context.fill (); - context.restore (); + protected virtual Icon? create_icon (string? text, uint subscript) { + Icon? icon = null; - context.save (); - context.translate ((w + (text_width - subscript_width)) / 2, (h + text_height) / 2 - subscript_height); - Pango.cairo_layout_path (context, subscript_layout); - context.fill (); - context.restore (); - } else { - context.save (); - context.translate ((w - text_width) / 2, (h - text_height) / 2); - Pango.cairo_layout_path (context, text_layout); + if (this.use_gtk) { + var style = get_style_context (); + + if (style != null) { + const int W = 22; + const int H = 22; + const int w = 20; + const int h = 20; + const double R = 2.0; + const double TEXT_SIZE = 12.0; + const double SUBSCRIPT_SIZE = 8.0; + + Pango.FontDescription description; + var colour = ((!) style).get_color (Gtk.StateFlags.NORMAL); + colour = { 0.5, 0.5, 0.5, 1.0 }; + ((!) style).get (Gtk.StateFlags.NORMAL, Gtk.STYLE_PROPERTY_FONT, out description); + + var surface = new Cairo.ImageSurface (Cairo.Format.ARGB32, W, H); + var context = new Cairo.Context (surface); + + context.translate (0.5 * (W - w), 0.5 * (H - h)); + + context.new_sub_path (); + context.arc (R, R, R, Math.PI, -0.5 * Math.PI); + context.arc (w - R, R, R, -0.5 * Math.PI, 0); + context.arc (w - R, h - R, R, 0, 0.5 * Math.PI); + context.arc (R, h - R, R, 0.5 * Math.PI, Math.PI); + context.close_path (); + + context.set_source_rgba (colour.red, colour.green, colour.blue, colour.alpha); context.fill (); - context.restore (); - } - } + context.set_operator (Cairo.Operator.CLEAR); + + if (text != null) { + var text_layout = Pango.cairo_create_layout (context); + text_layout.set_alignment (Pango.Alignment.CENTER); + description.set_absolute_size (Pango.units_from_double (TEXT_SIZE)); + text_layout.set_font_description (description); + text_layout.set_text ((!) text, -1); + Pango.cairo_update_layout (context, text_layout); + int text_width; + int text_height; + text_layout.get_pixel_size (out text_width, out text_height); + + if (subscript > 0) { + var subscript_layout = Pango.cairo_create_layout (context); + subscript_layout.set_alignment (Pango.Alignment.CENTER); + description.set_absolute_size (Pango.units_from_double (SUBSCRIPT_SIZE)); + subscript_layout.set_font_description (description); + subscript_layout.set_text (@"$subscript", -1); + Pango.cairo_update_layout (context, subscript_layout); + int subscript_width; + int subscript_height; + subscript_layout.get_pixel_size (out subscript_width, out subscript_height); + + context.save (); + context.translate ((w - (text_width + subscript_width)) / 2, (h - text_height) / 2); + Pango.cairo_layout_path (context, text_layout); + context.fill (); + context.restore (); + + context.save (); + context.translate ((w + (text_width - subscript_width)) / 2, (h + text_height) / 2 - subscript_height); + Pango.cairo_layout_path (context, subscript_layout); + context.fill (); + context.restore (); + } else { + context.save (); + context.translate ((w - text_width) / 2, (h - text_height) / 2); + Pango.cairo_layout_path (context, text_layout); + context.fill (); + context.restore (); + } + } - var buffer = new ByteArray (); + var buffer = new ByteArray (); - surface.write_to_png_stream ((data) => { - buffer.append (data); - return Cairo.Status.SUCCESS; - }); + surface.write_to_png_stream ((data) => { + buffer.append (data); + return Cairo.Status.SUCCESS; + }); - return new BytesIcon (ByteArray.free_to_bytes ((owned) buffer)); + icon = new BytesIcon (ByteArray.free_to_bytes ((owned) buffer)); + } + } + + return icon; } [DBus (visible = false)] @@ -718,8 +734,13 @@ public class Indicator.Keyboard.Service : Object { [DBus (visible = false)] public static int main (string[] args) { - Gtk.init (ref args); - new Service ("--force" in args); + var force = "--force" in args; + var use_gtk = "--use-gtk" in args; + + if (use_gtk) + use_gtk = Gtk.init_check (ref args); + + new Service (force, use_gtk); return 0; } } |