don't draw under decorations on wayland

This commit is contained in:
Caolán McNamara 2015-07-24 13:40:55 +01:00
parent 4788eaecfd
commit e7fc28a974
2 changed files with 134 additions and 0 deletions

View File

@ -0,0 +1,133 @@
From c19e079bc1a2cce977bd0e2bbba5901108180615 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Caol=C3=A1n=20McNamara?= <caolanm@redhat.com>
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

View File

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