diff options
author | Conor Curran <conor.curran@canonical.com> | 2011-07-28 10:18:04 +0100 |
---|---|---|
committer | Conor Curran <conor.curran@canonical.com> | 2011-07-28 10:18:04 +0100 |
commit | 06757112c6a6f3c860d1092bbd544c5e27b20c3b (patch) | |
tree | 8c43ade246905af1d8698b72a460904108642316 | |
parent | 9762553300ac40df12e5f700810cc8203903bb64 (diff) | |
parent | a2871b1b51c2f26a5778a6f15c5cae6650cc8fff (diff) | |
download | ayatana-indicator-sound-06757112c6a6f3c860d1092bbd544c5e27b20c3b.tar.gz ayatana-indicator-sound-06757112c6a6f3c860d1092bbd544c5e27b20c3b.tar.bz2 ayatana-indicator-sound-06757112c6a6f3c860d1092bbd544c5e27b20c3b.zip |
merged Trevino's middle click mute patch
-rw-r--r-- | src/Makefile.am | 2 | ||||
-rw-r--r-- | src/indicator-sound.c | 54 | ||||
-rw-r--r-- | src/mute-menu-item.c | 5 | ||||
-rw-r--r-- | src/mute-widget.c | 141 | ||||
-rw-r--r-- | src/mute-widget.h | 67 |
5 files changed, 269 insertions, 0 deletions
diff --git a/src/Makefile.am b/src/Makefile.am index e35f871..60c7249 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -18,6 +18,8 @@ libsoundmenu_la_SOURCES = \ transport-widget.h \ metadata-widget.c \ metadata-widget.h \ + mute-widget.c \ + mute-widget.h \ volume-widget.c \ volume-widget.h \ voip-input-widget.c \ diff --git a/src/indicator-sound.c b/src/indicator-sound.c index 76bf710..7c72900 100644 --- a/src/indicator-sound.c +++ b/src/indicator-sound.c @@ -39,6 +39,7 @@ with this program. If not, see <http://www.gnu.org/licenses/>. #include "voip-input-widget.h" #include "dbus-shared-names.h" #include "sound-state-manager.h" +#include "mute-widget.h" #include "gen-sound-service.xml.h" #include "common-defs.h" @@ -49,6 +50,7 @@ struct _IndicatorSoundPrivate { GtkWidget* volume_widget; GtkWidget* voip_widget; + MuteWidget *mute_widget; GList* transport_widgets_list; GDBusProxy *dbus_proxy; SoundStateManager* state_manager; @@ -75,6 +77,9 @@ static const gchar * get_accessible_desc (IndicatorObject * io); static void indicator_sound_scroll (IndicatorObject * io, IndicatorObjectEntry * entry, gint delta, IndicatorScrollDirection direction); +static void indicator_sound_middle_click (IndicatorObject * io, + IndicatorObjectEntry * entry, + guint time, gpointer data); //key/moust event handlers static gboolean key_press_cb(GtkWidget* widget, GdkEventKey* event, gpointer data); @@ -97,6 +102,10 @@ static gboolean new_metadata_widget (DbusmenuMenuitem * newitem, DbusmenuMenuitem * parent, DbusmenuClient * client, gpointer user_data); +static gboolean new_mute_widget (DbusmenuMenuitem * newitem, + DbusmenuMenuitem * parent, + DbusmenuClient * client, + gpointer user_data); // DBUS communication static GDBusNodeInfo *node_info = NULL; @@ -125,6 +134,7 @@ indicator_sound_class_init (IndicatorSoundClass *klass) io_class->get_menu = get_menu; io_class->get_accessible_desc = get_accessible_desc; io_class->entry_scrolled = indicator_sound_scroll; + io_class->secondary_activate = indicator_sound_middle_click; } static void @@ -137,6 +147,7 @@ indicator_sound_init (IndicatorSound *self) IndicatorSoundPrivate* priv = INDICATOR_SOUND_GET_PRIVATE(self); priv->volume_widget = NULL; priv->voip_widget = NULL; + priv->mute_widget = NULL; priv->dbus_proxy = NULL; GList* t_list = NULL; priv->transport_widgets_list = t_list; @@ -207,6 +218,9 @@ get_menu (IndicatorObject * io) dbusmenu_client_add_type_handler (DBUSMENU_CLIENT(client), DBUSMENU_METADATA_MENUITEM_TYPE, new_metadata_widget); + dbusmenu_client_add_type_handler (DBUSMENU_CLIENT(client), + DBUSMENU_MUTE_MENUITEM_TYPE, + new_mute_widget); // Note: Not ideal but all key handling needs to be managed here and then // delegated to the appropriate widget. g_signal_connect (menu, "key-press-event", G_CALLBACK(key_press_cb), io); @@ -459,6 +473,36 @@ new_voip_slider_widget (DbusmenuMenuitem * newitem, return TRUE; } +static gboolean +new_mute_widget(DbusmenuMenuitem * newitem, + DbusmenuMenuitem * parent, + DbusmenuClient * client, + gpointer user_data) +{ + IndicatorObject *io = NULL; + + g_return_val_if_fail(DBUSMENU_IS_MENUITEM(newitem), FALSE); + g_return_val_if_fail(DBUSMENU_IS_GTKCLIENT(client), FALSE); + + io = g_object_get_data (G_OBJECT (client), "indicator"); + IndicatorSoundPrivate* priv = INDICATOR_SOUND_GET_PRIVATE(INDICATOR_SOUND (io)); + + if (priv->mute_widget != NULL){ + g_object_unref (priv->mute_widget); + priv->mute_widget = NULL; + } + + priv->mute_widget = mute_widget_new(newitem); + GtkMenuItem *item = mute_widget_get_menu_item (priv->mute_widget); + + dbusmenu_gtkclient_newitem_base(DBUSMENU_GTKCLIENT(client), + newitem, + item, + parent); + + return TRUE; +} + /*******************************************************************/ //UI callbacks /******************************************************************/ @@ -677,6 +721,16 @@ indicator_sound_scroll (IndicatorObject * io, IndicatorObjectEntry * entry, sound_state_manager_show_notification (priv->state_manager, value); } +static void +indicator_sound_middle_click (IndicatorObject * io, IndicatorObjectEntry * entry, + guint time, gpointer data) +{ + IndicatorSoundPrivate* priv = INDICATOR_SOUND_GET_PRIVATE(INDICATOR_SOUND (io)); + g_return_if_fail (priv); + + mute_widget_toggle(priv->mute_widget); +} + void update_accessible_desc (IndicatorObject * io) { diff --git a/src/mute-menu-item.c b/src/mute-menu-item.c index 2876be3..0e6a46f 100644 --- a/src/mute-menu-item.c +++ b/src/mute-menu-item.c @@ -63,6 +63,11 @@ mute_menu_item_init (MuteMenuItem *self) MuteMenuItemPrivate* priv = MUTE_MENU_ITEM_GET_PRIVATE(self); priv->button = NULL; priv->button = dbusmenu_menuitem_new(); + + dbusmenu_menuitem_property_set(priv->button, + DBUSMENU_MENUITEM_PROP_TYPE, + DBUSMENU_MUTE_MENUITEM_TYPE); + dbusmenu_menuitem_property_set_bool (priv->button, DBUSMENU_MENUITEM_PROP_VISIBLE, TRUE); diff --git a/src/mute-widget.c b/src/mute-widget.c new file mode 100644 index 0000000..97c87ff --- /dev/null +++ b/src/mute-widget.c @@ -0,0 +1,141 @@ +/* +Copyright 2011 Canonical Ltd. + +Authors: + Marco Trevisan (Treviño) <mail@3v1n0.net> + +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 <http://www.gnu.org/licenses/>. +*/ + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#include <glib/gi18n.h> +#include <glib.h> +#include "mute-widget.h" +#include "common-defs.h" +#include "indicator-sound.h" + +typedef struct _MuteWidgetPrivate MuteWidgetPrivate; + +struct _MuteWidgetPrivate +{ + DbusmenuMenuitem *item; + GtkMenuItem *gitem; +}; + +#define MUTE_WIDGET_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE ((o), MUTE_WIDGET_TYPE, MuteWidgetPrivate)) + +/* Prototypes */ +static void mute_widget_class_init (MuteWidgetClass *klass); +static void mute_widget_init (MuteWidget *self); +static void mute_widget_dispose (GObject *object); +static void mute_widget_finalize (GObject *object); + +G_DEFINE_TYPE (MuteWidget, mute_widget, G_TYPE_OBJECT); + +static void +mute_widget_class_init (MuteWidgetClass *klass) +{ + GObjectClass *gobject_class = G_OBJECT_CLASS (klass); + gobject_class->dispose = mute_widget_dispose; + gobject_class->finalize = mute_widget_finalize; + g_type_class_add_private (klass, sizeof (MuteWidgetPrivate)); +} + +static void +mute_widget_init (MuteWidget *self) +{ + MuteWidgetPrivate *priv = MUTE_WIDGET_GET_PRIVATE(self); + priv->item = NULL; + priv->gitem = GTK_MENU_ITEM(gtk_menu_item_new ()); +} + +static void +mute_widget_dispose (GObject *object) +{ + G_OBJECT_CLASS (mute_widget_parent_class)->dispose (object); +} + +static void +mute_widget_finalize (GObject *object) +{ + MuteWidget *self = MUTE_WIDGET (object); + MuteWidgetPrivate *priv = MUTE_WIDGET_GET_PRIVATE(self); + + g_object_unref (priv->item); + g_object_unref (G_OBJECT (priv->gitem)); + G_OBJECT_CLASS (mute_widget_parent_class)->finalize (object); +} + +GtkMenuItem * +mute_widget_get_menu_item(MuteWidget *self) +{ + MuteWidgetPrivate *priv = MUTE_WIDGET_GET_PRIVATE(self); + return priv->gitem; +} + +MuteStatus +mute_widget_get_status (MuteWidget *self) +{ + g_return_val_if_fail(self, MUTE_STATUS_UNAVAILABLE); + MuteStatus status = MUTE_STATUS_UNAVAILABLE; + MuteWidgetPrivate *priv = MUTE_WIDGET_GET_PRIVATE(self); + + GVariant *vstatus = dbusmenu_menuitem_property_get_variant(priv->item, + DBUSMENU_MUTE_MENUITEM_VALUE); + + if (g_variant_is_of_type (vstatus, G_VARIANT_TYPE_BOOLEAN)) + { + if (g_variant_get_boolean (vstatus)) + status = MUTE_STATUS_MUTED; + else + status = MUTE_STATUS_UNMUTED; + } + + return status; +} + +void mute_widget_toggle (MuteWidget *self) +{ + g_return_if_fail (self); + MuteWidgetPrivate *priv = MUTE_WIDGET_GET_PRIVATE(self); + gtk_menu_item_activate (priv->gitem); +} + +/** + * mute_widget_new: + * @returns: a new #MuteWidget. + **/ +MuteWidget * +mute_widget_new (DbusmenuMenuitem *item) +{ + MuteWidget* widget = g_object_new(MUTE_WIDGET_TYPE, NULL); + MuteWidgetPrivate* priv = MUTE_WIDGET_GET_PRIVATE(widget); + priv->item = g_object_ref(item); + + GVariant *label = dbusmenu_menuitem_property_get_variant(priv->item, + DBUSMENU_MENUITEM_PROP_LABEL); + + if (g_variant_is_of_type(label, G_VARIANT_TYPE_STRING)) + gtk_menu_item_set_label(priv->gitem, g_variant_get_string(label, NULL)); + + if (label) + { + g_debug("Added a new Mute Widget %s", g_variant_print(label, FALSE)); + g_variant_unref(label); + } + + return widget; +} diff --git a/src/mute-widget.h b/src/mute-widget.h new file mode 100644 index 0000000..95130a1 --- /dev/null +++ b/src/mute-widget.h @@ -0,0 +1,67 @@ +/* +Copyright 2011 Canonical Ltd. + +Authors: + Marco Trevisan (Treviño) <mail@3v1n0.net> + +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 <http://www.gnu.org/licenses/>. +*/ +#ifndef __MUTE_WIDGET_H__ +#define __MUTE_WIDGET_H__ + +#include <glib.h> +#include <glib-object.h> +#include <gtk/gtk.h> +#if GTK_CHECK_VERSION(3, 0, 0) +#include <libdbusmenu-gtk3/menuitem.h> +#else +#include <libdbusmenu-gtk/menuitem.h> +#endif +#include <libindicator/indicator-object.h> + +G_BEGIN_DECLS + +#define MUTE_WIDGET_TYPE (mute_widget_get_type ()) +#define MUTE_WIDGET(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), MUTE_WIDGET_TYPE, MuteWidget)) +#define MUTE_WIDGET_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), MUTE_WIDGET_TYPE, MuteWidgetClass)) +#define IS_MUTE_WIDGET(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), MUTE_WIDGET_TYPE)) +#define IS_MUTE_WIDGET_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), MUTE_WIDGET_TYPE)) +#define MUTE_WIDGET_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), MUTE_WIDGET_TYPE, MuteWidgetClass)) + +typedef struct _MuteWidget MuteWidget; +typedef struct _MuteWidgetClass MuteWidgetClass; + +struct _MuteWidgetClass { + GObjectClass parent_class; +}; + +struct _MuteWidget { + GObject parent; +}; + +typedef enum { + MUTE_STATUS_UNAVAILABLE, + MUTE_STATUS_MUTED, + MUTE_STATUS_UNMUTED +} MuteStatus; + +GType mute_widget_get_type (void) G_GNUC_CONST; +MuteWidget* mute_widget_new (DbusmenuMenuitem *item); +MuteStatus mute_widget_get_status (MuteWidget *self); +void mute_widget_toggle (MuteWidget *self); +GtkMenuItem *mute_widget_get_menu_item (MuteWidget *self); + +G_END_DECLS + +#endif + |