xref: /trunk/main/vcl/unx/gtk/window/gtkobject.cxx (revision 9f62ea84)
1 /**************************************************************
2  *
3  * Licensed to the Apache Software Foundation (ASF) under one
4  * or more contributor license agreements.  See the NOTICE file
5  * distributed with this work for additional information
6  * regarding copyright ownership.  The ASF licenses this file
7  * to you under the Apache License, Version 2.0 (the
8  * "License"); you may not use this file except in compliance
9  * with the License.  You may obtain a copy of the License at
10  *
11  *   http://www.apache.org/licenses/LICENSE-2.0
12  *
13  * Unless required by applicable law or agreed to in writing,
14  * software distributed under the License is distributed on an
15  * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16  * KIND, either express or implied.  See the License for the
17  * specific language governing permissions and limitations
18  * under the License.
19  *
20  *************************************************************/
21 
22 
23 
24 // MARKER(update_precomp.py): autogen include statement, do not remove
25 #include "precompiled_vcl.hxx"
26 
27 #include <unx/gtk/gtkobject.hxx>
28 #include <unx/gtk/gtkframe.hxx>
29 #include <unx/gtk/gtkdata.hxx>
30 #include <unx/gtk/gtkinst.hxx>
31 
GtkSalObject(GtkSalFrame * pParent,sal_Bool bShow)32 GtkSalObject::GtkSalObject( GtkSalFrame* pParent, sal_Bool bShow )
33         : m_pSocket( NULL ),
34           m_pRegion( NULL )
35 {
36     if( pParent )
37     {
38         // our plug window
39         m_pSocket = gtk_drawing_area_new();
40         Show( bShow );
41         // insert into container
42         gtk_fixed_put( pParent->getFixedContainer(),
43                        m_pSocket,
44                        0, 0 );
45         // realize so we can get a window id
46         gtk_widget_realize( m_pSocket );
47 
48 
49         // make it transparent; some plugins may not insert
50         // their own window here but use the socket window itself
51         gtk_widget_set_app_paintable( m_pSocket, TRUE );
52 
53         //system data
54         SalDisplay* pDisp = GetX11SalData()->GetDisplay();
55         m_aSystemData.nSize 		= sizeof( SystemChildData );
56         m_aSystemData.pDisplay		= pDisp->GetDisplay();
57         m_aSystemData.aWindow		= GDK_WINDOW_XWINDOW(m_pSocket->window);
58         m_aSystemData.pSalFrame		= NULL;
59         m_aSystemData.pWidget		= m_pSocket;
60         m_aSystemData.pVisual		= pDisp->GetVisual(pParent->getScreenNumber()).GetVisual();
61         m_aSystemData.nScreen		= pParent->getScreenNumber();
62         m_aSystemData.nDepth		= pDisp->GetVisual(pParent->getScreenNumber()).GetDepth();
63         m_aSystemData.aColormap		= pDisp->GetColormap(pParent->getScreenNumber()).GetXColormap();
64         m_aSystemData.pAppContext	= NULL;
65         m_aSystemData.aShellWindow	= GDK_WINDOW_XWINDOW(GTK_WIDGET(pParent->getWindow())->window);
66         m_aSystemData.pShellWidget	= GTK_WIDGET(pParent->getWindow());
67 
68         g_signal_connect( G_OBJECT(m_pSocket), "button-press-event", G_CALLBACK(signalButton), this );
69         g_signal_connect( G_OBJECT(m_pSocket), "button-release-event", G_CALLBACK(signalButton), this );
70         g_signal_connect( G_OBJECT(m_pSocket), "focus-in-event", G_CALLBACK(signalFocus), this );
71         g_signal_connect( G_OBJECT(m_pSocket), "focus-out-event", G_CALLBACK(signalFocus), this );
72         g_signal_connect( G_OBJECT(m_pSocket), "destroy", G_CALLBACK(signalDestroy), this );
73 
74         // #i59255# necessary due to sync effects with java child windows
75         pParent->Sync();
76     }
77 }
78 
~GtkSalObject()79 GtkSalObject::~GtkSalObject()
80 {
81     if( m_pRegion )
82         gdk_region_destroy( m_pRegion );
83     if( m_pSocket )
84     {
85         // remove socket from parent frame's fixed container
86         gtk_container_remove( GTK_CONTAINER(gtk_widget_get_parent(m_pSocket)),
87                               m_pSocket );
88         // get rid of the socket
89         // actually the gtk_container_remove should let the ref count
90         // of the socket sink to 0 and destroy it (see signalDestroy)
91         // this is just a sanity check
92         if( m_pSocket )
93             gtk_widget_destroy( m_pSocket );
94     }
95 }
96 
ResetClipRegion()97 void GtkSalObject::ResetClipRegion()
98 {
99     if( m_pSocket )
100         gdk_window_shape_combine_region( m_pSocket->window, NULL, 0, 0 );
101 }
102 
GetClipRegionType()103 sal_uInt16 GtkSalObject::GetClipRegionType()
104 {
105     return SAL_OBJECT_CLIP_INCLUDERECTS;
106 }
107 
BeginSetClipRegion(sal_uLong)108 void GtkSalObject::BeginSetClipRegion( sal_uLong )
109 {
110     if( m_pRegion )
111         gdk_region_destroy( m_pRegion );
112     m_pRegion = gdk_region_new();
113 }
114 
UnionClipRegion(long nX,long nY,long nWidth,long nHeight)115 void GtkSalObject::UnionClipRegion( long nX, long nY, long nWidth, long nHeight )
116 {
117     GdkRectangle aRect;
118     aRect.x			= nX;
119     aRect.y			= nY;
120     aRect.width		= nWidth;
121     aRect.height	= nHeight;
122 
123     gdk_region_union_with_rect( m_pRegion, &aRect );
124 }
125 
EndSetClipRegion()126 void GtkSalObject::EndSetClipRegion()
127 {
128     if( m_pSocket )
129         gdk_window_shape_combine_region( m_pSocket->window, m_pRegion, 0, 0 );
130 }
131 
SetPosSize(long nX,long nY,long nWidth,long nHeight)132 void GtkSalObject::SetPosSize( long nX, long nY, long nWidth, long nHeight )
133 {
134     if( m_pSocket )
135     {
136         GtkFixed* pContainer = GTK_FIXED(gtk_widget_get_parent(m_pSocket));
137         gtk_fixed_move( pContainer, m_pSocket, nX, nY );
138         gtk_widget_set_size_request( m_pSocket, nWidth, nHeight );
139         gtk_container_resize_children( GTK_CONTAINER(pContainer) );
140     }
141 }
142 
Show(sal_Bool bVisible)143 void GtkSalObject::Show( sal_Bool bVisible )
144 {
145     if( m_pSocket )
146     {
147         if( bVisible )
148             gtk_widget_show( m_pSocket );
149         else
150             gtk_widget_hide( m_pSocket );
151     }
152 }
153 
Enable(sal_Bool)154 void GtkSalObject::Enable( sal_Bool )
155 {
156 }
157 
GrabFocus()158 void GtkSalObject::GrabFocus()
159 {
160 }
161 
SetBackground()162 void GtkSalObject::SetBackground()
163 {
164 }
165 
SetBackground(SalColor)166 void GtkSalObject::SetBackground( SalColor )
167 {
168 }
169 
GetSystemData() const170 const SystemEnvData* GtkSalObject::GetSystemData() const
171 {
172     return &m_aSystemData;
173 }
174 
175 
signalButton(GtkWidget *,GdkEventButton * pEvent,gpointer object)176 gboolean GtkSalObject::signalButton( GtkWidget*, GdkEventButton* pEvent, gpointer object )
177 {
178     GtkSalObject* pThis = (GtkSalObject*)object;
179 
180     if( pEvent->type == GDK_BUTTON_PRESS )
181     {
182         GTK_YIELD_GRAB();
183         pThis->CallCallback( SALOBJ_EVENT_TOTOP, NULL );
184     }
185 
186     return FALSE;
187 }
188 
signalFocus(GtkWidget *,GdkEventFocus * pEvent,gpointer object)189 gboolean GtkSalObject::signalFocus( GtkWidget*, GdkEventFocus* pEvent, gpointer object )
190 {
191     GtkSalObject* pThis = (GtkSalObject*)object;
192 
193     GTK_YIELD_GRAB();
194 
195     pThis->CallCallback( pEvent->in ? SALOBJ_EVENT_GETFOCUS : SALOBJ_EVENT_LOSEFOCUS, NULL );
196 
197     return FALSE;
198 }
199 
signalDestroy(GtkObject * pObj,gpointer object)200 void GtkSalObject::signalDestroy( GtkObject* pObj, gpointer object )
201 {
202     GtkSalObject* pThis = (GtkSalObject*)object;
203     if( GTK_WIDGET(pObj) == pThis->m_pSocket )
204     {
205         pThis->m_pSocket = NULL;
206     }
207 }
208 
InterceptChildWindowKeyDown(sal_Bool)209 void GtkSalObject::InterceptChildWindowKeyDown( sal_Bool /*bIntercept*/ )
210 {
211 }
212 
213