aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/common-defs.h14
-rw-r--r--src/indicator-sound.c26
-rw-r--r--src/indicator-sound.h3
-rw-r--r--src/mpris2-controller.vala33
-rw-r--r--src/mpris2-interfaces.vala1
-rw-r--r--src/slider-menu-item.c3
-rw-r--r--src/sound-service-dbus.c56
-rw-r--r--src/sound-service.xml6
-rw-r--r--src/sound-state-manager.c2
-rw-r--r--src/transport-menu-item.vala15
-rw-r--r--src/transport-widget.c199
-rw-r--r--src/transport-widget.h25
-rw-r--r--src/voip-input-widget.c4
-rw-r--r--src/volume-widget.c37
-rw-r--r--vapi/common-defs.vapi26
15 files changed, 297 insertions, 153 deletions
diff --git a/src/common-defs.h b/src/common-defs.h
index 2184a48..da504de 100644
--- a/src/common-defs.h
+++ b/src/common-defs.h
@@ -31,6 +31,20 @@ typedef enum {
AVAILABLE
}SoundState;
+typedef enum {
+ TRANSPORT_ACTION_PREVIOUS,
+ TRANSPORT_ACTION_PLAY_PAUSE,
+ TRANSPORT_ACTION_NEXT,
+ TRANSPORT_ACTION_REWIND,
+ TRANSPORT_ACTION_FORWIND,
+ TRANSPORT_ACTION_NO_ACTION
+}TransportAction;
+
+typedef enum {
+ TRANSPORT_STATE_PLAYING,
+ TRANSPORT_STATE_PAUSED
+}TransportState;
+
#define NOT_ACTIVE -1
#define DBUSMENU_PROPERTY_EMPTY -1
diff --git a/src/indicator-sound.c b/src/indicator-sound.c
index 6e1acc9..a7d3808 100644
--- a/src/indicator-sound.c
+++ b/src/indicator-sound.c
@@ -532,17 +532,17 @@ key_press_cb(GtkWidget* widget, GdkEventKey* event, gpointer data)
switch (event->keyval) {
case GDK_Right:
transport_widget_react_to_key_press_event ( transport_widget,
- TRANSPORT_NEXT );
+ TRANSPORT_ACTION_NEXT );
digested = TRUE;
break;
case GDK_Left:
transport_widget_react_to_key_press_event ( transport_widget,
- TRANSPORT_PREVIOUS );
+ TRANSPORT_ACTION_PREVIOUS );
digested = TRUE;
break;
case GDK_KEY_space:
transport_widget_react_to_key_press_event ( transport_widget,
- TRANSPORT_PLAY_PAUSE );
+ TRANSPORT_ACTION_PLAY_PAUSE );
digested = TRUE;
break;
case GDK_Up:
@@ -587,17 +587,17 @@ key_release_cb(GtkWidget* widget, GdkEventKey* event, gpointer data)
switch (event->keyval) {
case GDK_Right:
transport_widget_react_to_key_release_event ( transport_widget,
- TRANSPORT_NEXT );
+ TRANSPORT_ACTION_NEXT );
digested = TRUE;
break;
case GDK_Left:
transport_widget_react_to_key_release_event ( transport_widget,
- TRANSPORT_PREVIOUS );
+ TRANSPORT_ACTION_PREVIOUS );
digested = TRUE;
break;
case GDK_KEY_space:
transport_widget_react_to_key_release_event ( transport_widget,
- TRANSPORT_PLAY_PAUSE );
+ TRANSPORT_ACTION_PLAY_PAUSE );
digested = TRUE;
break;
case GDK_Up:
@@ -640,3 +640,17 @@ indicator_sound_scroll (IndicatorObject *io, gint delta,
sound_state_manager_show_notification (priv->state_manager, value);
}
+
+void
+update_accessible_desc (IndicatorObject * io)
+{
+ GList *entries = indicator_object_get_entries(io);
+ IndicatorObjectEntry * entry = (IndicatorObjectEntry *)entries->data;
+ entry->accessible_desc = get_accessible_desc(io);
+ g_signal_emit(G_OBJECT(io),
+ INDICATOR_OBJECT_SIGNAL_ACCESSIBLE_DESC_UPDATE_ID,
+ 0,
+ entry,
+ TRUE);
+ g_list_free(entries);
+}
diff --git a/src/indicator-sound.h b/src/indicator-sound.h
index 40a3e6f..c945efa 100644
--- a/src/indicator-sound.h
+++ b/src/indicator-sound.h
@@ -53,4 +53,7 @@ struct _IndicatorSound {
// GObject Boiler plate
GType indicator_sound_get_type (void);
+// Update the accessible description
+void update_accessible_desc (IndicatorObject * io);
+
#endif
diff --git a/src/mpris2-controller.vala b/src/mpris2-controller.vala
index c7305f4..6129458 100644
--- a/src/mpris2-controller.vala
+++ b/src/mpris2-controller.vala
@@ -17,6 +17,7 @@ You should have received a copy of the GNU General Public License along
with this program. If not, see <http://www.gnu.org/licenses/>.
*/
using Dbusmenu;
+using Transport;
/*
This class will entirely replace mpris-controller.vala hence why there is no
@@ -33,7 +34,7 @@ public class Mpris2Controller : GLib.Object
public Mpris2Controller(PlayerController ctrl)
{
- GLib.Object(owner: ctrl);
+ GLib.Object(owner: ctrl);
}
construct{
@@ -77,7 +78,7 @@ public class Mpris2Controller : GLib.Object
string state = this.player.PlaybackStatus;
//debug("in the property update and the playback status = %s and update = %s", state, (string)play_v);
Timeout.add ( 200, ensure_correct_playback_status );
- TransportMenuitem.state p = (TransportMenuitem.state)this.determine_play_state(state);
+ Transport.State p = (Transport.State)this.determine_play_state(state);
(this.owner.custom_items[PlayerController.widget_order.TRANSPORT] as TransportMenuitem).change_play_state(p);
}
Variant? meta_v = changed_properties.lookup("Metadata");
@@ -115,7 +116,7 @@ public class Mpris2Controller : GLib.Object
private bool ensure_correct_playback_status(){
//debug("TEST playback status = %s", this.player.PlaybackStatus);
- TransportMenuitem.state p = (TransportMenuitem.state)this.determine_play_state(this.player.PlaybackStatus);
+ Transport.State p = (Transport.State)this.determine_play_state(this.player.PlaybackStatus);
(this.owner.custom_items[PlayerController.widget_order.TRANSPORT] as TransportMenuitem).change_play_state(p);
return false;
}
@@ -142,19 +143,19 @@ public class Mpris2Controller : GLib.Object
return changed_updates;
}
- private TransportMenuitem.state determine_play_state(string? status){
+ private Transport.State determine_play_state(string? status){
if(status != null && status == "Playing"){
- return TransportMenuitem.state.PLAYING;
+ return Transport.State.PLAYING;
}
- return TransportMenuitem.state.PAUSED;
+ return Transport.State.PAUSED;
}
public void initial_update()
{
- TransportMenuitem.state update;
+ Transport.State update;
if(this.player.PlaybackStatus == null){
- update = TransportMenuitem.state.PAUSED;
+ update = Transport.State.PAUSED;
}
else{
update = determine_play_state (this.player.PlaybackStatus);
@@ -174,18 +175,26 @@ public class Mpris2Controller : GLib.Object
}
}
- public void transport_update(TransportMenuitem.action command)
+ public void transport_update(Transport.Action command)
{
//debug("transport_event input = %i", (int)command);
- if(command == TransportMenuitem.action.PLAY_PAUSE){
+ if(command == Transport.Action.PLAY_PAUSE){
this.player.PlayPause.begin();
}
- else if(command == TransportMenuitem.action.PREVIOUS){
+ else if(command == Transport.Action.PREVIOUS){
this.player.Previous.begin();
}
- else if(command == TransportMenuitem.action.NEXT){
+ else if(command == Transport.Action.NEXT){
this.player.Next.begin();
}
+ else if(command == Transport.Action.REWIND){
+ //debug("transport_event rewind = %i", (int)command);
+ this.player.Seek.begin(-500000);
+ }
+ else if(command == Transport.Action.FORWIND){
+ //debug("transport_event input = %i", (int)command);
+ this.player.Seek.begin(400000);
+ }
}
public bool connected()
diff --git a/src/mpris2-interfaces.vala b/src/mpris2-interfaces.vala
index 5506a47..5dab1d2 100644
--- a/src/mpris2-interfaces.vala
+++ b/src/mpris2-interfaces.vala
@@ -42,6 +42,7 @@ public interface MprisPlayer : Object {
public abstract async void PlayPause() throws IOError;
public abstract async void Next() throws IOError;
public abstract async void Previous() throws IOError;
+ public abstract async void Seek(int64 offset) throws IOError;
// signals
public signal void Seeked(int64 new_position);
}
diff --git a/src/slider-menu-item.c b/src/slider-menu-item.c
index b89f5ca..1c88f01 100644
--- a/src/slider-menu-item.c
+++ b/src/slider-menu-item.c
@@ -92,10 +92,11 @@ handle_event (DbusmenuMenuitem * mi,
input = g_variant_get_variant(value);
}
- gboolean volume_input = g_variant_get_double(input);
if (value != NULL){
if (IS_SLIDER_MENU_ITEM (mi)) {
SliderMenuItemPrivate* priv = SLIDER_MENU_ITEM_GET_PRIVATE (SLIDER_MENU_ITEM (mi));
+ gdouble volume_input = g_variant_get_double(input);
+ //g_debug ("slider menu item about to update volume %f", volume_input);
active_sink_update_volume (priv->a_sink, volume_input);
active_sink_ensure_sink_is_unmuted (priv->a_sink);
}
diff --git a/src/sound-service-dbus.c b/src/sound-service-dbus.c
index 9e5cffe..8d0cc0b 100644
--- a/src/sound-service-dbus.c
+++ b/src/sound-service-dbus.c
@@ -74,6 +74,8 @@ static gboolean sound_service_dbus_blacklist_player (SoundServiceDbus* self,
gchar* player_name,
gboolean blacklist);
+static gboolean sound_service_dbus_is_blacklisted (SoundServiceDbus* self,
+ gchar* player_name);
G_DEFINE_TYPE (SoundServiceDbus, sound_service_dbus, G_TYPE_OBJECT);
@@ -284,7 +286,16 @@ bus_method_call (GDBusConnection * connection,
player_name,
blacklist);
retval = g_variant_new ("(b)", result);
- }
+ }
+ else if (g_strcmp0(method, "IsBlacklisted") == 0) {
+ gchar* player_name;
+ g_variant_get (params, "(s)", &player_name);
+
+ g_debug ("IsBlacklisted - name %s", player_name);
+ gboolean result = sound_service_dbus_is_blacklisted (service,
+ player_name);
+ retval = g_variant_new ("(b)", result);
+ }
else {
g_warning("Calling method '%s' on the sound service but it's unknown", method);
}
@@ -299,17 +310,18 @@ static gboolean sound_service_dbus_blacklist_player (SoundServiceDbus* self,
gboolean blacklist)
{
g_return_val_if_fail (player_name != NULL, FALSE);
+ g_return_val_if_fail (IS_SOUND_SERVICE_DBUS (self), FALSE);
+ GVariant* the_black_list;
gboolean result = FALSE;
- GSettings* our_settings = NULL;
- our_settings = g_settings_new ("com.canonical.indicators.sound");
- GVariant* the_black_list = g_settings_get_value (our_settings,
- "blacklisted-media-players");
+ GSettings* our_settings;
GVariantIter iter;
gchar *str;
- // Firstly prep new array which will be set on the key.
GVariantBuilder builder;
-
+
+ our_settings = g_settings_new ("com.canonical.indicators.sound");
+ the_black_list = g_settings_get_value (our_settings,
+ "blacklisted-media-players");
g_variant_iter_init (&iter, the_black_list);
g_variant_builder_init(&builder, G_VARIANT_TYPE_STRING_ARRAY);
@@ -376,4 +388,34 @@ static gboolean sound_service_dbus_blacklist_player (SoundServiceDbus* self,
return result;
}
+static gboolean sound_service_dbus_is_blacklisted (SoundServiceDbus *self,
+ gchar *player_name)
+{
+ GSettings *our_settings;
+ GVariant *the_black_list;
+ GVariantIter iter;
+ gchar *str;
+ gboolean result = FALSE;
+
+ g_return_val_if_fail (player_name != NULL, FALSE);
+ g_return_val_if_fail (IS_SOUND_SERVICE_DBUS (self), FALSE);
+
+ our_settings = g_settings_new ("com.canonical.indicators.sound");
+ the_black_list = g_settings_get_value (our_settings,
+ "blacklisted-media-players");
+ g_variant_iter_init (&iter, the_black_list);
+ while (g_variant_iter_next (&iter, "s", &str)){
+ if (g_strcmp0 (player_name, str) == 0) {
+ result = TRUE;
+ g_free (str);
+ break;
+ }
+ g_free (str);
+ }
+
+ g_object_unref (our_settings);
+ g_variant_unref (the_black_list);
+
+ return result;
+}
diff --git a/src/sound-service.xml b/src/sound-service.xml
index 81ebc2d..517088e 100644
--- a/src/sound-service.xml
+++ b/src/sound-service.xml
@@ -7,6 +7,12 @@
<arg type='b' name='blacklist' direction="in"/>
<arg type='b' name='result' direction="out"/>
</method>
+ <method name = "IsBlacklisted">
+ <annotation name="org.freedesktop.DBus.GLib.Async" value="true"/>
+ <arg type='s' name='player_desktop_name' direction="in"/>
+ <arg type='b' name='result' direction="out"/>
+ </method>
+
<method name = "GetSoundState">
<annotation name="org.freedesktop.DBus.GLib.Async" value="true"/>
<arg type='i' name='current_state' direction="out"/>
diff --git a/src/sound-state-manager.c b/src/sound-state-manager.c
index 0958763..7095a39 100644
--- a/src/sound-state-manager.c
+++ b/src/sound-state-manager.c
@@ -153,7 +153,7 @@ sound_state_manager_notification_init (SoundStateManager* self)
if (has_notify_osd) {
priv->notification = notify_notification_new(PACKAGE_NAME, NULL, NULL);
notify_notification_set_hint_string(priv->notification,
- "x-canonical-private-synchronous", "");
+ "x-canonical-private-synchronous", PACKAGE_NAME);
}
}
diff --git a/src/transport-menu-item.vala b/src/transport-menu-item.vala
index b0009d9..67e9562 100644
--- a/src/transport-menu-item.vala
+++ b/src/transport-menu-item.vala
@@ -20,19 +20,10 @@ with this program. If not, see <http://www.gnu.org/licenses/>.
using Dbusmenu;
using Gee;
using DbusmenuTransport;
+using Transport;
public class TransportMenuitem : PlayerItem
{
- public enum action{
- PREVIOUS,
- PLAY_PAUSE,
- NEXT
- }
-
- public enum state{
- PLAYING,
- PAUSED
- }
public TransportMenuitem(PlayerController parent)
{
@@ -40,7 +31,7 @@ public class TransportMenuitem : PlayerItem
this.property_set_int(MENUITEM_PLAY_STATE, 1);
}
- public void change_play_state(state update)
+ public void change_play_state(Transport.State update)
{
//debug("UPDATING THE TRANSPORT DBUSMENUITEM PLAY STATE WITH VALUE %i",
// (int)update);
@@ -62,7 +53,7 @@ public class TransportMenuitem : PlayerItem
int32 input = v.get_int32();
//debug("transport menu item -> handle_event with value %s", input.to_string());
//debug("transport owner name = %s", this.owner.app_info.get_name());
- this.owner.mpris_bridge.transport_update((action)input);
+ this.owner.mpris_bridge.transport_update((Transport.Action)input);
}
public static HashSet<string> attributes_format()
diff --git a/src/transport-widget.c b/src/transport-widget.c
index 7c96684..0fbc101 100644
--- a/src/transport-widget.c
+++ b/src/transport-widget.c
@@ -27,7 +27,6 @@ Uses code from ctk
#include <math.h>
#include "transport-widget.h"
-#include "common-defs.h"
#define RECT_WIDTH 130.0f
@@ -77,13 +76,15 @@ typedef struct _TransportWidgetPrivate TransportWidgetPrivate;
struct _TransportWidgetPrivate
{
- TransportWidgetEvent current_command;
- TransportWidgetEvent key_event;
- TransportWidgetEvent motion_event;
- TransportWidgetState current_state;
- GHashTable* command_coordinates;
- DbusmenuMenuitem* twin_item;
- gboolean has_focus;
+ TransportAction current_command;
+ TransportAction key_event;
+ TransportAction motion_event;
+ TransportState current_state;
+ GHashTable* command_coordinates;
+ DbusmenuMenuitem* twin_item;
+ gboolean has_focus;
+ gint hold_timer;
+ gint skip_frequency;
};
#define TRANSPORT_WIDGET_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE ((o), TRANSPORT_WIDGET_TYPE, TransportWidgetPrivate))
@@ -119,17 +120,20 @@ static void transport_widget_menu_hidden ( GtkWidget *menu,
static void transport_widget_notify ( GObject *item,
GParamSpec *pspec,
gpointer user_data );
-static TransportWidgetEvent transport_widget_determine_button_event ( TransportWidget* button,
+static TransportAction transport_widget_determine_button_event ( TransportWidget* button,
GdkEventButton* event);
-static TransportWidgetEvent transport_widget_determine_motion_event ( TransportWidget* button,
+static TransportAction transport_widget_determine_motion_event ( TransportWidget* button,
GdkEventMotion* event);
static void transport_widget_react_to_button_release ( TransportWidget* button,
- TransportWidgetEvent command);
+ TransportAction command);
static void transport_widget_toggle_play_pause ( TransportWidget* button,
- TransportWidgetState update);
+ TransportState update);
static void transport_widget_select (GtkItem* menu, gpointer Userdata);
static void transport_widget_deselect (GtkItem* menu, gpointer Userdata);
-static TransportWidgetEvent transport_widget_collision_detection (gint x, gint y);
+static TransportAction transport_widget_collision_detection (gint x, gint y);
+static void transport_widget_start_timing (TransportWidget* widget);
+static gboolean transport_widget_trigger_seek (gpointer userdata);
+static gboolean transport_widget_seek (gpointer userdata);
/// Init functions //////////////////////////////////////////////////////////
@@ -155,11 +159,13 @@ static void
transport_widget_init (TransportWidget *self)
{
TransportWidgetPrivate* priv = TRANSPORT_WIDGET_GET_PRIVATE(self);
- priv->current_command = TRANSPORT_NADA;
- priv->current_state = PAUSE;
- priv->key_event = TRANSPORT_NADA;
- priv->motion_event = TRANSPORT_NADA;
+ priv->current_command = TRANSPORT_ACTION_NO_ACTION;
+ priv->current_state = TRANSPORT_STATE_PAUSED;
+ priv->key_event = TRANSPORT_ACTION_NO_ACTION;
+ priv->motion_event = TRANSPORT_ACTION_NO_ACTION;
priv->has_focus = FALSE;
+ priv->hold_timer = 0;
+ priv->skip_frequency = 0;
priv->command_coordinates = g_hash_table_new_full(g_direct_hash,
g_direct_equal,
NULL,
@@ -170,7 +176,7 @@ transport_widget_init (TransportWidget *self)
previous_list = g_list_insert(previous_list, GINT_TO_POINTER(60), 2);
previous_list = g_list_insert(previous_list, GINT_TO_POINTER(34), 3);
g_hash_table_insert(priv->command_coordinates,
- GINT_TO_POINTER(TRANSPORT_PREVIOUS),
+ GINT_TO_POINTER(TRANSPORT_ACTION_PREVIOUS),
previous_list);
GList* play_list = NULL;
@@ -180,7 +186,7 @@ transport_widget_init (TransportWidget *self)
play_list = g_list_insert(play_list, GINT_TO_POINTER(43), 3);
g_hash_table_insert(priv->command_coordinates,
- GINT_TO_POINTER(TRANSPORT_PLAY_PAUSE),
+ GINT_TO_POINTER(TRANSPORT_ACTION_PLAY_PAUSE),
play_list);
GList* next_list = NULL;
@@ -190,7 +196,7 @@ transport_widget_init (TransportWidget *self)
next_list = g_list_insert(next_list, GINT_TO_POINTER(34), 3);
g_hash_table_insert(priv->command_coordinates,
- GINT_TO_POINTER(TRANSPORT_NEXT),
+ GINT_TO_POINTER(TRANSPORT_ACTION_NEXT),
next_list);
gtk_widget_set_size_request(GTK_WIDGET(self), 200, 43);
g_signal_connect (G_OBJECT(self),
@@ -248,7 +254,7 @@ transport_widget_is_selected ( TransportWidget* widget )
static void
transport_widget_toggle_play_pause(TransportWidget* button,
- TransportWidgetState update)
+ TransportState update)
{
TransportWidgetPrivate* priv = TRANSPORT_WIDGET_GET_PRIVATE(button);
priv->current_state = update;
@@ -276,7 +282,7 @@ transport_widget_menu_hidden ( GtkWidget *menu,
TransportWidget *transport)
{
g_return_if_fail(IS_TRANSPORT_WIDGET(transport));
- transport_widget_react_to_button_release(transport, TRANSPORT_NADA);
+ transport_widget_react_to_button_release(transport, TRANSPORT_ACTION_NO_ACTION);
}
static gboolean
@@ -285,9 +291,8 @@ transport_widget_motion_notify_event (GtkWidget *menuitem,
{
g_return_val_if_fail ( IS_TRANSPORT_WIDGET(menuitem), FALSE );
TransportWidgetPrivate* priv = TRANSPORT_WIDGET_GET_PRIVATE ( TRANSPORT_WIDGET(menuitem) );
- TransportWidgetEvent result = transport_widget_determine_motion_event ( TRANSPORT_WIDGET(menuitem),
+ TransportAction result = transport_widget_determine_motion_event ( TRANSPORT_WIDGET(menuitem),
event);
-
priv->motion_event = result;
gtk_widget_queue_draw (menuitem);
return TRUE;
@@ -300,8 +305,8 @@ transport_widget_leave_notify_event (GtkWidget *menuitem,
g_return_val_if_fail ( IS_TRANSPORT_WIDGET(menuitem), FALSE );
TransportWidgetPrivate* priv = TRANSPORT_WIDGET_GET_PRIVATE ( TRANSPORT_WIDGET(menuitem) );
- priv->motion_event = TRANSPORT_NADA;
- priv->current_command = TRANSPORT_NADA;
+ priv->motion_event = TRANSPORT_ACTION_NO_ACTION;
+ priv->current_command = TRANSPORT_ACTION_NO_ACTION;
gtk_widget_queue_draw (GTK_WIDGET(menuitem));
return TRUE;
@@ -313,15 +318,73 @@ transport_widget_button_press_event (GtkWidget *menuitem,
{
g_return_val_if_fail ( IS_TRANSPORT_WIDGET(menuitem), FALSE );
TransportWidgetPrivate* priv = TRANSPORT_WIDGET_GET_PRIVATE ( TRANSPORT_WIDGET(menuitem) );
- TransportWidgetEvent result = transport_widget_determine_button_event ( TRANSPORT_WIDGET(menuitem),
+ TransportAction result = transport_widget_determine_button_event ( TRANSPORT_WIDGET(menuitem),
event);
- if(result != TRANSPORT_NADA){
+ if(result != TRANSPORT_ACTION_NO_ACTION){
priv->current_command = result;
gtk_widget_queue_draw (GTK_WIDGET(menuitem));
+ transport_widget_start_timing (TRANSPORT_WIDGET(menuitem));
}
return TRUE;
}
-
+/**
+ * TODO rename or merge
+ * @param widget
+ */
+static void
+transport_widget_start_timing (TransportWidget* widget)
+{
+ TransportWidgetPrivate* priv = TRANSPORT_WIDGET_GET_PRIVATE (widget);
+ priv->hold_timer = g_timeout_add (800,
+ transport_widget_trigger_seek,
+ widget);
+}
+
+static gboolean
+transport_widget_trigger_seek (gpointer userdata)
+{
+ g_return_val_if_fail ( IS_TRANSPORT_WIDGET(userdata), FALSE );
+ TransportWidgetPrivate* priv = TRANSPORT_WIDGET_GET_PRIVATE (TRANSPORT_WIDGET(userdata));
+ priv->skip_frequency = g_timeout_add (100,
+ transport_widget_seek,
+ userdata);
+ return FALSE;
+}
+
+/**
+ * This will be called repeatedly until a key/button release is received
+ * @param userdata
+ * @return
+ */
+static gboolean
+transport_widget_seek (gpointer userdata)
+{
+ g_return_val_if_fail ( IS_TRANSPORT_WIDGET(userdata), FALSE );
+ TransportWidgetPrivate* priv = TRANSPORT_WIDGET_GET_PRIVATE (TRANSPORT_WIDGET(userdata));
+ GVariant* new_transport_state;
+ if(priv->current_command == TRANSPORT_ACTION_NEXT){
+ g_debug ("we should be skipping forward");
+ new_transport_state = g_variant_new_int32 ((int)TRANSPORT_ACTION_FORWIND);
+
+ dbusmenu_menuitem_handle_event ( priv->twin_item,
+ "Transport state change",
+ new_transport_state,
+ 0 );
+
+ }
+ else if(priv->current_command == TRANSPORT_ACTION_PREVIOUS){
+ g_debug ("we should be skipping back");
+ new_transport_state = g_variant_new_int32 ((int)TRANSPORT_ACTION_REWIND);
+
+ dbusmenu_menuitem_handle_event ( priv->twin_item,
+ "Transport state change",
+ new_transport_state,
+ 0 );
+ }
+
+ return TRUE;
+}
+
static gboolean
transport_widget_button_release_event (GtkWidget *menuitem,
GdkEventButton *event)
@@ -329,9 +392,11 @@ transport_widget_button_release_event (GtkWidget *menuitem,
g_return_val_if_fail(IS_TRANSPORT_WIDGET(menuitem), FALSE);
TransportWidget* transport = TRANSPORT_WIDGET(menuitem);
TransportWidgetPrivate * priv = TRANSPORT_WIDGET_GET_PRIVATE ( transport );
- TransportWidgetEvent result = transport_widget_determine_button_event ( transport,
+ TransportAction result = transport_widget_determine_button_event ( transport,
event );
- if (result != TRANSPORT_NADA && priv->current_command == result){
+ if (result != TRANSPORT_ACTION_NO_ACTION &&
+ priv->current_command == result &&
+ priv->skip_frequency == 0){
GVariant* new_transport_state = g_variant_new_int32 ((int)result);
dbusmenu_menuitem_handle_event ( priv->twin_item,
"Transport state change",
@@ -361,9 +426,9 @@ transport_widget_deselect (GtkItem* item, gpointer Userdata)
void
transport_widget_react_to_key_press_event ( TransportWidget* transport,
- TransportWidgetEvent transport_event )
+ TransportAction transport_event )
{
- if(transport_event != TRANSPORT_NADA){
+ if(transport_event != TRANSPORT_ACTION_NO_ACTION){
TransportWidgetPrivate * priv = TRANSPORT_WIDGET_GET_PRIVATE ( transport );
priv->current_command = transport_event;
priv->key_event = transport_event;
@@ -374,9 +439,9 @@ transport_widget_react_to_key_press_event ( TransportWidget* transport,
void
transport_widget_react_to_key_release_event ( TransportWidget* transport,
- TransportWidgetEvent transport_event )
+ TransportAction transport_event )
{
- if(transport_event != TRANSPORT_NADA){
+ if(transport_event != TRANSPORT_ACTION_NO_ACTION){
TransportWidgetPrivate * priv = TRANSPORT_WIDGET_GET_PRIVATE ( transport );
GVariant* new_transport_event = g_variant_new_int32((int)transport_event);
dbusmenu_menuitem_handle_event ( priv->twin_item,
@@ -395,52 +460,60 @@ transport_widget_focus_update ( TransportWidget* transport, gboolean focus )
priv->has_focus = focus;
}
-static TransportWidgetEvent
+static TransportAction
transport_widget_determine_button_event( TransportWidget* button,
GdkEventButton* event )
{
return transport_widget_collision_detection (event->x, event->y);
}
-static TransportWidgetEvent
+static TransportAction
transport_widget_determine_motion_event( TransportWidget* button,
GdkEventMotion* event )
{
return transport_widget_collision_detection (event->x, event->y);
}
-static TransportWidgetEvent
+static TransportAction
transport_widget_collision_detection ( gint x,
gint y )
{
- TransportWidgetEvent event = TRANSPORT_NADA;
+ TransportAction event = TRANSPORT_ACTION_NO_ACTION;
if (x > 67 && x < 112
&& y > 12 && y < 40){
- event = TRANSPORT_PREVIOUS;
+ event = TRANSPORT_ACTION_PREVIOUS;
}
else if (x > 111 && x < 153
&& y > 5 && y < 47){
- event = TRANSPORT_PLAY_PAUSE;
+ event = TRANSPORT_ACTION_PLAY_PAUSE;
}
else if (x > 152 && x < 197
&& y > 12 && y < 40){
- event = TRANSPORT_NEXT;
+ event = TRANSPORT_ACTION_NEXT;
}
return event;
}
static void
transport_widget_react_to_button_release ( TransportWidget* button,
- TransportWidgetEvent command )
+ TransportAction command )
{
g_return_if_fail(IS_TRANSPORT_WIDGET(button));
TransportWidgetPrivate* priv = TRANSPORT_WIDGET_GET_PRIVATE(button);
- priv->current_command = TRANSPORT_NADA;
- priv->key_event = TRANSPORT_NADA;
+ priv->current_command = TRANSPORT_ACTION_NO_ACTION;
+ priv->key_event = TRANSPORT_ACTION_NO_ACTION;
gtk_widget_queue_draw (GTK_WIDGET(button));
+ if (priv->hold_timer != 0){
+ g_source_remove (priv->hold_timer);
+ priv->hold_timer = 0;
+ }
+ if(priv->skip_frequency != 0){
+ g_source_remove (priv->skip_frequency);
+ priv->skip_frequency = 0;
+ }
}
/// internal helper functions //////////////////////////////////////////////////
@@ -1218,7 +1291,7 @@ draw (GtkWidget* button, cairo_t *cr)
MIDDLE_END);
//prev/next button
- if(priv->current_command == TRANSPORT_PREVIOUS)
+ if(priv->current_command == TRANSPORT_ACTION_PREVIOUS)
{
draw_gradient (cr,
X,
@@ -1244,7 +1317,7 @@ draw (GtkWidget* button, cairo_t *cr)
INNER_COMPRESSED_START,
INNER_COMPRESSED_END);
}
- else if(priv->current_command == TRANSPORT_NEXT)
+ else if(priv->current_command == TRANSPORT_ACTION_NEXT)
{
draw_gradient (cr,
RECT_WIDTH / 2 + X,
@@ -1270,7 +1343,7 @@ draw (GtkWidget* button, cairo_t *cr)
INNER_COMPRESSED_START,
INNER_COMPRESSED_END);
}
- else if (priv->motion_event == TRANSPORT_PREVIOUS)
+ else if (priv->motion_event == TRANSPORT_ACTION_PREVIOUS)
{
draw_gradient (cr,
X,
@@ -1296,7 +1369,7 @@ draw (GtkWidget* button, cairo_t *cr)
MIDDLE_START_PRELIGHT,
MIDDLE_END_PRELIGHT);
}
- else if (priv->motion_event == TRANSPORT_NEXT)
+ else if (priv->motion_event == TRANSPORT_ACTION_NEXT)
{
draw_gradient (cr,
RECT_WIDTH / 2 + X,
@@ -1324,7 +1397,7 @@ draw (GtkWidget* button, cairo_t *cr)
}
// play/pause shadow
- if(priv->current_command != TRANSPORT_PLAY_PAUSE)
+ if(priv->current_command != TRANSPORT_ACTION_PLAY_PAUSE)
{
cairo_save (cr);
cairo_rectangle (cr, X, Y, RECT_WIDTH, MIDDLE_RADIUS*2);
@@ -1341,7 +1414,7 @@ draw (GtkWidget* button, cairo_t *cr)
}
// play/pause button
- if(priv->current_command == TRANSPORT_PLAY_PAUSE)
+ if(priv->current_command == TRANSPORT_ACTION_PLAY_PAUSE)
{
draw_circle (cr,
X + RECT_WIDTH / 2.0f - 2.0f * OUTER_RADIUS - 5.5f,
@@ -1357,7 +1430,7 @@ draw (GtkWidget* button, cairo_t *cr)
INNER_COMPRESSED_START,
INNER_COMPRESSED_END);
}
- else if (priv->motion_event == TRANSPORT_PLAY_PAUSE)
+ else if (priv->motion_event == TRANSPORT_ACTION_PLAY_PAUSE)
{
/* this subtle offset is to fix alpha borders, should be removed once this draw routine will be refactored */
draw_circle (cr,
@@ -1392,7 +1465,7 @@ draw (GtkWidget* button, cairo_t *cr)
}
// draw previous-button drop-shadow
- if (priv->has_focus && priv->key_event == TRANSPORT_PREVIOUS)
+ if (priv->has_focus && priv->key_event == TRANSPORT_ACTION_PREVIOUS)
{
_setup (&cr_surf, &surf, PREV_WIDTH+6, PREV_HEIGHT+6);
_mask_prev (cr_surf,
@@ -1452,7 +1525,7 @@ draw (GtkWidget* button, cairo_t *cr)
_finalize (cr, &cr_surf, &surf, PREV_X, PREV_Y);
// draw next-button drop-shadow
- if (priv->has_focus && priv->key_event == TRANSPORT_NEXT)
+ if (priv->has_focus && priv->key_event == TRANSPORT_ACTION_NEXT)
{
_setup (&cr_surf, &surf, NEXT_WIDTH+6, NEXT_HEIGHT+6);
_mask_next (cr_surf,
@@ -1512,9 +1585,10 @@ draw (GtkWidget* button, cairo_t *cr)
_finalize (cr, &cr_surf, &surf, NEXT_X, NEXT_Y);
// draw pause-button drop-shadow
- if(priv->current_state == PLAY)
+ if(priv->current_state == TRANSPORT_STATE_PLAYING)
{
- if (priv->has_focus && (priv->key_event == TRANSPORT_NADA || priv->key_event == TRANSPORT_PLAY_PAUSE))
+ if (priv->has_focus && (priv->key_event == TRANSPORT_ACTION_NO_ACTION ||
+ priv->key_event == TRANSPORT_ACTION_PLAY_PAUSE))
{
_setup (&cr_surf, &surf, PAUSE_WIDTH+6, PAUSE_HEIGHT+6);
_mask_pause (cr_surf,
@@ -1573,9 +1647,10 @@ draw (GtkWidget* button, cairo_t *cr)
TRUE);
_finalize (cr, &cr_surf, &surf, PAUSE_X, PAUSE_Y);
}
- else if(priv->current_state == PAUSE)
+ else if(priv->current_state == TRANSPORT_STATE_PAUSED)
{
- if (priv->has_focus && (priv->key_event == TRANSPORT_NADA || priv->key_event == TRANSPORT_PLAY_PAUSE))
+ if (priv->has_focus && (priv->key_event == TRANSPORT_ACTION_NO_ACTION ||
+ priv->key_event == TRANSPORT_ACTION_PLAY_PAUSE))
{
_setup (&cr_surf, &surf, PLAY_WIDTH+6, PLAY_HEIGHT+6);
_mask_play (cr_surf,
@@ -1644,11 +1719,11 @@ transport_widget_set_twin_item(TransportWidget* self,
priv->twin_item = twin_item;
g_signal_connect(G_OBJECT(priv->twin_item), "property-changed",
G_CALLBACK(transport_widget_property_update), self);
- gint initial_state = dbusmenu_menuitem_property_get_int( twin_item,
+ gint initial_state = dbusmenu_menuitem_property_get_int (twin_item,
DBUSMENU_TRANSPORT_MENUITEM_PLAY_STATE );
//g_debug("TRANSPORT WIDGET - INITIAL UPDATE = %i", initial_state);
- transport_widget_toggle_play_pause( self,
- (TransportWidgetState)initial_state);
+ transport_widget_toggle_play_pause (self,
+ (TransportState)initial_state);
}
/**
@@ -1667,7 +1742,7 @@ transport_widget_property_update(DbusmenuMenuitem* item, gchar* property,
{
int update_value = g_variant_get_int32(value);
//g_debug("transport_widget_update_state - with value %i", update_value);
- transport_widget_toggle_play_pause(bar, (TransportWidgetState)update_value);
+ transport_widget_toggle_play_pause(bar, (TransportState)update_value);
}
}
diff --git a/src/transport-widget.h b/src/transport-widget.h
index d02f59b..e5e91dc 100644
--- a/src/transport-widget.h
+++ b/src/transport-widget.h
@@ -23,6 +23,8 @@ with this program. If not, see <http://www.gnu.org/licenses/>.
#include <gtk/gtkmenuitem.h>
#include <libdbusmenu-gtk/menuitem.h>
+#include "common-defs.h"
+
G_BEGIN_DECLS
#define TRANSPORT_WIDGET_TYPE (transport_widget_get_type ())
@@ -35,17 +37,6 @@ G_BEGIN_DECLS
typedef struct _TransportWidget TransportWidget;
typedef struct _TransportWidgetClass TransportWidgetClass;
-typedef enum {
- TRANSPORT_PREVIOUS,
- TRANSPORT_PLAY_PAUSE,
- TRANSPORT_NEXT,
- TRANSPORT_NADA
-}TransportWidgetEvent;
-
-typedef enum {
- PLAY,
- PAUSE
-}TransportWidgetState;
struct _TransportWidgetClass {
GtkMenuItemClass parent_class;
@@ -65,12 +56,12 @@ typedef struct
void _color_shade (const CairoColorRGB *a, float k, CairoColorRGB *b);
GType transport_widget_get_type (void);
-GtkWidget* transport_widget_new ( DbusmenuMenuitem *item );
-void transport_widget_react_to_key_press_event ( TransportWidget* widget,
- TransportWidgetEvent transport_event );
-void transport_widget_react_to_key_release_event ( TransportWidget* widget,
- TransportWidgetEvent transport_event );
-gboolean transport_widget_is_selected ( TransportWidget* widget );
+GtkWidget* transport_widget_new (DbusmenuMenuitem *item);
+void transport_widget_react_to_key_press_event (TransportWidget* widget,
+ TransportAction transport_event);
+void transport_widget_react_to_key_release_event (TransportWidget* widget,
+ TransportAction transport_event);
+gboolean transport_widget_is_selected (TransportWidget* widget);
G_END_DECLS
#endif
diff --git a/src/voip-input-widget.c b/src/voip-input-widget.c
index 9b29feb..fc295ce 100644
--- a/src/voip-input-widget.c
+++ b/src/voip-input-widget.c
@@ -95,12 +95,12 @@ voip_input_widget_init (VoipInputWidget *self)
g_signal_connect(priv->ido_voip_input_slider, "slider-released", G_CALLBACK(voip_input_widget_slider_released), self);
GtkWidget* primary_image = ido_scale_menu_item_get_primary_image((IdoScaleMenuItem*)priv->ido_voip_input_slider);
- GIcon * primary_gicon = g_themed_icon_new_with_default_fallbacks("audio-input-microphone");
+ GIcon * primary_gicon = g_themed_icon_new_with_default_fallbacks("audio-input-microphone-none-panel");
gtk_image_set_from_gicon(GTK_IMAGE(primary_image), primary_gicon, GTK_ICON_SIZE_MENU);
g_object_unref(primary_gicon);
GtkWidget* secondary_image = ido_scale_menu_item_get_secondary_image((IdoScaleMenuItem*)priv->ido_voip_input_slider);
- GIcon * secondary_gicon = g_themed_icon_new_with_default_fallbacks("audio-input-microphone-high");
+ GIcon * secondary_gicon = g_themed_icon_new_with_default_fallbacks("audio-input-microphone-high-panel");
gtk_image_set_from_gicon(GTK_IMAGE(secondary_image), secondary_gicon, GTK_ICON_SIZE_MENU);
g_object_unref(secondary_gicon);
diff --git a/src/volume-widget.c b/src/volume-widget.c
index be97994..5c842dc 100644
--- a/src/volume-widget.c
+++ b/src/volume-widget.c
@@ -128,6 +128,7 @@ volume_widget_property_update( DbusmenuMenuitem* item, gchar* property,
GVariant* value, gpointer userdata)
{
g_return_if_fail (IS_VOLUME_WIDGET (userdata));
+ g_return_if_fail (g_variant_is_of_type (value, G_VARIANT_TYPE_DOUBLE) );
VolumeWidget* mitem = VOLUME_WIDGET(userdata);
VolumeWidgetPrivate * priv = VOLUME_WIDGET_GET_PRIVATE(mitem);
//g_debug("scrub-widget::property_update for prop %s", property);
@@ -136,16 +137,8 @@ volume_widget_property_update( DbusmenuMenuitem* item, gchar* property,
GtkWidget *slider = ido_scale_menu_item_get_scale((IdoScaleMenuItem*)priv->ido_volume_slider);
GtkRange *range = (GtkRange*)slider;
gdouble update = g_variant_get_double (value);
- //g_debug("volume-widget - update level with value %f", update);
gtk_range_set_value(range, update);
-
- GList *entry = indicator_object_get_entries(priv->indicator);
- g_signal_emit(G_OBJECT(priv->indicator),
- INDICATOR_OBJECT_SIGNAL_ACCESSIBLE_DESC_UPDATE_ID,
- 0,
- entry->data,
- TRUE);
- g_list_free(entry);
+ update_accessible_desc(priv->indicator);
}
}
}
@@ -165,25 +158,19 @@ volume_widget_set_twin_item(VolumeWidget* self,
GtkWidget *slider = ido_scale_menu_item_get_scale((IdoScaleMenuItem*)priv->ido_volume_slider);
GtkRange *range = (GtkRange*)slider;
gtk_range_set_value(range, initial_level);
-
- GList *entry = indicator_object_get_entries(priv->indicator);
- g_signal_emit(G_OBJECT(priv->indicator),
- INDICATOR_OBJECT_SIGNAL_ACCESSIBLE_DESC_UPDATE_ID,
- 0,
- entry->data,
- TRUE);
- g_list_free(entry);
+ update_accessible_desc(priv->indicator);
}
static gboolean
volume_widget_change_value_cb (GtkRange *range,
- GtkScrollType scroll,
- gdouble new_value,
- gpointer user_data)
+ GtkScrollType scroll,
+ gdouble new_value,
+ gpointer user_data)
{
g_return_val_if_fail (IS_VOLUME_WIDGET (user_data), FALSE);
VolumeWidget* mitem = VOLUME_WIDGET(user_data);
- volume_widget_update(mitem, new_value);
+ //g_debug ("changed value %f", new_value);
+ volume_widget_update(mitem, new_value);
return FALSE;
}
@@ -192,17 +179,19 @@ volume_widget_change_value_cb (GtkRange *range,
which set the slider to 0 or 100. Ignore all other events.
*/
static gboolean
-volume_widget_value_changed_cb(GtkRange *range, gpointer user_data)
+volume_widget_value_changed_cb (GtkRange *range, gpointer user_data)
{
+
g_return_val_if_fail (IS_VOLUME_WIDGET (user_data), FALSE);
VolumeWidget* mitem = VOLUME_WIDGET(user_data);
VolumeWidgetPrivate * priv = VOLUME_WIDGET_GET_PRIVATE(mitem);
- GtkWidget *slider = ido_scale_menu_item_get_scale((IdoScaleMenuItem*)priv->ido_volume_slider);
+ GtkWidget *slider = ido_scale_menu_item_get_scale((IdoScaleMenuItem*)priv->ido_volume_slider);
gdouble current_value = CLAMP(gtk_range_get_value(GTK_RANGE(slider)), 0, 100);
-
+ //g_debug ("value changed %f", gtk_range_get_value(GTK_RANGE(slider)));
if(current_value == 0 || current_value == 100){
volume_widget_update(mitem, current_value);
}
+
return FALSE;
}
diff --git a/vapi/common-defs.vapi b/vapi/common-defs.vapi
index 7b38e9c..7cac0de 100644
--- a/vapi/common-defs.vapi
+++ b/vapi/common-defs.vapi
@@ -41,14 +41,6 @@ namespace DbusmenuTitle{
}
[CCode (cheader_filename = "common-defs.h")]
-namespace DbusmenuScrub{
- public const string MENUITEM_TYPE;
- public const string MENUITEM_POSITION;
- public const string MENUITEM_DURATION;
- public const string MENUITEM_PLAY_STATE;
-}
-
-[CCode (cheader_filename = "common-defs.h")]
namespace DbusmenuPlaylists{
public const string MENUITEM_TYPE;
public const string MENUITEM_TITLE;
@@ -57,4 +49,20 @@ namespace DbusmenuPlaylists{
[CCode (cheader_filename = "common-defs.h")]
namespace DbusmenuPlaylist{
public const string MENUITEM_PATH;
-} \ No newline at end of file
+}
+
+
+[CCode (cprefix ="Transport", cheader_filename = "common-defs.h")]
+namespace Transport{
+ public enum Action{
+ PREVIOUS,
+ PLAY_PAUSE,
+ NEXT,
+ REWIND,
+ FORWIND
+ }
+ public enum State{
+ PLAYING,
+ PAUSED
+ }
+}