From 83836f587d5f4c11a9227c215a719a4ec4f2a71f Mon Sep 17 00:00:00 2001 From: Ted Gould Date: Wed, 19 Aug 2009 15:38:15 -0500 Subject: Adding in a new menu-item type. One for launchers! Woo Hoo! --- src/launcher-menu-item.c | 133 +++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 133 insertions(+) create mode 100644 src/launcher-menu-item.c (limited to 'src/launcher-menu-item.c') diff --git a/src/launcher-menu-item.c b/src/launcher-menu-item.c new file mode 100644 index 0000000..ce8fd5f --- /dev/null +++ b/src/launcher-menu-item.c @@ -0,0 +1,133 @@ +/* +An indicator to show information that is in messaging applications +that the user is using. + +Copyright 2009 Canonical Ltd. + +Authors: + Ted Gould + +This program is free software: you can redistribute it and/or modify it +under the terms of the GNU General Public License version 3, as published +by the Free Software Foundation. + +This program is distributed in the hope that it will be useful, but +WITHOUT ANY WARRANTY; without even the implied warranties of +MERCHANTABILITY, SATISFACTORY QUALITY, or FITNESS FOR A PARTICULAR +PURPOSE. See the GNU General Public License for more details. + +You should have received a copy of the GNU General Public License along +with this program. If not, see . +*/ + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#include +#include +#include "launcher-menu-item.h" + +enum { + NAME_CHANGED, + LAST_SIGNAL +}; + +static guint signals[LAST_SIGNAL] = { 0 }; + +typedef struct _LauncherMenuItemPrivate LauncherMenuItemPrivate; +struct _LauncherMenuItemPrivate +{ + GAppInfo * appinfo; +}; + +#define LAUNCHER_MENU_ITEM_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE ((o), LAUNCHER_MENU_ITEM_TYPE, LauncherMenuItemPrivate)) + +/* Prototypes */ +static void launcher_menu_item_class_init (LauncherMenuItemClass *klass); +static void launcher_menu_item_init (LauncherMenuItem *self); +static void launcher_menu_item_dispose (GObject *object); +static void launcher_menu_item_finalize (GObject *object); + + +G_DEFINE_TYPE (LauncherMenuItem, launcher_menu_item, DBUSMENU_TYPE_MENUITEM); + +static void +launcher_menu_item_class_init (LauncherMenuItemClass *klass) +{ + GObjectClass *object_class = G_OBJECT_CLASS (klass); + + g_type_class_add_private (klass, sizeof (LauncherMenuItemPrivate)); + + object_class->dispose = launcher_menu_item_dispose; + object_class->finalize = launcher_menu_item_finalize; + + signals[NAME_CHANGED] = g_signal_new(LAUNCHER_MENU_ITEM_SIGNAL_NAME_CHANGED, + G_TYPE_FROM_CLASS(klass), + G_SIGNAL_RUN_LAST, + G_STRUCT_OFFSET (LauncherMenuItemClass, name_changed), + NULL, NULL, + g_cclosure_marshal_VOID__STRING, + G_TYPE_NONE, 1, G_TYPE_STRING); + + return; +} + +static void +launcher_menu_item_init (LauncherMenuItem *self) +{ + g_debug("Building new Launcher Menu Item"); + LauncherMenuItemPrivate * priv = LAUNCHER_MENU_ITEM_GET_PRIVATE(self); + + priv->appinfo = NULL; + + return; +} + +static void +launcher_menu_item_dispose (GObject *object) +{ + // LauncherMenuItem * self = LAUNCHER_MENU_ITEM(object); + // LauncherMenuItemPrivate * priv = LAUNCHER_MENU_ITEM_GET_PRIVATE(self); + + G_OBJECT_CLASS (launcher_menu_item_parent_class)->dispose (object); +} + +static void +launcher_menu_item_finalize (GObject *object) +{ + LauncherMenuItem * self = LAUNCHER_MENU_ITEM(object); + LauncherMenuItemPrivate * priv = LAUNCHER_MENU_ITEM_GET_PRIVATE(self); + + if (priv->appinfo != NULL) { + g_object_unref(priv->appinfo); + } + + G_OBJECT_CLASS (launcher_menu_item_parent_class)->finalize (object); + + return; +} + +LauncherMenuItem * +launcher_menu_item_new (const gchar * desktop_file) +{ + LauncherMenuItem * self = g_object_new(LAUNCHER_MENU_ITEM_TYPE, NULL); + + LauncherMenuItemPrivate * priv = LAUNCHER_MENU_ITEM_GET_PRIVATE(self); + + priv->appinfo = G_APP_INFO(g_desktop_app_info_new_from_filename(desktop_file)); + + return self; +} + +const gchar * +launcher_menu_item_get_name (LauncherMenuItem * appitem) +{ + LauncherMenuItemPrivate * priv = LAUNCHER_MENU_ITEM_GET_PRIVATE(appitem); + + if (priv->appinfo == NULL) { + return NULL; + } else { + return g_app_info_get_name(priv->appinfo); + } +} -- cgit v1.2.3 From 29ce275bdc22d99ab995e260dfcee9fe49e951e1 Mon Sep 17 00:00:00 2001 From: Ted Gould Date: Wed, 19 Aug 2009 20:34:26 -0500 Subject: Lots of debug, but also cleaning up the desktop file name path so it gets properly into the constructor. --- src/launcher-menu-item.c | 3 +++ 1 file changed, 3 insertions(+) (limited to 'src/launcher-menu-item.c') diff --git a/src/launcher-menu-item.c b/src/launcher-menu-item.c index ce8fd5f..915c81c 100644 --- a/src/launcher-menu-item.c +++ b/src/launcher-menu-item.c @@ -112,11 +112,14 @@ LauncherMenuItem * launcher_menu_item_new (const gchar * desktop_file) { LauncherMenuItem * self = g_object_new(LAUNCHER_MENU_ITEM_TYPE, NULL); + g_debug("\tDesktop file: %s", desktop_file); LauncherMenuItemPrivate * priv = LAUNCHER_MENU_ITEM_GET_PRIVATE(self); priv->appinfo = G_APP_INFO(g_desktop_app_info_new_from_filename(desktop_file)); + g_debug("\tName: %s", launcher_menu_item_get_name(self)); + return self; } -- cgit v1.2.3 From 69a569919e85cec838fce571be5fe319d17258e0 Mon Sep 17 00:00:00 2001 From: Ted Gould Date: Wed, 19 Aug 2009 20:38:33 -0500 Subject: Setting the label of the menu item. --- src/launcher-menu-item.c | 1 + 1 file changed, 1 insertion(+) (limited to 'src/launcher-menu-item.c') diff --git a/src/launcher-menu-item.c b/src/launcher-menu-item.c index 915c81c..e8fc269 100644 --- a/src/launcher-menu-item.c +++ b/src/launcher-menu-item.c @@ -119,6 +119,7 @@ launcher_menu_item_new (const gchar * desktop_file) priv->appinfo = G_APP_INFO(g_desktop_app_info_new_from_filename(desktop_file)); g_debug("\tName: %s", launcher_menu_item_get_name(self)); + dbusmenu_menuitem_property_set(DBUSMENU_MENUITEM(self), "label", launcher_menu_item_get_name(self)); return self; } -- cgit v1.2.3 From cfb0854e7c6bfa7cc9ac5ffdcd6672ad812ecfa0 Mon Sep 17 00:00:00 2001 From: Ted Gould Date: Wed, 19 Aug 2009 21:30:02 -0500 Subject: Adding in the activate logic so that the menu items actually launch the application. --- src/launcher-menu-item.c | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) (limited to 'src/launcher-menu-item.c') diff --git a/src/launcher-menu-item.c b/src/launcher-menu-item.c index e8fc269..7970288 100644 --- a/src/launcher-menu-item.c +++ b/src/launcher-menu-item.c @@ -48,6 +48,7 @@ static void launcher_menu_item_class_init (LauncherMenuItemClass *klass); static void launcher_menu_item_init (LauncherMenuItem *self); static void launcher_menu_item_dispose (GObject *object); static void launcher_menu_item_finalize (GObject *object); +void activate_cb (LauncherMenuItem * self, gpointer data); G_DEFINE_TYPE (LauncherMenuItem, launcher_menu_item, DBUSMENU_TYPE_MENUITEM); @@ -121,6 +122,8 @@ launcher_menu_item_new (const gchar * desktop_file) g_debug("\tName: %s", launcher_menu_item_get_name(self)); dbusmenu_menuitem_property_set(DBUSMENU_MENUITEM(self), "label", launcher_menu_item_get_name(self)); + g_signal_connect(G_OBJECT(self), DBUSMENU_MENUITEM_SIGNAL_ITEM_ACTIVATED, G_CALLBACK(activate_cb), NULL); + return self; } @@ -135,3 +138,18 @@ launcher_menu_item_get_name (LauncherMenuItem * appitem) return g_app_info_get_name(priv->appinfo); } } + +void +activate_cb (LauncherMenuItem * self, gpointer data) +{ + LauncherMenuItemPrivate * priv = LAUNCHER_MENU_ITEM_GET_PRIVATE(self); + g_return_if_fail(priv->appinfo != NULL); + + GError * error = NULL; + if (!g_app_info_launch(priv->appinfo, NULL, NULL, &error)) { + g_warning("Application failed to launch '%s' because: %s", launcher_menu_item_get_name(self), error->message); + g_error_free(error); + } + + return; +} -- cgit v1.2.3 From 99744b30f0ebf4c7054b8274c30af063ec52b248 Mon Sep 17 00:00:00 2001 From: Ted Gould Date: Wed, 19 Aug 2009 21:59:43 -0500 Subject: Adding an eclipsed function for the LMI --- src/launcher-menu-item.c | 16 ++++++++++++++-- 1 file changed, 14 insertions(+), 2 deletions(-) (limited to 'src/launcher-menu-item.c') diff --git a/src/launcher-menu-item.c b/src/launcher-menu-item.c index 7970288..b869a40 100644 --- a/src/launcher-menu-item.c +++ b/src/launcher-menu-item.c @@ -48,7 +48,7 @@ static void launcher_menu_item_class_init (LauncherMenuItemClass *klass); static void launcher_menu_item_init (LauncherMenuItem *self); static void launcher_menu_item_dispose (GObject *object); static void launcher_menu_item_finalize (GObject *object); -void activate_cb (LauncherMenuItem * self, gpointer data); +static void activate_cb (LauncherMenuItem * self, gpointer data); G_DEFINE_TYPE (LauncherMenuItem, launcher_menu_item, DBUSMENU_TYPE_MENUITEM); @@ -139,7 +139,9 @@ launcher_menu_item_get_name (LauncherMenuItem * appitem) } } -void +/* When the menu item is clicked on it tries to launch + the application that is represented by the desktop file */ +static void activate_cb (LauncherMenuItem * self, gpointer data) { LauncherMenuItemPrivate * priv = LAUNCHER_MENU_ITEM_GET_PRIVATE(self); @@ -153,3 +155,13 @@ activate_cb (LauncherMenuItem * self, gpointer data) return; } + +/* Hides the menu item based on whether it is eclipsed + or not. */ +void +launcher_menu_item_set_eclipsed (LauncherMenuItem * li, gboolean eclipsed) +{ + g_debug("Laucher '%s' is %s", launcher_menu_item_get_name(li), eclipsed ? "now eclipsed" : "shown again"); + dbusmenu_menuitem_property_set(DBUSMENU_MENUITEM(li), "show", eclipsed ? "false" : "true"); + return; +} -- cgit v1.2.3 From 17745461f669047872c12a6c7db7b05a9ccb0417 Mon Sep 17 00:00:00 2001 From: Ted Gould Date: Wed, 19 Aug 2009 22:29:40 -0500 Subject: Big commit. Trying to check for eclipses, but first both objects needed to track their desktop file paths. So I had to add that little nugget in as well. --- src/launcher-menu-item.c | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) (limited to 'src/launcher-menu-item.c') diff --git a/src/launcher-menu-item.c b/src/launcher-menu-item.c index b869a40..4f05ae6 100644 --- a/src/launcher-menu-item.c +++ b/src/launcher-menu-item.c @@ -39,6 +39,7 @@ typedef struct _LauncherMenuItemPrivate LauncherMenuItemPrivate; struct _LauncherMenuItemPrivate { GAppInfo * appinfo; + gchar * desktop; }; #define LAUNCHER_MENU_ITEM_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE ((o), LAUNCHER_MENU_ITEM_TYPE, LauncherMenuItemPrivate)) @@ -81,6 +82,7 @@ launcher_menu_item_init (LauncherMenuItem *self) LauncherMenuItemPrivate * priv = LAUNCHER_MENU_ITEM_GET_PRIVATE(self); priv->appinfo = NULL; + priv->desktop = NULL; return; } @@ -102,6 +104,12 @@ launcher_menu_item_finalize (GObject *object) if (priv->appinfo != NULL) { g_object_unref(priv->appinfo); + priv->appinfo = NULL; + } + + if (priv->desktop != NULL) { + g_free(priv->desktop); + priv->desktop = NULL; } G_OBJECT_CLASS (launcher_menu_item_parent_class)->finalize (object); @@ -118,6 +126,7 @@ launcher_menu_item_new (const gchar * desktop_file) LauncherMenuItemPrivate * priv = LAUNCHER_MENU_ITEM_GET_PRIVATE(self); priv->appinfo = G_APP_INFO(g_desktop_app_info_new_from_filename(desktop_file)); + priv->desktop = g_strdup(desktop_file); g_debug("\tName: %s", launcher_menu_item_get_name(self)); dbusmenu_menuitem_property_set(DBUSMENU_MENUITEM(self), "label", launcher_menu_item_get_name(self)); @@ -156,6 +165,14 @@ activate_cb (LauncherMenuItem * self, gpointer data) return; } +const gchar * +launcher_menu_item_get_desktop (LauncherMenuItem * launchitem) +{ + g_return_val_if_fail(IS_LAUNCHER_MENU_ITEM(launchitem), NULL); + LauncherMenuItemPrivate * priv = LAUNCHER_MENU_ITEM_GET_PRIVATE(launchitem); + return priv->desktop; +} + /* Hides the menu item based on whether it is eclipsed or not. */ void -- cgit v1.2.3 From 8483b2d92f9b86e6d00afc163b835a47e1bebdbe Mon Sep 17 00:00:00 2001 From: Ted Gould Date: Thu, 20 Aug 2009 10:25:07 -0500 Subject: Use a GDK app context. Not sure about the timestamp units though. --- src/launcher-menu-item.c | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-) (limited to 'src/launcher-menu-item.c') diff --git a/src/launcher-menu-item.c b/src/launcher-menu-item.c index 4f05ae6..653592c 100644 --- a/src/launcher-menu-item.c +++ b/src/launcher-menu-item.c @@ -24,6 +24,7 @@ with this program. If not, see . #include "config.h" #endif +#include #include #include #include "launcher-menu-item.h" @@ -156,12 +157,23 @@ activate_cb (LauncherMenuItem * self, gpointer data) LauncherMenuItemPrivate * priv = LAUNCHER_MENU_ITEM_GET_PRIVATE(self); g_return_if_fail(priv->appinfo != NULL); + /* This should manage the X stuff for us */ + GdkAppLaunchContext * context = gdk_app_launch_context_new(); + + /* Using the current time as we don't have the event + time as that's not sent across the bus */ + GTimeVal time; + g_get_current_time(&time); + gdk_app_launch_context_set_timestamp(context, time.tv_usec); + GError * error = NULL; - if (!g_app_info_launch(priv->appinfo, NULL, NULL, &error)) { + if (!g_app_info_launch(priv->appinfo, NULL, G_APP_LAUNCH_CONTEXT(context), &error)) { g_warning("Application failed to launch '%s' because: %s", launcher_menu_item_get_name(self), error->message); g_error_free(error); } + g_object_unref(G_OBJECT(context)); + return; } -- cgit v1.2.3 From da36b66e974c34b2024677396236a62e5973e9c9 Mon Sep 17 00:00:00 2001 From: Ted Gould Date: Thu, 20 Aug 2009 11:29:09 -0500 Subject: Should be in milliseconds not micro --- src/launcher-menu-item.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'src/launcher-menu-item.c') diff --git a/src/launcher-menu-item.c b/src/launcher-menu-item.c index 653592c..6c79adb 100644 --- a/src/launcher-menu-item.c +++ b/src/launcher-menu-item.c @@ -164,7 +164,7 @@ activate_cb (LauncherMenuItem * self, gpointer data) time as that's not sent across the bus */ GTimeVal time; g_get_current_time(&time); - gdk_app_launch_context_set_timestamp(context, time.tv_usec); + gdk_app_launch_context_set_timestamp(context, time.tv_usec / 1000); GError * error = NULL; if (!g_app_info_launch(priv->appinfo, NULL, G_APP_LAUNCH_CONTEXT(context), &error)) { -- cgit v1.2.3