[vlc-commits] VlcPluginGtk: implemented right click popup menu

Cheng Sun git at videolan.org
Wed Dec 21 12:54:09 CET 2011


npapi-vlc | branch: master | Cheng Sun <chengsun9 at gmail.com> | Sat Dec 10 11:51:39 2011 +0000| [bef62b7d9e7559f917ef331e903b5a581fa19a26] | committer: Jean-Baptiste Kempf

VlcPluginGtk: implemented right click popup menu

Signed-off-by: Jean-Baptiste Kempf <jb at videolan.org>

> http://git.videolan.org/gitweb.cgi/npapi-vlc.git/?a=commit;h=bef62b7d9e7559f917ef331e903b5a581fa19a26
---

 npapi/vlcplugin_gtk.cpp |   74 ++++++++++++++++++++++++++++++++++++++++++++++-
 npapi/vlcplugin_gtk.h   |    5 ++-
 2 files changed, 76 insertions(+), 3 deletions(-)

diff --git a/npapi/vlcplugin_gtk.cpp b/npapi/vlcplugin_gtk.cpp
index 9df901d..a64b732 100644
--- a/npapi/vlcplugin_gtk.cpp
+++ b/npapi/vlcplugin_gtk.cpp
@@ -12,7 +12,8 @@ VlcPluginGtk::VlcPluginGtk(NPP instance, NPuint16_t mode) :
     parent(NULL),
     parent_vbox(NULL),
     video(NULL),
-    toolbar(NULL)
+    toolbar(NULL),
+    popup_menu(NULL)
 {
 }
 
@@ -24,6 +25,7 @@ void VlcPluginGtk::set_player_window()
 {
     libvlc_media_player_set_xwindow(libvlc_media_player,
                                     (uint32_t)getXid(video));
+    libvlc_video_set_mouse_input(libvlc_media_player, 0);
 }
 
 void VlcPluginGtk::toggle_fullscreen()
@@ -84,6 +86,71 @@ static void toolbar_handler(GtkToolButton *btn, gpointer user_data)
     fprintf(stderr, "WARNING: No idea what toolbar button you just clicked on (%s)\n", stock_id?stock_id:"NULL");
 }
 
+static void menu_handler(GtkMenuItem *menuitem, gpointer user_data)
+{
+    VlcPluginGtk *plugin = (VlcPluginGtk *) user_data;
+    const gchar *stock_id = gtk_menu_item_get_label(GTK_MENU_ITEM(menuitem));
+    for (int i = 0; i < sizeof(tool_actions)/sizeof(tool_actions_t); ++i) {
+        if (!strcmp(stock_id, tool_actions[i].stock_id)) {
+            plugin->control_handler(tool_actions[i].clicked);
+            return;
+        }
+    }
+    fprintf(stderr, "WARNING: No idea what menu item you just clicked on (%s)\n", stock_id?stock_id:"NULL");
+}
+
+void VlcPluginGtk::do_popup_menu(GtkWidget *widget, GdkEventButton *event)
+{
+    int button, event_time;
+
+    if (event) {
+        button = event->button;
+        event_time = event->time;
+    } else {
+        button = 0;
+        event_time = gtk_get_current_event_time();
+    }
+
+    /* construct menu */
+    GtkWidget *popup_menu = gtk_menu_new();
+    GtkWidget *menuitem;
+
+    /* play/pause */
+    menuitem = gtk_image_menu_item_new_from_stock(
+                        playlist_isplaying() ?
+                        GTK_STOCK_MEDIA_PAUSE :
+                        GTK_STOCK_MEDIA_PLAY, NULL);
+    g_signal_connect(G_OBJECT(menuitem), "activate", G_CALLBACK(menu_handler), this);
+    gtk_menu_shell_append(GTK_MENU_SHELL(popup_menu), menuitem);
+    /* stop */
+    menuitem = gtk_image_menu_item_new_from_stock(
+                                GTK_STOCK_MEDIA_STOP, NULL);
+    g_signal_connect(G_OBJECT(menuitem), "activate", G_CALLBACK(menu_handler), this);
+    gtk_menu_shell_append(GTK_MENU_SHELL(popup_menu), menuitem);
+
+    gtk_widget_show_all(popup_menu);
+
+    gtk_menu_attach_to_widget(GTK_MENU(popup_menu), widget, NULL);
+    gtk_menu_popup(GTK_MENU(popup_menu), NULL, NULL, NULL, NULL,
+                   button, event_time);
+}
+
+static bool video_button_handler(GtkWidget *widget, GdkEventButton *event, gpointer user_data)
+{
+    VlcPluginGtk *plugin = (VlcPluginGtk *) user_data;
+    if (event->button == 3 && event->type == GDK_BUTTON_PRESS) {
+        plugin->do_popup_menu(widget, event);
+        return true;
+    }
+    return false;
+}
+
+static bool video_popup_handler(GtkWidget *widget, gpointer user_data) {
+    VlcPluginGtk *plugin = (VlcPluginGtk *) user_data;
+    plugin->do_popup_menu(widget, NULL);
+    return true;
+}
+
 static bool time_slider_handler(GtkRange *range, GtkScrollType scroll, gdouble value, gpointer user_data)
 {
     VlcPluginGtk *plugin = (VlcPluginGtk *) user_data;
@@ -144,6 +211,11 @@ bool VlcPluginGtk::create_windows()
 
     video = gtk_drawing_area_new();
     gtk_widget_modify_bg(video, GTK_STATE_NORMAL, &color_black);
+    gtk_widget_add_events(video,
+            GDK_BUTTON_PRESS_MASK
+          | GDK_BUTTON_RELEASE_MASK);
+    g_signal_connect(G_OBJECT(video), "button-press-event", G_CALLBACK(video_button_handler), this);
+    g_signal_connect(G_OBJECT(video), "popup-menu", G_CALLBACK(video_popup_handler), this);
     gtk_box_pack_start(GTK_BOX(parent_vbox), video, true, true, 0);
 
     gtk_widget_show_all(parent);
diff --git a/npapi/vlcplugin_gtk.h b/npapi/vlcplugin_gtk.h
index 3291c09..69340d6 100644
--- a/npapi/vlcplugin_gtk.h
+++ b/npapi/vlcplugin_gtk.h
@@ -51,12 +51,13 @@ public:
     void hide_toolbar();
 
     void update_controls();
+    void do_popup_menu(GtkWidget *,GdkEventButton *);
 private:
     void set_player_window();
 
     unsigned int     i_width, i_height;
-    GtkWidget *parent, *parent_vbox, *video, *toolbar;
-    GtkWidget *time_slider;
+    GtkWidget *parent, *parent_vbox, *video;
+    GtkWidget *toolbar, *popup_menu, *time_slider;
 };
 
 #endif /* __VLCPLUGIN_GTK_H__ */



More information about the vlc-commits mailing list