summaryrefslogtreecommitdiffstats
path: root/src/ui/tool/event-utils.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/ui/tool/event-utils.cpp')
-rw-r--r--src/ui/tool/event-utils.cpp47
1 files changed, 45 insertions, 2 deletions
diff --git a/src/ui/tool/event-utils.cpp b/src/ui/tool/event-utils.cpp
index 6912897da..91b2cdb04 100644
--- a/src/ui/tool/event-utils.cpp
+++ b/src/ui/tool/event-utils.cpp
@@ -8,8 +8,10 @@
* Released under GNU GPL, read the file 'COPYING' for more information
*/
+#include <cstring>
#include <gdk/gdk.h>
#include <gdk/gdkkeysyms.h>
+#include "display/sp-canvas.h"
#include "ui/tool/event-utils.h"
namespace Inkscape {
@@ -28,7 +30,7 @@ guint shortcut_key(GdkEventKey const &event)
return shortcut_key;
}
-unsigned consume_same_key_events(guint keyval, gint mask)
+unsigned combine_key_events(guint keyval, gint mask)
{
GdkEvent *event_next;
gint i = 0;
@@ -37,7 +39,7 @@ unsigned consume_same_key_events(guint keyval, gint mask)
// while the next event is also a key notify with the same keyval and mask,
while (event_next && (event_next->type == GDK_KEY_PRESS || event_next->type == GDK_KEY_RELEASE)
&& event_next->key.keyval == keyval
- && (!mask || (event_next->key.state & mask))) {
+ && (!mask || event_next->key.state & mask)) {
if (event_next->type == GDK_KEY_PRESS)
i ++;
// kill it
@@ -51,6 +53,47 @@ unsigned consume_same_key_events(guint keyval, gint mask)
return i;
}
+unsigned combine_motion_events(SPCanvas *canvas, GdkEventMotion &event, gint mask)
+{
+ GdkEvent *event_next;
+ gint i = 0;
+ event.x -= canvas->x0;
+ event.y -= canvas->y0;
+
+ event_next = gdk_event_get();
+ // while the next event is also a motion notify
+ while (event_next && event_next->type == GDK_MOTION_NOTIFY
+ && (!mask || event_next->motion.state & mask))
+ {
+ if (event_next->motion.device == event.device) {
+ GdkEventMotion &next = event_next->motion;
+ event.send_event = next.send_event;
+ event.time = next.time;
+ event.x = next.x;
+ event.y = next.y;
+ event.state = next.state;
+ event.is_hint = next.is_hint;
+ event.x_root = next.x_root;
+ event.y_root = next.y_root;
+ if (event.axes && next.axes) {
+ memcpy(event.axes, next.axes, event.device->num_axes);
+ }
+ }
+
+ // kill it
+ gdk_event_free(event_next);
+ event_next = gdk_event_get();
+ i++;
+ }
+ // otherwise, put it back onto the queue
+ if (event_next)
+ gdk_event_put(event_next);
+ event.x += canvas->x0;
+ event.y += canvas->y0;
+
+ return i;
+}
+
/** Returns the modifier state valid after this event. Use this when you process events
* that change the modifier state. Currently handles only Shift, Ctrl, Alt. */
unsigned state_after_event(GdkEvent *event)