]> git.sesse.net Git - vlc/blobdiff - modules/gui/hildon/maemo_callbacks.c
lua_meta: factorize.
[vlc] / modules / gui / hildon / maemo_callbacks.c
index cf6395171a416da39af41974bed7a7ddf75bd506..073488e6e74c259346fcff4925829dccd56e24ea 100644 (file)
@@ -1,31 +1,39 @@
 /*****************************************************************************
-* maemo_callbacks.c : Callbacks for the maemo plugin.
-*****************************************************************************
-* Copyright (C) 2008 the VideoLAN team
-* $Id$
-*
-* Authors: Antoine Lejeune <phytos@videolan.org>
-*
-* This program is free software; you can redistribute it and/or modify
-* it under the terms of the GNU General Public License as published by
-* the Free Software Foundation; either version 2 of the License, or
-* (at your option) any later version.
-*
-* This program is distributed in the hope that it will be useful,
-* but WITHOUT ANY WARRANTY; without even the implied warranty of
-* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-* GNU General Public License for more details.
-*
-* You should have received a copy of the GNU General Public License
-* along with this program; if not, write to the Free Software
-* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA.
-*****************************************************************************/
+ * maemo_callbacks.c : Callbacks for the maemo plugin.
+ *****************************************************************************
+ * Copyright (C) 2008 the VideoLAN team
+ * $Id$
+ *
+ * Authors: Antoine Lejeune <phytos@videolan.org>
+ *          Gildas Bazin <gbazin@videolan.org>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA.
+ *****************************************************************************/
 
 #include <vlc_common.h>
 
 #include "maemo.h"
 #include "maemo_callbacks.h"
 
+#include <gdk/gdkkeysyms.h>
+#include <vlc_keys.h>
+
+#ifdef HAVE_HILDON_FM
+# include <hildon/hildon-file-chooser-dialog.h>
+#endif
+
 /*
  * Function used to retrieve an intf_thread_t object from a GtkWidget
  */
@@ -46,19 +54,6 @@ static intf_thread_t *get_intf_from_widget( GtkWidget *widget )
                                                  "p_intf" );
 }
 
-gboolean delete_event_cb( GtkWidget *widget,
-                          GdkEvent *event,
-                          gpointer user_data )
-{
-    (void)event; (void)user_data;
-    intf_thread_t *p_intf = get_intf_from_widget( widget );
-
-    libvlc_Quit( p_intf->p_libvlc );
-    gtk_main_quit();
-
-    return TRUE;
-}
-
 void play_cb( GtkButton *button, gpointer user_data )
 {
     (void)user_data;
@@ -99,6 +94,22 @@ void next_cb( GtkButton *button, gpointer user_data )
     playlist_Next( p_intf->p_sys->p_playlist );
 }
 
+void playlist_cb( GtkButton *button, gpointer user_data )
+{
+    (void)user_data;
+    intf_thread_t *p_intf = get_intf_from_widget( GTK_WIDGET( button ) );
+    if( GTK_WIDGET_VISIBLE(p_intf->p_sys->p_playlist_window) )
+    {
+      gtk_widget_show_all( p_intf->p_sys->p_video_window );
+      gtk_widget_hide_all( p_intf->p_sys->p_playlist_window );
+    }
+    else
+    {
+      gtk_widget_hide_all( p_intf->p_sys->p_video_window );
+      gtk_widget_show_all( p_intf->p_sys->p_playlist_window );
+    }
+}
+
 void seekbar_changed_cb( GtkRange *range, GtkScrollType scroll,
                          gdouble value, gpointer data )
 {
@@ -124,8 +135,6 @@ void pl_row_activated_cb( GtkTreeView *tree_view , GtkTreePath *path,
     gtk_tree_model_get_iter( model, &iter, path );
     gtk_tree_model_get( model, &iter, 0, &filename, -1 );
 
-    gtk_notebook_set_current_page( GTK_NOTEBOOK( p_intf->p_sys->p_tabs ), 0 );
-
     p_input = input_item_New( p_intf, filename, NULL );
     playlist_AddInput( p_intf->p_sys->p_playlist, p_input,
                        PLAYLIST_APPEND | PLAYLIST_GO, PLAYLIST_END, true, false );
@@ -140,8 +149,15 @@ void open_cb( GtkMenuItem *menuitem, gpointer user_data )
     GtkWidget *dialog;
     char *psz_filename = NULL;
 
+#ifdef HAVE_HILDON_FM
     dialog = hildon_file_chooser_dialog_new( GTK_WINDOW( p_intf->p_sys->p_main_window ),
                                              GTK_FILE_CHOOSER_ACTION_OPEN );
+#else
+    dialog = gtk_file_chooser_dialog_new( "Open File", GTK_WINDOW( p_intf->p_sys->p_main_window ),
+                                          GTK_FILE_CHOOSER_ACTION_OPEN,
+                                          GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL,
+                                          GTK_STOCK_OK, GTK_RESPONSE_OK, NULL );
+#endif
     gtk_widget_show_all( GTK_WIDGET( dialog ) );
 
     if( gtk_dialog_run( GTK_DIALOG( dialog ) ) == GTK_RESPONSE_OK )
@@ -217,22 +233,22 @@ void open_webcam_cb( GtkMenuItem *menuitem, gpointer user_data )
 
 void snapshot_cb( GtkMenuItem *menuitem, gpointer user_data )
 {
-    (void)menuitem;
     intf_thread_t *p_intf = (intf_thread_t *)user_data;
+    input_thread_t *p_input = p_intf->p_sys->p_input;
+    vout_thread_t *p_vout = p_input ? input_GetVout( p_input ) : NULL;
+    (void)menuitem;
 
-    if( !p_intf->p_sys->p_vout )
+    if( !p_vout )
     {
         hildon_banner_show_information(
                                 GTK_WIDGET( p_intf->p_sys->p_main_window ),
-                                "gtk-dialog-error",
-                                "There is no video" );
+                                "gtk-dialog-error", "There is no video" );
         return;
     }
 
-    var_TriggerCallback( p_intf->p_sys->p_vout, "video-snapshot" );
+    var_TriggerCallback( p_vout, "video-snapshot" );
     hildon_banner_show_information( GTK_WIDGET( p_intf->p_sys->p_main_window ),
-                                    NULL,
-                                    "Snapshot taken" );
+                                    NULL, "Snapshot taken" );
 }
 
 void dropframe_cb( GtkMenuItem *menuitem, gpointer user_data )
@@ -244,3 +260,105 @@ void dropframe_cb( GtkMenuItem *menuitem, gpointer user_data )
     else
         config_PutInt( p_intf, "ffmpeg-skip-frame", 0 );
 }
+
+static int keyModifiersToVLC( GdkEventKey *event )
+{
+    int i_keyModifiers = 0;
+    if( event->state & GDK_SHIFT_MASK ) i_keyModifiers |= KEY_MODIFIER_SHIFT;
+    if( event->state & GDK_MOD1_MASK ) i_keyModifiers |= KEY_MODIFIER_ALT;
+    if( event->state & GDK_CONTROL_MASK ) i_keyModifiers |= KEY_MODIFIER_CTRL;
+    if( event->state & GDK_META_MASK ) i_keyModifiers |= KEY_MODIFIER_META;
+    return i_keyModifiers;
+}
+
+static int eventToVLCKey( GdkEventKey *event )
+{
+    int i_vlck = 0;
+
+    switch( event->keyval )
+    {
+    case GDK_Left: i_vlck |= KEY_LEFT; break;
+    case GDK_Right: i_vlck |= KEY_RIGHT; break;
+    case GDK_Up: i_vlck |= KEY_UP; break;
+    case GDK_Down: i_vlck |= KEY_DOWN; break;
+    case GDK_Escape: i_vlck |= KEY_ESC; break;
+    case GDK_Return: i_vlck |= KEY_ENTER; break;
+
+    case GDK_F1: i_vlck |= KEY_F1; break;
+    case GDK_F2: i_vlck |= KEY_F2; break;
+    case GDK_F3: i_vlck |= KEY_F3; break;
+    case GDK_F4: i_vlck |= KEY_F4; break;
+    case GDK_F5: i_vlck |= KEY_F5; break;
+    case GDK_F6: i_vlck |= KEY_F6; break;
+    case GDK_F7: i_vlck |= KEY_F7; break;
+    case GDK_F8: i_vlck |= KEY_F8; break;
+    case GDK_F9: i_vlck |= KEY_F9; break;
+    case GDK_F10: i_vlck |= KEY_F10; break;
+    case GDK_F11: i_vlck |= KEY_F11; break;
+    case GDK_F12: i_vlck |= KEY_F12; break;
+
+    case GDK_Page_Up: i_vlck |= KEY_PAGEUP; break;
+    case GDK_Page_Down: i_vlck |= KEY_PAGEDOWN; break;
+    case GDK_Home: i_vlck |= KEY_HOME; break;
+    case GDK_End: i_vlck |= KEY_END; break;
+    case GDK_Insert: i_vlck |= KEY_INSERT; break;
+    case GDK_Delete: i_vlck |= KEY_DELETE; break;
+
+#ifndef HAVE_MAEMO
+    case GDK_AudioLowerVolume: i_vlck |= KEY_VOLUME_DOWN; break;
+    case GDK_AudioRaiseVolume: i_vlck |= KEY_VOLUME_UP; break;
+    case GDK_AudioMute: i_vlck |= KEY_VOLUME_MUTE; break;
+    case GDK_AudioPlay: i_vlck |= KEY_MEDIA_PLAY_PAUSE; break;
+    case GDK_AudioStop: i_vlck |= KEY_MEDIA_STOP; break;
+    case GDK_AudioNext: i_vlck |= KEY_MEDIA_NEXT_TRACK; break;
+    case GDK_AudioPrev: i_vlck |= KEY_MEDIA_PREV_TRACK; break;
+#endif
+    }
+
+    if( !i_vlck )
+    {
+        /* Force lowercase */
+        if( event->keyval >= GDK_A && event->keyval <= GDK_Z )
+            i_vlck = event->keyval + 32;
+        /* Rest of the ascii range */
+        else if( event->keyval >= GDK_space && event->keyval <= GDK_asciitilde )
+            i_vlck = event->keyval;
+    }
+
+    /* Handle modifiers */
+    i_vlck |= keyModifiersToVLC( event );
+
+    return i_vlck;
+}
+
+gboolean key_cb(GtkWidget *widget, GdkEventKey *event, gpointer user_data)
+{
+    intf_thread_t *p_intf = (intf_thread_t *)user_data;
+    widget = widget; /* unused */
+
+    int i_vlck = eventToVLCKey( event );
+    if( i_vlck > 0 )
+    {
+        var_SetInteger( p_intf->p_libvlc, "key-pressed", i_vlck );
+        return TRUE;
+    }
+
+    return FALSE;
+}
+
+gboolean fullscreen_cb( gpointer user_data )
+{
+    intf_thread_t *p_intf = (intf_thread_t *)user_data;
+
+    if(p_intf->p_sys->b_fullscreen)
+    {
+        gtk_widget_hide_all( GTK_WIDGET( p_intf->p_sys->p_control_window ) );
+        gtk_window_fullscreen( GTK_WINDOW(p_intf->p_sys->p_main_window) );
+    }
+    else
+    {
+        gtk_window_unfullscreen( GTK_WINDOW(p_intf->p_sys->p_main_window) );
+        gtk_widget_show_all( GTK_WIDGET( p_intf->p_sys->p_control_window ) );
+    }
+    return FALSE;
+}