[gnome-settings-daemon] media-keys: Add a binding to take a short screencast of the screen



commit 1ae70dc6ff141e248e8198ee1d82e1bec6ed4434
Author: Jasper St. Pierre <jstpierre mecheye net>
Date:   Wed Jul 17 21:10:02 2013 -0400

    media-keys: Add a binding to take a short screencast of the screen
    
    https://bugzilla.gnome.org/show_bug.cgi?id=704435

 ...ngs-daemon.plugins.media-keys.gschema.xml.in.in |    5 +
 plugins/media-keys/gsd-media-keys-manager.c        |   92 ++++++++++++++++++++
 plugins/media-keys/shortcuts-list.h                |    2 +
 3 files changed, 99 insertions(+), 0 deletions(-)
---
diff --git a/data/org.gnome.settings-daemon.plugins.media-keys.gschema.xml.in.in 
b/data/org.gnome.settings-daemon.plugins.media-keys.gschema.xml.in.in
index 8650bc0..a46888d 100644
--- a/data/org.gnome.settings-daemon.plugins.media-keys.gschema.xml.in.in
+++ b/data/org.gnome.settings-daemon.plugins.media-keys.gschema.xml.in.in
@@ -130,6 +130,11 @@
       <_summary>Copy a screenshot of an area to clipboard</_summary>
       <_description>Binding to copy a screenshot of an area to clipboard.</_description>
     </key>
+    <key name="screencast" type="s">
+      <default>'&lt;Ctrl&gt;&lt;Shift&gt;&lt;Alt&gt;R'</default>
+      <_summary>Record a short video of the screen</_summary>
+      <description>Binding to record a short video of the screen</description>
+    </key>
     <key name="www" type="s">
       <default>'XF86WWW'</default>
       <_summary>Launch web browser</_summary>
diff --git a/plugins/media-keys/gsd-media-keys-manager.c b/plugins/media-keys/gsd-media-keys-manager.c
index cf677e8..fee877e 100644
--- a/plugins/media-keys/gsd-media-keys-manager.c
+++ b/plugins/media-keys/gsd-media-keys-manager.c
@@ -76,6 +76,9 @@
 
 #define SHELL_GRABBER_RETRY_INTERVAL 1
 
+/* Screencasts last for 30 seconds */
+#define SCREENCAST_LENGTH 30
+
 static const gchar introspection_xml[] =
 "<node name='/org/gnome/SettingsDaemon/MediaKeys'>"
 "  <interface name='org.gnome.SettingsDaemon.MediaKeys'>"
@@ -171,6 +174,11 @@ struct GsdMediaKeysManagerPrivate
         /* ScreenSaver stuff */
         GsdScreenSaver  *screen_saver_proxy;
 
+        /* Screencast stuff */
+        GDBusProxy      *screencast_proxy;
+        guint            screencast_timeout_id;
+        GCancellable    *screencast_cancellable;
+
         /* systemd stuff */
         GDBusProxy      *logind_proxy;
         gint             inhibit_keys_fd;
@@ -1977,6 +1985,61 @@ do_battery_action (GsdMediaKeysManager *manager)
 }
 
 static void
+screencast_stop (GsdMediaKeysManager *manager)
+{
+        if (manager->priv->screencast_timeout_id > 0) {
+                g_source_remove (manager->priv->screencast_timeout_id);
+                manager->priv->screencast_timeout_id = 0;
+        }
+
+        g_dbus_proxy_call (manager->priv->screencast_proxy,
+                           "StopScreencast", NULL,
+                           G_DBUS_CALL_FLAGS_NONE, -1,
+                           manager->priv->screencast_cancellable,
+                           NULL, NULL);
+}
+
+static gboolean
+screencast_timeout (gpointer user_data)
+{
+        GsdMediaKeysManager *manager = user_data;
+        screencast_stop (manager);
+        return G_SOURCE_REMOVE;
+}
+
+static void
+screencast_start (GsdMediaKeysManager *manager)
+{
+        g_dbus_proxy_call (manager->priv->screencast_proxy,
+                           "Screencast",
+                           /* Translators: this is a filename used for screencast
+                            * recording, where "%d" and "%t" date and time, e.g.
+                            * "Screencast from 07-17-2013 10:00:46 PM.webm" */
+                           /* xgettext:no-c-format */
+                           g_variant_new_parsed ("(%s, @a{sv} {})",
+                                                 _("Screencast from %d %t.webm")),
+                           G_DBUS_CALL_FLAGS_NONE, -1,
+                           manager->priv->screencast_cancellable,
+                           NULL, NULL);
+
+        manager->priv->screencast_timeout_id = g_timeout_add_seconds (SCREENCAST_LENGTH,
+                                                                      screencast_timeout,
+                                                                      manager);
+}
+
+static void
+do_screencast_action (GsdMediaKeysManager *manager)
+{
+        if (manager->priv->screencast_proxy == NULL)
+                return;
+
+        if (manager->priv->screencast_timeout_id == 0)
+                screencast_start (manager);
+        else
+                screencast_stop (manager);
+}
+
+static void
 do_custom_action (GsdMediaKeysManager *manager,
                   guint                deviceid,
                   MediaKey            *key,
@@ -2051,6 +2114,9 @@ do_action (GsdMediaKeysManager *manager,
         case AREA_SCREENSHOT_CLIP_KEY:
                 gsd_screenshot_take (type);
                 break;
+        case SCREENCAST_KEY:
+                do_screencast_action (manager);
+                break;
         case WWW_KEY:
                 do_url_action (manager, "http", timestamp);
                 break;
@@ -2232,6 +2298,17 @@ on_shell_proxy_ready (GObject      *source,
 }
 
 static void
+on_screencast_proxy_ready (GObject      *source,
+                           GAsyncResult *result,
+                           gpointer      data)
+{
+        GsdMediaKeysManager *manager = data;
+
+        manager->priv->screencast_proxy =
+                g_dbus_proxy_new_for_bus_finish (result, NULL);
+}
+
+static void
 on_key_grabber_ready (GObject      *source,
                       GAsyncResult *result,
                       gpointer      data)
@@ -2272,6 +2349,14 @@ on_shell_appeared (GDBusConnection   *connection,
                                   SHELL_DBUS_NAME,
                                   manager->priv->shell_cancellable,
                                   on_shell_proxy_ready, manager);
+
+        g_dbus_proxy_new_for_bus (G_BUS_TYPE_SESSION,
+                                  0, NULL,
+                                  name_owner,
+                                  SHELL_DBUS_PATH "/Screencast",
+                                  SHELL_DBUS_NAME ".Screencast",
+                                  manager->priv->screencast_cancellable,
+                                  on_screencast_proxy_ready, manager);
 }
 
 static void
@@ -2341,6 +2426,7 @@ start_media_keys_idle_cb (GsdMediaKeysManager *manager)
 
         ensure_cancellable (&manager->priv->grab_cancellable);
         ensure_cancellable (&manager->priv->shell_cancellable);
+        ensure_cancellable (&manager->priv->screencast_cancellable);
 
         manager->priv->name_owner_id = g_bus_watch_name (G_BUS_TYPE_SESSION,
                                                          SHELL_DBUS_NAME, 0,
@@ -2413,6 +2499,7 @@ gsd_media_keys_manager_stop (GsdMediaKeysManager *manager)
         g_clear_object (&priv->power_screen_proxy);
         g_clear_object (&priv->power_keyboard_proxy);
         g_clear_object (&priv->mpris_controller);
+        g_clear_object (&priv->screencast_proxy);
 
         if (manager->priv->name_owner_id) {
                 g_bus_unwatch_name (manager->priv->name_owner_id);
@@ -2448,6 +2535,11 @@ gsd_media_keys_manager_stop (GsdMediaKeysManager *manager)
                 g_clear_object (&priv->shell_cancellable);
         }
 
+        if (priv->screencast_cancellable != NULL) {
+                g_cancellable_cancel (priv->screencast_cancellable);
+                g_clear_object (&priv->screencast_cancellable);
+        }
+
         g_clear_object (&priv->sink);
         g_clear_object (&priv->source);
         g_clear_object (&priv->volume);
diff --git a/plugins/media-keys/shortcuts-list.h b/plugins/media-keys/shortcuts-list.h
index 813eae0..943f12b 100644
--- a/plugins/media-keys/shortcuts-list.h
+++ b/plugins/media-keys/shortcuts-list.h
@@ -51,6 +51,7 @@ typedef enum {
         SCREENSHOT_CLIP_KEY,
         WINDOW_SCREENSHOT_CLIP_KEY,
         AREA_SCREENSHOT_CLIP_KEY,
+        SCREENCAST_KEY,
         WWW_KEY,
         PLAY_KEY,
         PAUSE_KEY,
@@ -124,6 +125,7 @@ static struct {
         { SCREENSHOT_CLIP_KEY, "screenshot-clip", NULL, NULL, SHELL_KEYBINDING_MODE_ALL },
         { WINDOW_SCREENSHOT_CLIP_KEY, "window-screenshot-clip", NULL, NULL, SHELL_KEYBINDING_MODE_NORMAL },
         { AREA_SCREENSHOT_CLIP_KEY, "area-screenshot-clip", NULL, NULL, SHELL_KEYBINDING_MODE_ALL },
+        { SCREENCAST_KEY, "screencast", NULL, NULL, SHELL_KEYBINDING_MODE_ALL },
         { WWW_KEY, "www", NULL, NULL, GSD_KEYBINDING_MODE_LAUNCHER },
         { PLAY_KEY, "play", NULL, NULL, SHELL_KEYBINDING_MODE_ALL },
         { PAUSE_KEY, "pause", NULL, NULL, SHELL_KEYBINDING_MODE_ALL },


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