Merge pull request #435 from andreasb242/pen-detection

Pen detection
presentation
andreasb242 7 years ago committed by GitHub
commit f9176a79b0
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
  1. 3
      src/control/tools/StrokeHandler.cpp
  2. 50
      src/gui/XournalView.cpp
  3. 17
      src/gui/XournalView.h
  4. 22
      src/gui/widgets/XournalWidget.cpp

@ -286,6 +286,9 @@ bool StrokeHandler::getPressureMultiplier(GdkEvent* event, double& pressure)
}
// This causes some memory corruption
// If touch and pen is active at the same time
// Here are random crashes. It cannot be reproduced
// without touch and pen at the same time
// gdouble* axes = event->button.axes;
// gdk_device_get_state(device,
// gtk_widget_get_parent_window(xournal->getWidget()),

@ -49,6 +49,7 @@ XournalView::XournalView(GtkWidget* parent, Control* control)
this->margin = 75;
this->currentPage = 0;
this->lastSelectedPage = -1;
this->lastPenAction = 0;
control->getZoomControl()->addZoomListener(this);
@ -360,11 +361,20 @@ bool XournalView::onKeyReleaseEvent(GdkEventKey* event)
void XournalView::onRealized(GtkWidget* widget, XournalView* view)
{
XOJ_CHECK_TYPE_OBJ(view, XournalView);
view->setEventCompression(view->getControl()->getSettings()->isEventCompression());
}
void XournalView::zoom_gesture_begin_cb(GtkGesture* gesture, GdkEventSequence* sequence, XournalView* view)
{
XOJ_CHECK_TYPE_OBJ(view, XournalView);
if (view->shouldIgnoreTouchEvents())
{
return;
}
Layout* layout = gtk_xournal_get_layout(view->widget);
// Save visible rectangle at beginning of gesture
view->visRect_gesture_begin = layout->getVisibleRect();
@ -379,6 +389,8 @@ void XournalView::zoom_gesture_begin_cb(GtkGesture* gesture, GdkEventSequence* s
void XournalView::zoom_gesture_end_cb(GtkGesture* gesture, GdkEventSequence* sequence, XournalView* view)
{
XOJ_CHECK_TYPE_OBJ(view, XournalView);
ZoomControl* zoom = view->control->getZoomControl();
zoom->zoom_center_x = -1;
zoom->zoom_center_y = -1;
@ -387,6 +399,13 @@ void XournalView::zoom_gesture_end_cb(GtkGesture* gesture, GdkEventSequence* seq
void XournalView::zoom_gesture_scale_changed_cb(GtkGestureZoom* gesture, gdouble scale, XournalView* view)
{
XOJ_CHECK_TYPE_OBJ(view, XournalView);
if (view->shouldIgnoreTouchEvents())
{
return;
}
view->setZoom(scale * view->zoom_gesture_begin);
}
@ -557,14 +576,45 @@ Rectangle* XournalView::getVisibleRect(size_t page)
Rectangle* XournalView::getVisibleRect(XojPageView* redrawable)
{
XOJ_CHECK_TYPE(XournalView);
return gtk_xournal_get_visible_area(this->widget, redrawable);
}
GtkContainer* XournalView::getParent()
{
XOJ_CHECK_TYPE(XournalView);
return this->parent;
}
/**
* A pen action was detected now, therefore ignore touch events
* for a short time
*/
void XournalView::penActionDetected()
{
XOJ_CHECK_TYPE(XournalView);
this->lastPenAction = g_get_monotonic_time() / 1000;
}
/**
* If the pen was active a short time before, ignore touch events
*/
bool XournalView::shouldIgnoreTouchEvents()
{
XOJ_CHECK_TYPE(XournalView);
if ((g_get_monotonic_time() / 1000 - this->lastPenAction) < 1000)
{
// printf("Ignore touch, pen was active\n");
return true;
}
return false;
}
GtkWidget* XournalView::getWidget()
{
XOJ_CHECK_TYPE(XournalView);

@ -105,6 +105,18 @@ public:
Rectangle* getVisibleRect(XojPageView* redrawable);
GtkContainer* getParent();
/**
* A pen action was detected now, therefore ignore touch events
* for a short time
*/
void penActionDetected();
/**
* If the pen was active a short time before, ignore touch events
*/
bool shouldIgnoreTouchEvents();
public:
// ZoomListener interface
void zoomChanged(double lastZoom);
@ -182,5 +194,10 @@ private:
*/
int cleanupTimeout;
/**
* Last Pen action, to ignore touch events within a time frame
*/
gint64 lastPenAction;
friend class Layout;
};

@ -540,6 +540,14 @@ gboolean gtk_xournal_motion_notify_event(GtkWidget* widget, GdkEventMotion* even
GtkXournal* xournal = GTK_XOURNAL(widget);
ToolHandler* h = xournal->view->getControl()->getToolHandler();
// Workaround to detect if the pen is there
GdkDevice* device = gdk_event_get_device((GdkEvent*)event);
int axesCount = gdk_device_get_n_axes(device);
if (axesCount >= 6)
{
xournal->view->penActionDetected();
}
if (xournal->view->zoom_gesture_active)
{
return TRUE;
@ -606,11 +614,9 @@ gboolean gtk_xournal_touch_event(GtkWidget* widget, GdkEventTouch* event)
g_return_val_if_fail(GTK_IS_XOURNAL(widget), FALSE);
g_return_val_if_fail(event != NULL, FALSE);
// GtkXournal* xournal = GTK_XOURNAL(widget);
// printf("Touch event!\n");
// Currently does not really work
// It's getting called, but the events
// are not consumed!
// This handler consume some touch events
// Not fully working, but fixes some touch
// issues
// Consume event
return true;
@ -636,6 +642,12 @@ static void gtk_xournal_init(GtkXournal* xournal)
events |= GDK_KEY_PRESS_MASK;
events |= GDK_SCROLL_MASK;
// NOT Working with GTK3, only with GTK2
// Therefore listening for mouse move events
// of the pen, and add a timeout
// events |= GDK_PROXIMITY_IN_MASK;
// events |= GDK_PROXIMITY_OUT_MASK;
gtk_widget_set_events(widget, events);
}

Loading…
Cancel
Save