[cheese] keybindings: capture webcam buttons



commit de0114556cef148c396552d1c189b476ea0c8aab
Author: Bastien Nocera <hadess hadess net>
Date:   Fri Jun 19 15:15:39 2009 +0100

    keybindings: capture webcam buttons
    
    Listen to XF86Webcam keypresses to capture webcam buttons. Should work with
    every driver that correctly binds the input device to KEY_CAMERA events.
    Fixes bug #521551

 src/cheese-window.c |   33 +++++++++++++++++++++++++++++++++
 1 files changed, 33 insertions(+), 0 deletions(-)
---
diff --git a/src/cheese-window.c b/src/cheese-window.c
index fd5727b..d922e5e 100644
--- a/src/cheese-window.c
+++ b/src/cheese-window.c
@@ -39,6 +39,8 @@
 #include <gtk/gtk.h>
 #include <libebook/e-book.h>
 
+#include <X11/XF86keysym.h>
+
 #ifdef HILDON
   #include <hildon/hildon-program.h>
 #endif
@@ -178,6 +180,8 @@ typedef struct
   CheeseFlash *flash;
 } CheeseWindow;
 
+static void cheese_window_action_button_clicked_cb (GtkWidget *widget, CheeseWindow *cheese_window);
+
 void
 cheese_window_bring_to_front (gpointer data)
 {
@@ -260,6 +264,30 @@ cheese_window_delete_event_cb (GtkWidget *widget, GdkEvent event, gpointer data)
   return FALSE;
 }
 
+static gboolean
+cheese_window_key_press_event_cb (GtkWidget *win, GdkEventKey *event, CheeseWindow *cheese_window)
+{
+  /* If we have modifiers, and either Ctrl, Mod1 (Alt), or any
+   * of Mod3 to Mod5 (Mod2 is num-lock...) are pressed, we
+   * let Gtk+ handle the key */
+  if (event->state != 0
+      && ((event->state & GDK_CONTROL_MASK)
+	  || (event->state & GDK_MOD1_MASK)
+	  || (event->state & GDK_MOD3_MASK)
+	  || (event->state & GDK_MOD4_MASK)
+	  || (event->state & GDK_MOD5_MASK)))
+    return FALSE;
+
+  switch (event->keyval) {
+  case XF86XK_WebCam:
+    /* do stuff */
+    cheese_window_action_button_clicked_cb (NULL, cheese_window);
+    return TRUE;
+  }
+
+  return FALSE;
+}
+
 static void
 cheese_window_fullscreen_clear_timeout (CheeseWindow *cheese_window)
 {
@@ -1849,6 +1877,11 @@ cheese_window_create_window (CheeseWindow *cheese_window)
   g_signal_connect (cheese_window->window, "delete_event",
                     G_CALLBACK (cheese_window_delete_event_cb), NULL);
 
+  /* Listen for key presses */
+  gtk_widget_add_events (cheese_window->window, GDK_KEY_PRESS_MASK | GDK_KEY_RELEASE_MASK);
+  g_signal_connect (cheese_window->window, "key_press_event",
+		    G_CALLBACK (cheese_window_key_press_event_cb), cheese_window);
+
   g_signal_connect (cheese_window->take_picture, "clicked",
                     G_CALLBACK (cheese_window_action_button_clicked_cb), cheese_window);
   g_signal_connect (cheese_window->take_picture_fullscreen, "clicked",



[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]