Merge pull request #428 from andreasb242/touch-handling

Touch handling
presentation
andreasb242 7 years ago committed by GitHub
commit bf16db8d8e
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
  1. 11
      src/control/settings/Settings.h
  2. 4
      src/gui/Layout.cpp
  3. 11
      src/gui/XournalView.cpp
  4. 91
      src/gui/widgets/XournalWidget.cpp

@ -449,9 +449,14 @@ private:
bool autosaveEnabled;
/**
* Allow scroll outside the page
* Allow scroll outside the page (horizontal)
*/
bool addHorizontalSpace, addVerticalSpace;
bool addHorizontalSpace;
/**
* Allow scroll outside the page (vertical)
*/
bool addVerticalSpace;
/**
* Enable Bugfix to prevent crash on GTK 2.18 etc
@ -461,7 +466,7 @@ private:
/**
* Default name if you save a new document
*/
string defaultSaveName; //should be string - don't change to path
string defaultSaveName; // should be string - don't change to path
/**
* The button config

@ -314,9 +314,9 @@ void Layout::layoutPages()
y += XOURNAL_PADDING_BETWEEN + verticalSpaceBetweenSlides;
}
int height = 2*marginTop + XOURNAL_PADDING + y + XOURNAL_PADDING;
int height = 2 * marginTop + XOURNAL_PADDING + y + XOURNAL_PADDING;
width += 2*marginLeft;
width += 2 * marginLeft;
this->setLayoutSize(width, height);
this->view->pagePosition->update(this->view->viewPages, len, height);

@ -61,15 +61,14 @@ XournalView::XournalView(GtkWidget* parent, Control* control)
// pinch-to-zoom
this->zoom_gesture_active = false;
// use parent as the gestures widget and not this->widget as gesture gets
// buggy otherwise (scrolling interferes with gestures scale value)
this->zoom_gesture = gtk_gesture_zoom_new (parent);
this->zoom_gesture = gtk_gesture_zoom_new(parent);
gtk_event_controller_set_propagation_phase (GTK_EVENT_CONTROLLER (this->zoom_gesture), GTK_PHASE_CAPTURE);
g_signal_connect (this->zoom_gesture, "begin", G_CALLBACK (zoom_gesture_begin_cb), this);
g_signal_connect (this->zoom_gesture, "scale-changed", G_CALLBACK (zoom_gesture_scale_changed_cb), this);
g_signal_connect (this->zoom_gesture, "end", G_CALLBACK (zoom_gesture_end_cb), this);
gtk_event_controller_set_propagation_phase(GTK_EVENT_CONTROLLER(this->zoom_gesture), GTK_PHASE_CAPTURE);
g_signal_connect(this->zoom_gesture, "begin", G_CALLBACK (zoom_gesture_begin_cb), this);
g_signal_connect(this->zoom_gesture, "scale-changed", G_CALLBACK (zoom_gesture_scale_changed_cb), this);
g_signal_connect(this->zoom_gesture, "end", G_CALLBACK (zoom_gesture_end_cb), this);
}
XournalView::~XournalView()

@ -10,6 +10,7 @@
#include "gui/pageposition/PagePositionHandler.h"
#include "gui/Shadow.h"
#include "gui/XournalView.h"
#include "util/DeviceListHelper.h"
#include <config-debug.h>
#include <Rectangle.h>
@ -37,18 +38,17 @@ static void gtk_xournal_size_allocate(GtkWidget* widget,
static void gtk_xournal_realize(GtkWidget* widget);
static gboolean gtk_xournal_draw(GtkWidget* widget, cairo_t* cr);
static void gtk_xournal_destroy(GtkWidget* object);
static gboolean gtk_xournal_button_press_event(GtkWidget* widget,
GdkEventButton* event);
static gboolean gtk_xournal_button_release_event(GtkWidget* widget,
GdkEventButton* event);
static gboolean gtk_xournal_motion_notify_event(GtkWidget* widget,
GdkEventMotion* event);
static gboolean gtk_xournal_key_press_event(GtkWidget* widget,
GdkEventKey* event);
static gboolean gtk_xournal_key_release_event(GtkWidget* widget,
GdkEventKey* event);
static void gtk_xournal_scroll_mouse_event(GtkXournal* xournal,
GdkEventMotion* event);
static gboolean gtk_xournal_button_press_event(GtkWidget* widget, GdkEventButton* event);
static gboolean gtk_xournal_button_release_event(GtkWidget* widget, GdkEventButton* event);
static gboolean gtk_xournal_motion_notify_event(GtkWidget* widget, GdkEventMotion* event);
static gboolean gtk_xournal_touch_event(GtkWidget* widget, GdkEventTouch* event);
static gboolean gtk_xournal_key_press_event(GtkWidget* widget, GdkEventKey* event);
static gboolean gtk_xournal_key_release_event(GtkWidget* widget, GdkEventKey* event);
static void gtk_xournal_scroll_mouse_event(GtkXournal* xournal, GdkEventMotion* event);
XojPageView *current_view;
@ -90,6 +90,30 @@ GType gtk_xournal_get_type(void)
return gtk_xournal_type;
}
static void gtk_xournal_init_touch_handling(GtkXournal* xournal)
{
// Currently does not work, needs further testing
// Settings* settings = xournal->view->getControl()->getSettings();
// ButtonConfig* cfg = settings->getTouchButtonConfig();
//
// if (cfg->getDisableDrawing())
// {
// DeviceListHelper devList;
// for (InputDevice& dev : devList.getDeviceList())
// {
// if (cfg->device == dev.getName())
// {
// printf("Disable device for drawing: %s\n", dev.getName().c_str());
//// gtk_widget_set_device_enabled(GTK_WIDGET(xournal), dev.getDevice(), false);
// gtk_widget_set_device_events(GTK_WIDGET(xournal), dev.getDevice(), (GdkEventMask) 0);
// return;
// }
// }
//
// printf("Could NOT disable device for drawing!\n");
// }
}
GtkWidget* gtk_xournal_new(XournalView* view, GtkScrollable* parent)
{
GtkXournal* xoj = GTK_XOURNAL(g_object_new(gtk_xournal_get_type(), NULL));
@ -113,6 +137,8 @@ GtkWidget* gtk_xournal_new(XournalView* view, GtkScrollable* parent)
xoj->selection = NULL;
xoj->shiftDown = false;
gtk_xournal_init_touch_handling(xoj);
return GTK_WIDGET(xoj);
}
@ -126,10 +152,13 @@ static void gtk_xournal_class_init(GtkXournalClass* klass)
widget_class->get_preferred_width = gtk_xournal_get_preferred_width;
widget_class->get_preferred_height = gtk_xournal_get_preferred_height;
widget_class->size_allocate = gtk_xournal_size_allocate;
widget_class->button_press_event = gtk_xournal_button_press_event;
widget_class->button_release_event = gtk_xournal_button_release_event;
widget_class->motion_notify_event = gtk_xournal_motion_notify_event;
widget_class->touch_event = gtk_xournal_touch_event;
widget_class->key_press_event = gtk_xournal_key_press_event;
widget_class->key_release_event = gtk_xournal_key_release_event;
@ -261,26 +290,25 @@ bool gtk_xournal_scroll_callback(GtkXournal* xournal)
static void gtk_xournal_scroll_mouse_event(GtkXournal* xournal, GdkEventMotion* event)
{
// use root coordinates as reference point because
//scrolling changes window relative coordinates
//see github Gnome/evince@1adce5486b10e763bed869
int x_root = event->x_root;
int y_root = event->y_root;
// use root coordinates as reference point because
// scrolling changes window relative coordinates
// see github Gnome/evince@1adce5486b10e763bed869
int x_root = event->x_root;
int y_root = event->y_root;
if (xournal->lastMousePositionX - x_root == 0 &&
xournal->lastMousePositionY - y_root == 0)
if (xournal->lastMousePositionX - x_root == 0 && xournal->lastMousePositionY - y_root == 0)
{
return;
}
if (xournal->scrollOffsetX == 0 && xournal->scrollOffsetY == 0)
{
xournal->scrollOffsetX = xournal->lastMousePositionX - x_root;
xournal->scrollOffsetY = xournal->lastMousePositionY - y_root;
xournal->scrollOffsetX = xournal->lastMousePositionX - x_root;
xournal->scrollOffsetY = xournal->lastMousePositionY - y_root;
g_idle_add((GSourceFunc) gtk_xournal_scroll_callback, xournal);
//gtk_xournal_scroll_callback(xournal);
xournal->lastMousePositionX = x_root;
xournal->lastMousePositionX = x_root;
xournal->lastMousePositionY = y_root;
}
}
@ -573,6 +601,22 @@ gboolean gtk_xournal_motion_notify_event(GtkWidget* widget, GdkEventMotion* even
return false;
}
gboolean gtk_xournal_touch_event(GtkWidget* widget, GdkEventTouch* event)
{
g_return_val_if_fail(widget != NULL, FALSE);
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!
// Consume event
return true;
}
static void gtk_xournal_init(GtkXournal* xournal)
{
GtkWidget* widget = GTK_WIDGET(xournal);
@ -583,7 +627,8 @@ static void gtk_xournal_init(GtkXournal* xournal)
events |= GDK_POINTER_MOTION_MASK;
events |= GDK_EXPOSURE_MASK;
events |= GDK_BUTTON_MOTION_MASK;
// not sure if GDK_TOUCH_MASK is needed
// See documentation: https://developer.gnome.org/gtk3/stable/chap-input-handling.html
events |= GDK_TOUCH_MASK;
events |= GDK_BUTTON_PRESS_MASK;
events |= GDK_BUTTON_RELEASE_MASK;

Loading…
Cancel
Save