|
|
|
|
@ -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; |
|
|
|
|
|