diff options
author | Marc-André Lureau <marcandre.lureau@gmail.com> | 2012-02-28 16:25:18 +0100 |
---|---|---|
committer | Marc-André Lureau <marcandre.lureau@gmail.com> | 2012-03-01 15:15:58 +0100 |
commit | 2e8b6650cffc0962797b00d99ad77a4cf54fac78 (patch) | |
tree | d384cbaa7542feba87712d9602abe05cee9f300f | |
parent | 50b0c72392ac686e06a9f675e1ad6e61172057e7 (diff) |
Add property app:has-focus
-rw-r--r-- | src/virt-viewer-app.c | 44 |
1 files changed, 44 insertions, 0 deletions
diff --git a/src/virt-viewer-app.c b/src/virt-viewer-app.c index 89a4ecf..86a059a 100644 --- a/src/virt-viewer-app.c +++ b/src/virt-viewer-app.c @@ -136,6 +136,8 @@ struct _VirtViewerAppPrivate { gchar *guest_name; gboolean grabbed; char *title; + + gint focused; }; @@ -153,6 +155,7 @@ enum { PROP_FULLSCREEN, PROP_TITLE, PROP_ENABLE_ACCEL, + PROP_HAS_FOCUS, }; enum { @@ -528,6 +531,32 @@ viewer_window_visible_cb(GtkWidget *widget G_GNUC_UNUSED, virt_viewer_app_update_menu_displays(VIRT_VIEWER_APP(user_data)); } +static gboolean +viewer_window_focus_in_cb(GtkWindow *window G_GNUC_UNUSED, + GdkEvent *event G_GNUC_UNUSED, + VirtViewerApp *self) +{ + self->priv->focused += 1; + + if (self->priv->focused == 1) + g_object_notify(G_OBJECT(self), "has-focus"); + + return FALSE; +} + +static gboolean +viewer_window_focus_out_cb(GtkWindow *window G_GNUC_UNUSED, + GdkEvent *event G_GNUC_UNUSED, + VirtViewerApp *self) +{ + self->priv->focused -= 1; + g_warn_if_fail(self->priv->focused >= 0); + + if (self->priv->focused <= 0) + g_object_notify(G_OBJECT(self), "has-focus"); + + return FALSE; +} static VirtViewerWindow* virt_viewer_app_window_new(VirtViewerApp *self, GtkWidget *container, gint nth) @@ -548,6 +577,8 @@ virt_viewer_app_window_new(VirtViewerApp *self, GtkWidget *container, gint nth) virt_viewer_app_set_fullscreen(self, self->priv->fullscreen); g_signal_connect(w, "hide", G_CALLBACK(viewer_window_visible_cb), self); g_signal_connect(w, "show", G_CALLBACK(viewer_window_visible_cb), self); + g_signal_connect(w, "focus-in-event", G_CALLBACK(viewer_window_focus_in_cb), self); + g_signal_connect(w, "focus-out-event", G_CALLBACK(viewer_window_focus_out_cb), self); return window; } @@ -1128,6 +1159,10 @@ virt_viewer_app_get_property (GObject *object, guint property_id, g_value_set_boolean(value, virt_viewer_app_get_enable_accel(self)); break; + case PROP_HAS_FOCUS: + g_value_set_boolean(value, priv->focused > 0); + break; + default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec); } @@ -1369,6 +1404,15 @@ virt_viewer_app_class_init (VirtViewerAppClass *klass) G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); + g_object_class_install_property(object_class, + PROP_HAS_FOCUS, + g_param_spec_boolean("has-focus", + "Has Focus", + "Application has focus", + FALSE, + G_PARAM_READABLE | + G_PARAM_STATIC_STRINGS)); + signals[SIGNAL_WINDOW_ADDED] = g_signal_new("window-added", G_OBJECT_CLASS_TYPE(object_class), |