commit c3f84218439984ae166e3454fab3b3d66763f1b6
Author: phantomjinx <[email protected]>
Date: Tue Jul 27 23:10:14 2010 +0100
Getting the volume icon to popup the volume slider
* Volume icon is displayed on left side and on clicking it pops up the
volume slide in a similar way to rhythmbox's volume control
plugins/media_player/media_player.c | 91 ++++++++++++++++++++++++-------
plugins/media_player/media_player.glade | 89 +++++++++++++++++++++---------
plugins/media_player/media_player.h | 5 +-
3 files changed, 137 insertions(+), 48 deletions(-)
---
diff --git a/plugins/media_player/media_player.c
b/plugins/media_player/media_player.c
index ed91a1d..02933e4 100644
--- a/plugins/media_player/media_player.c
+++ b/plugins/media_player/media_player.c
@@ -34,6 +34,7 @@
#include <gst/interfaces/xoverlay.h>
#include <gdk/gdkx.h>
#include <gtk/gtk.h>
+#include <gdk/gdk.h>
#include "libgtkpod/itdb.h"
#include "libgtkpod/file.h"
#include "libgtkpod/directories.h"
@@ -200,10 +201,10 @@ static void playsong_real() {
g_return_if_fail(tr);
str = get_file_name_from_source(tr, SOURCE_PREFER_LOCAL);
if (str) {
+
gtk_label_set_text(GTK_LABEL(player->song_label), tr->title); //
set label to title
- g_object_set_data(G_OBJECT (player->song_label), "tr_title",
tr->title); // set label to title...again?wtf?
- g_object_set_data(G_OBJECT (player->song_label), "tr_artist",
tr->artist); // set label to title...again?wtf?
- gtk_widget_set_sensitive(player->volume_scale, TRUE); //set volume
scale sensitivity to true
+ g_object_set_data(G_OBJECT (player->song_label), "tr_title",
tr->title);
+ g_object_set_data(G_OBJECT (player->song_label), "tr_artist",
tr->artist);
/* init GStreamer */
loop = g_main_loop_new(NULL, FALSE); // make new loop
@@ -419,35 +420,38 @@ void set_selected_tracks(GList *tracks) {
gchar *str = get_file_name_from_source(tr, SOURCE_PREFER_LOCAL);
if (str) {
gtk_label_set_text(GTK_LABEL(player->song_label), tr->title); // set
label to title
- g_object_set_data(G_OBJECT (player->song_label), "tr_title",
tr->title); // set label to title...again?wtf?
- g_object_set_data(G_OBJECT (player->song_label), "tr_artist",
tr->artist); // set label to title...again?wtf?
- gtk_widget_set_sensitive(player->volume_scale, TRUE); //set volume
scale sensitivity to true
+ g_object_set_data(G_OBJECT (player->song_label), "tr_title",
tr->title);
+ g_object_set_data(G_OBJECT (player->song_label), "tr_artist",
tr->artist);
}
g_free(str);
}
void init_media_player(GtkWidget *parent) {
GtkWidget *window;
+ GladeXML *xml;
gst_init_check(0, NULL, NULL);
srand(time(NULL));
- gchar *glade_path = g_build_filename(get_glade_dir(),
"media_player.glade", NULL);
player = g_new0(MediaPlayer, 1);
+ player->glade_path = g_build_filename(get_glade_dir(),
"media_player.glade", NULL);
+ xml = glade_xml_new(player->glade_path, "media_window", NULL);
+
+ window = gtkpod_xml_get_widget(xml, "media_window");
+ player->video_widget = gtkpod_xml_get_widget(xml, "video_widget");
+ player->media_panel = gtkpod_xml_get_widget(xml, "media_panel");
+ player->song_label = gtkpod_xml_get_widget(xml, "song_label");
+ player->song_time_label = gtkpod_xml_get_widget(xml, "song_time_label");
+ player->media_toolbar = gtkpod_xml_get_widget(xml, "media_toolbar");
- player->xml = glade_xml_new(glade_path, "media_window", NULL);
+ player->play_button = gtkpod_xml_get_widget(xml, "play_button");
+ player->stop_button = gtkpod_xml_get_widget(xml, "stop_button");
+ player->previous_button = gtkpod_xml_get_widget(xml, "previous_button");
+ player->next_button = gtkpod_xml_get_widget(xml, "next_button");
+ player->song_scale = gtkpod_xml_get_widget(xml, "song_scale");
- window = gtkpod_xml_get_widget(player->xml, "media_window");
- player->video_widget = gtkpod_xml_get_widget(player->xml, "video_widget");
- player->media_panel = gtkpod_xml_get_widget(player->xml, "media_panel");
- player->song_label = gtkpod_xml_get_widget(player->xml, "song_label");
- player->media_toolbar = gtkpod_xml_get_widget(player->xml,
"media_toolbar");
+ player->volume = 5;
- player->play_button = gtkpod_xml_get_widget(player->xml, "play_button");
- player->stop_button = gtkpod_xml_get_widget(player->xml, "stop_button");
- player->previous_button = gtkpod_xml_get_widget(player->xml,
"previous_button");
- player->next_button = gtkpod_xml_get_widget(player->xml, "next_button");
- player->song_scale = gtkpod_xml_get_widget(player->xml, "song_scale");
- player->volume_scale = gtkpod_xml_get_widget(player->xml, "volume_scale");
+ glade_xml_signal_autoconnect(xml);
g_object_ref(player->media_panel);
gtk_container_remove(GTK_CONTAINER (window), player->media_panel);
@@ -461,14 +465,61 @@ void init_media_player(GtkWidget *parent) {
gtk_widget_show(player->song_label);
gtk_widget_show_all(player->media_toolbar);
- g_free(glade_path);
+ g_object_unref(xml);
}
void destroy_media_player() {
gtk_widget_destroy(player->media_panel);
+ g_free(player->glade_path);
player = NULL;
}
+static void update_volume(gint volume) {
+ player->volume = volume;
+
+}
+
+static gboolean volume_changed_cb(GtkRange *range, GtkScrollType scroll,
gdouble value, gpointer user_data) {
+ update_volume(value);
+ return FALSE;
+}
+
+G_MODULE_EXPORT gboolean on_volume_window_focus_out(GtkWidget *widget,
GdkEventFocus *event, gpointer data) {
+ GtkWidget *vol_scale = (GtkWidget *) g_object_get_data(G_OBJECT(widget),
"scale");
+ update_volume(gtk_range_get_value(GTK_RANGE(vol_scale)));
+ gtk_widget_destroy(widget);
+ return TRUE;
+}
+
+G_MODULE_EXPORT void on_volume_button_clicked_cb(GtkToolButton *toolbutton,
gpointer *userdata) {
+ GladeXML *xml;
+ GtkWidget *vol_window;
+ GtkWidget *vol_scale;
+
+ xml = glade_xml_new(player->glade_path, "volume_window", NULL);
+ vol_window = gtkpod_xml_get_widget(xml, "volume_window");
+ vol_scale = gtkpod_xml_get_widget(xml, "volume_scale");
+ g_object_set_data(G_OBJECT(vol_window), "scale", vol_scale);
+
+ gtk_range_set_value(GTK_RANGE(vol_scale), player->volume);
+ g_signal_connect(G_OBJECT (vol_scale),
+ "change-value",
+ G_CALLBACK(volume_changed_cb),
+ NULL);
+
+
+ // gtk_widget_set_events(vol_window, GDK_FOCUS_CHANGE_MASK);
+ g_signal_connect (G_OBJECT (vol_window),
+ "focus-out-event",
+ G_CALLBACK (on_volume_window_focus_out),
+ NULL);
+
+ gtk_widget_show_all(vol_window);
+ gtk_widget_grab_focus(vol_window);
+
+ g_object_unref(xml);
+}
+
void media_player_track_removed_cb(GtkPodApp *app, gpointer tk, gpointer data)
{
Track *old_track = tk;
if (!player)
diff --git a/plugins/media_player/media_player.glade
b/plugins/media_player/media_player.glade
index 67cf218..bd399c9 100644
--- a/plugins/media_player/media_player.glade
+++ b/plugins/media_player/media_player.glade
@@ -4,7 +4,6 @@
<!-- interface-naming-policy toplevel-contextual -->
<widget class="GtkWindow" id="media_window">
<property name="window_position">mouse</property>
- <signal name="delete_event" handler="on_gtkpod_delete_event"/>
<child>
<widget class="GtkVBox" id="media_panel">
<property name="visible">True</property>
@@ -16,13 +15,36 @@
</packing>
</child>
<child>
- <widget class="GtkLabel" id="song_label">
+ <widget class="GtkHBox" id="song_label_box">
<property name="visible">True</property>
- <property name="xalign">0</property>
- <property name="xpad">6</property>
+ <property name="spacing">10</property>
+ <child>
+ <widget class="GtkLabel" id="song_label">
+ <property name="visible">True</property>
+ <property name="xalign">0</property>
+ <property name="xpad">6</property>
+ <property name="label" translatable="yes">Test Song by
Test</property>
+ </widget>
+ <packing>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <widget class="GtkLabel" id="song_time_label">
+ <property name="visible">True</property>
+ <property name="label" translatable="yes">00:00:00</property>
+ </widget>
+ <packing>
+ <property name="expand">False</property>
+ <property name="padding">5</property>
+ <property name="pack_type">end</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
</widget>
<packing>
<property name="expand">False</property>
+ <property name="padding">5</property>
<property name="position">1</property>
</packing>
</child>
@@ -40,7 +62,7 @@
<property name="label"
translatable="yes">Previous</property>
<property name="use_underline">True</property>
<property name="stock_id">gtk-media-previous</property>
- <signal name="clicked"
handler="on_Previous_button_clicked"/>
+ <signal name="clicked"
handler="on_previous_button_clicked_cb"/>
</widget>
<packing>
<property name="position">0</property>
@@ -52,7 +74,7 @@
<property name="label" translatable="yes">Play</property>
<property name="use_underline">True</property>
<property name="stock_id">gtk-media-play</property>
- <signal name="clicked" handler="on_Play_button_clicked"/>
+ <signal name="clicked"
handler="on_play_button_clicked_cb"/>
</widget>
<packing>
<property name="position">1</property>
@@ -64,7 +86,7 @@
<property name="label" translatable="yes">Stop</property>
<property name="use_underline">True</property>
<property name="stock_id">gtk-media-stop</property>
- <signal name="clicked" handler="on_Stop_button_clicked"/>
+ <signal name="clicked"
handler="on_stop_button_clicked_cb"/>
</widget>
<packing>
<property name="position">2</property>
@@ -76,7 +98,7 @@
<property name="label" translatable="yes">Next</property>
<property name="use_underline">True</property>
<property name="stock_id">gtk-media-next</property>
- <signal name="clicked"
handler="on_Forward_button_clicked"/>
+ <signal name="clicked"
handler="on_next_button_clicked_cb"/>
</widget>
<packing>
<property name="position">3</property>
@@ -108,30 +130,16 @@
<widget class="GtkHBox" id="volume_box">
<property name="visible">True</property>
<child>
- <widget class="GtkImage" id="volume_icon">
+ <widget class="GtkToolButton" id="volume_button">
<property name="visible">True</property>
- <property name="events">GDK_POINTER_MOTION_MASK |
GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK |
GDK_BUTTON_RELEASE_MASK</property>
- <property
name="stock">media_player-volume-control-icon</property>
- <property name="icon-size">3</property>
+ <property name="label" translatable="yes">Volume</property>
+ <property
name="stock_id">media_player-volume-control-icon</property>
+ <signal name="clicked"
handler="on_volume_button_clicked_cb"/>
</widget>
<packing>
<property name="position">0</property>
</packing>
</child>
- <child>
- <widget class="GtkHScale" id="volume_scale">
- <property name="width_request">75</property>
- <property name="visible">True</property>
- <property name="sensitive">False</property>
- <property name="can_focus">True</property>
- <property name="events">GDK_POINTER_MOTION_MASK |
GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK |
GDK_BUTTON_RELEASE_MASK</property>
- <property name="adjustment">0 -90 10 0.20000000000000001 2
2</property>
- <property name="draw_value">False</property>
- </widget>
- <packing>
- <property name="position">1</property>
- </packing>
- </child>
</widget>
<packing>
<property name="expand">False</property>
@@ -149,4 +157,33 @@
</widget>
</child>
</widget>
+ <widget class="GtkWindow" id="volume_window">
+ <property name="width_request">30</property>
+ <property name="height_request">150</property>
+ <property name="resizable">False</property>
+ <property name="window_position">mouse</property>
+ <property name="default_width">20</property>
+ <property name="default_height">100</property>
+ <property name="destroy_with_parent">True</property>
+ <property name="type_hint">dialog</property>
+ <property name="skip_taskbar_hint">True</property>
+ <property name="skip_pager_hint">True</property>
+ <property name="urgency_hint">True</property>
+ <property name="decorated">False</property>
+ <property name="deletable">False</property>
+ <property name="transient_for">media_window</property>
+ <child>
+ <widget class="GtkVScale" id="volume_scale">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="is_focus">True</property>
+ <property name="events">GDK_EXPOSURE_MASK | GDK_POINTER_MOTION_MASK |
GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_MOTION_MASK | GDK_BUTTON1_MOTION_MASK
| GDK_BUTTON2_MOTION_MASK | GDK_BUTTON3_MOTION_MASK | GDK_BUTTON_PRESS_MASK |
GDK_BUTTON_RELEASE_MASK | GDK_KEY_PRESS_MASK | GDK_KEY_RELEASE_MASK |
GDK_ENTER_NOTIFY_MASK | GDK_LEAVE_NOTIFY_MASK | GDK_FOCUS_CHANGE_MASK |
GDK_STRUCTURE_MASK | GDK_PROPERTY_CHANGE_MASK | GDK_VISIBILITY_NOTIFY_MASK |
GDK_PROXIMITY_IN_MASK | GDK_PROXIMITY_OUT_MASK | GDK_SUBSTRUCTURE_MASK |
GDK_SCROLL_MASK</property>
+ <property name="orientation">vertical</property>
+ <property name="adjustment">9 0 11 1 1 0</property>
+ <property name="inverted">True</property>
+ <property name="fill_level">10</property>
+ <property name="digits">0</property>
+ </widget>
+ </child>
+ </widget>
</glade-interface>
diff --git a/plugins/media_player/media_player.h
b/plugins/media_player/media_player.h
index 16af085..9c04af7 100644
--- a/plugins/media_player/media_player.h
+++ b/plugins/media_player/media_player.h
@@ -36,6 +36,7 @@ typedef struct {
GtkWidget *media_panel;
GtkWidget *video_widget;
GtkWidget *song_label;
+ GtkWidget *song_time_label;
GtkWidget *media_toolbar;
GtkWidget *previous_button;
@@ -43,10 +44,10 @@ typedef struct {
GtkWidget *stop_button;
GtkWidget *next_button;
GtkWidget *song_scale;
- GtkWidget *volume_scale;
+ gchar *glade_path;
- GladeXML *xml;
+ gint volume;
GList *tracks;
------------------------------------------------------------------------------
The Palm PDK Hot Apps Program offers developers who use the
Plug-In Development Kit to bring their C/C++ apps to Palm for a share
of $1 Million in cash or HP Products. Visit us here for more details:
http://ad.doubleclick.net/clk;226879339;13503038;l?
http://clk.atdmt.com/CRS/go/247765532/direct/01/
_______________________________________________
gtkpod-cvs2 mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/gtkpod-cvs2