From e7fc28a974033dd31583e6bc353ac60945768e59 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Caol=C3=A1n=20McNamara?= Date: Fri, 24 Jul 2015 13:40:55 +0100 Subject: [PATCH] don't draw under decorations on wayland --- ...k3-draw-paint-to-the-fixed-container.patch | 133 ++++++++++++++++++ libreoffice.spec | 1 + 2 files changed, 134 insertions(+) create mode 100644 0001-gtk3-draw-paint-to-the-fixed-container.patch diff --git a/0001-gtk3-draw-paint-to-the-fixed-container.patch b/0001-gtk3-draw-paint-to-the-fixed-container.patch new file mode 100644 index 0000000..837f2fb --- /dev/null +++ b/0001-gtk3-draw-paint-to-the-fixed-container.patch @@ -0,0 +1,133 @@ +From c19e079bc1a2cce977bd0e2bbba5901108180615 Mon Sep 17 00:00:00 2001 +From: =?UTF-8?q?Caol=C3=A1n=20McNamara?= +Date: Fri, 24 Jul 2015 12:22:14 +0100 +Subject: [PATCH] gtk3: draw/paint to the fixed container + +which fills the toplevel window, rather than directly to the toplevel window. + +It makes no difference for X, but for wayland the window decorations are part +of the toplevel window, dropping down a level means we don't draw out menu bar +under the window decoration space + +Change-Id: Icec400efacd16b5d901107c13b6fa90c59cad0e6 +(cherry picked from commit 298c089df77d9afe2cf86bb7a6a8544a0151e8c5) +--- + vcl/inc/unx/gtk/gtkframe.hxx | 2 +- + vcl/unx/gtk/window/gtksalframe.cxx | 35 ++++++++++++++++++----------------- + 2 files changed, 19 insertions(+), 18 deletions(-) + +diff --git a/vcl/inc/unx/gtk/gtkframe.hxx b/vcl/inc/unx/gtk/gtkframe.hxx +index 6797ea82..4977a7c 100644 +--- a/vcl/inc/unx/gtk/gtkframe.hxx ++++ b/vcl/inc/unx/gtk/gtkframe.hxx +@@ -173,6 +173,7 @@ class GtkSalFrame : public SalFrame, public X11WindowProvider + + SalX11Screen m_nXScreen; + GtkWidget* m_pWindow; ++ GtkFixed* m_pFixedContainer; + GdkWindow* m_pForeignParent; + GdkNativeWindow m_aForeignParentWindow; + GdkWindow* m_pForeignTopLevel; +@@ -180,7 +181,6 @@ class GtkSalFrame : public SalFrame, public X11WindowProvider + Pixmap m_hBackgroundPixmap; + sal_uLong m_nStyle; + SalExtStyle m_nExtStyle; +- GtkFixed* m_pFixedContainer; + GtkSalFrame* m_pParent; + std::list< GtkSalFrame* > m_aChildren; + GdkWindowState m_nState; +diff --git a/vcl/unx/gtk/window/gtksalframe.cxx b/vcl/unx/gtk/window/gtksalframe.cxx +index ba2f79b..b99d48d 100644 +--- a/vcl/unx/gtk/window/gtksalframe.cxx ++++ b/vcl/unx/gtk/window/gtksalframe.cxx +@@ -414,7 +414,7 @@ void GtkSalFrame::doKeyCallback( guint state, + if (keyval == GDK_0) + { + fprintf( stderr, "force widget_queue_draw\n"); +- gtk_widget_queue_draw (m_pWindow); ++ gtk_widget_queue_draw (m_pFixedContainer); + return; + } + else if (keyval == GDK_1) +@@ -1034,12 +1034,25 @@ void GtkSalFrame::updateScreenNumber() + + void GtkSalFrame::InitCommon() + { ++ // add the fixed container child, ++ // fixed is needed since we have to position plugin windows ++ m_pFixedContainer = GTK_FIXED(g_object_new( ooo_fixed_get_type(), NULL )); ++ gtk_container_add( GTK_CONTAINER(m_pWindow), GTK_WIDGET(m_pFixedContainer) ); ++ ++ gtk_widget_set_app_paintable(GTK_WIDGET(m_pFixedContainer), true); ++ /*non-X11 displays won't show anything at all without double-buffering ++ enabled*/ ++ if (GDK_IS_X11_DISPLAY(getGdkDisplay())) ++ gtk_widget_set_double_buffered(GTK_WIDGET(m_pFixedContainer), false); ++ gtk_widget_set_redraw_on_allocate(GTK_WIDGET(m_pFixedContainer), false); ++ ++ + // connect signals + g_signal_connect( G_OBJECT(m_pWindow), "style-set", G_CALLBACK(signalStyleSet), this ); + g_signal_connect( G_OBJECT(m_pWindow), "button-press-event", G_CALLBACK(signalButton), this ); + g_signal_connect( G_OBJECT(m_pWindow), "button-release-event", G_CALLBACK(signalButton), this ); + #if GTK_CHECK_VERSION(3,0,0) +- g_signal_connect( G_OBJECT(m_pWindow), "draw", G_CALLBACK(signalDraw), this ); ++ g_signal_connect( G_OBJECT(m_pFixedContainer), "draw", G_CALLBACK(signalDraw), this ); + // g_signal_connect( G_OBJECT(m_pWindow), "state-flags-changed", G_CALLBACK(signalFlagsChanged), this ); + #if GTK_CHECK_VERSION(3,14,0) + GtkGesture *pSwipe = gtk_gesture_swipe_new(m_pWindow); +@@ -1055,7 +1068,7 @@ void GtkSalFrame::InitCommon() + #endif + + #else +- g_signal_connect( G_OBJECT(m_pWindow), "expose-event", G_CALLBACK(signalExpose), this ); ++ g_signal_connect( G_OBJECT(m_pFixedContainer), "expose-event", G_CALLBACK(signalExpose), this ); + #endif + g_signal_connect( G_OBJECT(m_pWindow), "focus-in-event", G_CALLBACK(signalFocus), this ); + g_signal_connect( G_OBJECT(m_pWindow), "focus-out-event", G_CALLBACK(signalFocus), this ); +@@ -1097,24 +1110,12 @@ void GtkSalFrame::InitCommon() + m_nAppActionGroupExportId = 0; + m_nHudAwarenessId = 0; + +- gtk_widget_set_app_paintable( m_pWindow, TRUE ); +- /*non-X11 displays won't show anything at all without double-buffering +- enabled*/ +- if (GDK_IS_X11_DISPLAY(getGdkDisplay())) +- gtk_widget_set_double_buffered( m_pWindow, FALSE ); +- gtk_widget_set_redraw_on_allocate( m_pWindow, FALSE ); +- + gtk_widget_add_events( m_pWindow, + GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK | + GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | + GDK_VISIBILITY_NOTIFY_MASK | GDK_SCROLL_MASK + ); + +- // add the fixed container child, +- // fixed is needed since we have to position plugin windows +- m_pFixedContainer = GTK_FIXED(g_object_new( ooo_fixed_get_type(), NULL )); +- gtk_container_add( GTK_CONTAINER(m_pWindow), GTK_WIDGET(m_pFixedContainer) ); +- + // show the widgets + gtk_widget_show( GTK_WIDGET(m_pFixedContainer) ); + +@@ -3639,7 +3640,7 @@ void GtkSalFrame::damaged (const basegfx::B2IBox& rDamageRect) + cairo_destroy(cr); + } + +- gtk_widget_queue_draw_area(m_pWindow, ++ gtk_widget_queue_draw_area(GTK_WIDGET(m_pFixedContainer), + rDamageRect.getMinX(), + rDamageRect.getMinY(), + rDamageRect.getWidth(), +@@ -3702,7 +3703,7 @@ void GtkSalFrame::TriggerPaintEvent() + SAL_INFO("vcl.gtk3", "force painting" << 0 << "," << 0 << " " << maGeometry.nWidth << "x" << maGeometry.nHeight); + SalPaintEvent aPaintEvt(0, 0, maGeometry.nWidth, maGeometry.nHeight, true); + CallCallback(SALEVENT_PAINT, &aPaintEvt); +- gtk_widget_queue_draw(m_pWindow); ++ gtk_widget_queue_draw(GTK_WIDGET(m_pFixedContainer)); + #endif + } + +-- +2.4.3 + diff --git a/libreoffice.spec b/libreoffice.spec index ba4a1f2..a33c66e 100644 --- a/libreoffice.spec +++ b/libreoffice.spec @@ -331,6 +331,7 @@ Patch21: 0001-implement-equalize-width-and-height-for-impress-draw.patch Patch22: 0001-f22-openjdk-for-ppc64le-has-both-these-dirs-but-jawt.patch Patch23: 0001-ppc64-simplify-this-a-little.patch Patch24: 0002-ppc64-using-a-fp-register-also-consumes-a-gp-registe.patch +Patch25: 0001-gtk3-draw-paint-to-the-fixed-container.patch %define instdir %{_libdir} %define baseinstdir %{instdir}/libreoffice