aboutsummaryrefslogtreecommitdiff
path: root/lib
diff options
context:
space:
mode:
Diffstat (limited to 'lib')
-rw-r--r--lib/main.vala238
1 files changed, 134 insertions, 104 deletions
diff --git a/lib/main.vala b/lib/main.vala
index 7e2a6f32..bb908340 100644
--- a/lib/main.vala
+++ b/lib/main.vala
@@ -1,6 +1,8 @@
[DBus (name = "com.canonical.indicator.keyboard")]
public class Indicator.Keyboard.Service : Object {
+ private bool use_gtk;
+ private bool use_bamf;
private MainLoop? loop;
private Settings indicator_settings;
private Settings source_settings;
@@ -21,14 +23,23 @@ public class Indicator.Keyboard.Service : Object {
private uint[]? icon_string_subscripts;
[DBus (visible = false)]
- public Service (bool force) {
+ public Service (ref unowned string[] args) {
Bus.own_name (BusType.SESSION,
"com.canonical.indicator.keyboard",
- BusNameOwnerFlags.ALLOW_REPLACEMENT | (force ? BusNameOwnerFlags.REPLACE : 0),
+ BusNameOwnerFlags.ALLOW_REPLACEMENT | ("--force" in args ? BusNameOwnerFlags.REPLACE : 0),
this.handle_bus_acquired,
null,
this.handle_name_lost);
+ this.use_gtk = "--use-gtk" in args;
+ this.use_bamf = "--use-bamf" in args;
+
+ if (this.use_gtk) {
+ this.use_gtk = Gtk.init_check (ref args);
+ } else {
+ Gdk.init (ref args);
+ }
+
this.indicator_settings = new Settings ("com.canonical.indicator.keyboard");
this.indicator_settings.changed["visible"].connect (this.handle_changed_visible);
@@ -118,17 +129,19 @@ public class Indicator.Keyboard.Service : Object {
[DBus (visible = false)]
private void update_window_sources () {
- var group_per_window = this.per_window_settings.get_boolean ("group-per-window");
-
- if (group_per_window != (this.window_sources != null)) {
- if (group_per_window) {
- this.window_sources = new Gee.HashMap<string, uint> ();
- this.matcher = Bamf.Matcher.get_default ();
- ((!) this.matcher).active_window_changed.connect (this.handle_active_window_changed);
- } else {
- ((!) this.matcher).active_window_changed.disconnect (this.handle_active_window_changed);
- this.matcher = null;
- this.window_sources = null;
+ if (this.use_bamf) {
+ var group_per_window = this.per_window_settings.get_boolean ("group-per-window");
+
+ if (group_per_window != (this.window_sources != null)) {
+ if (group_per_window) {
+ this.window_sources = new Gee.HashMap<string, uint> ();
+ this.matcher = Bamf.Matcher.get_default ();
+ ((!) this.matcher).active_window_changed.connect (this.handle_active_window_changed);
+ } else {
+ ((!) this.matcher).active_window_changed.disconnect (this.handle_active_window_changed);
+ this.matcher = null;
+ this.window_sources = null;
+ }
}
}
}
@@ -158,100 +171,114 @@ 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;
+
+ if (this.use_gtk) {
+ 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;
+ protected virtual Icon? create_icon (string? text, uint subscript) {
+ Icon? icon = null;
+
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 ();
-
- 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 ();
+
+ 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.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;
- });
+ icon = new BytesIcon (ByteArray.free_to_bytes ((owned) buffer));
+ }
- return new BytesIcon (ByteArray.free_to_bytes ((owned) buffer));
+ return icon;
}
[DBus (visible = false)]
@@ -388,15 +415,19 @@ public class Indicator.Keyboard.Service : Object {
icon_name = @"indicator-keyboard-$((!) icon_string)-$icon_subscript";
}
- var icon_theme = Gtk.IconTheme.get_default ();
- Gtk.IconInfo? icon_info = icon_theme.lookup_icon (icon_name, 22, 0);
+ if (this.use_gtk) {
+ var icon_theme = Gtk.IconTheme.get_default ();
+ Gtk.IconInfo? icon_info = icon_theme.lookup_icon (icon_name, 22, 0);
- if (icon_info != null) {
- try {
- this.icons[index] = Icon.new_for_string (((!) icon_info).get_filename ());
- } catch (Error error) {
- this.icons[index] = null;
+ if (icon_info != null) {
+ try {
+ this.icons[index] = Icon.new_for_string (((!) icon_info).get_filename ());
+ } catch (Error error) {
+ this.icons[index] = null;
+ }
}
+ } else {
+ this.icons[index] = new ThemedIcon (icon_name);
}
}
@@ -718,8 +749,7 @@ public class Indicator.Keyboard.Service : Object {
[DBus (visible = false)]
public static int main (string[] args) {
- Gtk.init (ref args);
- new Service ("--force" in args);
+ new Service (ref args);
return 0;
}
}