Replace cursor position monitoring with MetaCursorTracker
I was tired of seeing 1s updates in shell recording videos when seeing them on Planet GNOME, so here you go.
This commit is contained in:
parent
ef18b7ea25
commit
8c9aa2efd9
@ -7,13 +7,6 @@ const Meta = imports.gi.Meta;
|
|||||||
const GnomeDesktop = imports.gi.GnomeDesktop;
|
const GnomeDesktop = imports.gi.GnomeDesktop;
|
||||||
const Shell = imports.gi.Shell;
|
const Shell = imports.gi.Shell;
|
||||||
|
|
||||||
// We stop polling if the user is idle for more than this amount of time
|
|
||||||
const IDLE_TIME = 1000;
|
|
||||||
|
|
||||||
// This file implements a reasonably efficient system for tracking the position
|
|
||||||
// of the mouse pointer. We simply query the pointer from the X server in a loop,
|
|
||||||
// but we turn off the polling when the user is idle.
|
|
||||||
|
|
||||||
let _pointerWatcher = null;
|
let _pointerWatcher = null;
|
||||||
function getPointerWatcher() {
|
function getPointerWatcher() {
|
||||||
if (_pointerWatcher == null)
|
if (_pointerWatcher == null)
|
||||||
@ -25,9 +18,8 @@ function getPointerWatcher() {
|
|||||||
const PointerWatch = new Lang.Class({
|
const PointerWatch = new Lang.Class({
|
||||||
Name: 'PointerWatch',
|
Name: 'PointerWatch',
|
||||||
|
|
||||||
_init: function(watcher, interval, callback) {
|
_init: function(watcher, callback) {
|
||||||
this.watcher = watcher;
|
this.watcher = watcher;
|
||||||
this.interval = interval;
|
|
||||||
this.callback = callback;
|
this.callback = callback;
|
||||||
},
|
},
|
||||||
|
|
||||||
@ -43,9 +35,9 @@ const PointerWatcher = new Lang.Class({
|
|||||||
Name: 'PointerWatcher',
|
Name: 'PointerWatcher',
|
||||||
|
|
||||||
_init: function() {
|
_init: function() {
|
||||||
this._idleMonitor = Meta.IdleMonitor.get_core();
|
this._cursorTracker = Meta.CursorTracker.get_for_screen(global.screen);
|
||||||
this._idleMonitor.add_idle_watch(IDLE_TIME, Lang.bind(this, this._onIdleMonitorBecameIdle));
|
this._cursorTracker.connect('position-changed', Lang.bind(this, this._updatePointer));
|
||||||
this._idle = this._idleMonitor.get_idletime() > IDLE_TIME;
|
|
||||||
this._watches = [];
|
this._watches = [];
|
||||||
this.pointerX = null;
|
this.pointerX = null;
|
||||||
this.pointerY = null;
|
this.pointerY = null;
|
||||||
@ -61,60 +53,25 @@ const PointerWatcher = new Lang.Class({
|
|||||||
// Set up a watch on the position of the mouse pointer. Returns a
|
// Set up a watch on the position of the mouse pointer. Returns a
|
||||||
// PointerWatch object which has a remove() method to remove the watch.
|
// PointerWatch object which has a remove() method to remove the watch.
|
||||||
addWatch: function(interval, callback) {
|
addWatch: function(interval, callback) {
|
||||||
|
this._cursorTracker.enable_track_position();
|
||||||
|
|
||||||
// Avoid unreliably calling the watch for the current position
|
// Avoid unreliably calling the watch for the current position
|
||||||
this._updatePointer();
|
this._updatePointer();
|
||||||
|
|
||||||
let watch = new PointerWatch(this, interval, callback);
|
this._watches.push(callback);
|
||||||
this._watches.push(watch);
|
|
||||||
this._updateTimeout();
|
|
||||||
return watch;
|
return watch;
|
||||||
},
|
},
|
||||||
|
|
||||||
_removeWatch: function(watch) {
|
_removeWatch: function(watch) {
|
||||||
for (let i = 0; i < this._watches.length; i++) {
|
for (let i = 0; i < this._watches.length; i++) {
|
||||||
if (this._watches[i] == watch) {
|
if (this._watches[i] == watch) {
|
||||||
|
this._cursorTracker.disable_track_position();
|
||||||
this._watches.splice(i, 1);
|
this._watches.splice(i, 1);
|
||||||
this._updateTimeout();
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
|
||||||
_onIdleMonitorBecameActive: function(monitor) {
|
|
||||||
this._idle = false;
|
|
||||||
this._updatePointer();
|
|
||||||
this._updateTimeout();
|
|
||||||
},
|
|
||||||
|
|
||||||
_onIdleMonitorBecameIdle: function(monitor) {
|
|
||||||
this._idle = true;
|
|
||||||
this._idleMonitor.add_user_active_watch(Lang.bind(this, this._onIdleMonitorBecameActive));
|
|
||||||
this._updateTimeout();
|
|
||||||
},
|
|
||||||
|
|
||||||
_updateTimeout: function() {
|
|
||||||
if (this._timeoutId) {
|
|
||||||
Mainloop.source_remove(this._timeoutId);
|
|
||||||
this._timeoutId = 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (this._idle || this._watches.length == 0)
|
|
||||||
return;
|
|
||||||
|
|
||||||
let minInterval = this._watches[0].interval;
|
|
||||||
for (let i = 1; i < this._watches.length; i++)
|
|
||||||
minInterval = Math.min(this._watches[i].interval, minInterval);
|
|
||||||
|
|
||||||
this._timeoutId = Mainloop.timeout_add(minInterval,
|
|
||||||
Lang.bind(this, this._onTimeout));
|
|
||||||
GLib.Source.set_name_by_id(this._timeoutId, '[gnome-shell] this._onTimeout');
|
|
||||||
},
|
|
||||||
|
|
||||||
_onTimeout: function() {
|
|
||||||
this._updatePointer();
|
|
||||||
return GLib.SOURCE_CONTINUE;
|
|
||||||
},
|
|
||||||
|
|
||||||
_updatePointer: function() {
|
_updatePointer: function() {
|
||||||
let [x, y, mods] = global.get_pointer();
|
let [x, y, mods] = global.get_pointer();
|
||||||
if (this.pointerX == x && this.pointerY == y)
|
if (this.pointerX == x && this.pointerY == y)
|
||||||
|
@ -80,7 +80,6 @@ struct _ShellRecorder {
|
|||||||
guint redraw_timeout;
|
guint redraw_timeout;
|
||||||
guint redraw_idle;
|
guint redraw_idle;
|
||||||
guint update_memory_used_timeout;
|
guint update_memory_used_timeout;
|
||||||
guint update_pointer_timeout;
|
|
||||||
guint repaint_hook_id;
|
guint repaint_hook_id;
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -126,11 +125,6 @@ G_DEFINE_TYPE(ShellRecorder, shell_recorder, G_TYPE_OBJECT);
|
|||||||
*/
|
*/
|
||||||
#define DEFAULT_FRAMES_PER_SECOND 30
|
#define DEFAULT_FRAMES_PER_SECOND 30
|
||||||
|
|
||||||
/* The time (in milliseconds) between querying the server for the cursor
|
|
||||||
* position.
|
|
||||||
*/
|
|
||||||
#define UPDATE_POINTER_TIME 100
|
|
||||||
|
|
||||||
/* The time we wait (in milliseconds) before redrawing when the memory used
|
/* The time we wait (in milliseconds) before redrawing when the memory used
|
||||||
* changes.
|
* changes.
|
||||||
*/
|
*/
|
||||||
@ -537,7 +531,8 @@ on_cursor_changed (MetaCursorTracker *tracker,
|
|||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
recorder_update_pointer (ShellRecorder *recorder)
|
on_cursor_position_changed (MetaCursorTracker *tracker,
|
||||||
|
ShellRecorder *recorder)
|
||||||
{
|
{
|
||||||
int pointer_x, pointer_y;
|
int pointer_x, pointer_y;
|
||||||
|
|
||||||
@ -551,36 +546,6 @@ recorder_update_pointer (ShellRecorder *recorder)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static gboolean
|
|
||||||
recorder_update_pointer_timeout (gpointer data)
|
|
||||||
{
|
|
||||||
recorder_update_pointer (data);
|
|
||||||
|
|
||||||
return TRUE;
|
|
||||||
}
|
|
||||||
|
|
||||||
static void
|
|
||||||
recorder_add_update_pointer_timeout (ShellRecorder *recorder)
|
|
||||||
{
|
|
||||||
if (!recorder->update_pointer_timeout)
|
|
||||||
{
|
|
||||||
recorder->update_pointer_timeout = g_timeout_add (UPDATE_POINTER_TIME,
|
|
||||||
recorder_update_pointer_timeout,
|
|
||||||
recorder);
|
|
||||||
g_source_set_name_by_id (recorder->update_pointer_timeout, "[gnome-shell] recorder_update_pointer_timeout");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
static void
|
|
||||||
recorder_remove_update_pointer_timeout (ShellRecorder *recorder)
|
|
||||||
{
|
|
||||||
if (recorder->update_pointer_timeout)
|
|
||||||
{
|
|
||||||
g_source_remove (recorder->update_pointer_timeout);
|
|
||||||
recorder->update_pointer_timeout = 0;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
static void
|
static void
|
||||||
recorder_connect_stage_callbacks (ShellRecorder *recorder)
|
recorder_connect_stage_callbacks (ShellRecorder *recorder)
|
||||||
{
|
{
|
||||||
@ -652,6 +617,8 @@ recorder_set_screen (ShellRecorder *recorder,
|
|||||||
recorder->cursor_tracker = tracker;
|
recorder->cursor_tracker = tracker;
|
||||||
g_signal_connect_object (tracker, "cursor-changed",
|
g_signal_connect_object (tracker, "cursor-changed",
|
||||||
G_CALLBACK (on_cursor_changed), recorder, 0);
|
G_CALLBACK (on_cursor_changed), recorder, 0);
|
||||||
|
g_signal_connect_object (tracker, "position-changed",
|
||||||
|
G_CALLBACK (on_cursor_position_changed), recorder, 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
@ -1514,7 +1481,7 @@ shell_recorder_record (ShellRecorder *recorder,
|
|||||||
|
|
||||||
recorder->state = RECORDER_STATE_RECORDING;
|
recorder->state = RECORDER_STATE_RECORDING;
|
||||||
recorder_update_pointer (recorder);
|
recorder_update_pointer (recorder);
|
||||||
recorder_add_update_pointer_timeout (recorder);
|
meta_cursor_tracker_enable_track_position (recorder->cursor_tracker);
|
||||||
|
|
||||||
/* Disable unredirection while we are recoring */
|
/* Disable unredirection while we are recoring */
|
||||||
meta_disable_unredirect_for_screen (shell_global_get_screen (shell_global_get ()));
|
meta_disable_unredirect_for_screen (shell_global_get_screen (shell_global_get ()));
|
||||||
@ -1553,7 +1520,7 @@ shell_recorder_close (ShellRecorder *recorder)
|
|||||||
*/
|
*/
|
||||||
clutter_actor_paint (CLUTTER_ACTOR (recorder->stage));
|
clutter_actor_paint (CLUTTER_ACTOR (recorder->stage));
|
||||||
|
|
||||||
recorder_remove_update_pointer_timeout (recorder);
|
meta_cursor_tracker_disable_track_position (recorder->cursor_tracker);
|
||||||
recorder_close_pipeline (recorder);
|
recorder_close_pipeline (recorder);
|
||||||
|
|
||||||
/* Queue a redraw to remove the recording indicator */
|
/* Queue a redraw to remove the recording indicator */
|
||||||
|
Loading…
Reference in New Issue
Block a user