1 /* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
3 * This file is part of the LibreOffice project.
5 * This Source Code Form is subject to the terms of the Mozilla Public
6 * License, v. 2.0. If a copy of the MPL was not distributed with this
7 * file, You can obtain one at http://mozilla.org/MPL/2.0/.
9 * This file incorporates work covered by the following license notice:
11 * Licensed to the Apache Software Foundation (ASF) under one or more
12 * contributor license agreements. See the NOTICE file distributed
13 * with this work for additional information regarding copyright
14 * ownership. The ASF licenses this file to you under the Apache
15 * License, Version 2.0 (the "License"); you may not use this file
16 * except in compliance with the License. You may obtain a copy of
17 * the License at http://www.apache.org/licenses/LICENSE-2.0 .
20 #ifndef _VCL_WMADAPTOR_HXX_
21 #define _VCL_WMADAPTOR_HXX_
23 #include <tools/string.hxx>
24 #include <tools/gen.hxx>
30 #include <vclpluginapi.h>
38 class VCLPLUG_GEN_PUBLIC WMAdaptor
45 // atoms for extended WM hints
47 NET_SUPPORTING_WM_CHECK
,
54 NET_WM_STATE_MAXIMIZED_HORZ
,
55 NET_WM_STATE_MAXIMIZED_VERT
,
58 NET_WM_STATE_SKIP_PAGER
,
59 NET_WM_STATE_SKIP_TASKBAR
,
60 NET_WM_STATE_STAYS_ON_TOP
,
62 NET_WM_STATE_FULLSCREEN
,
67 NET_WM_WINDOW_TYPE_DESKTOP
,
68 NET_WM_WINDOW_TYPE_DIALOG
,
69 NET_WM_WINDOW_TYPE_DOCK
,
70 NET_WM_WINDOW_TYPE_MENU
,
71 NET_WM_WINDOW_TYPE_NORMAL
,
72 NET_WM_WINDOW_TYPE_TOOLBAR
,
73 KDE_NET_WM_WINDOW_TYPE_OVERRIDE
,
74 NET_WM_WINDOW_TYPE_SPLASH
,
75 NET_WM_WINDOW_TYPE_UTILITY
,
76 NET_NUMBER_OF_DESKTOPS
,
80 // atoms for Gnome WM hints
81 WIN_SUPPORTING_WM_CHECK
,
94 // atoms for general WM hints
119 * flags for frame decoration
121 static const int decoration_Title
= 0x00000001;
122 static const int decoration_Border
= 0x00000002;
123 static const int decoration_Resize
= 0x00000004;
124 static const int decoration_MinimizeBtn
= 0x00000008;
125 static const int decoration_MaximizeBtn
= 0x00000010;
126 static const int decoration_CloseBtn
= 0x00000020;
127 static const int decoration_All
= 0x10000000;
135 windowType_ModalDialogue
,
136 windowType_ModelessDialogue
,
144 SalDisplay
* m_pSalDisplay
; // Display to use
145 Display
* m_pDisplay
; // X Display of SalDisplay
147 Atom m_aWMAtoms
[ NetAtomMax
];
149 bool m_bEqualWorkAreas
;
150 ::std::vector
< Rectangle
>
152 bool m_bTransientBehaviour
;
153 bool m_bEnableAlwaysOnTopWorks
;
154 bool m_bLegacyPartialFullscreen
;
156 int m_nInitWinGravity
;
157 bool m_bWMshouldSwitchWorkspace
;
158 bool m_bWMshouldSwitchWorkspaceInit
;
160 WMAdaptor( SalDisplay
* )
166 * returns whether this instance is useful
167 * only useful for createWMAdaptor
169 virtual bool isValid() const;
171 bool getWMshouldSwitchWorkspace() const;
173 virtual ~WMAdaptor();
176 * creates a vaild WMAdaptor instance for the SalDisplay
178 static WMAdaptor
* createWMAdaptor( SalDisplay
* );
181 * may return an empty string if the window manager could
184 const String
& getWindowManagerName() const
185 { return m_aWMName
; }
188 * gets the number of workareas
190 int getWorkAreaCount() const
191 { return m_aWMWorkAreas
.size(); }
194 * gets the current work area/desktop number: [0,m_nDesktops[ or -1 if unknown
196 int getCurrentWorkArea() const;
198 * gets the workarea the specified window is on (or -1)
200 int getWindowWorkArea( XLIB_Window aWindow
) const;
202 * gets the specified workarea
204 const Rectangle
& getWorkArea( int n
) const
205 { return m_aWMWorkAreas
[n
]; }
208 * attemp to switch the desktop to a certain workarea
209 * if bConsiderWM is true, then on some WMs the call will not result in any action
211 void switchToWorkArea( int nWorkArea
, bool bConsiderWM
= true ) const;
216 virtual void setWMName( X11SalFrame
* pFrame
, const String
& rWMName
) const;
221 virtual void setPID( X11SalFrame
* pFrame
) const;
224 * set WM_CLIENT_MACHINE
226 virtual void setClientMachine( X11SalFrame
* pFrame
) const;
228 virtual void answerPing( X11SalFrame
*, XClientMessageEvent
* ) const;
232 * maximization can be toggled in either direction
233 * to get the original position and size
234 * use maximizeFrame( pFrame, false, false )
236 virtual void maximizeFrame( X11SalFrame
* pFrame
, bool bHorizontal
= true, bool bVertical
= true ) const;
238 * start/stop fullscreen mode on a frame
240 virtual void showFullScreen( X11SalFrame
* pFrame
, bool bFullScreen
) const;
242 * tell whether legacy partial full screen handling is necessary
243 * see #i107249#: NET_WM_STATE_FULLSCREEN is not well defined, but de facto
244 * modern WM's interpret it the "right" way, namely they make "full screen"
245 * taking twin view or Xinerama into accound and honor the positioning hints
246 * to see which screen actually was meant to use for fullscreen.
248 bool isLegacyPartialFullscreen() const
249 { return m_bLegacyPartialFullscreen
; }
253 virtual void setFrameStruts( X11SalFrame
*pFrame
,
254 int left
, int right
, int top
, int bottom
,
255 int left_start_y
, int left_end_y
,
256 int right_start_y
, int right_end_y
,
257 int top_start_x
, int top_end_x
,
258 int bottom_start_x
, int bottom_end_x
) const;
260 * set _NET_WM_USER_TIME property, if NetWM
262 virtual void setUserTime( X11SalFrame
* i_pFrame
, long i_nUserTime
) const;
265 * tells whether fullscreen mode is supported by WM
267 bool supportsFullScreen() const { return m_aWMAtoms
[ NET_WM_STATE_FULLSCREEN
] != 0; }
270 * shade/unshade frame
272 virtual void shade( X11SalFrame
* pFrame
, bool bToShaded
) const;
275 * set hints what decoration is needed;
276 * must be called before showing the frame
278 virtual void setFrameTypeAndDecoration( X11SalFrame
* pFrame
, WMWindowType eType
, int nDecorationFlags
, X11SalFrame
* pTransientFrame
= NULL
) const;
281 * tells whether there is WM support for splash screens
283 bool supportsSplash() const { return m_aWMAtoms
[ NET_WM_WINDOW_TYPE_SPLASH
] != 0; }
286 * tells whteher there is WM support for NET_WM_WINDOW_TYPE_TOOLBAR
288 bool supportsToolbar() const { return m_aWMAtoms
[ NET_WM_WINDOW_TYPE_TOOLBAR
] != 0; }
291 * enables always on top or equivalent if possible
293 virtual void enableAlwaysOnTop( X11SalFrame
* pFrame
, bool bEnable
) const;
296 * tells whether enableAlwaysOnTop actually works with this WM
298 bool isAlwaysOnTopOK() const { return m_bEnableAlwaysOnTopWorks
; }
301 * handle WM messages (especially WM state changes)
303 virtual int handlePropertyNotify( X11SalFrame
* pFrame
, XPropertyEvent
* pEvent
) const;
306 * called by SalFrame::Show: time to update state properties
308 virtual void frameIsMapping( X11SalFrame
* ) const;
313 Atom
getAtom( WMAtom eAtom
) const
314 { return m_aWMAtoms
[ eAtom
]; }
316 int getPositionWinGravity () const
317 { return m_nWinGravity
; }
318 int getInitWinGravity() const
319 { return m_nInitWinGravity
; }
322 * expected behaviour is that the WM will not allow transient
323 * windows to get stacked behind the windows they are transient for
325 bool isTransientBehaviourAsExpected() const
326 { return m_bTransientBehaviour
; }
329 * changes the transient hint of a window to reference frame
330 * if reference frame is NULL the root window is used instead
332 void changeReferenceFrame( X11SalFrame
* pFrame
, X11SalFrame
* pReferenceFrame
) const;
339 /* vim:set shiftwidth=4 softtabstop=4 expandtab: */