motion timeout
Add intermediate points to make quick free drawings smoother. Do not redisplay the area at this step (crashes). Fix #45.
This commit is contained in:
parent
6e99e380cb
commit
b159c2ccd4
30
area.js
30
area.js
|
|
@ -47,6 +47,7 @@ const pgettext = imports.gettext.domain(Me.metadata['gettext-domain']).pgettext;
|
||||||
|
|
||||||
const CAIRO_DEBUG_EXTENDS = false;
|
const CAIRO_DEBUG_EXTENDS = false;
|
||||||
const SVG_DEBUG_EXTENDS = false;
|
const SVG_DEBUG_EXTENDS = false;
|
||||||
|
const MOTION_TIME = 5; // ms, time accuracy for free drawing, max is about 33 ms. The lower it is, the smoother the drawing is.
|
||||||
const TEXT_CURSOR_TIME = 600; // ms
|
const TEXT_CURSOR_TIME = 600; // ms
|
||||||
const ELEMENT_GRABBER_TIME = 80; // ms, default is about 16 ms
|
const ELEMENT_GRABBER_TIME = 80; // ms, default is about 16 ms
|
||||||
const GRID_TILES_HORIZONTAL_NUMBER = 30;
|
const GRID_TILES_HORIZONTAL_NUMBER = 30;
|
||||||
|
|
@ -664,6 +665,31 @@ var DrawingArea = new Lang.Class({
|
||||||
return;
|
return;
|
||||||
let controlPressed = event.has_control_modifier();
|
let controlPressed = event.has_control_modifier();
|
||||||
this._updateDrawing(x, y, controlPressed);
|
this._updateDrawing(x, y, controlPressed);
|
||||||
|
|
||||||
|
if (this.motionTimeout)
|
||||||
|
GLib.source_remove(this.motionTimeout);
|
||||||
|
|
||||||
|
if (this.currentTool == Shapes.NONE) {
|
||||||
|
// Minimum time between two motion events is about 33 ms.
|
||||||
|
// Add intermediate points to make quick free drawings smoother.
|
||||||
|
this.motionTimeout = GLib.timeout_add(GLib.PRIORITY_DEFAULT, MOTION_TIME, () => {
|
||||||
|
if (this.spaceKeyPressed)
|
||||||
|
return GLib.SOURCE_CONTINUE;
|
||||||
|
|
||||||
|
let [stageX, stageY, mods] = global.get_pointer();
|
||||||
|
let [s, x, y] = this.transform_stage_point(stageX, stageY);
|
||||||
|
if (!s)
|
||||||
|
return GLib.SOURCE_CONTINUE;
|
||||||
|
|
||||||
|
let controlPressed = !!(mods & Clutter.ModifierType.CONTROL_MASK);
|
||||||
|
|
||||||
|
// Important: do not call this._updateDrawing because the area MUST NOT BE REDISPLAYED at this step.
|
||||||
|
// It would lead to critical issues (bad performances and shell crashes).
|
||||||
|
this.currentElement.updateDrawing(x, y, controlPressed);
|
||||||
|
|
||||||
|
return GLib.SOURCE_CONTINUE;
|
||||||
|
});
|
||||||
|
}
|
||||||
});
|
});
|
||||||
},
|
},
|
||||||
|
|
||||||
|
|
@ -678,6 +704,10 @@ var DrawingArea = new Lang.Class({
|
||||||
},
|
},
|
||||||
|
|
||||||
_stopDrawing: function() {
|
_stopDrawing: function() {
|
||||||
|
if (this.motionTimeout) {
|
||||||
|
GLib.source_remove(this.motionTimeout);
|
||||||
|
this.motionTimeout = null;
|
||||||
|
}
|
||||||
if (this.motionHandler) {
|
if (this.motionHandler) {
|
||||||
this.disconnect(this.motionHandler);
|
this.disconnect(this.motionHandler);
|
||||||
this.motionHandler = null;
|
this.motionHandler = null;
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue