aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/Makefile.am1
-rw-r--r--src/Makefile.in1
-rw-r--r--src/app-indicator.c806
-rw-r--r--src/app-indicator.h259
-rw-r--r--src/application-service-marshal.c37
-rw-r--r--src/application-service-marshal.list1
-rw-r--r--src/gen-notification-item.xml.c7
-rw-r--r--src/notification-item.xml7
8 files changed, 657 insertions, 462 deletions
diff --git a/src/Makefile.am b/src/Makefile.am
index 8a74d66..a4bd27a 100644
--- a/src/Makefile.am
+++ b/src/Makefile.am
@@ -148,6 +148,7 @@ INTROSPECTION_COMPILER_ARGS = --includedir=$(builddir)
if HAVE_INTROSPECTION
introspection_sources = \
+ $(addprefix $(srcdir)/,app-indicator.c) \
$(addprefix $(srcdir)/,$(libappindicator_headers))
AppIndicator$(VER)-0.1.gir: libappindicator$(VER).la
diff --git a/src/Makefile.in b/src/Makefile.in
index d420133..b9e2457 100644
--- a/src/Makefile.in
+++ b/src/Makefile.in
@@ -466,6 +466,7 @@ INTROSPECTION_GIRS = $(am__append_1)
INTROSPECTION_COMPILER_ARGS = --includedir=$(builddir)
@HAVE_INTROSPECTION_TRUE@introspection_sources = \
+@HAVE_INTROSPECTION_TRUE@ $(addprefix $(srcdir)/,app-indicator.c) \
@HAVE_INTROSPECTION_TRUE@ $(addprefix $(srcdir)/,$(libappindicator_headers))
@HAVE_INTROSPECTION_TRUE@AppIndicator_0_1_gir_INCLUDES = \
diff --git a/src/app-indicator.c b/src/app-indicator.c
index bc08eea..c2f0f69 100644
--- a/src/app-indicator.c
+++ b/src/app-indicator.c
@@ -51,20 +51,18 @@ License version 3 and version 2.1 along with this program. If not, see
#define PANEL_ICON_SUFFIX "panel"
/**
- AppIndicatorPrivate:
-
- All of the private data in an instance of a
- application indicator.
-*/
-/* Private Fields
- @id: The ID of the indicator. Maps to AppIndicator:id.
- @category: Which category the indicator is. Maps to AppIndicator:category.
- @status: The status of the indicator. Maps to AppIndicator:status.
- @icon_name: The name of the icon to use. Maps to AppIndicator:icon-name.
- @attention_icon_name: The name of the attention icon to use. Maps to AppIndicator:attention-icon-name.
- @menu: The menu for this indicator. Maps to AppIndicator:menu
- @watcher_proxy: The proxy connection to the watcher we're connected to. If we're not connected to one this will be %NULL.
-*/
+ * AppIndicatorPrivate:
+ * All of the private data in an instance of an application indicator.
+ *
+ * Private Fields
+ * @id: The ID of the indicator. Maps to AppIndicator:id.
+ * @category: Which category the indicator is. Maps to AppIndicator:category.
+ * @status: The status of the indicator. Maps to AppIndicator:status.
+ * @icon_name: The name of the icon to use. Maps to AppIndicator:icon-name.
+ * @attention_icon_name: The name of the attention icon to use. Maps to AppIndicator:attention-icon-name.
+ * @menu: The menu for this indicator. Maps to AppIndicator:menu
+ * @watcher_proxy: The proxy connection to the watcher we're connected to. If we're not connected to one this will be %NULL.
+ */
struct _AppIndicatorPrivate {
/*< Private >*/
/* Properties */
@@ -77,6 +75,8 @@ struct _AppIndicatorPrivate {
gchar *icon_theme_path;
DbusmenuServer *menuservice;
GtkWidget *menu;
+ GtkWidget *sec_activate_target;
+ gboolean sec_activate_enabled;
guint32 ordering_index;
gchar * label;
gchar * label_guide;
@@ -104,8 +104,8 @@ enum {
NEW_STATUS,
NEW_LABEL,
CONNECTION_CHANGED,
- NEW_ICON_THEME_PATH,
- SCROLL_EVENT,
+ NEW_ICON_THEME_PATH,
+ SCROLL_EVENT,
LAST_SIGNAL
};
@@ -178,6 +178,7 @@ static gboolean fallback_timer_expire (gpointer data);
static GtkStatusIcon * fallback (AppIndicator * self);
static void status_icon_status_wrapper (AppIndicator * self, const gchar * status, gpointer data);
static gboolean scroll_event_wrapper(GtkWidget *status_icon, GdkEventScroll *event, gpointer user_data);
+static gboolean middle_click_wrapper(GtkWidget *status_icon, GdkEventButton *event, gpointer user_data);
static void status_icon_changes (AppIndicator * self, gpointer data);
static void status_icon_activate (GtkStatusIcon * icon, gpointer data);
static void status_icon_menu_activate (GtkStatusIcon *status_icon, guint button, guint activate_time, gpointer user_data);
@@ -185,6 +186,7 @@ static void unfallback (AppIndicator * self, GtkStatusIcon * status_icon);
static gchar * append_panel_icon_suffix (const gchar * icon_name);
static void watcher_owner_changed (GObject * obj, GParamSpec * pspec, gpointer user_data);
static void theme_changed_cb (GtkIconTheme * theme, gpointer user_data);
+static void sec_activate_target_parent_changed(GtkWidget *menuitem, GtkWidget *old_parent, gpointer user_data);
static GVariant * bus_get_prop (GDBusConnection * connection, const gchar * sender, const gchar * path, const gchar * interface, const gchar * property, GError ** error, gpointer user_data);
static void bus_method_call (GDBusConnection * connection, const gchar * sender, const gchar * path, const gchar * interface, const gchar * method, GVariant * params, GDBusMethodInvocation * invocation, gpointer user_data);
static void bus_creation (GObject * obj, GAsyncResult * res, gpointer user_data);
@@ -221,11 +223,11 @@ app_indicator_class_init (AppIndicatorClass *klass)
/* Properties */
/**
- AppIndicator:id:
-
- The ID for this indicator, which should be unique, but used consistently
- by this program and its indicator.
- */
+ * AppIndicator:id:
+ *
+ * The ID for this indicator, which should be unique, but used consistently
+ * by this program and its indicator.
+ */
g_object_class_install_property (object_class,
PROP_ID,
g_param_spec_string(PROP_ID_S,
@@ -235,11 +237,11 @@ app_indicator_class_init (AppIndicatorClass *klass)
G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS | G_PARAM_CONSTRUCT_ONLY));
/**
- AppIndicator:category:
-
- The type of indicator that this represents. Please don't use 'Other'.
- Defaults to 'ApplicationStatus'.
- */
+ * AppIndicator:category:
+ *
+ * The type of indicator that this represents. Please don't use 'Other'.
+ * Defaults to 'ApplicationStatus'.
+ */
g_object_class_install_property (object_class,
PROP_CATEGORY,
g_param_spec_string (PROP_CATEGORY_S,
@@ -249,11 +251,11 @@ app_indicator_class_init (AppIndicatorClass *klass)
G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS | G_PARAM_CONSTRUCT_ONLY));
/**
- AppIndicator:status:
-
- Whether the indicator is shown or requests attention. Defaults to
- 'Passive'.
- */
+ * AppIndicator:
+ *
+ * Whether the indicator is shown or requests attention. Defaults to
+ * 'Passive'.
+ */
g_object_class_install_property (object_class,
PROP_STATUS,
g_param_spec_string (PROP_STATUS_S,
@@ -263,10 +265,10 @@ app_indicator_class_init (AppIndicatorClass *klass)
G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
/**
- AppIndicator:icon-name:
-
- The name of the regular icon that is shown for the indicator.
- */
+ * AppIndicator:icon-name:
+ *
+ * The name of the regular icon that is shown for the indicator.
+ */
g_object_class_install_property(object_class,
PROP_ICON_NAME,
g_param_spec_string (PROP_ICON_NAME_S,
@@ -275,10 +277,10 @@ app_indicator_class_init (AppIndicatorClass *klass)
NULL,
G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
/**
- AppIndicator:icon-desc:
-
- The description of the regular icon that is shown for the indicator.
- */
+ * AppIndicator:icon-desc:
+ *
+ * The description of the regular icon that is shown for the indicator.
+ */
g_object_class_install_property(object_class,
PROP_ICON_DESC,
g_param_spec_string (PROP_ICON_DESC_S,
@@ -288,11 +290,11 @@ app_indicator_class_init (AppIndicatorClass *klass)
G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
/**
- AppIndicator:attention-icon-name:
-
- If the indicator sets it's status to %APP_INDICATOR_STATUS_ATTENTION
- then this icon is shown.
- */
+ * AppIndicator:attention-icon-name:
+ *
+ * If the indicator sets it's status to %APP_INDICATOR_STATUS_ATTENTION
+ * then this icon is shown.
+ */
g_object_class_install_property (object_class,
PROP_ATTENTION_ICON_NAME,
g_param_spec_string (PROP_ATTENTION_ICON_NAME_S,
@@ -301,11 +303,11 @@ app_indicator_class_init (AppIndicatorClass *klass)
NULL,
G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
/**
- AppIndicator:attention-icon-desc:
-
- If the indicator sets it's status to %APP_INDICATOR_STATUS_ATTENTION
- then this textual description of the icon shown.
- */
+ * AppIndicator:attention-icon-desc:
+ *
+ * If the indicator sets it's status to %APP_INDICATOR_STATUS_ATTENTION
+ * then this textual description of the icon shown.
+ */
g_object_class_install_property (object_class,
PROP_ATTENTION_ICON_DESC,
g_param_spec_string (PROP_ATTENTION_ICON_DESC_S,
@@ -314,11 +316,11 @@ app_indicator_class_init (AppIndicatorClass *klass)
NULL,
G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
/**
- AppIndicator:icon-theme-path:
-
- An additional place to look for icon names that may be installed by the
- application.
- */
+ * AppIndicator:icon-theme-path:
+ *
+ * An additional place to look for icon names that may be installed by the
+ * application.
+ */
g_object_class_install_property(object_class,
PROP_ICON_THEME_PATH,
g_param_spec_string (PROP_ICON_THEME_PATH_S,
@@ -328,11 +330,11 @@ app_indicator_class_init (AppIndicatorClass *klass)
G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS | G_PARAM_CONSTRUCT));
/**
- AppIndicator:connected:
-
- Pretty simple, %TRUE if we have a reasonable expectation of being
- displayed through this object. You should hide your TrayIcon if so.
- */
+ * AppIndicator:connected:
+ *
+ * Pretty simple, %TRUE if we have a reasonable expectation of being
+ * displayed through this object. You should hide your TrayIcon if so.
+ */
g_object_class_install_property (object_class,
PROP_CONNECTED,
g_param_spec_boolean (PROP_CONNECTED_S,
@@ -341,15 +343,15 @@ app_indicator_class_init (AppIndicatorClass *klass)
FALSE,
G_PARAM_READABLE | G_PARAM_STATIC_STRINGS));
/**
- AppIndicator:label:
-
- A label that can be shown next to the string in the application
- indicator. The label will not be shown unless there is an icon
- as well. The label is useful for numerical and other frequently
- updated information. In general, it shouldn't be shown unless a
- user requests it as it can take up a significant amount of space
- on the user's panel. This may not be shown in all visualizations.
- */
+ * AppIndicator:label:
+ *
+ * A label that can be shown next to the string in the application
+ * indicator. The label will not be shown unless there is an icon
+ * as well. The label is useful for numerical and other frequently
+ * updated information. In general, it shouldn't be shown unless a
+ * user requests it as it can take up a significant amount of space
+ * on the user's panel. This may not be shown in all visualizations.
+ */
g_object_class_install_property(object_class,
PROP_LABEL,
g_param_spec_string (PROP_LABEL_S,
@@ -358,16 +360,16 @@ app_indicator_class_init (AppIndicatorClass *klass)
NULL,
G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
/**
- AppIndicator:label-guide:
-
- An optional string to provide guidance to the panel on how big
- the #AppIndicator:label string could get. If this is set correctly
- then the panel should never 'jiggle' as the string adjusts through
- out the range of options. For instance, if you were providing a
- percentage like "54% thrust" in #AppIndicator:label you'd want to
- set this string to "100% thrust" to ensure space when Scotty can
- get you enough power.
- */
+ * AppIndicator:label-guide:
+ *
+ * An optional string to provide guidance to the panel on how big
+ * the #AppIndicator:label string could get. If this is set correctly
+ * then the panel should never 'jiggle' as the string adjusts through
+ * out the range of options. For instance, if you were providing a
+ * percentage like "54% thrust" in #AppIndicator:label you'd want to
+ * set this string to "100% thrust" to ensure space when Scotty can
+ * get you enough power.
+ */
g_object_class_install_property(object_class,
PROP_LABEL_GUIDE,
g_param_spec_string (PROP_LABEL_GUIDE_S,
@@ -376,17 +378,17 @@ app_indicator_class_init (AppIndicatorClass *klass)
NULL,
G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
/**
- AppIndicator:ordering-index:
-
- The ordering index is an odd parameter, and if you think you don't need
- it you're probably right. In general, the application indicator try
- to place the applications in a recreatable place taking into account
- which category they're in to try and group them. But, there are some
- cases where you'd want to ensure indicators are next to each other.
- To do that you can override the generated ordering index and replace it
- with a new one. Again, you probably don't want to be doing this, but
- in case you do, this is the way.
- */
+ * AppIndicator:ordering-index:
+ *
+ * The ordering index is an odd parameter, and if you think you don't need
+ * it you're probably right. In general, the application indicator try
+ * to place the applications in a recreatable place taking into account
+ * which category they're in to try and group them. But, there are some
+ * cases where you'd want to ensure indicators are next to each other.
+ * To do that you can override the generated ordering index and replace it
+ * with a new one. Again, you probably don't want to be doing this, but
+ * in case you do, this is the way.
+ */
g_object_class_install_property(object_class,
PROP_ORDERING_INDEX,
g_param_spec_uint (PROP_ORDERING_INDEX_S,
@@ -396,11 +398,11 @@ app_indicator_class_init (AppIndicatorClass *klass)
G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
/**
- AppIndicator:dbus-menu-server:
-
- A way to get the internal dbusmenu server if it is available.
- This should only be used for testing.
- */
+ * AppIndicator:dbus-menu-server:
+ *
+ * A way to get the internal dbusmenu server if it is available.
+ * This should only be used for testing.
+ */
g_object_class_install_property(object_class,
PROP_DBUS_MENU_SERVER,
g_param_spec_object (PROP_DBUS_MENU_SERVER_S,
@@ -412,11 +414,11 @@ app_indicator_class_init (AppIndicatorClass *klass)
/* Signals */
/**
- AppIndicator::new-icon:
- @arg0: The #AppIndicator object
-
- Emitted when #AppIndicator:icon-name is changed
- */
+ * AppIndicator::new-icon:
+ * @arg0: The #AppIndicator object
+ *
+ * when #AppIndicator:icon-name is changed
+ */
signals[NEW_ICON] = g_signal_new (APP_INDICATOR_SIGNAL_NEW_ICON,
G_TYPE_FROM_CLASS(klass),
G_SIGNAL_RUN_LAST,
@@ -426,11 +428,11 @@ app_indicator_class_init (AppIndicatorClass *klass)
G_TYPE_NONE, 0, G_TYPE_NONE);
/**
- AppIndicator::new-attention-icon:
- @arg0: The #AppIndicator object
-
- Emitted when #AppIndicator:attention-icon-name is changed
- */
+ * AppIndicator::new-attention-icon:
+ * @arg0: The #AppIndicator object
+ *
+ * Emitted when #AppIndicator:attention-icon-name is changed
+ */
signals[NEW_ATTENTION_ICON] = g_signal_new (APP_INDICATOR_SIGNAL_NEW_ATTENTION_ICON,
G_TYPE_FROM_CLASS(klass),
G_SIGNAL_RUN_LAST,
@@ -440,12 +442,12 @@ app_indicator_class_init (AppIndicatorClass *klass)
G_TYPE_NONE, 0, G_TYPE_NONE);
/**
- AppIndicator::new-status:
- @arg0: The #AppIndicator object
- @arg1: The string value of the #AppIndicatorStatus enum.
-
- Emitted when #AppIndicator:status is changed
- */
+ * AppIndicator::new-status:
+ * @arg0: The #AppIndicator object
+ * @arg1: The string value of the #AppIndicatorStatus enum.
+ *
+ * Emitted when #AppIndicator:status is changed
+ */
signals[NEW_STATUS] = g_signal_new (APP_INDICATOR_SIGNAL_NEW_STATUS,
G_TYPE_FROM_CLASS(klass),
G_SIGNAL_RUN_LAST,
@@ -456,13 +458,13 @@ app_indicator_class_init (AppIndicatorClass *klass)
G_TYPE_STRING);
/**
- AppIndicator::new-label:
- @arg0: The #AppIndicator object
- @arg1: The string for the label
- @arg1: The string for the guide
-
- Emitted when either #AppIndicator:label or #AppIndicator:label-guide are
- changed.
+ * AppIndicator::new-label:
+ * @arg0: The #AppIndicator object
+ * @arg1: The string for the label
+ * @arg1: The string for the guide
+ *
+ * Emitted when either #AppIndicator:label or #AppIndicator:label-guide are
+ * changed.
*/
signals[NEW_LABEL] = g_signal_new (APP_INDICATOR_SIGNAL_NEW_LABEL,
G_TYPE_FROM_CLASS(klass),
@@ -473,12 +475,12 @@ app_indicator_class_init (AppIndicatorClass *klass)
G_TYPE_NONE, 2, G_TYPE_STRING, G_TYPE_STRING);
/**
- AppIndicator::connection-changed:
- @arg0: The #AppIndicator object
- @arg1: Whether we're connected or not
-
- Signaled when we connect to a watcher, or when it drops away.
- */
+ * AppIndicator::connection-changed:
+ * @arg0: The #AppIndicator object
+ * @arg1: Whether we're connected or not
+ *
+ * Signaled when we connect to a watcher, or when it drops away.
+ */
signals[CONNECTION_CHANGED] = g_signal_new (APP_INDICATOR_SIGNAL_CONNECTION_CHANGED,
G_TYPE_FROM_CLASS(klass),
G_SIGNAL_RUN_LAST,
@@ -488,12 +490,12 @@ app_indicator_class_init (AppIndicatorClass *klass)
G_TYPE_NONE, 1, G_TYPE_BOOLEAN, G_TYPE_NONE);
/**
- AppIndicator::new-icon-theme-path:
- @arg0: The #AppIndicator object
-
- Signaled when there is a new icon set for the
- object.
- */
+ * AppIndicator::new-icon-theme-path:
+ * @arg0: The #AppIndicator object
+ *
+ * Signaled when there is a new icon set for the
+ * object.
+ */
signals[NEW_ICON_THEME_PATH] = g_signal_new (APP_INDICATOR_SIGNAL_NEW_ICON_THEME_PATH,
G_TYPE_FROM_CLASS(klass),
G_SIGNAL_RUN_LAST,
@@ -503,14 +505,13 @@ app_indicator_class_init (AppIndicatorClass *klass)
G_TYPE_NONE, 1, G_TYPE_STRING);
/**
- AppIndicator::scroll-event:
- @arg0: The #AppIndicator object
- @arg1: How many steps the scroll wheel has taken
- @arg2: (type Gdk.ScrollDirection) Which direction the wheel went in
-
- Signaled when there is a new icon set for the
- object.
- */
+ * AppIndicator::scroll-event:
+ * @arg0: The #AppIndicator object
+ * @arg1: How many steps the scroll wheel has taken
+ * @arg2: (type Gdk.ScrollDirection) Which direction the wheel went in
+ *
+ * Signaled when the #AppIndicator receives a scroll event.
+ */
signals[SCROLL_EVENT] = g_signal_new (APP_INDICATOR_SIGNAL_SCROLL_EVENT,
G_TYPE_FROM_CLASS(klass),
G_SIGNAL_RUN_LAST,
@@ -588,6 +589,9 @@ app_indicator_init (AppIndicator *self)
priv->shorties = NULL;
+ priv->sec_activate_target = NULL;
+ priv->sec_activate_enabled = FALSE;
+
/* Start getting the session bus */
g_object_ref(self); /* ref for the bus creation callback */
g_bus_get(G_BUS_TYPE_SESSION, NULL, bus_creation, self);
@@ -663,6 +667,12 @@ app_indicator_dispose (GObject *object)
priv->connection = NULL;
}
+ if (priv->sec_activate_target != NULL) {
+ g_signal_handlers_disconnect_by_func (priv->sec_activate_target, sec_activate_target_parent_changed, self);
+ g_object_unref(G_OBJECT(priv->sec_activate_target));
+ priv->sec_activate_target = NULL;
+ }
+
g_signal_handlers_disconnect_by_func(gtk_icon_theme_get_default(), G_CALLBACK(theme_changed_cb), self);
G_OBJECT_CLASS (app_indicator_parent_class)->dispose (object);
@@ -990,6 +1000,7 @@ bus_method_call (GDBusConnection * connection, const gchar * sender,
g_return_if_fail(IS_APP_INDICATOR(user_data));
AppIndicator * app = APP_INDICATOR(user_data);
+ AppIndicatorPrivate * priv = app->priv;
GVariant * retval = NULL;
if (g_strcmp0(method, "Scroll") == 0) {
@@ -1011,6 +1022,16 @@ bus_method_call (GDBusConnection * connection, const gchar * sender,
delta = ABS(delta);
g_signal_emit(app, signals[SCROLL_EVENT], 0, delta, direction);
+ } else if (g_strcmp0(method, "SecondaryActivate") == 0 ||
+ g_strcmp0(method, "XAyatanaSecondaryActivate") == 0) {
+ GtkWidget *menuitem = priv->sec_activate_target;
+
+ if (priv->sec_activate_enabled && menuitem &&
+ gtk_widget_get_visible (menuitem) &&
+ gtk_widget_get_sensitive (menuitem))
+ {
+ gtk_widget_activate (menuitem);
+ }
} else {
g_warning("Calling method '%s' on the app-indicator and it's unknown", method);
}
@@ -1442,6 +1463,7 @@ fallback (AppIndicator * self)
g_signal_connect(G_OBJECT(icon), "activate", G_CALLBACK(status_icon_activate), self);
g_signal_connect(G_OBJECT(icon), "popup-menu", G_CALLBACK(status_icon_menu_activate), self);
g_signal_connect(G_OBJECT(icon), "scroll-event", G_CALLBACK(scroll_event_wrapper), self);
+ g_signal_connect(G_OBJECT(icon), "button-release-event", G_CALLBACK(middle_click_wrapper), self);
return icon;
}
@@ -1457,12 +1479,39 @@ status_icon_status_wrapper (AppIndicator * self, const gchar * status, gpointer
/* A wrapper for redirecting the scroll events to the app-indicator from status
icon widget. */
static gboolean
-scroll_event_wrapper(GtkWidget *status_icon, GdkEventScroll *event, gpointer data)
+scroll_event_wrapper (GtkWidget *status_icon, GdkEventScroll *event, gpointer data)
{
g_return_val_if_fail(IS_APP_INDICATOR(data), FALSE);
AppIndicator * app = APP_INDICATOR(data);
g_signal_emit(app, signals[SCROLL_EVENT], 0, 1, event->direction);
+ return TRUE;
+}
+
+static gboolean
+middle_click_wrapper (GtkWidget *status_icon, GdkEventButton *event, gpointer data)
+{
+ g_return_val_if_fail(IS_APP_INDICATOR(data), FALSE);
+ AppIndicator * app = APP_INDICATOR(data);
+ AppIndicatorPrivate *priv = app->priv;
+
+ if (event->button == 2 && event->type == GDK_BUTTON_RELEASE) {
+ GtkAllocation alloc;
+ gint px = event->x;
+ gint py = event->y;
+ gtk_widget_get_allocation (status_icon, &alloc);
+ GtkWidget *menuitem = priv->sec_activate_target;
+
+ if (px >= 0 && px < alloc.width && py >= 0 && py < alloc.height &&
+ priv->sec_activate_enabled && menuitem &&
+ gtk_widget_get_visible (menuitem) &&
+ gtk_widget_get_sensitive (menuitem))
+ {
+ gtk_widget_activate (menuitem);
+ return TRUE;
+ }
+ }
+
return FALSE;
}
@@ -1535,6 +1584,7 @@ unfallback (AppIndicator * self, GtkStatusIcon * status_icon)
g_signal_handlers_disconnect_by_func(G_OBJECT(self), status_icon_status_wrapper, status_icon);
g_signal_handlers_disconnect_by_func(G_OBJECT(self), status_icon_changes, status_icon);
g_signal_handlers_disconnect_by_func(G_OBJECT(self), scroll_event_wrapper, status_icon);
+ g_signal_handlers_disconnect_by_func(G_OBJECT(self), middle_click_wrapper, status_icon);
gtk_status_icon_set_visible(status_icon, FALSE);
g_object_unref(G_OBJECT(status_icon));
return;
@@ -1557,23 +1607,54 @@ append_panel_icon_suffix (const gchar *icon_name)
return long_name;
}
+static gboolean
+widget_is_menu_child(AppIndicator * self, GtkWidget *child)
+{
+ g_return_val_if_fail(IS_APP_INDICATOR(self), FALSE);
+
+ if (!self->priv->menu) return FALSE;
+ if (!child) return FALSE;
+
+ GtkWidget *parent;
+
+ while ((parent = gtk_widget_get_parent(child))) {
+ if (parent == self->priv->menu)
+ return TRUE;
+
+ if (GTK_IS_MENU(parent))
+ child = gtk_menu_get_attach_widget(GTK_MENU(parent));
+ else
+ child = parent;
+ }
+
+ return FALSE;
+}
+
+static void
+sec_activate_target_parent_changed(GtkWidget *menuitem, GtkWidget *old_parent,
+ gpointer data)
+{
+ g_return_if_fail(IS_APP_INDICATOR(data));
+ AppIndicator *self = data;
+ self->priv->sec_activate_enabled = widget_is_menu_child(self, menuitem);
+}
+
/* ************************* */
/* Public Functions */
/* ************************* */
/**
- app_indicator_new:
- @id: The unique id of the indicator to create.
- @icon_name: The icon name for this indicator
- @category: The category of indicator.
-
- Creates a new #AppIndicator setting the properties:
- #AppIndicator:id with @id, #AppIndicator:category
- with @category and #AppIndicator:icon-name with
- @icon_name.
-
- Return value: A pointer to a new #AppIndicator object.
+ * app_indicator_new:
+ * @id: The unique id of the indicator to create.
+ * @icon_name: The icon name for this indicator
+ * @category: The category of indicator.
+ *
+ * Creates a new #AppIndicator setting the properties:
+ * #AppIndicator:id with @id, #AppIndicator:category with @category
+ * and #AppIndicator:icon-name with @icon_name.
+ *
+ * Return value: A pointer to a new #AppIndicator object.
*/
AppIndicator *
app_indicator_new (const gchar *id,
@@ -1590,18 +1671,18 @@ app_indicator_new (const gchar *id,
}
/**
- app_indicator_new_with_path:
- @id: The unique id of the indicator to create.
- @icon_name: The icon name for this indicator
- @category: The category of indicator.
- @icon_theme_path: A custom path for finding icons.
-
- Creates a new #AppIndicator setting the properties:
- #AppIndicator:id with @id, #AppIndicator:category
- with @category, #AppIndicator:icon-name with
- @icon_name and #AppIndicator:icon-theme-path with @icon_theme_path.
-
- Return value: A pointer to a new #AppIndicator object.
+ * app_indicator_new_with_path:
+ * @id: The unique id of the indicator to create.
+ * @icon_name: The icon name for this indicator
+ * @category: The category of indicator.
+ * @icon_theme_path: A custom path for finding icons.
+
+ * Creates a new #AppIndicator setting the properties:
+ * #AppIndicator:id with @id, #AppIndicator:category with @category,
+ * #AppIndicator:icon-name with @icon_name and #AppIndicator:icon-theme-path
+ * with @icon_theme_path.
+ *
+ * Return value: A pointer to a new #AppIndicator object.
*/
AppIndicator *
app_indicator_new_with_path (const gchar *id,
@@ -1620,20 +1701,20 @@ app_indicator_new_with_path (const gchar *id,
}
/**
- app_indicator_get_type:
-
- Generates or returns the unique #GType for #AppIndicator.
-
- Return value: A unique #GType for #AppIndicator objects.
-*/
+ * app_indicator_get_type:
+ *
+ * Generates or returns the unique #GType for #AppIndicator.
+ *
+ * Return value: A unique #GType for #AppIndicator objects.
+ */
/**
- app_indicator_set_status:
- @self: The #AppIndicator object to use
- @status: The status to set for this indicator
-
- Wrapper function for property #AppIndicator:status.
-*/
+ * app_indicator_set_status:
+ * @self: The #AppIndicator object to use
+ * @status: The status to set for this indicator
+ *
+ * Wrapper function for property #AppIndicator:status.
+ */
void
app_indicator_set_status (AppIndicator *self, AppIndicatorStatus status)
{
@@ -1667,15 +1748,15 @@ app_indicator_set_status (AppIndicator *self, AppIndicatorStatus status)
}
/**
- app_indicator_set_attention_icon:
- @self: The #AppIndicator object to use
- @icon_name: The name of the attention icon to set for this indicator
-
- Wrapper for app_indicator_set_attention_icon_full() with a NULL
- description.
-
- Deprecated: Use app_indicator_set_attention_icon_full() instead.
-*/
+ * app_indicator_set_attention_icon:
+ * @self: The #AppIndicator object to use
+ * @icon_name: The name of the attention icon to set for this indicator
+ *
+ * Wrapper for app_indicator_set_attention_icon_full() with a NULL
+ * description.
+ *
+ * Deprecated: Use app_indicator_set_attention_icon_full() instead.
+ */
void
app_indicator_set_attention_icon (AppIndicator *self, const gchar *icon_name)
{
@@ -1683,13 +1764,13 @@ app_indicator_set_attention_icon (AppIndicator *self, const gchar *icon_name)
}
/**
- app_indicator_set_attention_icon_full:
- @self: The #AppIndicator object to use
- @icon_name: The name of the attention icon to set for this indicator
- @icon_desc: A textual description of the icon
-
- Wrapper function for property #AppIndicator:attention-icon-name.
-*/
+ * app_indicator_set_attention_icon_full:
+ * @self: The #AppIndicator object to use
+ * @icon_name: The name of the attention icon to set for this indicator
+ * @icon_desc: A textual description of the icon
+ *
+ * Wrapper function for property #AppIndicator:attention-icon-name.
+ */
void
app_indicator_set_attention_icon_full (AppIndicator *self, const gchar *icon_name, const gchar * icon_desc)
{
@@ -1740,15 +1821,15 @@ app_indicator_set_attention_icon_full (AppIndicator *self, const gchar *icon_nam
}
/**
- app_indicator_set_icon:
- @self: The #AppIndicator object to use
- @icon_name: The icon name to set.
-
- Wrapper function for app_indicator_set_icon_full() with a NULL
- description.
-
- Deprecated: Use app_indicator_set_icon_full()
-**/
+ * app_indicator_set_icon:
+ * @self: The #AppIndicator object to use
+ * @icon_name: The icon name to set.
+ *
+ * Wrapper function for app_indicator_set_icon_full() with a NULL
+ * description.
+ *
+ * Deprecated: Use app_indicator_set_icon_full()
+ */
void
app_indicator_set_icon (AppIndicator *self, const gchar *icon_name)
{
@@ -1756,18 +1837,18 @@ app_indicator_set_icon (AppIndicator *self, const gchar *icon_name)
}
/**
- app_indicator_set_icon_full:
- @self: The #AppIndicator object to use
- @icon_name: The icon name to set.
- @icon_desc: A textual description of the icon for accessibility
-
- Sets the default icon to use when the status is active but
- not set to attention. In most cases, this should be the
- application icon for the program.
-
- Wrapper function for property #AppIndicator:icon-name and
- #AppIndicator::icon-desc.
-**/
+ * app_indicator_set_icon_full:
+ * @self: The #AppIndicator object to use
+ * @icon_name: The icon name to set.
+ * @icon_desc: A textual description of the icon for accessibility
+ *
+ * Sets the default icon to use when the status is active but
+ * not set to attention. In most cases, this should be the
+ * application icon for the program.
+ *
+ * Wrapper function for property #AppIndicator:icon-name and
+ * #AppIndicator::icon-desc.
+ */
void
app_indicator_set_icon_full (AppIndicator *self, const gchar *icon_name, const gchar * icon_desc)
{
@@ -1818,14 +1899,14 @@ app_indicator_set_icon_full (AppIndicator *self, const gchar *icon_name, const g
}
/**
- app_indicator_set_label:
- @self: The #AppIndicator object to use
- @label: The label to show next to the icon.
- @guide: A guide to size the label correctly.
-
- This is a wrapper function for the #AppIndicator:label and
- #AppIndicator:guide properties. This function can take #NULL
- as either @label or @guide and will clear the entries.
+ * app_indicator_set_label:
+ * @self: The #AppIndicator object to use
+ * @label: The label to show next to the icon.
+ * @guide: A guide to size the label correctly.
+ *
+ * This is a wrapper function for the #AppIndicator:label and
+ * #AppIndicator:guide properties. This function can take #NULL
+ * as either @label or @guide and will clear the entries.
*/
void
app_indicator_set_label (AppIndicator *self, const gchar * label, const gchar * guide)
@@ -1843,12 +1924,12 @@ app_indicator_set_label (AppIndicator *self, const gchar * label, const gchar *
}
/**
- app_indicator_set_icon_theme_path:
- @self: The #AppIndicator object to use
- @icon_theme_path: The icon theme path to set.
-
- Sets the path to use when searching for icons.
-**/
+ * app_indicator_set_icon_theme_path:
+ * @self: The #AppIndicator object to use
+ * @icon_theme_path: The icon theme path to set.
+ *
+ * Sets the path to use when searching for icons.
+ */
void
app_indicator_set_icon_theme_path (AppIndicator *self, const gchar *icon_theme_path)
{
@@ -1915,16 +1996,16 @@ setup_dbusmenu (AppIndicator *self)
}
/**
- app_indicator_set_menu:
- @self: The #AppIndicator
- @menu: A #GtkMenu to set
-
- Sets the menu that should be shown when the Application Indicator
- is clicked on in the panel. An application indicator will not
- be rendered unless it has a menu.
-
- Wrapper function for property #AppIndicator:menu.
-**/
+ * app_indicator_set_menu:
+ * @self: The #AppIndicator
+ * @menu: (allow-none): A #GtkMenu to set
+ *
+ * Sets the menu that should be shown when the Application Indicator
+ * is clicked on in the panel. An application indicator will not
+ * be rendered unless it has a menu.
+ *
+ * Wrapper function for property #AppIndicator:menu.
+ */
void
app_indicator_set_menu (AppIndicator *self, GtkMenu *menu)
{
@@ -1946,22 +2027,24 @@ app_indicator_set_menu (AppIndicator *self, GtkMenu *menu)
setup_dbusmenu (self);
+ priv->sec_activate_enabled = widget_is_menu_child (self, priv->sec_activate_target);
+
check_connect (self);
return;
}
/**
- app_indicator_set_ordering_index:
- @self: The #AppIndicator
- @ordering_index: A value for the ordering of this app indicator
-
- Sets the ordering index for the app indicator which effects the
- placement of it on the panel. For almost all app indicator
- this is not the function you're looking for.
-
- Wrapper function for property #AppIndicator:ordering-index.
-**/
+ * app_indicator_set_ordering_index:
+ * @self: The #AppIndicator
+ * @ordering_index: A value for the ordering of this app indicator
+ *
+ * Sets the ordering index for the app indicator which effects the
+ * placement of it on the panel. For almost all app indicator
+ * this is not the function you're looking for.
+ *
+ * Wrapper function for property #AppIndicator:ordering-index.
+ */
void
app_indicator_set_ordering_index (AppIndicator *self, guint32 ordering_index)
{
@@ -1973,13 +2056,52 @@ app_indicator_set_ordering_index (AppIndicator *self, guint32 ordering_index)
}
/**
- app_indicator_get_id:
- @self: The #AppIndicator object to use
+ * app_indicator_set_secondary_activate_target:
+ * @self: The #AppIndicator
+ * @menuitem: (allow-none): A #GtkWidget to be activated on secondary activation
+ *
+ * Set the @menuitem to be activated when a secondary activation event (i.e. a
+ * middle-click) is emitted over the #AppIndicator icon/label.
+ *
+ * The @menuitem can be also a complex #GtkWidget, but to get activated when
+ * a secondary activation occurs in the #Appindicator, it must be a visible and
+ * active child (or inner-child) of the #AppIndicator:menu.
+ *
+ * Setting @menuitem to %NULL causes to disable this feature.
+ */
+void
+app_indicator_set_secondary_activate_target (AppIndicator *self, GtkWidget *menuitem)
+{
+ g_return_if_fail (IS_APP_INDICATOR (self));
+ AppIndicatorPrivate *priv = self->priv;
- Wrapper function for property #AppIndicator:id.
+ if (priv->sec_activate_target) {
+ g_signal_handlers_disconnect_by_func (priv->sec_activate_target,
+ sec_activate_target_parent_changed,
+ self);
+ g_object_unref(G_OBJECT(priv->sec_activate_target));
+ priv->sec_activate_target = NULL;
+ }
- Return value: The current ID
-*/
+ if (menuitem == NULL) {
+ return;
+ }
+
+ g_return_if_fail (GTK_IS_WIDGET (menuitem));
+
+ priv->sec_activate_target = g_object_ref(G_OBJECT(menuitem));
+ priv->sec_activate_enabled = widget_is_menu_child(self, menuitem);
+ g_signal_connect(menuitem, "parent-set", G_CALLBACK(sec_activate_target_parent_changed), self);
+}
+
+/**
+ * app_indicator_get_id:
+ * @self: The #AppIndicator object to use
+ *
+ * Wrapper function for property #AppIndicator:id.
+ *
+ * Return value: The current ID
+ */
const gchar *
app_indicator_get_id (AppIndicator *self)
{
@@ -1989,13 +2111,13 @@ app_indicator_get_id (AppIndicator *self)
}
/**
- app_indicator_get_category:
- @self: The #AppIndicator object to use
-
- Wrapper function for property #AppIndicator:category.
-
- Return value: The current category.
-*/
+ * app_indicator_get_category:
+ * @self: The #AppIndicator object to use
+ *
+ * Wrapper function for property #AppIndicator:category.
+ *
+ * Return value: The current category.
+ */
AppIndicatorCategory
app_indicator_get_category (AppIndicator *self)
{
@@ -2005,13 +2127,13 @@ app_indicator_get_category (AppIndicator *self)
}
/**
- app_indicator_get_status:
- @self: The #AppIndicator object to use
-
- Wrapper function for property #AppIndicator:status.
-
- Return value: The current status.
-*/
+ * app_indicator_get_status:
+ * @self: The #AppIndicator object to use
+ *
+ * Wrapper function for property #AppIndicator:status.
+ *
+ * Return value: The current status.
+ */
AppIndicatorStatus
app_indicator_get_status (AppIndicator *self)
{
@@ -2021,13 +2143,13 @@ app_indicator_get_status (AppIndicator *self)
}
/**
- app_indicator_get_icon:
- @self: The #AppIndicator object to use
-
- Wrapper function for property #AppIndicator:icon-name.
-
- Return value: The current icon name.
-*/
+ * app_indicator_get_icon:
+ * @self: The #AppIndicator object to use
+ *
+ * Wrapper function for property #AppIndicator:icon-name.
+ *
+ * Return value: The current icon name.
+ */
const gchar *
app_indicator_get_icon (AppIndicator *self)
{
@@ -2037,12 +2159,12 @@ app_indicator_get_icon (AppIndicator *self)
}
/**
- app_indicator_get_icon_desc:
- @self: The #AppIndicator object to use
-
- Wrapper function for property #AppIndicator:icon-desc.
-
- Return value: The current icon description.
+ * app_indicator_get_icon_desc:
+ * @self: The #AppIndicator object to use
+ *
+ * Wrapper function for property #AppIndicator:icon-desc.
+ *
+ * Return value: The current icon description.
*/
const gchar *
app_indicator_get_icon_desc (AppIndicator *self)
@@ -2053,13 +2175,13 @@ app_indicator_get_icon_desc (AppIndicator *self)
}
/**
- app_indicator_get_icon_theme_path:
- @self: The #AppIndicator object to use
-
- Wrapper function for property #AppIndicator:icon-theme-path.
-
- Return value: The current icon theme path.
-*/
+ * app_indicator_get_icon_theme_path:
+ * @self: The #AppIndicator object to use
+ *
+ * Wrapper function for property #AppIndicator:icon-theme-path.
+ *
+ * Return value: The current icon theme path.
+ */
const gchar *
app_indicator_get_icon_theme_path (AppIndicator *self)
{
@@ -2069,13 +2191,13 @@ app_indicator_get_icon_theme_path (AppIndicator *self)
}
/**
- app_indicator_get_attention_icon:
- @self: The #AppIndicator object to use
-
- Wrapper function for property #AppIndicator:attention-icon-name.
-
- Return value: The current attention icon name.
-*/
+ * app_indicator_get_attention_icon:
+ * @self: The #AppIndicator object to use
+ *
+ * Wrapper function for property #AppIndicator:attention-icon-name.
+ *
+ * Return value: The current attention icon name.
+ */
const gchar *
app_indicator_get_attention_icon (AppIndicator *self)
{
@@ -2085,13 +2207,13 @@ app_indicator_get_attention_icon (AppIndicator *self)
}
/**
- app_indicator_get_attention_icon_desc:
- @self: The #AppIndicator object to use
-
- Wrapper function for property #AppIndicator:attention-icon-desc.
-
- Return value: The current attention icon description.
-*/
+ * app_indicator_get_attention_icon_desc:
+ * @self: The #AppIndicator object to use
+ *
+ * Wrapper function for property #AppIndicator:attention-icon-desc.
+ *
+ * Return value: The current attention icon description.
+ */
const gchar *
app_indicator_get_attention_icon_desc (AppIndicator *self)
{
@@ -2101,14 +2223,14 @@ app_indicator_get_attention_icon_desc (AppIndicator *self)
}
/**
- app_indicator_get_menu:
- @self: The #AppIndicator object to use
-
- Gets the menu being used for this application indicator.
- Wrapper function for property #AppIndicator:menu.
-
- Return value: (transfer none): A #GtkMenu object or %NULL if one hasn't been set.
-*/
+ * app_indicator_get_menu:
+ * @self: The #AppIndicator object to use
+ *
+ * Gets the menu being used for this application indicator.
+ * Wrapper function for property #AppIndicator:menu.
+ *
+ * Returns: (transfer none): A #GtkMenu object or %NULL if one hasn't been set.
+ */
GtkMenu *
app_indicator_get_menu (AppIndicator *self)
{
@@ -2122,13 +2244,13 @@ app_indicator_get_menu (AppIndicator *self)
}
/**
- app_indicator_get_label:
- @self: The #AppIndicator object to use
-
- Wrapper function for property #AppIndicator:label.
-
- Return value: The current label.
-*/
+ * app_indicator_get_label:
+ * @self: The #AppIndicator object to use
+ *
+ * Wrapper function for property #AppIndicator:label.
+ *
+ * Return value: The current label.
+ */
const gchar *
app_indicator_get_label (AppIndicator *self)
{
@@ -2138,13 +2260,13 @@ app_indicator_get_label (AppIndicator *self)
}
/**
- app_indicator_get_label_guide:
- @self: The #AppIndicator object to use
-
- Wrapper function for property #AppIndicator:label-guide.
-
- Return value: The current label guide.
-*/
+ * app_indicator_get_label_guide:
+ * @self: The #AppIndicator object to use
+ *
+ * Wrapper function for property #AppIndicator:label-guide.
+ *
+ * Return value: The current label guide.
+ */
const gchar *
app_indicator_get_label_guide (AppIndicator *self)
{
@@ -2154,13 +2276,13 @@ app_indicator_get_label_guide (AppIndicator *self)
}
/**
- app_indicator_get_ordering_index:
- @self: The #AppIndicator object to use
-
- Wrapper function for property #AppIndicator:ordering-index.
-
- Return value: The current ordering index.
-*/
+ * app_indicator_get_ordering_index:
+ * @self: The #AppIndicator object to use
+ *
+ * Wrapper function for property #AppIndicator:ordering-index.
+ *
+ * Return value: The current ordering index.
+ */
guint32
app_indicator_get_ordering_index (AppIndicator *self)
{
@@ -2173,6 +2295,22 @@ app_indicator_get_ordering_index (AppIndicator *self)
}
}
+/**
+ * app_indicator_get_secondary_activate_target:
+ * @self: The #AppIndicator object to use
+ *
+ * Gets the menuitem being called on secondary-activate event.
+ *
+ * Returns: (transfer none): A #GtkWidget object or %NULL if none has been set.
+ */
+GtkWidget *
+app_indicator_get_secondary_activate_target (AppIndicator *self)
+{
+ g_return_val_if_fail (IS_APP_INDICATOR (self), NULL);
+
+ return GTK_WIDGET(self->priv->sec_activate_target);
+}
+
#define APP_INDICATOR_SHORTY_NICK "app-indicator-shorty-nick"
/* Callback when an item from the desktop shortcuts gets
@@ -2195,14 +2333,14 @@ shorty_activated_cb (DbusmenuMenuitem * mi, guint timestamp, gpointer user_data)
}
/**
- app_indicator_build_menu_from_desktop:
- @self: The #AppIndicator object to use
- @desktop_file: A path to the desktop file to build the menu from
- @desktop_profile: Which entries should be used from the desktop file
-
- This function allows for building the Application Indicator menu
- from a static desktop file.
-*/
+ * app_indicator_build_menu_from_desktop:
+ * @self: The #AppIndicator object to use
+ * @desktop_file: A path to the desktop file to build the menu from
+ * @desktop_profile: Which entries should be used from the desktop file
+ *
+ * This function allows for building the Application Indicator menu
+ * from a static desktop file.
+ */
void
app_indicator_build_menu_from_desktop (AppIndicator * self, const gchar * desktop_file, const gchar * desktop_profile)
{
diff --git a/src/app-indicator.h b/src/app-indicator.h
index f96212d..6922248 100644
--- a/src/app-indicator.h
+++ b/src/app-indicator.h
@@ -35,40 +35,40 @@ License version 3 and version 2.1 along with this program. If not, see
G_BEGIN_DECLS
/**
- APP_INDICATOR_TYPE:
-
- Get the #GType for a #AppIndicator.
-*/
+ * APP_INDICATOR_TYPE:
+ *
+ * Get the #GType for a #AppIndicator.
+ */
/**
- APP_INDICATOR:
- @obj: The object to convert
-
- Safely convert a #GObject into an #AppIndicator.
-*/
+ * APP_INDICATOR:
+ * @obj: The object to convert
+ *
+ * Safely convert a #GObject into an #AppIndicator.
+ */
/**
- APP_INDICATOR_CLASS:
- @klass: #GObjectClass based class to convert.
-
- Safely convert a #GObjectClass into a #AppIndicatorClass.
-*/
+ * APP_INDICATOR_CLASS:
+ * @klass: #GObjectClass based class to convert.
+ *
+ * Safely convert a #GObjectClass into a #AppIndicatorClass.
+ */
/**
- IS_APP_INDICATOR:
- @obj: An #GObject to check
-
- Checks to see if @obj is in the object hierarchy of #AppIndicator.
-*/
+ * IS_APP_INDICATOR:
+ * @obj: An #GObject to check
+ *
+ * Checks to see if @obj is in the object hierarchy of #AppIndicator.
+ */
/**
- IS_APP_INDICATOR_CLASS:
- @klass: An #GObjectClass to check
-
- Checks to see if @klass is in the object class hierarchy of #AppIndicatorClass.
-*/
+ * IS_APP_INDICATOR_CLASS:
+ * @klass: An #GObjectClass to check
+ *
+ * Checks to see if @klass is in the object class hierarchy of #AppIndicatorClass.
+ */
/**
- APP_INDICATOR_GET_CLASS:
- @obj: A #GObject in the class hierarchy of #AppIndicator.
-
- Gets a pointer to the #AppIndicatorClass for the object @obj.
-*/
+ * APP_INDICATOR_GET_CLASS:
+ * @obj: A #GObject in the class hierarchy of #AppIndicator.
+ *
+ * Gets a pointer to the #AppIndicatorClass for the object @obj.
+ */
#define APP_INDICATOR_TYPE (app_indicator_get_type ())
#define APP_INDICATOR(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), APP_INDICATOR_TYPE, AppIndicator))
@@ -78,40 +78,40 @@ G_BEGIN_DECLS
#define APP_INDICATOR_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), APP_INDICATOR_TYPE, AppIndicatorClass))
/**
- APP_INDICATOR_SIGNAL_NEW_ICON:
-
- String identifier for the #AppIndicator::new-icon signal.
-*/
+ * APP_INDICATOR_SIGNAL_NEW_ICON:
+ *
+ * String identifier for the #AppIndicator::new-icon signal.
+ */
/**
- APP_INDICATOR_SIGNAL_NEW_ATTENTION_ICON:
-
- String identifier for the #AppIndicator::new-attention-icon signal.
-*/
+ * APP_INDICATOR_SIGNAL_NEW_ATTENTION_ICON:
+ *
+ * String identifier for the #AppIndicator::new-attention-icon signal.
+ */
/**
- APP_INDICATOR_SIGNAL_NEW_STATUS:
-
- String identifier for the #AppIndicator::new-status signal.
-*/
+ * APP_INDICATOR_SIGNAL_NEW_STATUS:
+ *
+ * String identifier for the #AppIndicator::new-status signal.
+ */
/**
- APP_INDICATOR_SIGNAL_NEW_LABEL:
-
- String identifier for the #AppIndicator::new-label signal.
-*/
+ * APP_INDICATOR_SIGNAL_NEW_LABEL:
+ *
+ * String identifier for the #AppIndicator::new-label signal.
+ */
/**
- APP_INDICATOR_SIGNAL_CONNECTION_CHANGED:
-
- String identifier for the #AppIndicator::connection-changed signal.
-*/
+ * APP_INDICATOR_SIGNAL_CONNECTION_CHANGED:
+ *
+ * String identifier for the #AppIndicator::connection-changed signal.
+ */
/**
- APP_INDICATOR_SIGNAL_NEW_ICON_THEME_PATH:
-
- String identifier for the #AppIndicator::new-icon-theme-path signal.
-*/
+ * APP_INDICATOR_SIGNAL_NEW_ICON_THEME_PATH:
+ *
+ * String identifier for the #AppIndicator::new-icon-theme-path signal.
+ */
/**
- APP_INDICATOR_SIGNAL_SCROLL_EVENT:
-
- String identifier for the #AppIndicator::scroll-event signal.
-*/
+ * APP_INDICATOR_SIGNAL_SCROLL_EVENT:
+ *
+ * String identifier for the #AppIndicator::scroll-event signal.
+ */
#define APP_INDICATOR_SIGNAL_NEW_ICON "new-icon"
#define APP_INDICATOR_SIGNAL_NEW_ATTENTION_ICON "new-attention-icon"
#define APP_INDICATOR_SIGNAL_NEW_STATUS "new-status"
@@ -121,16 +121,16 @@ G_BEGIN_DECLS
#define APP_INDICATOR_SIGNAL_SCROLL_EVENT "scroll-event"
/**
- AppIndicatorCategory:
- @APP_INDICATOR_CATEGORY_APPLICATION_STATUS: The indicator is used to display the status of the application.
- @APP_INDICATOR_CATEGORY_COMMUNICATIONS: The application is used for communication with other people.
- @APP_INDICATOR_CATEGORY_SYSTEM_SERVICES: A system indicator relating to something in the user's system.
- @APP_INDICATOR_CATEGORY_HARDWARE: An indicator relating to the user's hardware.
- @APP_INDICATOR_CATEGORY_OTHER: Something not defined in this enum, please don't use unless you really need it.
-
- The category provides grouping for the indicators so that
- users can find indicators that are similar together.
-*/
+ * AppIndicatorCategory:
+ * @APP_INDICATOR_CATEGORY_APPLICATION_STATUS: The indicator is used to display the status of the application.
+ * @APP_INDICATOR_CATEGORY_COMMUNICATIONS: The application is used for communication with other people.
+ * @APP_INDICATOR_CATEGORY_SYSTEM_SERVICES: A system indicator relating to something in the user's system.
+ * @APP_INDICATOR_CATEGORY_HARDWARE: An indicator relating to the user's hardware.
+ * @APP_INDICATOR_CATEGORY_OTHER: Something not defined in this enum, please don't use unless you really need it.
+ *
+ * The category provides grouping for the indicators so that
+ * users can find indicators that are similar together.
+ */
typedef enum { /*< prefix=APP_INDICATOR_CATEGORY >*/
APP_INDICATOR_CATEGORY_APPLICATION_STATUS, /*< nick=ApplicationStatus >*/
APP_INDICATOR_CATEGORY_COMMUNICATIONS, /*< nick=Communications >*/
@@ -140,16 +140,16 @@ typedef enum { /*< prefix=APP_INDICATOR_CATEGORY >*/
} AppIndicatorCategory;
/**
- AppIndicatorStatus:
- @APP_INDICATOR_STATUS_PASSIVE: The indicator should not be shown to the user.
- @APP_INDICATOR_STATUS_ACTIVE: The indicator should be shown in it's default state.
- @APP_INDICATOR_STATUS_ATTENTION: The indicator should show it's attention icon.
-
- These are the states that the indicator can be on in
- the user's panel. The indicator by default starts
- in the state @APP_INDICATOR_STATUS_PASSIVE and can be
- shown by setting it to @APP_INDICATOR_STATUS_ACTIVE.
-*/
+ * AppIndicatorStatus:
+ * @APP_INDICATOR_STATUS_PASSIVE: The indicator should not be shown to the user.
+ * @APP_INDICATOR_STATUS_ACTIVE: The indicator should be shown in it's default state.
+ * @APP_INDICATOR_STATUS_ATTENTION: The indicator should show it's attention icon.
+ *
+ * These are the states that the indicator can be on in
+ * the user's panel. The indicator by default starts
+ * in the state @APP_INDICATOR_STATUS_PASSIVE and can be
+ * shown by setting it to @APP_INDICATOR_STATUS_ACTIVE.
+ */
typedef enum { /*< prefix=APP_INDICATOR_STATUS >*/
APP_INDICATOR_STATUS_PASSIVE, /*< nick=Passive >*/
APP_INDICATOR_STATUS_ACTIVE, /*< nick=Active >*/
@@ -161,30 +161,30 @@ typedef struct _AppIndicatorClass AppIndicatorClass;
typedef struct _AppIndicatorPrivate AppIndicatorPrivate;
/**
- AppIndicatorClass:
- @parent_class: Mia familia
- @new_icon: Slot for #AppIndicator::new-icon.
- @new_attention_icon: Slot for #AppIndicator::new-attention-icon.
- @new_status: Slot for #AppIndicator::new-status.
- @new_icon_theme_path: Slot for #AppIndicator::new-icon-theme-path
- @new_label: Slot for #AppIndicator::new-label.
- @connection_changed: Slot for #AppIndicator::connection-changed.
- @scroll_event: Slot for #AppIndicator::scroll-event
- @app_indicator_reserved_ats: Reserved for future use.
- @fallback: Function that gets called to make a #GtkStatusIcon when
- there is no Application Indicator area available.
- @unfallback: The function that gets called if an Application
- Indicator area appears after the fallback has been created.
- @app_indicator_reserved_1: Reserved for future use.
- @app_indicator_reserved_2: Reserved for future use.
- @app_indicator_reserved_3: Reserved for future use.
- @app_indicator_reserved_4: Reserved for future use.
- @app_indicator_reserved_5: Reserved for future use.
- @app_indicator_reserved_6: Reserved for future use.
-
- The signals and external functions that make up the #AppIndicator
- class object.
-*/
+ * AppIndicatorClass:
+ * @parent_class: Mia familia
+ * @new_icon: Slot for #AppIndicator::new-icon.
+ * @new_attention_icon: Slot for #AppIndicator::new-attention-icon.
+ * @new_status: Slot for #AppIndicator::new-status.
+ * @new_icon_theme_path: Slot for #AppIndicator::new-icon-theme-path
+ * @new_label: Slot for #AppIndicator::new-label.
+ * @connection_changed: Slot for #AppIndicator::connection-changed.
+ * @scroll_event: Slot for #AppIndicator::scroll-event
+ * @app_indicator_reserved_ats: Reserved for future use.
+ * @fallback: Function that gets called to make a #GtkStatusIcon when
+ * there is no Application Indicator area available.
+ * @unfallback: The function that gets called if an Application
+ * Indicator area appears after the fallback has been created.
+ * @app_indicator_reserved_1: Reserved for future use.
+ * @app_indicator_reserved_2: Reserved for future use.
+ * @app_indicator_reserved_3: Reserved for future use.
+ * @app_indicator_reserved_4: Reserved for future use.
+ * @app_indicator_reserved_5: Reserved for future use.
+ * @app_indicator_reserved_6: Reserved for future use.
+ *
+ * The signals and external functions that make up the #AppIndicator
+ * class object.
+ */
struct _AppIndicatorClass {
/* Parent */
GObjectClass parent_class;
@@ -232,19 +232,18 @@ struct _AppIndicatorClass {
};
/**
- AppIndicator:
-
- A application indicator represents the values that are needed to show a
- unique status in the panel for an application. In general, applications
- should try to fit in the other indicators that are available on the
- panel before using this. But, sometimes it is necissary.
-*/
-/* Private fields
- @parent: Parent object.
- @priv: Internal data.
-*/
+ * AppIndicator:
+ *
+ * A application indicator represents the values that are needed to show a
+ * unique status in the panel for an application. In general, applications
+ * should try to fit in the other indicators that are available on the
+ * panel before using this. But, sometimes it is necissary.
+ *
+ * Private fields
+ * @parent: Parent object.
+ * @priv: Internal data.
+ */
struct _AppIndicator {
- /*< Private >*/
GObject parent;
/*< Private >*/
@@ -284,6 +283,8 @@ void app_indicator_set_icon_theme_path(AppIndicator
const gchar *icon_theme_path);
void app_indicator_set_ordering_index (AppIndicator *self,
guint32 ordering_index);
+void app_indicator_set_secondary_activate_target (AppIndicator *self,
+ GtkWidget *menuitem);
/* Get properties */
const gchar * app_indicator_get_id (AppIndicator *self);
@@ -294,10 +295,12 @@ const gchar * app_indicator_get_icon_desc (AppIndic
const gchar * app_indicator_get_icon_theme_path (AppIndicator *self);
const gchar * app_indicator_get_attention_icon (AppIndicator *self);
const gchar * app_indicator_get_attention_icon_desc (AppIndicator *self);
+
GtkMenu * app_indicator_get_menu (AppIndicator *self);
const gchar * app_indicator_get_label (AppIndicator *self);
const gchar * app_indicator_get_label_guide (AppIndicator *self);
guint32 app_indicator_get_ordering_index (AppIndicator *self);
+GtkWidget * app_indicator_get_secondary_activate_target (AppIndicator *self);
/* Helpers */
void app_indicator_build_menu_from_desktop (AppIndicator * self,
@@ -307,20 +310,20 @@ void app_indicator_build_menu_from_desktop (AppIndica
G_END_DECLS
/**
- SECTION:app-indicator
- @short_description: An object to put application information
- into the panel.
- @stability: Unstable
- @include: libappindicator/app-indicator.h
-
- An application indicator is a way for an application to put
- a menu into the panel on the user's screen. This allows the
- user to interact with the application even though it might
- not be visible to the user at the time. In most cases this
- is not a good solution as there are other ways to inform the
- user. It should only be use if persistence is a desired
- feature for the user (not for your marketing purpose of
- having your logo in the panel).
-*/
+ * SECTION:app-indicator
+ * @short_description: An object to put application information
+ * into the panel.
+ * @stability: Unstable
+ * @include: libappindicator/app-indicator.h
+ *
+ * An application indicator is a way for an application to put
+ * a menu into the panel on the user's screen. This allows the
+ * user to interact with the application even though it might
+ * not be visible to the user at the time. In most cases this
+ * is not a good solution as there are other ways to inform the
+ * user. It should only be use if persistence is a desired
+ * feature for the user (not for your marketing purpose of
+ * having your logo in the panel).
+ */
#endif
diff --git a/src/application-service-marshal.c b/src/application-service-marshal.c
index fb940b7..d077981 100644
--- a/src/application-service-marshal.c
+++ b/src/application-service-marshal.c
@@ -286,3 +286,40 @@ _application_service_marshal_VOID__INT_UINT (GClosure *closure,
data2);
}
+/* VOID:INT,INT (./application-service-marshal.list:25) */
+void
+_application_service_marshal_VOID__INT_INT (GClosure *closure,
+ GValue *return_value G_GNUC_UNUSED,
+ guint n_param_values,
+ const GValue *param_values,
+ gpointer invocation_hint G_GNUC_UNUSED,
+ gpointer marshal_data)
+{
+ typedef void (*GMarshalFunc_VOID__INT_INT) (gpointer data1,
+ gint arg_1,
+ gint arg_2,
+ gpointer data2);
+ register GMarshalFunc_VOID__INT_INT callback;
+ register GCClosure *cc = (GCClosure*) closure;
+ register gpointer data1, data2;
+
+ g_return_if_fail (n_param_values == 3);
+
+ if (G_CCLOSURE_SWAP_DATA (closure))
+ {
+ data1 = closure->data;
+ data2 = g_value_peek_pointer (param_values + 0);
+ }
+ else
+ {
+ data1 = g_value_peek_pointer (param_values + 0);
+ data2 = closure->data;
+ }
+ callback = (GMarshalFunc_VOID__INT_INT) (marshal_data ? marshal_data : cc->callback);
+
+ callback (data1,
+ g_marshal_value_peek_int (param_values + 1),
+ g_marshal_value_peek_int (param_values + 2),
+ data2);
+}
+
diff --git a/src/application-service-marshal.list b/src/application-service-marshal.list
index 39a55fe..ae3aa6f 100644
--- a/src/application-service-marshal.list
+++ b/src/application-service-marshal.list
@@ -22,3 +22,4 @@ VOID: INT, STRING
VOID: STRING, STRING
VOID: BOOL, STRING, OBJECT
VOID: INT, UINT
+VOID: INT, INT
diff --git a/src/gen-notification-item.xml.c b/src/gen-notification-item.xml.c
index aa2ee0d..0a442a8 100644
--- a/src/gen-notification-item.xml.c
+++ b/src/gen-notification-item.xml.c
@@ -24,6 +24,13 @@ const char * _notification_item =
" <arg type=\"i\" name=\"delta\" direction=\"in\" />\n"
" <arg type=\"s\" name=\"orientation\" direction=\"in\" />\n"
" </method>\n"
+" <method name=\"SecondaryActivate\">\n"
+" <arg type=\"i\" name=\"x\" direction=\"in\" />\n"
+" <arg type=\"i\" name=\"y\" direction=\"in\" />\n"
+" </method>\n"
+" <method name=\"XAyatanaSecondaryActivate\">\n"
+" <arg type=\"u\" name=\"timestamp\" direction=\"in\" />\n"
+" </method>\n"
"\n"
"<!-- Signals -->\n"
" <signal name=\"NewIcon\">\n"
diff --git a/src/notification-item.xml b/src/notification-item.xml
index bbf77c5..589a438 100644
--- a/src/notification-item.xml
+++ b/src/notification-item.xml
@@ -23,6 +23,13 @@
<arg type="i" name="delta" direction="in" />
<arg type="s" name="orientation" direction="in" />
</method>
+ <method name="SecondaryActivate">
+ <arg type="i" name="x" direction="in" />
+ <arg type="i" name="y" direction="in" />
+ </method>
+ <method name="XAyatanaSecondaryActivate">
+ <arg type="u" name="timestamp" direction="in" />
+ </method>
<!-- Signals -->
<signal name="NewIcon">