[gnome-settings-daemon] media-keys: Add a binding to take a short screencast of the screen
- From: Jasper St. Pierre <jstpierre src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gnome-settings-daemon] media-keys: Add a binding to take a short screencast of the screen
- Date: Thu, 15 Aug 2013 00:42:48 +0000 (UTC)
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>'<Ctrl><Shift><Alt>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]