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

Reply via email to