You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
279 lines
9.3 KiB
279 lines
9.3 KiB
From 9f13817e695a46c9dc9ef79a63f26d828e6a7368 Mon Sep 17 00:00:00 2001
|
|
From: =?UTF-8?q?Caol=C3=A1n=20McNamara?= <caolanm@redhat.com>
|
|
Date: Fri, 12 Feb 2016 16:55:12 +0000
|
|
Subject: [PATCH 2/5] split the gtk2 and gtk3 gtkobjects
|
|
|
|
(cherry picked from commit 31fa4545985acc1594107e087cedc2d99b3d0f0b)
|
|
|
|
Change-Id: I32084232c44a12e9641010b51e75710abc827695
|
|
---
|
|
vcl/unx/gtk/gtkobject.cxx | 21 -----
|
|
vcl/unx/gtk3/gtk3gtkobject.cxx | 185 ++++++++++++++++++++++++++++++++++++++++-
|
|
2 files changed, 184 insertions(+), 22 deletions(-)
|
|
|
|
diff --git a/vcl/unx/gtk/gtkobject.cxx b/vcl/unx/gtk/gtkobject.cxx
|
|
index 35084aa..cc78ff5 100644
|
|
--- a/vcl/unx/gtk/gtkobject.cxx
|
|
+++ b/vcl/unx/gtk/gtkobject.cxx
|
|
@@ -51,7 +51,6 @@ GtkSalObject::GtkSalObject( GtkSalFrame* pParent, bool bShow )
|
|
|
|
// system data
|
|
m_aSystemData.nSize = sizeof( SystemEnvData );
|
|
-#if !GTK_CHECK_VERSION(3,0,0)
|
|
SalDisplay* pDisp = vcl_sal::getSalDisplay(GetGenericData());
|
|
m_aSystemData.pDisplay = pDisp->GetDisplay();
|
|
m_aSystemData.pVisual = pDisp->GetVisual(pParent->getXScreenNumber()).GetVisual();
|
|
@@ -59,12 +58,6 @@ GtkSalObject::GtkSalObject( GtkSalFrame* pParent, bool bShow )
|
|
m_aSystemData.aColormap = pDisp->GetColormap(pParent->getXScreenNumber()).GetXColormap();
|
|
m_aSystemData.aWindow = GDK_WINDOW_XWINDOW(widget_get_window(m_pSocket));
|
|
m_aSystemData.aShellWindow = GDK_WINDOW_XWINDOW(widget_get_window(GTK_WIDGET(pParent->getWindow())));
|
|
-#else
|
|
- static int nWindow = 0;
|
|
- m_aSystemData.aWindow = nWindow;
|
|
- ++nWindow;
|
|
- m_aSystemData.aShellWindow = reinterpret_cast<long>(this);
|
|
-#endif
|
|
m_aSystemData.pSalFrame = nullptr;
|
|
m_aSystemData.pWidget = m_pSocket;
|
|
m_aSystemData.nScreen = pParent->getXScreenNumber().getXScreen();
|
|
@@ -86,11 +79,7 @@ GtkSalObject::~GtkSalObject()
|
|
{
|
|
if( m_pRegion )
|
|
{
|
|
-#if GTK_CHECK_VERSION(3,0,0)
|
|
- cairo_region_destroy( m_pRegion );
|
|
-#else
|
|
gdk_region_destroy( m_pRegion );
|
|
-#endif
|
|
}
|
|
if( m_pSocket )
|
|
{
|
|
@@ -119,15 +108,9 @@ sal_uInt16 GtkSalObject::GetClipRegionType()
|
|
|
|
void GtkSalObject::BeginSetClipRegion( sal_uLong )
|
|
{
|
|
-#if GTK_CHECK_VERSION(3,0,0)
|
|
- if( m_pRegion )
|
|
- cairo_region_destroy( m_pRegion );
|
|
- m_pRegion = cairo_region_create();
|
|
-#else
|
|
if( m_pRegion )
|
|
gdk_region_destroy( m_pRegion );
|
|
m_pRegion = gdk_region_new();
|
|
-#endif
|
|
}
|
|
|
|
void GtkSalObject::UnionClipRegion( long nX, long nY, long nWidth, long nHeight )
|
|
@@ -138,11 +121,7 @@ void GtkSalObject::UnionClipRegion( long nX, long nY, long nWidth, long nHeight
|
|
aRect.width = nWidth;
|
|
aRect.height = nHeight;
|
|
|
|
-#if GTK_CHECK_VERSION(3,0,0)
|
|
- cairo_region_union_rectangle( m_pRegion, &aRect );
|
|
-#else
|
|
gdk_region_union_with_rect( m_pRegion, &aRect );
|
|
-#endif
|
|
}
|
|
|
|
void GtkSalObject::EndSetClipRegion()
|
|
diff --git a/vcl/unx/gtk3/gtk3gtkobject.cxx b/vcl/unx/gtk3/gtk3gtkobject.cxx
|
|
index 96c1527..8c06b4e 100644
|
|
--- a/vcl/unx/gtk3/gtk3gtkobject.cxx
|
|
+++ b/vcl/unx/gtk3/gtk3gtkobject.cxx
|
|
@@ -5,8 +5,191 @@
|
|
* This Source Code Form is subject to the terms of the Mozilla Public
|
|
* License, v. 2.0. If a copy of the MPL was not distributed with this
|
|
* file, You can obtain one at http://mozilla.org/MPL/2.0/.
|
|
+ *
|
|
+ * This file incorporates work covered by the following license notice:
|
|
+ *
|
|
+ * Licensed to the Apache Software Foundation (ASF) under one or more
|
|
+ * contributor license agreements. See the NOTICE file distributed
|
|
+ * with this work for additional information regarding copyright
|
|
+ * ownership. The ASF licenses this file to you under the Apache
|
|
+ * License, Version 2.0 (the "License"); you may not use this file
|
|
+ * except in compliance with the License. You may obtain a copy of
|
|
+ * the License at http://www.apache.org/licenses/LICENSE-2.0 .
|
|
*/
|
|
|
|
-#include "../gtk/gtkobject.cxx"
|
|
+#ifdef AIX
|
|
+#define _LINUX_SOURCE_COMPAT
|
|
+#include <sys/timer.h>
|
|
+#undef _LINUX_SOURCE_COMPAT
|
|
+#endif
|
|
+
|
|
+#include <unx/gtk/gtkobject.hxx>
|
|
+#include <unx/gtk/gtkframe.hxx>
|
|
+#include <unx/gtk/gtkdata.hxx>
|
|
+#include <unx/gtk/gtkinst.hxx>
|
|
+#include <unx/gtk/gtkgdi.hxx>
|
|
+
|
|
+GtkSalObject::GtkSalObject( GtkSalFrame* pParent, bool bShow )
|
|
+ : m_pSocket( nullptr ),
|
|
+ m_pRegion( nullptr )
|
|
+{
|
|
+ if( pParent )
|
|
+ {
|
|
+ // our plug window
|
|
+ m_pSocket = gtk_drawing_area_new();
|
|
+ Show( bShow );
|
|
+ // insert into container
|
|
+ gtk_fixed_put( pParent->getFixedContainer(),
|
|
+ m_pSocket,
|
|
+ 0, 0 );
|
|
+ // realize so we can get a window id
|
|
+ gtk_widget_realize( m_pSocket );
|
|
+
|
|
+ // make it transparent; some plugins may not insert
|
|
+ // their own window here but use the socket window itself
|
|
+ gtk_widget_set_app_paintable( m_pSocket, TRUE );
|
|
+
|
|
+ // system data
|
|
+ m_aSystemData.nSize = sizeof( SystemEnvData );
|
|
+ static int nWindow = 0;
|
|
+ m_aSystemData.aWindow = nWindow;
|
|
+ ++nWindow;
|
|
+ m_aSystemData.aShellWindow = reinterpret_cast<long>(this);
|
|
+ m_aSystemData.pSalFrame = nullptr;
|
|
+ m_aSystemData.pWidget = m_pSocket;
|
|
+ m_aSystemData.nScreen = pParent->getXScreenNumber().getXScreen();
|
|
+ m_aSystemData.pAppContext = nullptr;
|
|
+ m_aSystemData.pShellWidget = GTK_WIDGET(pParent->getWindow());
|
|
+
|
|
+ g_signal_connect( G_OBJECT(m_pSocket), "button-press-event", G_CALLBACK(signalButton), this );
|
|
+ g_signal_connect( G_OBJECT(m_pSocket), "button-release-event", G_CALLBACK(signalButton), this );
|
|
+ g_signal_connect( G_OBJECT(m_pSocket), "focus-in-event", G_CALLBACK(signalFocus), this );
|
|
+ g_signal_connect( G_OBJECT(m_pSocket), "focus-out-event", G_CALLBACK(signalFocus), this );
|
|
+ g_signal_connect( G_OBJECT(m_pSocket), "destroy", G_CALLBACK(signalDestroy), this );
|
|
+
|
|
+ // #i59255# necessary due to sync effects with java child windows
|
|
+ pParent->Flush();
|
|
+ }
|
|
+}
|
|
+
|
|
+GtkSalObject::~GtkSalObject()
|
|
+{
|
|
+ if( m_pRegion )
|
|
+ {
|
|
+ cairo_region_destroy( m_pRegion );
|
|
+ }
|
|
+ if( m_pSocket )
|
|
+ {
|
|
+ // remove socket from parent frame's fixed container
|
|
+ gtk_container_remove( GTK_CONTAINER(gtk_widget_get_parent(m_pSocket)),
|
|
+ m_pSocket );
|
|
+ // get rid of the socket
|
|
+ // actually the gtk_container_remove should let the ref count
|
|
+ // of the socket sink to 0 and destroy it (see signalDestroy)
|
|
+ // this is just a sanity check
|
|
+ if( m_pSocket )
|
|
+ gtk_widget_destroy( m_pSocket );
|
|
+ }
|
|
+}
|
|
+
|
|
+void GtkSalObject::ResetClipRegion()
|
|
+{
|
|
+ if( m_pSocket )
|
|
+ gdk_window_shape_combine_region( widget_get_window(m_pSocket), nullptr, 0, 0 );
|
|
+}
|
|
+
|
|
+sal_uInt16 GtkSalObject::GetClipRegionType()
|
|
+{
|
|
+ return SAL_OBJECT_CLIP_INCLUDERECTS;
|
|
+}
|
|
+
|
|
+void GtkSalObject::BeginSetClipRegion( sal_uLong )
|
|
+{
|
|
+ if( m_pRegion )
|
|
+ cairo_region_destroy( m_pRegion );
|
|
+ m_pRegion = cairo_region_create();
|
|
+}
|
|
+
|
|
+void GtkSalObject::UnionClipRegion( long nX, long nY, long nWidth, long nHeight )
|
|
+{
|
|
+ GdkRectangle aRect;
|
|
+ aRect.x = nX;
|
|
+ aRect.y = nY;
|
|
+ aRect.width = nWidth;
|
|
+ aRect.height = nHeight;
|
|
+
|
|
+ cairo_region_union_rectangle( m_pRegion, &aRect );
|
|
+}
|
|
+
|
|
+void GtkSalObject::EndSetClipRegion()
|
|
+{
|
|
+ if( m_pSocket )
|
|
+ gdk_window_shape_combine_region( widget_get_window(m_pSocket), m_pRegion, 0, 0 );
|
|
+}
|
|
+
|
|
+void GtkSalObject::SetPosSize( long nX, long nY, long nWidth, long nHeight )
|
|
+{
|
|
+ if( m_pSocket )
|
|
+ {
|
|
+ GtkFixed* pContainer = GTK_FIXED(gtk_widget_get_parent(m_pSocket));
|
|
+ gtk_fixed_move( pContainer, m_pSocket, nX, nY );
|
|
+ gtk_widget_set_size_request( m_pSocket, nWidth, nHeight );
|
|
+ gtk_container_resize_children( GTK_CONTAINER(pContainer) );
|
|
+ }
|
|
+}
|
|
+
|
|
+void GtkSalObject::Show( bool bVisible )
|
|
+{
|
|
+ if( m_pSocket )
|
|
+ {
|
|
+ if( bVisible )
|
|
+ gtk_widget_show( m_pSocket );
|
|
+ else
|
|
+ gtk_widget_hide( m_pSocket );
|
|
+ }
|
|
+}
|
|
+
|
|
+const SystemEnvData* GtkSalObject::GetSystemData() const
|
|
+{
|
|
+ return &m_aSystemData;
|
|
+}
|
|
+
|
|
+gboolean GtkSalObject::signalButton( GtkWidget*, GdkEventButton* pEvent, gpointer object )
|
|
+{
|
|
+ GtkSalObject* pThis = static_cast<GtkSalObject*>(object);
|
|
+
|
|
+ if( pEvent->type == GDK_BUTTON_PRESS )
|
|
+ {
|
|
+ pThis->CallCallback( SALOBJ_EVENT_TOTOP, nullptr );
|
|
+ }
|
|
+
|
|
+ return FALSE;
|
|
+}
|
|
+
|
|
+gboolean GtkSalObject::signalFocus( GtkWidget*, GdkEventFocus* pEvent, gpointer object )
|
|
+{
|
|
+ GtkSalObject* pThis = static_cast<GtkSalObject*>(object);
|
|
+
|
|
+ pThis->CallCallback( pEvent->in ? SALOBJ_EVENT_GETFOCUS : SALOBJ_EVENT_LOSEFOCUS, nullptr );
|
|
+
|
|
+ return FALSE;
|
|
+}
|
|
+
|
|
+void GtkSalObject::signalDestroy( GtkWidget* pObj, gpointer object )
|
|
+{
|
|
+ GtkSalObject* pThis = static_cast<GtkSalObject*>(object);
|
|
+ if( pObj == pThis->m_pSocket )
|
|
+ {
|
|
+ pThis->m_pSocket = nullptr;
|
|
+ }
|
|
+}
|
|
+
|
|
+void GtkSalObject::SetForwardKey( bool bEnable )
|
|
+{
|
|
+ if( bEnable )
|
|
+ gtk_widget_add_events( GTK_WIDGET( m_pSocket ), GDK_KEY_PRESS_MASK | GDK_KEY_RELEASE );
|
|
+ else
|
|
+ gtk_widget_set_events( GTK_WIDGET( m_pSocket ), ~(GDK_KEY_PRESS_MASK | GDK_KEY_RELEASE) & gtk_widget_get_events( GTK_WIDGET( m_pSocket ) ) );
|
|
+}
|
|
|
|
/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
|
|
--
|
|
2.7.1
|
|
|