[gnome-shell] Make parameters configureable
- From: Adel Gadllah <agadllah src gnome org>
- To: svn-commits-list gnome org
- Cc:
- Subject: [gnome-shell] Make parameters configureable
- Date: Mon, 8 Feb 2010 20:31:43 +0000 (UTC)
commit 3e1b1d57897a5525729c44baf3a6b8f692ae5a5e
Author: Adel Gadllah <adel gadllah gmail com>
Date: Mon Feb 8 21:25:58 2010 +0100
Make parameters configureable
Make the framerate, file extension and gstreamer pipeline used by the
screencast recorder configureable using gconf.
This patch does not change the defaults, it justs provides a way for
the user to override them.
https://bugzilla.gnome.org/show_bug.cgi?id=608995
data/gnome-shell.schemas | 47 ++++++++++++++++++++++++++++++++++++
js/ui/main.js | 10 +++++++
src/shell-recorder.c | 59 ++++++++++++++++++++++++++++++++++++++++++++-
src/shell-recorder.h | 2 +
4 files changed, 116 insertions(+), 2 deletions(-)
---
diff --git a/data/gnome-shell.schemas b/data/gnome-shell.schemas
index 6da8e32..462a62e 100644
--- a/data/gnome-shell.schemas
+++ b/data/gnome-shell.schemas
@@ -117,6 +117,53 @@
</locale>
</schema>
+ <schema>
+ <key>/schemas/desktop/gnome/shell/recorder/framerate</key>
+ <applyto>/desktop/gnome/shell/recorder/framerate</applyto>
+ <owner>gnome-shell</owner>
+ <type>int</type>
+ <default>15</default>
+ <locale name="C">
+ <short>Framerate used for recording screencasts.</short>
+ <long>
+ The framerate of the resulting screencast recordered by GNOME Shell's screencast recorder in frames-per-second.
+ </long>
+ </locale>
+ </schema>
+
+ <schema>
+ <key>/schemas/desktop/gnome/shell/recorder/pipeline</key>
+ <applyto>/desktop/gnome/shell/recorder/pipeline</applyto>
+ <owner>gnome-shell</owner>
+ <type>string</type>
+ <default></default>
+ <locale name="C">
+ <short>The gstreamer pipeline used to encode the screencast</short>
+ <long>
+ Sets the GStreamer pipeline used to encode recordings. It follows the syntax used for gst-launch.
+ The pipeline should have an unconnected sink pad where the recorded video is recorded. It will
+ normally have a unconnected source pad; output from that pad will be written into the output file.
+ However the pipeline can also take care of its own output - this might be used to send the output to an icecast server via shout2send or similar.
+ When unset or set to an empty value, the default pipeline will be used. This is currently 'videorate ! theoraenc ! oggmux' and records to Ogg Theora.
+ </long>
+ </locale>
+ </schema>
+
+ <schema>
+ <key>/schemas/desktop/gnome/shell/recorder/file_extension</key>
+ <applyto>/desktop/gnome/shell/recorder/file_extension</applyto>
+ <owner>gnome-shell</owner>
+ <type>string</type>
+ <default>ogg</default>
+ <locale name="C">
+ <short>File extension used for storing the screencast</short>
+ <long>
+ The filename for recorded screencasts will be a unique filename based on the current date, and use this extension.
+ It should be changed when recording to a different container format.
+ </long>
+ </locale>
+ </schema>
+
</schemalist>
</gconfschemafile>
diff --git a/js/ui/main.js b/js/ui/main.js
index 4a7fe32..47c7548 100644
--- a/js/ui/main.js
+++ b/js/ui/main.js
@@ -134,6 +134,16 @@ function start() {
if (recorder.is_recording()) {
recorder.pause();
} else {
+ //read the parameters from GConf always in case they have changed
+ let gconf = Shell.GConf.get_default();
+ recorder.set_framerate(gconf.get_int("recorder/framerate"));
+ recorder.set_filename("shell-%d%u-%c." + gconf.get_string("recorder/file_extension"));
+ let pipeline = gconf.get_string("recorder/pipeline");
+ if (!pipeline.match(/^\s*$/))
+ recorder.set_pipeline(pipeline);
+ else
+ recorder.set_pipeline(null);
+
recorder.record();
}
});
diff --git a/src/shell-recorder.c b/src/shell-recorder.c
index 1a31b4d..2247992 100644
--- a/src/shell-recorder.c
+++ b/src/shell-recorder.c
@@ -63,6 +63,7 @@ struct _ShellRecorder {
gboolean have_pack_invert; /* True when GL_MESA_pack_invert is available */
+ int framerate;
char *pipeline_description;
char *filename;
gboolean filename_has_count; /* %c used: handle pausing differently */
@@ -93,6 +94,8 @@ struct _RecorderPipeline
static void recorder_set_stage (ShellRecorder *recorder,
ClutterStage *stage);
+static void recorder_set_framerate (ShellRecorder *recorder,
+ int framerate);
static void recorder_set_pipeline (ShellRecorder *recorder,
const char *pipeline);
static void recorder_set_filename (ShellRecorder *recorder,
@@ -104,6 +107,7 @@ static void recorder_pipeline_closed (RecorderPipeline *pipeline);
enum {
PROP_0,
PROP_STAGE,
+ PROP_FRAMERATE,
PROP_PIPELINE,
PROP_FILENAME
};
@@ -117,7 +121,7 @@ G_DEFINE_TYPE(ShellRecorder, shell_recorder, G_TYPE_OBJECT);
* as theora for a minimal size increase. This may be an artifact of the
* encoding process.
*/
-#define FRAMES_PER_SECOND 15
+#define DEFAULT_FRAMES_PER_SECOND 15
/* The time (in milliseconds) between querying the server for the cursor
* position.
@@ -246,6 +250,7 @@ shell_recorder_init (ShellRecorder *recorder)
recorder->memory_target = get_memory_target();
recorder->state = RECORDER_STATE_CLOSED;
+ recorder->framerate = DEFAULT_FRAMES_PER_SECOND;
}
static void
@@ -874,6 +879,21 @@ recorder_set_stage (ShellRecorder *recorder,
}
static void
+recorder_set_framerate (ShellRecorder *recorder,
+ int framerate)
+{
+ if (framerate == recorder->framerate)
+ return;
+
+ if (recorder->current_pipeline)
+ shell_recorder_close (recorder);
+
+ recorder->framerate = framerate;
+
+ g_object_notify (G_OBJECT (recorder), "framerate");
+}
+
+static void
recorder_set_pipeline (ShellRecorder *recorder,
const char *pipeline)
{
@@ -924,6 +944,9 @@ shell_recorder_set_property (GObject *object,
case PROP_STAGE:
recorder_set_stage (recorder, g_value_get_object (value));
break;
+ case PROP_FRAMERATE:
+ recorder_set_framerate (recorder, g_value_get_int (value));
+ break;
case PROP_PIPELINE:
recorder_set_pipeline (recorder, g_value_get_string (value));
break;
@@ -949,6 +972,9 @@ shell_recorder_get_property (GObject *object,
case PROP_STAGE:
g_value_set_object (value, G_OBJECT (recorder->stage));
break;
+ case PROP_FRAMERATE:
+ g_value_set_int (value, recorder->framerate);
+ break;
case PROP_PIPELINE:
g_value_set_string (value, recorder->pipeline_description);
break;
@@ -977,6 +1003,17 @@ shell_recorder_class_init (ShellRecorderClass *klass)
"Stage to record",
CLUTTER_TYPE_STAGE,
G_PARAM_READWRITE));
+
+ g_object_class_install_property (gobject_class,
+ PROP_FRAMERATE,
+ g_param_spec_int ("framerate",
+ "Framerate",
+ "Framerate used for resulting video in frames-per-second",
+ 0,
+ G_MAXINT,
+ DEFAULT_FRAMES_PER_SECOND,
+ G_PARAM_READWRITE));
+
g_object_class_install_property (gobject_class,
PROP_PIPELINE,
g_param_spec_string ("pipeline",
@@ -1018,7 +1055,7 @@ recorder_pipeline_set_caps (RecorderPipeline *pipeline)
"blue_mask", G_TYPE_INT, 0x0000ff,
#endif
"endianness", G_TYPE_INT, G_BIG_ENDIAN,
- "framerate", GST_TYPE_FRACTION, FRAMES_PER_SECOND, 1,
+ "framerate", GST_TYPE_FRACTION, pipeline->recorder->framerate, 1,
"width", G_TYPE_INT, pipeline->recorder->stage_width,
"height", G_TYPE_INT, pipeline->recorder->stage_height,
NULL);
@@ -1524,6 +1561,24 @@ shell_recorder_new (ClutterStage *stage)
}
/**
+ * shell_recorder_set_framerate:
+ * @recorder: the #ShellRecorder
+ * @framerate: Framerate used for resulting video in frames-per-second.
+ *
+ * Sets the number of frames per second we configure for the GStreamer pipeline.
+ *
+ * The default value is 15.
+ */
+void
+shell_recorder_set_framerate (ShellRecorder *recorder,
+ int framerate)
+{
+ g_return_if_fail (SHELL_IS_RECORDER (recorder));
+
+ recorder_set_framerate (recorder, framerate);
+}
+
+/**
* shell_recorder_set_filename:
* @recorder: the #ShellRecorder
* @filename: the filename template to use for output files,
diff --git a/src/shell-recorder.h b/src/shell-recorder.h
index 26b76ec..fe96c5b 100644
--- a/src/shell-recorder.h
+++ b/src/shell-recorder.h
@@ -30,6 +30,8 @@ GType shell_recorder_get_type (void) G_GNUC_CONST;
ShellRecorder *shell_recorder_new (ClutterStage *stage);
+void shell_recorder_set_framerate (ShellRecorder *recorder,
+ int framerate);
void shell_recorder_set_filename (ShellRecorder *recorder,
const char *filename);
void shell_recorder_set_pipeline (ShellRecorder *recorder,
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]