aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rwxr-xr-xconfigure20
-rw-r--r--configure.ac4
-rw-r--r--data/com.canonical.indicators.sound.gschema.xml2
-rw-r--r--src/common-defs.h3
-rw-r--r--src/indicator-sound.c4
-rw-r--r--src/mpris2-controller.c55
-rw-r--r--src/mpris2-controller.vala14
-rw-r--r--src/mpris2-watcher.vala2
-rw-r--r--src/music-player-bridge.h1
-rw-r--r--src/player-controller.c138
-rw-r--r--src/player-controller.vala28
-rw-r--r--src/player-item.c2
-rw-r--r--src/player-item.vala4
-rw-r--r--src/playlists-menu-item.c225
-rw-r--r--src/playlists-menu-item.vala31
-rw-r--r--src/slider-menu-item.c49
-rw-r--r--src/sound-service-dbus.c5
-rw-r--r--src/sound-service.c2
-rw-r--r--src/transport-menu-item.c126
-rw-r--r--src/transport-menu-item.vala56
-rw-r--r--src/transport-widget.c108
-rw-r--r--src/voip-input-menu-item.c5
-rw-r--r--src/voip-input-widget.c13
-rw-r--r--src/volume-widget.c66
-rw-r--r--src/volume-widget.h2
-rw-r--r--vapi/common-defs.vapi6
26 files changed, 595 insertions, 376 deletions
diff --git a/configure b/configure
index 2547385..f6dd51e 100755
--- a/configure
+++ b/configure
@@ -1,6 +1,6 @@
#! /bin/sh
# Guess values for system-dependent variables and create Makefiles.
-# Generated by GNU Autoconf 2.67 for indicator-sound 0.6.4.
+# Generated by GNU Autoconf 2.67 for indicator-sound 0.6.5.
#
# Report bugs to <conor.curran@canonical.com>.
#
@@ -761,8 +761,8 @@ MAKEFLAGS=
# Identity of this package.
PACKAGE_NAME='indicator-sound'
PACKAGE_TARNAME='indicator-sound'
-PACKAGE_VERSION='0.6.4'
-PACKAGE_STRING='indicator-sound 0.6.4'
+PACKAGE_VERSION='0.6.5'
+PACKAGE_STRING='indicator-sound 0.6.5'
PACKAGE_BUGREPORT='conor.curran@canonical.com'
PACKAGE_URL=''
@@ -1564,7 +1564,7 @@ if test "$ac_init_help" = "long"; then
# Omit some internal or obsolete options to make the list less imposing.
# This message is too long to be a string in the A/UX 3.1 sh.
cat <<_ACEOF
-\`configure' configures indicator-sound 0.6.4 to adapt to many kinds of systems.
+\`configure' configures indicator-sound 0.6.5 to adapt to many kinds of systems.
Usage: $0 [OPTION]... [VAR=VALUE]...
@@ -1634,7 +1634,7 @@ fi
if test -n "$ac_init_help"; then
case $ac_init_help in
- short | recursive ) echo "Configuration of indicator-sound 0.6.4:";;
+ short | recursive ) echo "Configuration of indicator-sound 0.6.5:";;
esac
cat <<\_ACEOF
@@ -1767,7 +1767,7 @@ fi
test -n "$ac_init_help" && exit $ac_status
if $ac_init_version; then
cat <<\_ACEOF
-indicator-sound configure 0.6.4
+indicator-sound configure 0.6.5
generated by GNU Autoconf 2.67
Copyright (C) 2010 Free Software Foundation, Inc.
@@ -2136,7 +2136,7 @@ cat >config.log <<_ACEOF
This file contains any messages produced by compilers while
running configure, to aid debugging if configure makes a mistake.
-It was created by indicator-sound $as_me 0.6.4, which was
+It was created by indicator-sound $as_me 0.6.5, which was
generated by GNU Autoconf 2.67. Invocation command line was
$ $0 $@
@@ -2956,7 +2956,7 @@ fi
# Define the identity of the package.
PACKAGE=indicator-sound
- VERSION=0.6.4
+ VERSION=0.6.5
cat >>confdefs.h <<_ACEOF
@@ -14349,7 +14349,7 @@ cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
# report actual input values of CONFIG_FILES etc. instead of their
# values after options handling.
ac_log="
-This file was extended by indicator-sound $as_me 0.6.4, which was
+This file was extended by indicator-sound $as_me 0.6.5, which was
generated by GNU Autoconf 2.67. Invocation command line was
CONFIG_FILES = $CONFIG_FILES
@@ -14415,7 +14415,7 @@ _ACEOF
cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
ac_cs_config="`$as_echo "$ac_configure_args" | sed 's/^ //; s/[\\""\`\$]/\\\\&/g'`"
ac_cs_version="\\
-indicator-sound config.status 0.6.4
+indicator-sound config.status 0.6.5
configured by $0, generated by GNU Autoconf 2.67,
with options \\"\$ac_cs_config\\"
diff --git a/configure.ac b/configure.ac
index 796b124..be50971 100644
--- a/configure.ac
+++ b/configure.ac
@@ -1,10 +1,10 @@
-AC_INIT(indicator-sound, 0.6.4, conor.curran@canonical.com)
+AC_INIT(indicator-sound, 0.6.5, conor.curran@canonical.com)
AC_PREREQ(2.53)
AM_CONFIG_HEADER(config.h)
-AM_INIT_AUTOMAKE(indicator-sound, 0.6.4)
+AM_INIT_AUTOMAKE(indicator-sound, 0.6.5)
AM_MAINTAINER_MODE
diff --git a/data/com.canonical.indicators.sound.gschema.xml b/data/com.canonical.indicators.sound.gschema.xml
index 1e08269..dc63bcb 100644
--- a/data/com.canonical.indicators.sound.gschema.xml
+++ b/data/com.canonical.indicators.sound.gschema.xml
@@ -11,7 +11,7 @@
</key>
<key name="interested-media-players" type="as">
<summary>A list of applications which at some point have registered with the sound menu</summary>
- <default>[ 'banshee-1' ]</default>
+ <default>[ 'banshee' ]</default>
<description>
Each media player which abides by the MPRIS2 spec will automatically appear in the menu.
This array should contain the desktop file names (minus .desktop suffix) of applications which
diff --git a/src/common-defs.h b/src/common-defs.h
index 68cb0b8..b118d4b 100644
--- a/src/common-defs.h
+++ b/src/common-defs.h
@@ -45,7 +45,8 @@ typedef enum {
typedef enum {
TRANSPORT_STATE_PLAYING,
- TRANSPORT_STATE_PAUSED
+ TRANSPORT_STATE_PAUSED,
+ TRANSPORT_STATE_LAUNCHING
}TransportState;
#define NOT_ACTIVE -1
diff --git a/src/indicator-sound.c b/src/indicator-sound.c
index 7d74a42..042bf89 100644
--- a/src/indicator-sound.c
+++ b/src/indicator-sound.c
@@ -539,7 +539,7 @@ key_press_cb(GtkWidget* widget, GdkEventKey* event, gpointer data)
voip_input_widget_update (VOIP_INPUT_WIDGET(priv->voip_widget), new_value);
}
else{
- volume_widget_update (VOLUME_WIDGET(priv->volume_widget), new_value);
+ volume_widget_update (VOLUME_WIDGET(priv->volume_widget), new_value, "keypress-update");
}
}
}
@@ -660,7 +660,7 @@ indicator_sound_scroll (IndicatorObject *io, gint delta,
value -= adj->step_increment;
}
//g_debug("indicator-sound-scroll - update slider with value %f", value);
- volume_widget_update(VOLUME_WIDGET(priv->volume_widget), value);
+ volume_widget_update(VOLUME_WIDGET(priv->volume_widget), value, "scroll updates");
sound_state_manager_show_notification (priv->state_manager, value);
}
diff --git a/src/mpris2-controller.c b/src/mpris2-controller.c
index 89ef02d..0576340 100644
--- a/src/mpris2-controller.c
+++ b/src/mpris2-controller.c
@@ -344,7 +344,6 @@ MprisRoot* mpris2_controller_get_mpris2_root (Mpris2Controller* self);
gchar* mpris_root_get_Identity (MprisRoot* self);
GHashTable* mpris_player_get_Metadata (MprisPlayer* self);
static GVariant* _variant_new1 (const gchar* value);
-static const gchar* _variant_get2 (GVariant* value);
void mpris2_controller_initial_update (Mpris2Controller* self);
void mpris2_controller_transport_update (Mpris2Controller* self, TransportAction command);
void mpris_player_PlayPause (MprisPlayer* self, GAsyncReadyCallback _callback_, gpointer _user_data_);
@@ -635,11 +634,6 @@ static GVariant* _variant_new1 (const gchar* value) {
}
-static const gchar* _variant_get2 (GVariant* value) {
- return g_variant_dup_string (value, NULL);
-}
-
-
static GHashTable* mpris2_controller_clean_metadata (Mpris2Controller* self) {
GHashTable* result = NULL;
GHashTable* _tmp0_ = NULL;
@@ -667,11 +661,9 @@ static GHashTable* mpris2_controller_clean_metadata (Mpris2Controller* self) {
GVariant* _tmp9_;
GVariant* _tmp10_;
GVariant* v_artists;
- const gchar* _tmp11_ = NULL;
gchar* display_artists = NULL;
- const gchar* _tmp12_ = NULL;
- gchar* _tmp18_;
- gconstpointer _tmp19_ = NULL;
+ const gchar* _tmp11_ = NULL;
+ gchar* _tmp17_;
_tmp6_ = mpris_player_get_Metadata (self->priv->_player);
_tmp7_ = _tmp6_;
_tmp8_ = g_hash_table_lookup (_tmp7_, "xesam:artist");
@@ -680,36 +672,31 @@ static GHashTable* mpris2_controller_clean_metadata (Mpris2Controller* self) {
_g_hash_table_unref0 (_tmp7_);
v_artists = _tmp10_;
_tmp11_ = g_variant_get_type_string (v_artists);
- g_debug ("mpris2-controller.vala:130: artists is of type %s", _tmp11_);
- _tmp12_ = g_variant_get_type_string (v_artists);
- if (g_strcmp0 (_tmp12_, "s") == 0) {
- const gchar* _tmp13_ = NULL;
- gchar* _tmp14_;
- g_debug ("mpris2-controller.vala:133: SPOTIFY is that you ?");
- _tmp13_ = g_variant_get_string (v_artists, NULL);
- _tmp14_ = g_strdup (_tmp13_);
+ if (g_strcmp0 (_tmp11_, "s") == 0) {
+ const gchar* _tmp12_ = NULL;
+ gchar* _tmp13_;
+ _tmp12_ = g_variant_get_string (v_artists, NULL);
+ _tmp13_ = g_strdup (_tmp12_);
_g_free0 (display_artists);
- display_artists = _tmp14_;
+ display_artists = _tmp13_;
} else {
- size_t _tmp15_;
- gchar** _tmp16_ = NULL;
+ size_t _tmp14_;
+ gchar** _tmp15_ = NULL;
gchar** artists;
gint artists_length1;
gint _artists_size_;
- gchar* _tmp17_ = NULL;
- _tmp16_ = g_variant_dup_strv (v_artists, &_tmp15_);
- artists = _tmp16_;
- artists_length1 = _tmp15_;
- _artists_size_ = _tmp15_;
- _tmp17_ = g_strjoinv (", ", artists);
+ gchar* _tmp16_ = NULL;
+ _tmp15_ = g_variant_dup_strv (v_artists, &_tmp14_);
+ artists = _tmp15_;
+ artists_length1 = _tmp14_;
+ _artists_size_ = _tmp14_;
+ _tmp16_ = g_strjoinv (", ", artists);
_g_free0 (display_artists);
- display_artists = _tmp17_;
+ display_artists = _tmp16_;
artists = (_vala_array_free (artists, artists_length1, (GDestroyNotify) g_free), NULL);
}
- _tmp18_ = g_strdup ("xesam:artist");
- g_hash_table_replace (changed_updates, _tmp18_, _variant_new1 (display_artists));
- _tmp19_ = g_hash_table_lookup (changed_updates, "xesam:artist");
- g_debug ("mpris2-controller.vala:141: artist : %s", _variant_get2 ((GVariant*) _tmp19_));
+ _tmp17_ = g_strdup ("xesam:artist");
+ g_hash_table_replace (changed_updates, _tmp17_, _variant_new1 (display_artists));
_g_free0 (display_artists);
_g_variant_unref0 (v_artists);
}
@@ -977,7 +964,6 @@ static gboolean mpris2_controller_fetch_playlists_co (Mpris2ControllerFetchPlayl
{
data->e = data->_inner_error_;
data->_inner_error_ = NULL;
- g_debug ("mpris2-controller.vala:229: Could not fetch playlists because %s", data->e->message);
_g_error_free0 (data->e);
data->current_playlists = (_vala_PlaylistDetails_array_free (data->current_playlists, data->current_playlists_length1), NULL);
if (data->_state_ == 0) {
@@ -996,7 +982,6 @@ static gboolean mpris2_controller_fetch_playlists_co (Mpris2ControllerFetchPlayl
return FALSE;
}
if (data->current_playlists != NULL) {
- g_debug ("mpris2-controller.vala:234: Size of the playlist array = %i", data->current_playlists_length1);
data->_tmp3_ = NULL;
data->_tmp3_ = gee_abstract_list_get ((GeeAbstractList*) data->self->priv->_owner->custom_items, (gint) PLAYER_CONTROLLER_WIDGET_ORDER_PLAYLISTS);
data->_tmp4_ = (PlayerItem*) data->_tmp3_;
@@ -1038,7 +1023,6 @@ static gboolean mpris2_controller_fetch_active_playlist (Mpris2Controller* self)
_tmp2_ = _tmp1_.valid == FALSE;
active_playlist_container_destroy (&_tmp1_);
if (_tmp2_) {
- g_debug ("mpris2-controller.vala:247: We don't have an active playlist");
}
_tmp3_ = gee_abstract_list_get ((GeeAbstractList*) self->priv->_owner->custom_items, (gint) PLAYER_CONTROLLER_WIDGET_ORDER_PLAYLISTS);
_tmp4_ = (PlayerItem*) _tmp3_;
@@ -1064,7 +1048,6 @@ void mpris2_controller_activate_playlist (Mpris2Controller* self, const char* pa
GError * e;
e = _inner_error_;
_inner_error_ = NULL;
- g_debug ("mpris2-controller.vala:260: Could not activate playlist %s because %s", (const gchar*) path, e->message);
_g_error_free0 (e);
}
__finally12:
diff --git a/src/mpris2-controller.vala b/src/mpris2-controller.vala
index 6129458..94c52c0 100644
--- a/src/mpris2-controller.vala
+++ b/src/mpris2-controller.vala
@@ -127,10 +127,10 @@ public class Mpris2Controller : GLib.Object
Variant? artist_v = this.player.Metadata.lookup("xesam:artist");
if(artist_v != null){
Variant? v_artists = this.player.Metadata.lookup("xesam:artist");
- debug("artists is of type %s", v_artists.get_type_string ());
+ //debug("artists is of type %s", v_artists.get_type_string ());
string display_artists;
if(v_artists.get_type_string() == "s"){
- debug("SPOTIFY is that you ?");
+ //debug("SPOTIFY is that you ?");
display_artists = v_artists.get_string();
}
else{
@@ -138,7 +138,7 @@ public class Mpris2Controller : GLib.Object
display_artists = string.joinv(", ", artists);
}
changed_updates.replace("xesam:artist", display_artists);
- debug("artist : %s", (string)changed_updates.lookup("xesam:artist"));
+ //debug("artist : %s", (string)changed_updates.lookup("xesam:artist"));
}
return changed_updates;
}
@@ -226,12 +226,12 @@ public class Mpris2Controller : GLib.Object
false);
}
catch (IOError e){
- debug("Could not fetch playlists because %s", e.message);
+ //debug("Could not fetch playlists because %s", e.message);
return;
}
if( current_playlists != null ){
- debug( "Size of the playlist array = %i", current_playlists.length );
+ //debug( "Size of the playlist array = %i", current_playlists.length );
PlaylistsMenuitem playlists_item = this.owner.custom_items[PlayerController.widget_order.PLAYLISTS] as PlaylistsMenuitem;
playlists_item.update(current_playlists);
}
@@ -244,7 +244,7 @@ public class Mpris2Controller : GLib.Object
private bool fetch_active_playlist()
{
if (this.playlists.ActivePlaylist.valid == false){
- debug(" We don't have an active playlist");
+ //debug(" We don't have an active playlist");
}
PlaylistsMenuitem playlists_item = this.owner.custom_items[PlayerController.widget_order.PLAYLISTS] as PlaylistsMenuitem;
playlists_item.active_playlist_update ( this.playlists.ActivePlaylist.details );
@@ -257,7 +257,7 @@ public class Mpris2Controller : GLib.Object
this.playlists.ActivatePlaylist.begin(path);
}
catch(IOError e){
- debug("Could not activate playlist %s because %s", (string)path, e.message);
+ //debug("Could not activate playlist %s because %s", (string)path, e.message);
}
}
}
diff --git a/src/mpris2-watcher.vala b/src/mpris2-watcher.vala
index 0b37506..d508959 100644
--- a/src/mpris2-watcher.vala
+++ b/src/mpris2-watcher.vala
@@ -168,4 +168,4 @@ public class Mpris2Watcher : GLib.Object
delete xml_doc;
return result;
}
-} \ No newline at end of file
+}
diff --git a/src/music-player-bridge.h b/src/music-player-bridge.h
index 857e220..b155c6a 100644
--- a/src/music-player-bridge.h
+++ b/src/music-player-bridge.h
@@ -426,6 +426,7 @@ GType transport_menuitem_get_type (void) G_GNUC_CONST;
GType player_controller_get_type (void) G_GNUC_CONST;
TransportMenuitem* transport_menuitem_new (PlayerController* parent);
TransportMenuitem* transport_menuitem_construct (GType object_type, PlayerController* parent);
+void transport_menuitem_handle_cached_action (TransportMenuitem* self);
void transport_menuitem_change_play_state (TransportMenuitem* self, TransportState update);
GeeHashSet* transport_menuitem_attributes_format (void);
GType metadata_menuitem_get_type (void) G_GNUC_CONST;
diff --git a/src/player-controller.c b/src/player-controller.c
index 2eb7992..5a2a64f 100644
--- a/src/player-controller.c
+++ b/src/player-controller.c
@@ -34,6 +34,7 @@ with this program. If not, see <http://www.gnu.org/licenses/>.
#include <stdlib.h>
#include <string.h>
#include <gio/gio.h>
+#include <common-defs.h>
#define TYPE_PLAYER_CONTROLLER (player_controller_get_type ())
@@ -86,6 +87,16 @@ typedef struct _PlaylistsMenuitemClass PlaylistsMenuitemClass;
typedef struct _PlayerItemPrivate PlayerItemPrivate;
typedef struct _PlaylistsMenuitemPrivate PlaylistsMenuitemPrivate;
+#define TYPE_TRANSPORT_MENUITEM (transport_menuitem_get_type ())
+#define TRANSPORT_MENUITEM(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), TYPE_TRANSPORT_MENUITEM, TransportMenuitem))
+#define TRANSPORT_MENUITEM_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), TYPE_TRANSPORT_MENUITEM, TransportMenuitemClass))
+#define IS_TRANSPORT_MENUITEM(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), TYPE_TRANSPORT_MENUITEM))
+#define IS_TRANSPORT_MENUITEM_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), TYPE_TRANSPORT_MENUITEM))
+#define TRANSPORT_MENUITEM_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), TYPE_TRANSPORT_MENUITEM, TransportMenuitemClass))
+
+typedef struct _TransportMenuitem TransportMenuitem;
+typedef struct _TransportMenuitemClass TransportMenuitemClass;
+
#define TYPE_TITLE_MENUITEM (title_menuitem_get_type ())
#define TITLE_MENUITEM(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), TYPE_TITLE_MENUITEM, TitleMenuitem))
#define TITLE_MENUITEM_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), TYPE_TITLE_MENUITEM, TitleMenuitemClass))
@@ -106,16 +117,6 @@ typedef struct _TitleMenuitemClass TitleMenuitemClass;
typedef struct _MetadataMenuitem MetadataMenuitem;
typedef struct _MetadataMenuitemClass MetadataMenuitemClass;
-#define TYPE_TRANSPORT_MENUITEM (transport_menuitem_get_type ())
-#define TRANSPORT_MENUITEM(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), TYPE_TRANSPORT_MENUITEM, TransportMenuitem))
-#define TRANSPORT_MENUITEM_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), TYPE_TRANSPORT_MENUITEM, TransportMenuitemClass))
-#define IS_TRANSPORT_MENUITEM(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), TYPE_TRANSPORT_MENUITEM))
-#define IS_TRANSPORT_MENUITEM_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), TYPE_TRANSPORT_MENUITEM))
-#define TRANSPORT_MENUITEM_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), TYPE_TRANSPORT_MENUITEM, TransportMenuitemClass))
-
-typedef struct _TransportMenuitem TransportMenuitem;
-typedef struct _TransportMenuitemClass TransportMenuitemClass;
-
struct _PlayerController {
GObject parent_instance;
PlayerControllerPrivate * priv;
@@ -211,12 +212,14 @@ void player_controller_remove_from_menu (PlayerController* self);
static gboolean _bool_equal (const gboolean* s1, const gboolean* s2);
GType playlists_menuitem_get_type (void) G_GNUC_CONST;
void player_controller_hibernate (PlayerController* self);
+GType transport_menuitem_get_type (void) G_GNUC_CONST;
+void transport_menuitem_change_play_state (TransportMenuitem* self, TransportState update);
void player_item_reset (PlayerItem* self, GeeHashSet* attrs);
-GeeHashSet* transport_menuitem_attributes_format (void);
GeeHashSet* metadata_menuitem_attributes_format (void);
GType title_menuitem_get_type (void) G_GNUC_CONST;
void title_menuitem_toggle_active_triangle (TitleMenuitem* self, gboolean update);
gboolean player_item_populated (PlayerItem* self, GeeHashSet* attrs);
+void transport_menuitem_handle_cached_action (TransportMenuitem* self);
PlayerItem* player_item_new (const gchar* type);
PlayerItem* player_item_construct (GType object_type, const gchar* type);
TitleMenuitem* title_menuitem_new (PlayerController* parent);
@@ -226,7 +229,6 @@ MetadataMenuitem* metadata_menuitem_construct (GType object_type);
GType metadata_menuitem_get_type (void) G_GNUC_CONST;
TransportMenuitem* transport_menuitem_new (PlayerController* parent);
TransportMenuitem* transport_menuitem_construct (GType object_type, PlayerController* parent);
-GType transport_menuitem_get_type (void) G_GNUC_CONST;
PlaylistsMenuitem* playlists_menuitem_new (PlayerController* parent);
PlaylistsMenuitem* playlists_menuitem_construct (GType object_type, PlayerController* parent);
gint player_controller_get_menu_offset (PlayerController* self);
@@ -469,38 +471,35 @@ void player_controller_remove_from_menu (PlayerController* self) {
void player_controller_hibernate (PlayerController* self) {
gpointer _tmp0_ = NULL;
PlayerItem* _tmp1_;
- GeeHashSet* _tmp2_ = NULL;
- GeeHashSet* _tmp3_;
- gpointer _tmp4_ = NULL;
- PlayerItem* _tmp5_;
- GeeHashSet* _tmp6_ = NULL;
- GeeHashSet* _tmp7_;
- gpointer _tmp8_ = NULL;
- PlayerItem* _tmp9_;
+ TransportMenuitem* transport;
+ gpointer _tmp2_ = NULL;
+ PlayerItem* _tmp3_;
+ GeeHashSet* _tmp4_ = NULL;
+ GeeHashSet* _tmp5_;
+ gpointer _tmp6_ = NULL;
+ PlayerItem* _tmp7_;
TitleMenuitem* title;
g_return_if_fail (self != NULL);
player_controller_update_state (self, PLAYER_CONTROLLER_STATE_OFFLINE);
_tmp0_ = gee_abstract_list_get ((GeeAbstractList*) self->custom_items, (gint) PLAYER_CONTROLLER_WIDGET_ORDER_TRANSPORT);
_tmp1_ = (PlayerItem*) _tmp0_;
- _tmp2_ = transport_menuitem_attributes_format ();
- _tmp3_ = _tmp2_;
- player_item_reset (_tmp1_, _tmp3_);
- _g_object_unref0 (_tmp3_);
- _g_object_unref0 (_tmp1_);
- _tmp4_ = gee_abstract_list_get ((GeeAbstractList*) self->custom_items, (gint) PLAYER_CONTROLLER_WIDGET_ORDER_METADATA);
- _tmp5_ = (PlayerItem*) _tmp4_;
- _tmp6_ = metadata_menuitem_attributes_format ();
- _tmp7_ = _tmp6_;
- player_item_reset (_tmp5_, _tmp7_);
- _g_object_unref0 (_tmp7_);
+ transport = IS_TRANSPORT_MENUITEM (_tmp1_) ? ((TransportMenuitem*) _tmp1_) : NULL;
+ transport_menuitem_change_play_state (transport, TRANSPORT_STATE_PAUSED);
+ _tmp2_ = gee_abstract_list_get ((GeeAbstractList*) self->custom_items, (gint) PLAYER_CONTROLLER_WIDGET_ORDER_METADATA);
+ _tmp3_ = (PlayerItem*) _tmp2_;
+ _tmp4_ = metadata_menuitem_attributes_format ();
+ _tmp5_ = _tmp4_;
+ player_item_reset (_tmp3_, _tmp5_);
_g_object_unref0 (_tmp5_);
- _tmp8_ = gee_abstract_list_get ((GeeAbstractList*) self->custom_items, (gint) PLAYER_CONTROLLER_WIDGET_ORDER_TITLE);
- _tmp9_ = (PlayerItem*) _tmp8_;
- title = IS_TITLE_MENUITEM (_tmp9_) ? ((TitleMenuitem*) _tmp9_) : NULL;
+ _g_object_unref0 (_tmp3_);
+ _tmp6_ = gee_abstract_list_get ((GeeAbstractList*) self->custom_items, (gint) PLAYER_CONTROLLER_WIDGET_ORDER_TITLE);
+ _tmp7_ = (PlayerItem*) _tmp6_;
+ title = IS_TITLE_MENUITEM (_tmp7_) ? ((TitleMenuitem*) _tmp7_) : NULL;
title_menuitem_toggle_active_triangle (title, FALSE);
_g_object_unref0 (self->mpris_bridge);
self->mpris_bridge = NULL;
_g_object_unref0 (title);
+ _g_object_unref0 (transport);
}
@@ -508,15 +507,14 @@ void player_controller_update_layout (PlayerController* self) {
gpointer _tmp0_ = NULL;
PlayerItem* _tmp1_;
PlaylistsMenuitem* playlists_menuitem;
- gpointer _tmp6_ = NULL;
- PlayerItem* _tmp7_;
- gpointer _tmp8_ = NULL;
- PlayerItem* _tmp9_;
- GeeHashSet* _tmp10_ = NULL;
- GeeHashSet* _tmp11_;
- gboolean _tmp12_;
- gpointer _tmp13_ = NULL;
- PlayerItem* _tmp14_;
+ gpointer _tmp7_ = NULL;
+ PlayerItem* _tmp8_;
+ gpointer _tmp9_ = NULL;
+ PlayerItem* _tmp10_;
+ GeeHashSet* _tmp11_ = NULL;
+ GeeHashSet* _tmp12_;
+ gboolean _tmp13_;
+ const gchar* _tmp14_ = NULL;
g_return_if_fail (self != NULL);
_tmp0_ = gee_abstract_list_get ((GeeAbstractList*) self->custom_items, (gint) PLAYER_CONTROLLER_WIDGET_ORDER_PLAYLISTS);
_tmp1_ = (PlayerItem*) _tmp0_;
@@ -526,33 +524,49 @@ void player_controller_update_layout (PlayerController* self) {
PlayerItem* _tmp3_;
gpointer _tmp4_ = NULL;
PlayerItem* _tmp5_;
- _tmp2_ = gee_abstract_list_get ((GeeAbstractList*) self->custom_items, (gint) PLAYER_CONTROLLER_WIDGET_ORDER_TRANSPORT);
+ const gchar* _tmp6_ = NULL;
+ _tmp2_ = gee_abstract_list_get ((GeeAbstractList*) self->custom_items, (gint) PLAYER_CONTROLLER_WIDGET_ORDER_METADATA);
_tmp3_ = (PlayerItem*) _tmp2_;
dbusmenu_menuitem_property_set_bool ((DbusmenuMenuitem*) _tmp3_, DBUSMENU_MENUITEM_PROP_VISIBLE, FALSE);
_g_object_unref0 (_tmp3_);
- _tmp4_ = gee_abstract_list_get ((GeeAbstractList*) self->custom_items, (gint) PLAYER_CONTROLLER_WIDGET_ORDER_METADATA);
+ dbusmenu_menuitem_property_set_bool (playlists_menuitem->root_item, DBUSMENU_MENUITEM_PROP_VISIBLE, FALSE);
+ _tmp4_ = gee_abstract_list_get ((GeeAbstractList*) self->custom_items, (gint) PLAYER_CONTROLLER_WIDGET_ORDER_TRANSPORT);
_tmp5_ = (PlayerItem*) _tmp4_;
- dbusmenu_menuitem_property_set_bool ((DbusmenuMenuitem*) _tmp5_, DBUSMENU_MENUITEM_PROP_VISIBLE, FALSE);
+ _tmp6_ = g_app_info_get_id (self->priv->_app_info);
+ dbusmenu_menuitem_property_set_bool ((DbusmenuMenuitem*) _tmp5_, DBUSMENU_MENUITEM_PROP_VISIBLE, g_strcmp0 (_tmp6_, "banshee.desktop") == 0);
_g_object_unref0 (_tmp5_);
- dbusmenu_menuitem_property_set_bool (playlists_menuitem->root_item, DBUSMENU_MENUITEM_PROP_VISIBLE, FALSE);
_g_object_unref0 (playlists_menuitem);
return;
}
- _tmp6_ = gee_abstract_list_get ((GeeAbstractList*) self->custom_items, (gint) PLAYER_CONTROLLER_WIDGET_ORDER_METADATA);
- _tmp7_ = (PlayerItem*) _tmp6_;
- _tmp8_ = gee_abstract_list_get ((GeeAbstractList*) self->custom_items, (gint) PLAYER_CONTROLLER_WIDGET_ORDER_METADATA);
- _tmp9_ = (PlayerItem*) _tmp8_;
- _tmp10_ = metadata_menuitem_attributes_format ();
- _tmp11_ = _tmp10_;
- _tmp12_ = player_item_populated (_tmp9_, _tmp11_);
- dbusmenu_menuitem_property_set_bool ((DbusmenuMenuitem*) _tmp7_, DBUSMENU_MENUITEM_PROP_VISIBLE, _tmp12_);
- _g_object_unref0 (_tmp11_);
- _g_object_unref0 (_tmp9_);
- _g_object_unref0 (_tmp7_);
- _tmp13_ = gee_abstract_list_get ((GeeAbstractList*) self->custom_items, (gint) PLAYER_CONTROLLER_WIDGET_ORDER_TRANSPORT);
- _tmp14_ = (PlayerItem*) _tmp13_;
- dbusmenu_menuitem_property_set_bool ((DbusmenuMenuitem*) _tmp14_, DBUSMENU_MENUITEM_PROP_VISIBLE, TRUE);
- _g_object_unref0 (_tmp14_);
+ _tmp7_ = gee_abstract_list_get ((GeeAbstractList*) self->custom_items, (gint) PLAYER_CONTROLLER_WIDGET_ORDER_METADATA);
+ _tmp8_ = (PlayerItem*) _tmp7_;
+ _tmp9_ = gee_abstract_list_get ((GeeAbstractList*) self->custom_items, (gint) PLAYER_CONTROLLER_WIDGET_ORDER_METADATA);
+ _tmp10_ = (PlayerItem*) _tmp9_;
+ _tmp11_ = metadata_menuitem_attributes_format ();
+ _tmp12_ = _tmp11_;
+ _tmp13_ = player_item_populated (_tmp10_, _tmp12_);
+ dbusmenu_menuitem_property_set_bool ((DbusmenuMenuitem*) _tmp8_, DBUSMENU_MENUITEM_PROP_VISIBLE, _tmp13_);
+ _g_object_unref0 (_tmp12_);
+ _g_object_unref0 (_tmp10_);
+ _g_object_unref0 (_tmp8_);
+ _tmp14_ = g_app_info_get_id (self->priv->_app_info);
+ if (g_strcmp0 (_tmp14_, "banshee.desktop") == 0) {
+ gpointer _tmp15_ = NULL;
+ PlayerItem* _tmp16_;
+ TransportMenuitem* transport;
+ _tmp15_ = gee_abstract_list_get ((GeeAbstractList*) self->custom_items, (gint) PLAYER_CONTROLLER_WIDGET_ORDER_TRANSPORT);
+ _tmp16_ = (PlayerItem*) _tmp15_;
+ transport = IS_TRANSPORT_MENUITEM (_tmp16_) ? ((TransportMenuitem*) _tmp16_) : NULL;
+ transport_menuitem_handle_cached_action (transport);
+ _g_object_unref0 (transport);
+ } else {
+ gpointer _tmp17_ = NULL;
+ PlayerItem* _tmp18_;
+ _tmp17_ = gee_abstract_list_get ((GeeAbstractList*) self->custom_items, (gint) PLAYER_CONTROLLER_WIDGET_ORDER_TRANSPORT);
+ _tmp18_ = (PlayerItem*) _tmp17_;
+ dbusmenu_menuitem_property_set_bool ((DbusmenuMenuitem*) _tmp18_, DBUSMENU_MENUITEM_PROP_VISIBLE, TRUE);
+ _g_object_unref0 (_tmp18_);
+ }
dbusmenu_menuitem_property_set_bool (playlists_menuitem->root_item, DBUSMENU_MENUITEM_PROP_VISIBLE, *self->use_playlists);
_g_object_unref0 (playlists_menuitem);
}
diff --git a/src/player-controller.vala b/src/player-controller.vala
index 3ce121e..20479d9 100644
--- a/src/player-controller.vala
+++ b/src/player-controller.vala
@@ -133,7 +133,8 @@ public class PlayerController : GLib.Object
public void hibernate()
{
update_state(PlayerController.state.OFFLINE);
- this.custom_items[widget_order.TRANSPORT].reset(TransportMenuitem.attributes_format());
+ TransportMenuitem transport = this.custom_items[widget_order.TRANSPORT] as TransportMenuitem;
+ transport.change_play_state (Transport.State.PAUSED);
this.custom_items[widget_order.METADATA].reset(MetadataMenuitem.attributes_format());
TitleMenuitem title = this.custom_items[widget_order.TITLE] as TitleMenuitem;
title.toggle_active_triangle(false);
@@ -143,20 +144,25 @@ public class PlayerController : GLib.Object
public void update_layout()
{
PlaylistsMenuitem playlists_menuitem = this.custom_items[widget_order.PLAYLISTS] as PlaylistsMenuitem;
-
if(this.current_state != state.CONNECTED){
- this.custom_items[widget_order.TRANSPORT].property_set_bool(MENUITEM_PROP_VISIBLE,
+ this.custom_items[widget_order.METADATA].property_set_bool (MENUITEM_PROP_VISIBLE,
false);
- this.custom_items[widget_order.METADATA].property_set_bool(MENUITEM_PROP_VISIBLE,
- false);
- playlists_menuitem.root_item.property_set_bool ( MENUITEM_PROP_VISIBLE,
- false );
+ playlists_menuitem.root_item.property_set_bool (MENUITEM_PROP_VISIBLE,
+ false );
+ this.custom_items[widget_order.TRANSPORT].property_set_bool (MENUITEM_PROP_VISIBLE,
+ this.app_info.get_id() == "banshee.desktop");
return;
}
- this.custom_items[widget_order.METADATA].property_set_bool(MENUITEM_PROP_VISIBLE,
- this.custom_items[widget_order.METADATA].populated(MetadataMenuitem.attributes_format()));
- this.custom_items[widget_order.TRANSPORT].property_set_bool(MENUITEM_PROP_VISIBLE,
- true);
+ this.custom_items[widget_order.METADATA].property_set_bool (MENUITEM_PROP_VISIBLE,
+ this.custom_items[widget_order.METADATA].populated(MetadataMenuitem.attributes_format()));
+ if (this.app_info.get_id() == "banshee.desktop"){
+ TransportMenuitem transport = this.custom_items[widget_order.TRANSPORT] as TransportMenuitem;
+ transport.handle_cached_action();
+ }
+ else{
+ this.custom_items[widget_order.TRANSPORT].property_set_bool (MENUITEM_PROP_VISIBLE,
+ true);
+ }
playlists_menuitem.root_item.property_set_bool ( MENUITEM_PROP_VISIBLE,
this.use_playlists );
}
diff --git a/src/player-item.c b/src/player-item.c
index 6133279..f5d88d8 100644
--- a/src/player-item.c
+++ b/src/player-item.c
@@ -145,7 +145,6 @@ void player_item_reset (PlayerItem* self, GeeHashSet* attrs) {
}
_tmp2_ = gee_iterator_get (_s_it);
s = (gchar*) _tmp2_;
- g_debug ("player-item.vala:40: attempting to set prop %s to EMPTY", s);
dbusmenu_menuitem_property_set_int ((DbusmenuMenuitem*) self, s, PLAYER_ITEM_EMPTY);
_g_free0 (s);
}
@@ -199,7 +198,6 @@ void player_item_update (PlayerItem* self, GHashTable* data, GeeHashSet* attribu
g_return_if_fail (self != NULL);
g_return_if_fail (data != NULL);
g_return_if_fail (attributes != NULL);
- g_debug ("player-item.vala:53: PlayerItem::update()");
if (data == NULL) {
g_warning ("player-item.vala:55: PlayerItem::Update -> The hashtable was null - ju" \
"st leave it!");
diff --git a/src/player-item.vala b/src/player-item.vala
index 9d07bf7..f71b166 100644
--- a/src/player-item.vala
+++ b/src/player-item.vala
@@ -37,7 +37,7 @@ public class PlayerItem : Dbusmenu.Menuitem
public void reset(HashSet<string> attrs){
foreach(string s in attrs){
- debug("attempting to set prop %s to EMPTY", s);
+ //debug("attempting to set prop %s to EMPTY", s);
this.property_set_int(s, EMPTY);
}
}
@@ -50,7 +50,7 @@ public class PlayerItem : Dbusmenu.Menuitem
*/
public void update(HashTable<string, Variant?> data, HashSet<string> attributes)
{
- debug("PlayerItem::update()");
+ //debug("PlayerItem::update()");
if(data == null){
warning("PlayerItem::Update -> The hashtable was null - just leave it!");
return;
diff --git a/src/playlists-menu-item.c b/src/playlists-menu-item.c
index ced54cf..ed78fc8 100644
--- a/src/playlists-menu-item.c
+++ b/src/playlists-menu-item.c
@@ -34,7 +34,6 @@ with this program. If not, see <http://www.gnu.org/licenses/>.
#include <stdlib.h>
#include <string.h>
#include <glib/gi18n-lib.h>
-#include <gio/gio.h>
#define TYPE_PLAYER_ITEM (player_item_get_type ())
@@ -155,7 +154,7 @@ void playlists_menuitem_update (PlaylistsMenuitem* self, PlaylistDetails* playli
static Block1Data* block1_data_ref (Block1Data* _data1_);
static void block1_data_unref (Block1Data* _data1_);
static gboolean playlists_menuitem_already_observed (PlaylistsMenuitem* self, PlaylistDetails* new_detail);
-static gchar* playlists_menuitem_parse_icon_path (PlaylistsMenuitem* self, const gchar* path);
+static gboolean playlists_menuitem_is_video_related (PlaylistsMenuitem* self, PlaylistDetails* new_detail);
static void _lambda1_ (Block1Data* _data1_);
static void playlists_menuitem_submenu_item_activated (PlaylistsMenuitem* self, gint menu_item_id);
static void __lambda1__dbusmenu_menuitem_item_activated (DbusmenuMenuitem* _sender, guint timestamp, gpointer self);
@@ -167,9 +166,6 @@ void mpris2_controller_activate_playlist (Mpris2Controller* self, const char* pa
GeeHashSet* playlists_menuitem_attributes_format (void);
static GObject * playlists_menuitem_constructor (GType type, guint n_construct_properties, GObjectConstructParam * construct_properties);
static void playlists_menuitem_finalize (GObject* obj);
-static void _vala_array_destroy (gpointer array, gint array_length, GDestroyNotify destroy_func);
-static void _vala_array_free (gpointer array, gint array_length, GDestroyNotify destroy_func);
-static gint _vala_array_length (gpointer array);
PlaylistsMenuitem* playlists_menuitem_construct (GType object_type, PlayerController* parent) {
@@ -231,37 +227,38 @@ void playlists_menuitem_update (PlaylistsMenuitem* self, PlaylistDetails* playli
detail = _tmp0_;
{
Block1Data* _data1_;
- gboolean _tmp2_;
- DbusmenuMenuitem* _tmp3_ = NULL;
- gchar* _tmp4_ = NULL;
- gchar* _result_;
- gint _tmp5_;
+ gboolean _tmp2_ = FALSE;
+ gboolean _tmp3_;
+ DbusmenuMenuitem* _tmp5_ = NULL;
+ gint _tmp6_;
_data1_ = g_slice_new0 (Block1Data);
_data1_->_ref_count_ = 1;
_data1_->self = g_object_ref (self);
- _tmp2_ = playlists_menuitem_already_observed (self, &detail);
+ _tmp3_ = playlists_menuitem_already_observed (self, &detail);
+ if (_tmp3_) {
+ _tmp2_ = TRUE;
+ } else {
+ gboolean _tmp4_;
+ _tmp4_ = playlists_menuitem_is_video_related (self, &detail);
+ _tmp2_ = _tmp4_;
+ }
if (_tmp2_) {
playlist_details_destroy (&detail);
block1_data_unref (_data1_);
_data1_ = NULL;
continue;
}
- _tmp3_ = dbusmenu_menuitem_new ();
- _data1_->menuitem = _tmp3_;
+ _tmp5_ = dbusmenu_menuitem_new ();
+ _data1_->menuitem = _tmp5_;
dbusmenu_menuitem_property_set (_data1_->menuitem, DBUSMENU_MENUITEM_PROP_LABEL, detail.name);
- _tmp4_ = playlists_menuitem_parse_icon_path (self, detail.icon_path);
- _result_ = _tmp4_;
- if (_result_ != NULL) {
- dbusmenu_menuitem_property_set (_data1_->menuitem, DBUSMENU_MENUITEM_PROP_ICON_NAME, (const gchar*) _result_);
- }
+ dbusmenu_menuitem_property_set (_data1_->menuitem, DBUSMENU_MENUITEM_PROP_ICON_NAME, "playlist-symbolic");
dbusmenu_menuitem_property_set (_data1_->menuitem, DBUSMENU_PLAYLIST_MENUITEM_PATH, (const gchar*) detail.path);
dbusmenu_menuitem_property_set_bool (_data1_->menuitem, DBUSMENU_MENUITEM_PROP_VISIBLE, TRUE);
dbusmenu_menuitem_property_set_bool (_data1_->menuitem, DBUSMENU_MENUITEM_PROP_ENABLED, TRUE);
g_signal_connect_data (_data1_->menuitem, "item-activated", (GCallback) __lambda1__dbusmenu_menuitem_item_activated, block1_data_ref (_data1_), (GClosureNotify) block1_data_unref, 0);
- _tmp5_ = dbusmenu_menuitem_get_id (_data1_->menuitem);
- gee_abstract_map_set ((GeeAbstractMap*) self->priv->current_playlists, GINT_TO_POINTER (_tmp5_), _data1_->menuitem);
+ _tmp6_ = dbusmenu_menuitem_get_id (_data1_->menuitem);
+ gee_abstract_map_set ((GeeAbstractMap*) self->priv->current_playlists, GINT_TO_POINTER (_tmp6_), _data1_->menuitem);
dbusmenu_menuitem_child_append (self->root_item, _data1_->menuitem);
- _g_free0 (_result_);
playlist_details_destroy (&detail);
block1_data_unref (_data1_);
_data1_ = NULL;
@@ -269,28 +266,28 @@ void playlists_menuitem_update (PlaylistsMenuitem* self, PlaylistDetails* playli
}
}
{
- GeeCollection* _tmp6_ = NULL;
- GeeCollection* _tmp7_;
- GeeIterator* _tmp8_ = NULL;
- GeeIterator* _tmp9_;
+ GeeCollection* _tmp7_ = NULL;
+ GeeCollection* _tmp8_;
+ GeeIterator* _tmp9_ = NULL;
+ GeeIterator* _tmp10_;
GeeIterator* _item_it;
- _tmp6_ = gee_map_get_values ((GeeMap*) self->priv->current_playlists);
- _tmp7_ = _tmp6_;
- _tmp8_ = gee_iterable_iterator ((GeeIterable*) _tmp7_);
- _tmp9_ = _tmp8_;
- _g_object_unref0 (_tmp7_);
- _item_it = _tmp9_;
+ _tmp7_ = gee_map_get_values ((GeeMap*) self->priv->current_playlists);
+ _tmp8_ = _tmp7_;
+ _tmp9_ = gee_iterable_iterator ((GeeIterable*) _tmp8_);
+ _tmp10_ = _tmp9_;
+ _g_object_unref0 (_tmp8_);
+ _item_it = _tmp10_;
while (TRUE) {
- gboolean _tmp10_;
- gpointer _tmp11_ = NULL;
+ gboolean _tmp11_;
+ gpointer _tmp12_ = NULL;
DbusmenuMenuitem* item;
gboolean within;
- _tmp10_ = gee_iterator_next (_item_it);
- if (!_tmp10_) {
+ _tmp11_ = gee_iterator_next (_item_it);
+ if (!_tmp11_) {
break;
}
- _tmp11_ = gee_iterator_get (_item_it);
- item = (DbusmenuMenuitem*) _tmp11_;
+ _tmp12_ = gee_iterator_get (_item_it);
+ item = (DbusmenuMenuitem*) _tmp12_;
within = FALSE;
{
PlaylistDetails* detail_collection;
@@ -299,16 +296,16 @@ void playlists_menuitem_update (PlaylistsMenuitem* self, PlaylistDetails* playli
detail_collection = playlists;
detail_collection_length1 = playlists_length1;
for (detail_it = 0; detail_it < playlists_length1; detail_it = detail_it + 1) {
- PlaylistDetails _tmp12_;
- PlaylistDetails _tmp13_ = {0};
+ PlaylistDetails _tmp13_;
+ PlaylistDetails _tmp14_ = {0};
PlaylistDetails detail;
- playlist_details_copy (&detail_collection[detail_it], &_tmp13_);
- _tmp12_ = _tmp13_;
- detail = _tmp12_;
+ playlist_details_copy (&detail_collection[detail_it], &_tmp14_);
+ _tmp13_ = _tmp14_;
+ detail = _tmp13_;
{
- const gchar* _tmp14_ = NULL;
- _tmp14_ = dbusmenu_menuitem_property_get (item, DBUSMENU_PLAYLIST_MENUITEM_PATH);
- if (g_strcmp0 (detail.path, _tmp14_) == 0) {
+ const gchar* _tmp15_ = NULL;
+ _tmp15_ = dbusmenu_menuitem_property_get (item, DBUSMENU_PLAYLIST_MENUITEM_PATH);
+ if (g_strcmp0 (detail.path, _tmp15_) == 0) {
within = TRUE;
playlist_details_destroy (&detail);
break;
@@ -318,14 +315,14 @@ void playlists_menuitem_update (PlaylistsMenuitem* self, PlaylistDetails* playli
}
}
if (within == FALSE) {
- const gchar* _tmp15_ = NULL;
const gchar* _tmp16_ = NULL;
- _tmp15_ = dbusmenu_menuitem_property_get (self->root_item, DBUSMENU_PLAYLIST_MENUITEM_PATH);
- _tmp16_ = dbusmenu_menuitem_property_get (item, DBUSMENU_PLAYLIST_MENUITEM_PATH);
- if (g_strcmp0 (_tmp15_, _tmp16_) == 0) {
- const gchar* _tmp17_ = NULL;
- _tmp17_ = _ ("Choose Playlist");
- dbusmenu_menuitem_property_set (self->root_item, DBUSMENU_MENUITEM_PROP_LABEL, _tmp17_);
+ const gchar* _tmp17_ = NULL;
+ _tmp16_ = dbusmenu_menuitem_property_get (self->root_item, DBUSMENU_PLAYLIST_MENUITEM_PATH);
+ _tmp17_ = dbusmenu_menuitem_property_get (item, DBUSMENU_PLAYLIST_MENUITEM_PATH);
+ if (g_strcmp0 (_tmp16_, _tmp17_) == 0) {
+ const gchar* _tmp18_ = NULL;
+ _tmp18_ = _ ("Choose Playlist");
+ dbusmenu_menuitem_property_set (self->root_item, DBUSMENU_MENUITEM_PROP_LABEL, _tmp18_);
}
dbusmenu_menuitem_child_delete (self->root_item, item);
}
@@ -336,55 +333,8 @@ void playlists_menuitem_update (PlaylistsMenuitem* self, PlaylistDetails* playli
}
-static gchar* playlists_menuitem_parse_icon_path (PlaylistsMenuitem* self, const gchar* path) {
- gchar* result = NULL;
- GFile* _tmp0_ = NULL;
- GFile* icon_file;
- gchar* _tmp1_ = NULL;
- gchar* _tmp2_;
- gboolean _tmp3_;
- gchar* _tmp4_ = NULL;
- gchar* _tmp5_;
- gchar** _tmp6_;
- gchar** _tmp7_ = NULL;
- gchar** _tmp8_;
- gint _tmp8__length1;
- gchar* _tmp9_;
- gchar* _tmp10_;
- g_return_val_if_fail (self != NULL, NULL);
- g_return_val_if_fail (path != NULL, NULL);
- if (g_strcmp0 (path, "") == 0) {
- result = NULL;
- return result;
- }
- _tmp0_ = g_file_new_for_path (path);
- icon_file = _tmp0_;
- _tmp1_ = g_file_get_path (icon_file);
- _tmp2_ = _tmp1_;
- _tmp3_ = _tmp2_ == NULL;
- _g_free0 (_tmp2_);
- if (_tmp3_) {
- result = NULL;
- _g_object_unref0 (icon_file);
- return result;
- }
- _tmp4_ = g_file_get_basename (icon_file);
- _tmp5_ = _tmp4_;
- _tmp7_ = _tmp6_ = g_strsplit (_tmp5_, ".", 0);
- _tmp8_ = _tmp7_;
- _tmp8__length1 = _vala_array_length (_tmp6_);
- _tmp9_ = g_strdup (_tmp8_[0]);
- _tmp10_ = _tmp9_;
- _tmp8_ = (_vala_array_free (_tmp8_, _tmp8__length1, (GDestroyNotify) g_free), NULL);
- _g_free0 (_tmp5_);
- result = _tmp10_;
- _g_object_unref0 (icon_file);
- return result;
-}
-
-
void playlists_menuitem_update_individual_playlist (PlaylistsMenuitem* self, PlaylistDetails* new_detail) {
- const gchar* _tmp8_ = NULL;
+ const gchar* _tmp7_ = NULL;
g_return_if_fail (self != NULL);
{
GeeCollection* _tmp0_ = NULL;
@@ -411,22 +361,14 @@ void playlists_menuitem_update_individual_playlist (PlaylistsMenuitem* self, Pla
item = (DbusmenuMenuitem*) _tmp5_;
_tmp6_ = dbusmenu_menuitem_property_get (item, DBUSMENU_PLAYLIST_MENUITEM_PATH);
if (g_strcmp0 ((*new_detail).path, _tmp6_) == 0) {
- gchar* _tmp7_ = NULL;
- gchar* _result_;
dbusmenu_menuitem_property_set (item, DBUSMENU_MENUITEM_PROP_LABEL, (*new_detail).name);
- _tmp7_ = playlists_menuitem_parse_icon_path (self, (*new_detail).icon_path);
- _result_ = _tmp7_;
- if (_result_ != NULL) {
- dbusmenu_menuitem_property_set (item, DBUSMENU_MENUITEM_PROP_ICON_NAME, _result_);
- }
- _g_free0 (_result_);
}
_g_object_unref0 (item);
}
_g_object_unref0 (_item_it);
}
- _tmp8_ = dbusmenu_menuitem_property_get (self->root_item, DBUSMENU_PLAYLIST_MENUITEM_PATH);
- if (g_strcmp0 (_tmp8_, (*new_detail).path) == 0) {
+ _tmp7_ = dbusmenu_menuitem_property_get (self->root_item, DBUSMENU_PLAYLIST_MENUITEM_PATH);
+ if (g_strcmp0 (_tmp7_, (*new_detail).path) == 0) {
dbusmenu_menuitem_property_set (self->root_item, DBUSMENU_MENUITEM_PROP_LABEL, (*new_detail).name);
}
}
@@ -480,6 +422,37 @@ static gboolean playlists_menuitem_already_observed (PlaylistsMenuitem* self, Pl
}
+static gboolean string_contains (const gchar* self, const gchar* needle) {
+ gboolean result = FALSE;
+ gchar* _tmp0_ = NULL;
+ g_return_val_if_fail (self != NULL, FALSE);
+ g_return_val_if_fail (needle != NULL, FALSE);
+ _tmp0_ = strstr ((gchar*) self, (gchar*) needle);
+ result = _tmp0_ != NULL;
+ return result;
+}
+
+
+static gboolean playlists_menuitem_is_video_related (PlaylistsMenuitem* self, PlaylistDetails* new_detail) {
+ gboolean result = FALSE;
+ gchar* _tmp0_;
+ gchar* location;
+ gboolean _tmp1_;
+ g_return_val_if_fail (self != NULL, FALSE);
+ _tmp0_ = g_strdup ((const gchar*) (*new_detail).path);
+ location = _tmp0_;
+ _tmp1_ = string_contains (location, "/VideoLibrarySource/");
+ if (_tmp1_) {
+ result = TRUE;
+ _g_free0 (location);
+ return result;
+ }
+ result = FALSE;
+ _g_free0 (location);
+ return result;
+}
+
+
void playlists_menuitem_active_playlist_update (PlaylistsMenuitem* self, PlaylistDetails* detail) {
gchar* _tmp0_;
gchar* update;
@@ -509,7 +482,7 @@ static void playlists_menuitem_submenu_item_activated (PlaylistsMenuitem* self,
g_return_if_fail (self != NULL);
_tmp0_ = gee_abstract_map_has_key ((GeeAbstractMap*) self->priv->current_playlists, GINT_TO_POINTER (menu_item_id));
if (!_tmp0_) {
- g_warning ("playlists-menu-item.vala:133: item %i was activated but we don't have " \
+ g_warning ("playlists-menu-item.vala:126: item %i was activated but we don't have " \
"a corresponding playlist", menu_item_id);
return;
}
@@ -592,34 +565,4 @@ GType playlists_menuitem_get_type (void) {
}
-static void _vala_array_destroy (gpointer array, gint array_length, GDestroyNotify destroy_func) {
- if ((array != NULL) && (destroy_func != NULL)) {
- int i;
- for (i = 0; i < array_length; i = i + 1) {
- if (((gpointer*) array)[i] != NULL) {
- destroy_func (((gpointer*) array)[i]);
- }
- }
- }
-}
-
-
-static void _vala_array_free (gpointer array, gint array_length, GDestroyNotify destroy_func) {
- _vala_array_destroy (array, array_length, destroy_func);
- g_free (array);
-}
-
-
-static gint _vala_array_length (gpointer array) {
- int length;
- length = 0;
- if (array) {
- while (((gpointer*) array)[length]) {
- length++;
- }
- }
- return length;
-}
-
-
diff --git a/src/playlists-menu-item.vala b/src/playlists-menu-item.vala
index 79ab506..58c3875 100644
--- a/src/playlists-menu-item.vala
+++ b/src/playlists-menu-item.vala
@@ -46,15 +46,13 @@ public class PlaylistsMenuitem : PlayerItem
public new void update (PlaylistDetails[] playlists)
{
foreach ( PlaylistDetails detail in playlists ){
-
- if (this.already_observed(detail)) continue;
+ // We don't want to list playlists which are for videos)'
+ if (this.already_observed(detail) || this.is_video_related(detail))
+ continue;
Dbusmenu.Menuitem menuitem = new Menuitem();
menuitem.property_set (MENUITEM_PROP_LABEL, detail.name);
- var result = this.parse_icon_path (detail.icon_path);
- if (result != null) {
- menuitem.property_set (MENUITEM_PROP_ICON_NAME, (string)result);
- }
+ menuitem.property_set (MENUITEM_PROP_ICON_NAME, "playlist-symbolic");
menuitem.property_set (MENUITEM_PATH, (string)detail.path);
menuitem.property_set_bool (MENUITEM_PROP_VISIBLE, true);
@@ -80,28 +78,16 @@ public class PlaylistsMenuitem : PlayerItem
if (this.root_item.property_get (MENUITEM_PATH) == item.property_get (MENUITEM_PATH)){
this.root_item.property_set (MENUITEM_PROP_LABEL, _("Choose Playlist"));
}
- this.root_item.child_delete (item);
+ this.root_item.child_delete (item);
}
}
}
- private string? parse_icon_path (string path)
- {
- if (path == "")return null;
- var icon_file = File.new_for_path (path);
- if (icon_file.get_path() == null)return null;
- return icon_file.get_basename().split(".")[0];
- }
-
public void update_individual_playlist (PlaylistDetails new_detail)
{
foreach ( Dbusmenu.Menuitem item in this.current_playlists.values ){
if (new_detail.path == item.property_get (MENUITEM_PATH)){
item.property_set (MENUITEM_PROP_LABEL, new_detail.name);
- var result = this.parse_icon_path (new_detail.icon_path);
- if (result != null) {
- item.property_set (MENUITEM_PROP_ICON_NAME, result);
- }
}
}
// If its active make sure the name is updated on the root item.
@@ -119,6 +105,13 @@ public class PlaylistsMenuitem : PlayerItem
return false;
}
+ private bool is_video_related (PlaylistDetails new_detail)
+ {
+ var location = (string)new_detail.path;
+ if (location.contains ("/VideoLibrarySource/")) return true;
+ return false;
+ }
+
public void active_playlist_update (PlaylistDetails detail)
{
var update = detail.name;
diff --git a/src/slider-menu-item.c b/src/slider-menu-item.c
index 974749f..8186fa3 100644
--- a/src/slider-menu-item.c
+++ b/src/slider-menu-item.c
@@ -69,7 +69,6 @@ slider_menu_item_class_init (SliderMenuItemClass *klass)
static void
slider_menu_item_init (SliderMenuItem *self)
{
- g_debug("Building new Slider Menu Item");
dbusmenu_menuitem_property_set( DBUSMENU_MENUITEM(self),
DBUSMENU_MENUITEM_PROP_TYPE,
DBUSMENU_VOLUME_MENUITEM_TYPE );
@@ -101,21 +100,20 @@ handle_event (DbusmenuMenuitem * mi,
GVariant * value,
guint timestamp)
{
- GVariant* input = NULL;
- input = value;
- if (g_variant_is_of_type(value, G_VARIANT_TYPE_VARIANT) == TRUE) {
- input = g_variant_get_variant(value);
- }
+ g_return_if_fail (g_variant_is_of_type (value, G_VARIANT_TYPE_DOUBLE));
+ g_return_if_fail (IS_SLIDER_MENU_ITEM (mi));
- 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);
- slider_menu_item_update_volume (SLIDER_MENU_ITEM (mi), volume_input);
- device_ensure_sink_is_unmuted (priv->a_sink);
- }
- }
+ SliderMenuItemPrivate* priv = SLIDER_MENU_ITEM_GET_PRIVATE (SLIDER_MENU_ITEM (mi));
+ gdouble volume_input = g_variant_get_double (value);
+
+/*
+ g_debug ("slider menu item handle event with value %f on name %s",
+ volume_input,
+ name);
+*/
+
+ slider_menu_item_update_volume (SLIDER_MENU_ITEM (mi), volume_input);
+ device_ensure_sink_is_unmuted (priv->a_sink);
}
@@ -136,7 +134,7 @@ slider_menu_item_populate (SliderMenuItem* self, const pa_sink_info* update)
dbusmenu_menuitem_property_set_variant (DBUSMENU_MENUITEM(self),
DBUSMENU_VOLUME_MENUITEM_LEVEL,
new_volume);
- GVariant* new_mute_update = g_variant_new_int32 (update->mute);
+ GVariant* new_mute_update = g_variant_new_boolean (update->mute == 1);
dbusmenu_menuitem_property_set_variant (DBUSMENU_MENUITEM(self),
DBUSMENU_VOLUME_MENUITEM_MUTE,
new_mute_update);
@@ -148,6 +146,11 @@ slider_menu_item_populate (SliderMenuItem* self, const pa_sink_info* update)
static void
slider_menu_item_update_volume (SliderMenuItem* self, gdouble percent)
{
+
+/*
+ g_debug ("slider menu item update volume - about to set the volume to %f", percent);
+*/
+
pa_cvolume new_volume;
pa_cvolume_init(&new_volume);
new_volume.channels = 1;
@@ -174,13 +177,21 @@ slider_menu_item_update (SliderMenuItem* self, const pa_sink_info* update)
gdouble volume_percent = ((gdouble) vol * 100) / PA_VOLUME_NORM;
GVariant* new_volume = g_variant_new_double (volume_percent);
+
+/*
+ g_debug ("slider menu item update - volume update to ui to %f", volume_percent);
+*/
+
dbusmenu_menuitem_property_set_variant (DBUSMENU_MENUITEM(self),
DBUSMENU_VOLUME_MENUITEM_LEVEL,
new_volume);
+
if (priv->mute != update->mute){
priv->mute = update->mute;
- g_debug ("volume menu item - update - mute = %i", update->mute);
- GVariant* new_mute_update = g_variant_new_int32 (update->mute);
+/*
+ g_debug ("volume menu item - update - mute on ui = %i", update->mute);
+*/
+ GVariant* new_mute_update = g_variant_new_boolean (update->mute == 1);
dbusmenu_menuitem_property_set_variant (DBUSMENU_MENUITEM(self),
DBUSMENU_VOLUME_MENUITEM_MUTE,
new_mute_update);
@@ -233,4 +244,4 @@ slider_menu_item_new (Device* sink)
SliderMenuItemPrivate* priv = SLIDER_MENU_ITEM_GET_PRIVATE (self);
priv->a_sink = sink;
return self;
-} \ No newline at end of file
+}
diff --git a/src/sound-service-dbus.c b/src/sound-service-dbus.c
index 7c817af..1b9d29e 100644
--- a/src/sound-service-dbus.c
+++ b/src/sound-service-dbus.c
@@ -148,11 +148,8 @@ sound_service_dbus_create_root_item (SoundServiceDbus* self)
{
SoundServiceDbusPrivate * priv = SOUND_SERVICE_DBUS_GET_PRIVATE(self);
priv->root_menuitem = dbusmenu_menuitem_new();
- g_debug("Root ID: %d", dbusmenu_menuitem_get_id(priv->root_menuitem));
+ //g_debug("Root ID: %d", dbusmenu_menuitem_get_id(priv->root_menuitem));
DbusmenuServer *server = dbusmenu_server_new (INDICATOR_SOUND_MENU_DBUS_OBJECT_PATH);
- const gchar* paths[] = {"/usr/share/banshee-1/icons", NULL};
- dbusmenu_server_set_icon_paths (server,
- paths);
dbusmenu_server_set_root (server, priv->root_menuitem);
g_object_unref (priv->root_menuitem);
priv->device = device_new (self);
diff --git a/src/sound-service.c b/src/sound-service.c
index 7e6426c..1324537 100644
--- a/src/sound-service.c
+++ b/src/sound-service.c
@@ -22,6 +22,8 @@ with this program. If not, see <http://www.gnu.org/licenses/>.
#include "sound-service-dbus.h"
#include "music-player-bridge.h"
+#include <locale.h>
+
static GMainLoop *mainloop = NULL;
/**********************************************************************************************************************/
diff --git a/src/transport-menu-item.c b/src/transport-menu-item.c
index df1cc14..7f24dc6 100644
--- a/src/transport-menu-item.c
+++ b/src/transport-menu-item.c
@@ -30,9 +30,9 @@ with this program. If not, see <http://www.gnu.org/licenses/>.
#include <libdbusmenu-glib/server.h>
#include <libdbusmenu-glib/types.h>
#include <common-defs.h>
+#include <gee.h>
#include <stdlib.h>
#include <string.h>
-#include <gee.h>
#define TYPE_PLAYER_ITEM (player_item_get_type ())
@@ -66,7 +66,6 @@ typedef struct _TransportMenuitemPrivate TransportMenuitemPrivate;
typedef struct _PlayerController PlayerController;
typedef struct _PlayerControllerClass PlayerControllerClass;
-#define _g_variant_unref0(var) ((var == NULL) ? NULL : (var = (g_variant_unref (var), NULL)))
typedef struct _PlayerControllerPrivate PlayerControllerPrivate;
#define TYPE_MPRIS2_CONTROLLER (mpris2_controller_get_type ())
@@ -78,8 +77,11 @@ typedef struct _PlayerControllerPrivate PlayerControllerPrivate;
typedef struct _Mpris2Controller Mpris2Controller;
typedef struct _Mpris2ControllerClass Mpris2ControllerClass;
+#define _g_variant_unref0(var) ((var == NULL) ? NULL : (var = (g_variant_unref (var), NULL)))
#define _g_object_unref0(var) ((var == NULL) ? NULL : (var = (g_object_unref (var), NULL)))
+#define PLAYER_CONTROLLER_TYPE_STATE (player_controller_state_get_type ())
+
struct _PlayerItem {
DbusmenuMenuitem parent_instance;
PlayerItemPrivate * priv;
@@ -98,6 +100,10 @@ struct _TransportMenuitemClass {
PlayerItemClass parent_class;
};
+struct _TransportMenuitemPrivate {
+ TransportAction cached_action;
+};
+
struct _PlayerController {
GObject parent_instance;
PlayerControllerPrivate * priv;
@@ -111,30 +117,47 @@ struct _PlayerControllerClass {
GObjectClass parent_class;
};
+typedef enum {
+ PLAYER_CONTROLLER_STATE_OFFLINE,
+ PLAYER_CONTROLLER_STATE_INSTANTIATING,
+ PLAYER_CONTROLLER_STATE_READY,
+ PLAYER_CONTROLLER_STATE_CONNECTED,
+ PLAYER_CONTROLLER_STATE_DISCONNECTED
+} PlayerControllerstate;
+
static gpointer transport_menuitem_parent_class = NULL;
GType player_item_get_type (void) G_GNUC_CONST;
GType transport_menuitem_get_type (void) G_GNUC_CONST;
+#define TRANSPORT_MENUITEM_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE ((o), TYPE_TRANSPORT_MENUITEM, TransportMenuitemPrivate))
enum {
TRANSPORT_MENUITEM_DUMMY_PROPERTY
};
GType player_controller_get_type (void) G_GNUC_CONST;
TransportMenuitem* transport_menuitem_new (PlayerController* parent);
TransportMenuitem* transport_menuitem_construct (GType object_type, PlayerController* parent);
-void transport_menuitem_change_play_state (TransportMenuitem* self, TransportState update);
-static void transport_menuitem_real_handle_event (DbusmenuMenuitem* base, const gchar* name, GVariant* input_value, guint timestamp);
+void transport_menuitem_handle_cached_action (TransportMenuitem* self);
+static gboolean transport_menuitem_send_cached_action (TransportMenuitem* self);
+static gboolean _transport_menuitem_send_cached_action_gsource_func (gpointer self);
PlayerController* player_item_get_owner (PlayerItem* self);
GType mpris2_controller_get_type (void) G_GNUC_CONST;
void mpris2_controller_transport_update (Mpris2Controller* self, TransportAction command);
+void transport_menuitem_change_play_state (TransportMenuitem* self, TransportState update);
+static void transport_menuitem_real_handle_event (DbusmenuMenuitem* base, const gchar* name, GVariant* input_value, guint timestamp);
+static gboolean transport_menuitem_get_running (TransportMenuitem* self);
+void player_controller_instantiate (PlayerController* self);
GeeHashSet* transport_menuitem_attributes_format (void);
+GType player_controller_state_get_type (void) G_GNUC_CONST;
+static GObject * transport_menuitem_constructor (GType type, guint n_construct_properties, GObjectConstructParam * construct_properties);
+static void transport_menuitem_finalize (GObject* obj);
+static void _vala_transport_menuitem_get_property (GObject * object, guint property_id, GValue * value, GParamSpec * pspec);
TransportMenuitem* transport_menuitem_construct (GType object_type, PlayerController* parent) {
TransportMenuitem * self = NULL;
g_return_val_if_fail (parent != NULL, NULL);
self = (TransportMenuitem*) g_object_new (object_type, "item-type", DBUSMENU_TRANSPORT_MENUITEM_TYPE, "owner", parent, NULL);
- dbusmenu_menuitem_property_set_int ((DbusmenuMenuitem*) self, DBUSMENU_TRANSPORT_MENUITEM_PLAY_STATE, 1);
return self;
}
@@ -144,6 +167,37 @@ TransportMenuitem* transport_menuitem_new (PlayerController* parent) {
}
+/**
+ Please remove this timeout when the default player can handle mpris commands
+ immediately once it raises its dbus interface
+ **/
+static gboolean _transport_menuitem_send_cached_action_gsource_func (gpointer self) {
+ gboolean result;
+ result = transport_menuitem_send_cached_action (self);
+ return result;
+}
+
+
+void transport_menuitem_handle_cached_action (TransportMenuitem* self) {
+ g_return_if_fail (self != NULL);
+ if (self->priv->cached_action != TRANSPORT_ACTION_NO_ACTION) {
+ g_timeout_add_seconds_full (G_PRIORITY_DEFAULT, (guint) 1, _transport_menuitem_send_cached_action_gsource_func, g_object_ref (self), g_object_unref);
+ }
+}
+
+
+static gboolean transport_menuitem_send_cached_action (TransportMenuitem* self) {
+ gboolean result = FALSE;
+ PlayerController* _tmp0_ = NULL;
+ g_return_val_if_fail (self != NULL, FALSE);
+ _tmp0_ = player_item_get_owner ((PlayerItem*) self);
+ mpris2_controller_transport_update (_tmp0_->mpris_bridge, self->priv->cached_action);
+ self->priv->cached_action = TRANSPORT_ACTION_NO_ACTION;
+ result = FALSE;
+ return result;
+}
+
+
void transport_menuitem_change_play_state (TransportMenuitem* self, TransportState update) {
gint temp;
g_return_if_fail (self != NULL);
@@ -164,7 +218,7 @@ static void transport_menuitem_real_handle_event (DbusmenuMenuitem* base, const
gboolean _tmp1_;
gint32 _tmp3_;
gint32 input;
- PlayerController* _tmp4_ = NULL;
+ gboolean _tmp4_;
self = (TransportMenuitem*) base;
g_return_if_fail (name != NULL);
g_return_if_fail (input_value != NULL);
@@ -179,8 +233,18 @@ static void transport_menuitem_real_handle_event (DbusmenuMenuitem* base, const
}
_tmp3_ = g_variant_get_int32 (v);
input = _tmp3_;
- _tmp4_ = player_item_get_owner ((PlayerItem*) self);
- mpris2_controller_transport_update (_tmp4_->mpris_bridge, (TransportAction) input);
+ _tmp4_ = transport_menuitem_get_running (self);
+ if (_tmp4_ == TRUE) {
+ PlayerController* _tmp5_ = NULL;
+ _tmp5_ = player_item_get_owner ((PlayerItem*) self);
+ mpris2_controller_transport_update (_tmp5_->mpris_bridge, (TransportAction) input);
+ } else {
+ PlayerController* _tmp6_ = NULL;
+ self->priv->cached_action = (TransportAction) input;
+ _tmp6_ = player_item_get_owner ((PlayerItem*) self);
+ player_controller_instantiate (_tmp6_);
+ dbusmenu_menuitem_property_set_int ((DbusmenuMenuitem*) self, DBUSMENU_TRANSPORT_MENUITEM_PLAY_STATE, (gint) TRANSPORT_STATE_LAUNCHING);
+ }
_g_variant_unref0 (v);
}
@@ -197,13 +261,48 @@ GeeHashSet* transport_menuitem_attributes_format (void) {
}
+static gboolean transport_menuitem_get_running (TransportMenuitem* self) {
+ gboolean result;
+ PlayerController* _tmp0_ = NULL;
+ g_return_val_if_fail (self != NULL, FALSE);
+ _tmp0_ = player_item_get_owner ((PlayerItem*) self);
+ result = _tmp0_->current_state == PLAYER_CONTROLLER_STATE_CONNECTED;
+ return result;
+}
+
+
+static GObject * transport_menuitem_constructor (GType type, guint n_construct_properties, GObjectConstructParam * construct_properties) {
+ GObject * obj;
+ GObjectClass * parent_class;
+ TransportMenuitem * self;
+ parent_class = G_OBJECT_CLASS (transport_menuitem_parent_class);
+ obj = parent_class->constructor (type, n_construct_properties, construct_properties);
+ self = TRANSPORT_MENUITEM (obj);
+ dbusmenu_menuitem_property_set_int ((DbusmenuMenuitem*) self, DBUSMENU_TRANSPORT_MENUITEM_PLAY_STATE, (gint) TRANSPORT_STATE_PAUSED);
+ self->priv->cached_action = TRANSPORT_ACTION_NO_ACTION;
+ return obj;
+}
+
+
static void transport_menuitem_class_init (TransportMenuitemClass * klass) {
transport_menuitem_parent_class = g_type_class_peek_parent (klass);
+ g_type_class_add_private (klass, sizeof (TransportMenuitemPrivate));
DBUSMENU_MENUITEM_CLASS (klass)->handle_event = transport_menuitem_real_handle_event;
+ G_OBJECT_CLASS (klass)->get_property = _vala_transport_menuitem_get_property;
+ G_OBJECT_CLASS (klass)->constructor = transport_menuitem_constructor;
+ G_OBJECT_CLASS (klass)->finalize = transport_menuitem_finalize;
}
static void transport_menuitem_instance_init (TransportMenuitem * self) {
+ self->priv = TRANSPORT_MENUITEM_GET_PRIVATE (self);
+}
+
+
+static void transport_menuitem_finalize (GObject* obj) {
+ TransportMenuitem * self;
+ self = TRANSPORT_MENUITEM (obj);
+ G_OBJECT_CLASS (transport_menuitem_parent_class)->finalize (obj);
}
@@ -219,4 +318,15 @@ GType transport_menuitem_get_type (void) {
}
+static void _vala_transport_menuitem_get_property (GObject * object, guint property_id, GValue * value, GParamSpec * pspec) {
+ TransportMenuitem * self;
+ self = TRANSPORT_MENUITEM (object);
+ switch (property_id) {
+ default:
+ G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec);
+ break;
+ }
+}
+
+
diff --git a/src/transport-menu-item.vala b/src/transport-menu-item.vala
index 67e9562..ec41dd7 100644
--- a/src/transport-menu-item.vala
+++ b/src/transport-menu-item.vala
@@ -23,18 +23,44 @@ using DbusmenuTransport;
using Transport;
public class TransportMenuitem : PlayerItem
-{
-
+{
+ private Transport.Action cached_action;
+
+ private bool running {
+ get{
+ return this.owner.current_state == PlayerController.state.CONNECTED;
+ }
+ }
+
public TransportMenuitem(PlayerController parent)
{
Object(item_type: MENUITEM_TYPE, owner: parent);
- this.property_set_int(MENUITEM_PLAY_STATE, 1);
+ }
+ construct{
+ this.property_set_int(MENUITEM_PLAY_STATE, (int)Transport.State.PAUSED);
+ this.cached_action = Transport.Action.NO_ACTION;
+ }
+
+ /**
+ Please remove this timeout when the default player can handle mpris commands
+ immediately once it raises its dbus interface
+ **/
+ public void handle_cached_action()
+ {
+ if (this.cached_action != Transport.Action.NO_ACTION){
+ Timeout.add_seconds (1, send_cached_action);
+ }
+ }
+
+ private bool send_cached_action()
+ {
+ this.owner.mpris_bridge.transport_update(this.cached_action);
+ this.cached_action = Transport.Action.NO_ACTION;
+ return false;
}
- public void change_play_state(Transport.State update)
+ public void change_play_state (Transport.State update)
{
- //debug("UPDATING THE TRANSPORT DBUSMENUITEM PLAY STATE WITH VALUE %i",
- // (int)update);
int temp = (int)update;
this.property_set_int(MENUITEM_PLAY_STATE, temp);
}
@@ -43,17 +69,21 @@ public class TransportMenuitem : PlayerItem
Variant input_value,
uint timestamp)
{
- /*debug ( "Handle event in transport menu item - input variant is of type %s",
- input_value.get_type_string() );*/
Variant v = input_value;
- if ( input_value.is_of_type ( VariantType.VARIANT) ){
+ if ( input_value.is_of_type (VariantType.VARIANT)){
v = input_value.get_variant();
}
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((Transport.Action)input);
+
+ if (this.running == true){
+ this.owner.mpris_bridge.transport_update((Transport.Action)input);
+ }
+ else{
+ this.cached_action = (Transport.Action)input;
+ this.owner.instantiate();
+ this.property_set_int (MENUITEM_PLAY_STATE, (int)Transport.State.LAUNCHING);
+ }
}
public static HashSet<string> attributes_format()
@@ -63,4 +93,4 @@ public class TransportMenuitem : PlayerItem
return attrs;
}
-} \ No newline at end of file
+}
diff --git a/src/transport-widget.c b/src/transport-widget.c
index ef2916d..f05c4c1 100644
--- a/src/transport-widget.c
+++ b/src/transport-widget.c
@@ -85,6 +85,9 @@ struct _TransportWidgetPrivate
gboolean has_focus;
gint hold_timer;
gint skip_frequency;
+ gint launching_timer;
+ gdouble launching_transparency;
+ gboolean fade_out;
};
// TODO refactor the UI handlers, consolidate functionality between key press /release
@@ -136,6 +139,7 @@ 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);
+static gboolean transport_widget_fade_playbutton (gpointer userdata);
/// Init functions //////////////////////////////////////////////////////////
@@ -168,6 +172,9 @@ transport_widget_init (TransportWidget *self)
priv->has_focus = FALSE;
priv->hold_timer = 0;
priv->skip_frequency = 0;
+ priv->launching_timer = 0;
+ priv->launching_transparency = 1.0f;
+ priv->fade_out = TRUE;
priv->command_coordinates = g_hash_table_new_full(g_direct_hash,
g_direct_equal,
NULL,
@@ -1733,6 +1740,61 @@ draw (GtkWidget* button, cairo_t *cr)
FALSE);
_finalize (cr, &cr_surf, &surf, PAUSE_X-0.5f, PAUSE_Y);
}
+ else if(priv->current_state == TRANSPORT_STATE_LAUNCHING)
+ {
+/*
+ g_debug ("launching in draw");
+*/
+ _setup (&cr_surf, &surf, PLAY_WIDTH+6, PLAY_HEIGHT+6);
+ _mask_play (cr_surf,
+ PLAY_PADDING,
+ PLAY_PADDING,
+ PLAY_WIDTH - (2*PLAY_PADDING),
+ PLAY_HEIGHT - (2*PLAY_PADDING));
+
+ double BUTTON_SHADOW_LAUNCHING[] = {color_button[3].r,
+ color_button[3].g,
+ color_button[3].b,
+ priv->launching_transparency};
+ double BUTTON_LAUNCHING_END[] = {color_button[0].r,
+ color_button[0].g,
+ color_button[0].b,
+ priv->launching_transparency};
+ double BUTTON_LAUNCHING_START[] = {color_button[1].r,
+ color_button[1].g,
+ color_button[1].b,
+ priv->launching_transparency};
+ _fill (cr_surf,
+ PLAY_PADDING,
+ PLAY_PADDING,
+ PLAY_WIDTH - (2*PLAY_PADDING),
+ PLAY_HEIGHT - (2*PLAY_PADDING),
+ BUTTON_SHADOW_LAUNCHING,
+ BUTTON_SHADOW_LAUNCHING,
+ FALSE);
+ _surface_blur (surf, 3);
+ _finalize_repaint (cr, &cr_surf, &surf, PAUSE_X-0.5f, PAUSE_Y + 0.5f, 3);
+
+ // draw play-button
+ _setup (&cr_surf, &surf, PLAY_WIDTH, PLAY_HEIGHT);
+ cairo_set_line_width (cr, 10.5);
+ cairo_set_line_cap(cr, CAIRO_LINE_CAP_ROUND);
+ cairo_set_line_join(cr, CAIRO_LINE_JOIN_ROUND);
+ _mask_play (cr_surf,
+ PLAY_PADDING,
+ PLAY_PADDING,
+ PLAY_WIDTH - (2*PLAY_PADDING),
+ PLAY_HEIGHT - (2*PLAY_PADDING));
+ _fill (cr_surf,
+ PLAY_PADDING,
+ PLAY_PADDING,
+ PLAY_WIDTH - (2*PLAY_PADDING),
+ PLAY_HEIGHT - (2*PLAY_PADDING),
+ BUTTON_LAUNCHING_START,
+ BUTTON_LAUNCHING_END,
+ FALSE);
+ _finalize (cr, &cr_surf, &surf, PAUSE_X-0.5f, PAUSE_Y);
+ }
}
static void
@@ -1750,6 +1812,30 @@ transport_widget_set_twin_item(TransportWidget* self,
(TransportState)initial_state);
}
+static gboolean
+transport_widget_fade_playbutton (gpointer userdata)
+{
+ TransportWidget* bar = (TransportWidget*)userdata;
+ g_return_val_if_fail(IS_TRANSPORT_WIDGET(bar), FALSE);
+/*
+ g_debug ("fade in /out timeout");
+*/
+ TransportWidgetPrivate* priv = TRANSPORT_WIDGET_GET_PRIVATE(bar);
+ if (priv->launching_transparency == 1.0f){
+ priv->fade_out = TRUE;
+ }
+ else if (priv->launching_transparency <= 0.3F){
+ priv->fade_out = FALSE;
+ }
+ if (priv->fade_out == TRUE){
+ priv->launching_transparency -= 0.05f;
+ }
+ else{
+ priv->launching_transparency += 0.05f;
+ }
+ gtk_widget_queue_draw (GTK_WIDGET(bar));
+ return TRUE;
+}
/**
* transport_widget_update_state()
* Callback for updates from the other side of dbus
@@ -1761,12 +1847,28 @@ transport_widget_property_update(DbusmenuMenuitem* item, gchar* property,
//g_debug("transport_widget_update_state - with property %s", property);
TransportWidget* bar = (TransportWidget*)userdata;
g_return_if_fail(IS_TRANSPORT_WIDGET(bar));
+ TransportWidgetPrivate* priv = TRANSPORT_WIDGET_GET_PRIVATE(bar);
if(g_ascii_strcasecmp(DBUSMENU_TRANSPORT_MENUITEM_PLAY_STATE, property) == 0)
{
- 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, (TransportState)update_value);
+ TransportState new_state = (TransportState)g_variant_get_int32(value);
+ //g_debug("transport_widget_update_state - with value %i", update_value);
+ if (new_state == TRANSPORT_STATE_LAUNCHING){
+ priv->current_state = TRANSPORT_STATE_LAUNCHING;
+ priv->launching_timer = g_timeout_add (100,
+ transport_widget_fade_playbutton,
+ bar);
+ //g_debug("TransportWidget::toggle play state : %i", priv->current_state);
+ }
+ else{
+ if (priv->launching_timer != 0){
+ g_source_remove (priv->launching_timer);
+ priv->launching_timer = 0;
+ priv->fade_out = TRUE;
+ priv->launching_transparency = 1.0f;
+ }
+ transport_widget_toggle_play_pause(bar, new_state);
+ }
}
}
diff --git a/src/voip-input-menu-item.c b/src/voip-input-menu-item.c
index a92f91c..e645e69 100644
--- a/src/voip-input-menu-item.c
+++ b/src/voip-input-menu-item.c
@@ -73,7 +73,6 @@ voip_input_menu_item_class_init (VoipInputMenuItemClass *klass)
static void
voip_input_menu_item_init (VoipInputMenuItem *self)
{
- g_debug("Building new Slider Menu Item");
dbusmenu_menuitem_property_set( DBUSMENU_MENUITEM(self),
DBUSMENU_MENUITEM_PROP_TYPE,
DBUSMENU_VOIP_INPUT_MENUITEM_TYPE );
@@ -117,7 +116,9 @@ handle_event (DbusmenuMenuitem * mi,
if (value != NULL){
if (IS_VOIP_INPUT_MENU_ITEM (mi)) {
VoipInputMenuItemPrivate* priv = VOIP_INPUT_MENU_ITEM_GET_PRIVATE (VOIP_INPUT_MENU_ITEM (mi));
+/*
g_debug ("Handle event in the voip input level backend instance - %f", percent);
+*/
pa_cvolume new_volume;
pa_cvolume_init(&new_volume);
new_volume.channels = 1;
@@ -167,7 +168,9 @@ voip_input_menu_item_update (VoipInputMenuItem* item,
// Only send over the mute updates if the state has changed.
// in this order - volume first mute last!!
if (priv->mute != source->mute){
+/*
g_debug ("voip menu item - update - mute = %i", priv->mute);
+*/
GVariant* new_mute_update = g_variant_new_int32 (source->mute);
dbusmenu_menuitem_property_set_variant (DBUSMENU_MENUITEM(item),
DBUSMENU_VOIP_INPUT_MENUITEM_MUTE,
diff --git a/src/voip-input-widget.c b/src/voip-input-widget.c
index 6878361..5f67fab 100644
--- a/src/voip-input-widget.c
+++ b/src/voip-input-widget.c
@@ -97,7 +97,7 @@ 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-zero-panel");
+ GIcon * primary_gicon = g_themed_icon_new_with_default_fallbacks("audio-input-microphone-low-zero-panel");
gtk_image_set_from_gicon(GTK_IMAGE(primary_image), primary_gicon, GTK_ICON_SIZE_MENU);
g_object_unref(primary_gicon);
@@ -129,9 +129,9 @@ voip_input_widget_property_update (DbusmenuMenuitem* item, gchar* property,
g_return_if_fail (IS_VOIP_INPUT_WIDGET (userdata));
VoipInputWidget* mitem = VOIP_INPUT_WIDGET(userdata);
VoipInputWidgetPrivate * priv = VOIP_INPUT_WIDGET_GET_PRIVATE(mitem);
- //g_debug("scrub-widget::property_update for prop %s", property);
if(g_ascii_strcasecmp(DBUSMENU_VOIP_INPUT_MENUITEM_LEVEL, property) == 0){
- if(priv->grabbed == FALSE){
+ g_return_if_fail (g_variant_is_of_type (value, G_VARIANT_TYPE_DOUBLE));
+ if (priv->grabbed == FALSE){
GtkWidget *slider = ido_scale_menu_item_get_scale((IdoScaleMenuItem*)priv->ido_voip_input_slider);
GtkRange *range = (GtkRange*)slider;
gdouble update = g_variant_get_double (value);
@@ -141,6 +141,7 @@ voip_input_widget_property_update (DbusmenuMenuitem* item, gchar* property,
}
if(g_ascii_strcasecmp(DBUSMENU_VOIP_INPUT_MENUITEM_MUTE, property) == 0){
if(priv->grabbed == FALSE){
+ g_return_if_fail (g_variant_is_of_type (value, G_VARIANT_TYPE_INT32));
GtkWidget *slider = ido_scale_menu_item_get_scale((IdoScaleMenuItem*)priv->ido_voip_input_slider);
GtkRange *range = (GtkRange*)slider;
gint update = g_variant_get_int32 (value);
@@ -149,8 +150,10 @@ voip_input_widget_property_update (DbusmenuMenuitem* item, gchar* property,
level = 0;
}
else{
- level = g_variant_get_double (dbusmenu_menuitem_property_get_variant (priv->twin_item,
- DBUSMENU_VOIP_INPUT_MENUITEM_LEVEL));
+ GVariant* variant = dbusmenu_menuitem_property_get_variant (priv->twin_item,
+ DBUSMENU_VOIP_INPUT_MENUITEM_LEVEL);
+ g_return_if_fail (g_variant_is_of_type (variant, G_VARIANT_TYPE_DOUBLE));
+ level = g_variant_get_double (variant);
}
gtk_range_set_value(range, level);
diff --git a/src/volume-widget.c b/src/volume-widget.c
index f638bd4..e8e7bae 100644
--- a/src/volume-widget.c
+++ b/src/volume-widget.c
@@ -128,7 +128,7 @@ static void
volume_widget_property_update( DbusmenuMenuitem* item, gchar* property,
GVariant* value, gpointer userdata)
{
- g_return_if_fail (IS_VOLUME_WIDGET (userdata));
+ g_return_if_fail (IS_VOLUME_WIDGET(userdata));
VolumeWidget* mitem = VOLUME_WIDGET(userdata);
VolumeWidgetPrivate * priv = VOLUME_WIDGET_GET_PRIVATE(mitem);
@@ -139,28 +139,37 @@ volume_widget_property_update( DbusmenuMenuitem* item, gchar* property,
GtkRange *range = (GtkRange*)slider;
gdouble update = g_variant_get_double (value);
gtk_range_set_value(range, update);
+/*
+ g_debug ("volume-widget::volume_widget_property_update - volume - value %f", update);
+*/
update_accessible_desc(priv->indicator);
}
}
- if(g_ascii_strcasecmp(DBUSMENU_VOLUME_MENUITEM_MUTE, property) == 0){
- g_debug ("volume widget - mute update ");
+ else if(g_ascii_strcasecmp(DBUSMENU_VOLUME_MENUITEM_MUTE, property) == 0){
+ g_return_if_fail (g_variant_is_of_type (value, G_VARIANT_TYPE_BOOLEAN));
if(priv->grabbed == FALSE){
GtkWidget *slider = ido_scale_menu_item_get_scale((IdoScaleMenuItem*)priv->ido_volume_slider);
GtkRange *range = (GtkRange*)slider;
- gint update = g_variant_get_int32 (value);
+ gboolean update = g_variant_get_boolean (value);
gdouble level;
- g_debug ("volume widget - mute update %i", update);
-
- if (update == 1){
+ if (update == TRUE){
level = 0;
}
else{
- level = g_variant_get_double (dbusmenu_menuitem_property_get_variant (priv->twin_item,
- DBUSMENU_VOLUME_MENUITEM_LEVEL));
+ GVariant* variant = dbusmenu_menuitem_property_get_variant (priv->twin_item,
+ DBUSMENU_VOLUME_MENUITEM_LEVEL);
+/*
+ g_debug ("variant for the volume - is it null = %i", variant == NULL);
+*/
+ g_return_if_fail (g_variant_is_of_type (variant, G_VARIANT_TYPE_DOUBLE) );
+
+ level = g_variant_get_double (variant);
}
+/*
+ g_debug ("volume-widget::volume_widget_property_update - mute - value %i and level = %f", update, level);
+*/
gtk_range_set_value(range, level);
- g_debug ("volume-widget - update mute with value %i", update);
}
}
}
@@ -176,13 +185,13 @@ volume_widget_set_twin_item(VolumeWidget* self,
G_CALLBACK(volume_widget_property_update), self);
gdouble initial_level = g_variant_get_double (dbusmenu_menuitem_property_get_variant(twin_item,
DBUSMENU_VOLUME_MENUITEM_LEVEL));
- gint initial_mute = g_variant_get_int32 (dbusmenu_menuitem_property_get_variant(twin_item,
- DBUSMENU_VOLUME_MENUITEM_MUTE));
+ gboolean initial_mute = g_variant_get_boolean (dbusmenu_menuitem_property_get_variant(twin_item,
+ DBUSMENU_VOLUME_MENUITEM_MUTE));
//g_debug("volume_widget_set_twin_item initial level = %f", initial_level);
GtkWidget *slider = ido_scale_menu_item_get_scale((IdoScaleMenuItem*)priv->ido_volume_slider);
GtkRange *range = (GtkRange*)slider;
- if(initial_mute == 1){
+ if(initial_mute == TRUE){
initial_level = 0;
}
gtk_range_set_value(range, initial_level);
@@ -197,8 +206,12 @@ volume_widget_change_value_cb (GtkRange *range,
{
g_return_val_if_fail (IS_VOLUME_WIDGET (user_data), FALSE);
VolumeWidget* mitem = VOLUME_WIDGET(user_data);
- //g_debug ("changed value %f", new_value);
- volume_widget_update(mitem, new_value);
+
+/*
+ g_debug ("changed value %f", new_value);
+*/
+
+ volume_widget_update(mitem, new_value, "change-value");
return FALSE;
}
@@ -211,28 +224,35 @@ 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);
+ 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);
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)));
- gint mute = g_variant_get_int32 (dbusmenu_menuitem_property_get_variant (priv->twin_item,
- DBUSMENU_VOLUME_MENUITEM_MUTE));
- if((current_value == 0 && mute != 1) || current_value == 100){
- volume_widget_update(mitem, current_value);
+ gboolean mute = g_variant_get_boolean (dbusmenu_menuitem_property_get_variant (priv->twin_item,
+ DBUSMENU_VOLUME_MENUITEM_MUTE));
+ if((current_value == 0 && mute == FALSE) || current_value == 100){
+/*
+ g_debug ("value changed - actual set %f", current_value);
+*/
+ volume_widget_update (mitem, current_value, "value-changed");
}
return FALSE;
}
void
-volume_widget_update(VolumeWidget* self, gdouble update)
+volume_widget_update(VolumeWidget* self, gdouble update, gchar* label)
{
+ gchar* source = NULL;
+ source = label;
+ if (label == NULL){
+ source = "v widget update";
+ }
VolumeWidgetPrivate * priv = VOLUME_WIDGET_GET_PRIVATE(self);
gdouble clamped = CLAMP(update, 0, 100);
GVariant* new_volume = g_variant_new_double(clamped);
- dbusmenu_menuitem_handle_event (priv->twin_item, "update", new_volume, 0);
+ dbusmenu_menuitem_handle_event (priv->twin_item, source, new_volume, 0);
}
GtkWidget*
diff --git a/src/volume-widget.h b/src/volume-widget.h
index 50ef377..7012473 100644
--- a/src/volume-widget.h
+++ b/src/volume-widget.h
@@ -47,7 +47,7 @@ struct _VolumeWidget {
GType volume_widget_get_type (void) G_GNUC_CONST;
GtkWidget* volume_widget_new(DbusmenuMenuitem *item, IndicatorObject* io);
GtkWidget* volume_widget_get_ido_slider(VolumeWidget* self);
-void volume_widget_update(VolumeWidget* self, gdouble update);
+void volume_widget_update(VolumeWidget* self, gdouble update, gchar* label);
void volume_widget_tidy_up (GtkWidget *widget);
gdouble volume_widget_get_current_volume ( GtkWidget *widget );
diff --git a/vapi/common-defs.vapi b/vapi/common-defs.vapi
index 7cac0de..0d28cdb 100644
--- a/vapi/common-defs.vapi
+++ b/vapi/common-defs.vapi
@@ -59,10 +59,12 @@ namespace Transport{
PLAY_PAUSE,
NEXT,
REWIND,
- FORWIND
+ FORWIND,
+ NO_ACTION
}
public enum State{
PLAYING,
- PAUSED
+ PAUSED,
+ LAUNCHING
}
}