From 6e17a19a902c3bf96183855170ac7462fedcae83 Mon Sep 17 00:00:00 2001 From: Andreas Butti Date: Sun, 2 Dec 2018 08:20:45 +0100 Subject: [PATCH] Try to disable scrolling if pen is active --- src/gui/Layout.cpp | 53 ++++++++++++++++++++++++++++++++++-------- src/gui/Layout.h | 14 ++++------- src/gui/MainWindow.cpp | 12 +++++----- 3 files changed, 54 insertions(+), 25 deletions(-) diff --git a/src/gui/Layout.cpp b/src/gui/Layout.cpp index 40d07167..51fe7623 100644 --- a/src/gui/Layout.cpp +++ b/src/gui/Layout.cpp @@ -7,20 +7,38 @@ #include "widgets/XournalWidget.h" -Layout::Layout(XournalView* _view, +Layout::Layout(XournalView* view, GtkAdjustment* adjHorizontal, GtkAdjustment* adjVertical) - : view(_view), + : view(view), adjHorizontal(adjHorizontal), adjVertical(adjVertical), + lastScrollHorizontal(-1), + lastScrollVertical(-1), lastWidgetWidth(0), layoutWidth(0), layoutHeight(0) { XOJ_INIT_TYPE(Layout); - g_signal_connect(adjHorizontal, "value-changed", G_CALLBACK(adjustmentValueChanged), this); - g_signal_connect(adjVertical, "value-changed", G_CALLBACK(adjustmentValueChanged), this); + g_signal_connect(adjHorizontal, "value-changed", G_CALLBACK( + +[](GtkAdjustment* adjustment, Layout* layout) + { + XOJ_CHECK_TYPE_OBJ(layout, Layout); + layout->checkScroll(adjustment, layout->lastScrollHorizontal); + layout->updateCurrentPage(); + }), this); + + g_signal_connect(adjVertical, "value-changed", G_CALLBACK( + +[](GtkAdjustment* adjustment, Layout* layout) + { + XOJ_CHECK_TYPE_OBJ(layout, Layout); + layout->checkScroll(adjustment, layout->lastScrollVertical); + layout->updateCurrentPage(); + }), this); + + lastScrollHorizontal = gtk_adjustment_get_value(adjHorizontal); + lastScrollVertical = gtk_adjustment_get_value(adjVertical); } Layout::~Layout() @@ -28,11 +46,26 @@ Layout::~Layout() XOJ_RELEASE_TYPE(Layout); } +void Layout::checkScroll(GtkAdjustment* adjustment, double& lastScroll) +{ + XOJ_CHECK_TYPE(Layout); + + if (!view->shouldIgnoreTouchEvents()) + { + lastScroll = gtk_adjustment_get_value(adjustment); + return; + } + + gtk_adjustment_set_value(adjustment, lastScroll); +} + /** * Check which page should be selected */ void Layout::updateCurrentPage() { + XOJ_CHECK_TYPE(Layout); + Rectangle visRect = getVisibleRect(); Control* control = this->view->getControl(); @@ -116,14 +149,10 @@ void Layout::updateCurrentPage() } } -void Layout::adjustmentValueChanged(GtkAdjustment* adjustment, - Layout* layout) -{ - layout->updateCurrentPage(); -} - Rectangle Layout::getVisibleRect() { + XOJ_CHECK_TYPE(Layout); + return Rectangle(gtk_adjustment_get_value(adjHorizontal), gtk_adjustment_get_value(adjVertical), gtk_adjustment_get_page_size(adjHorizontal), @@ -135,6 +164,8 @@ Rectangle Layout::getVisibleRect() */ double Layout::getLayoutHeight() { + XOJ_CHECK_TYPE(Layout); + return layoutHeight; } @@ -143,6 +174,8 @@ double Layout::getLayoutHeight() */ double Layout::getLayoutWidth() { + XOJ_CHECK_TYPE(Layout); + return layoutWidth; } diff --git a/src/gui/Layout.h b/src/gui/Layout.h index c47a84f0..c87f51e0 100644 --- a/src/gui/Layout.h +++ b/src/gui/Layout.h @@ -84,18 +84,11 @@ public: */ void updateCurrentPage(); -public: - /** - * Callback for a changed value of one of the adjustments of - * the scrolled window. It updates the current XojPageView - * via Layout::updateCurrentPage() - */ - static void adjustmentValueChanged(GtkAdjustment* adjustment, - Layout* layout); - private: + void checkScroll(GtkAdjustment* adjustment, double& lastScroll); void setLayoutSize(int width, int height); +private: XOJ_TYPE_ATTRIB; XournalView* view; @@ -103,6 +96,9 @@ private: GtkAdjustment* adjHorizontal; GtkAdjustment* adjVertical; + double lastScrollHorizontal; + double lastScrollVertical; + /** * The last width of the widget */ diff --git a/src/gui/MainWindow.cpp b/src/gui/MainWindow.cpp index 84515d64..e0150f2e 100644 --- a/src/gui/MainWindow.cpp +++ b/src/gui/MainWindow.cpp @@ -29,8 +29,8 @@ using std::cout; using std::endl; namespace bf = boost::filesystem; -MainWindow::MainWindow(GladeSearchpath* gladeSearchPath, Control* control) : - GladeGui(gladeSearchPath, "main.glade", "mainWindow") +MainWindow::MainWindow(GladeSearchpath* gladeSearchPath, Control* control) + : GladeGui(gladeSearchPath, "main.glade", "mainWindow") { XOJ_INIT_TYPE(MainWindow); @@ -61,13 +61,13 @@ MainWindow::MainWindow(GladeSearchpath* gladeSearchPath, Control* control) : setSidebarVisible(control->getSettings()->isSidebarVisible()); // Window handler - g_signal_connect(this->window, "delete-event", (GCallback) & deleteEventCallback, this->control); - g_signal_connect(this->window, "window_state_event", G_CALLBACK(&windowStateEventCallback), this); + g_signal_connect(this->window, "delete-event", G_CALLBACK(deleteEventCallback), this->control); + g_signal_connect(this->window, "window_state_event", G_CALLBACK(windowStateEventCallback), this); g_signal_connect(get("buttonCloseSidebar"), "clicked", G_CALLBACK(buttonCloseSidebarClicked), this); // "watch over" all events - g_signal_connect(this->window, "key-press-event", (GCallback) & onKeyPressCallback, this); + g_signal_connect(this->window, "key-press-event", G_CALLBACK(onKeyPressCallback), this); this->toolbar = new ToolMenuHandler(this->control, this, GTK_WINDOW(getWindow())); @@ -97,7 +97,7 @@ MainWindow::MainWindow(GladeSearchpath* gladeSearchPath, Control* control) : createToolbarAndMenu(); GtkWidget* menuViewSidebarVisible = get("menuViewSidebarVisible"); - g_signal_connect(menuViewSidebarVisible, "toggled", (GCallback) viewShowSidebar, this); + g_signal_connect(menuViewSidebarVisible, "toggled", G_CALLBACK(viewShowSidebar), this); updateScrollbarSidebarPosition();