bump product version to 7.2.5.1
[LibreOffice.git] / vcl / inc / unx / wmadaptor.hxx
blobe76ba4d3693821e4d7e0e97b6d9010d3d7c5aeeb
1 /* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
2 /*
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 INCLUDED_VCL_INC_UNX_WMADAPTOR_HXX
21 #define INCLUDED_VCL_INC_UNX_WMADAPTOR_HXX
23 #include <rtl/ustring.hxx>
24 #include <tools/gen.hxx>
26 #include <X11/Xlib.h>
28 #include <vclpluginapi.h>
29 #include "salframe.h"
30 #include <vector>
32 class SalDisplay;
33 class X11SalFrame;
35 namespace vcl_sal {
37 class WMAdaptor
39 public:
40 enum WMAtom {
41 // atoms for types
42 UTF8_STRING,
44 // atoms for extended WM hints
45 NET_ACTIVE_WINDOW,
46 NET_SUPPORTED,
47 NET_SUPPORTING_WM_CHECK,
48 NET_WM_NAME,
49 NET_WM_DESKTOP,
50 NET_WM_ICON_NAME,
51 NET_WM_PID,
52 NET_WM_PING,
53 NET_WM_STATE,
54 NET_WM_STATE_MAXIMIZED_HORZ,
55 NET_WM_STATE_MAXIMIZED_VERT,
56 NET_WM_STATE_MODAL,
57 NET_WM_STATE_SKIP_PAGER,
58 NET_WM_STATE_SKIP_TASKBAR,
59 NET_WM_STATE_STAYS_ON_TOP,
60 NET_WM_STATE_STICKY,
61 NET_WM_STATE_FULLSCREEN,
62 NET_WM_STRUT,
63 NET_WM_STRUT_PARTIAL,
64 NET_WM_USER_TIME,
65 NET_WM_WINDOW_TYPE,
66 NET_WM_WINDOW_TYPE_DESKTOP,
67 NET_WM_WINDOW_TYPE_DIALOG,
68 NET_WM_WINDOW_TYPE_DOCK,
69 NET_WM_WINDOW_TYPE_MENU,
70 NET_WM_WINDOW_TYPE_NORMAL,
71 NET_WM_WINDOW_TYPE_TOOLBAR,
72 KDE_NET_WM_WINDOW_TYPE_OVERRIDE,
73 NET_WM_WINDOW_TYPE_SPLASH,
74 NET_WM_WINDOW_TYPE_UTILITY,
75 NET_NUMBER_OF_DESKTOPS,
76 NET_CURRENT_DESKTOP,
77 NET_WORKAREA,
78 NET_WM_ICON,
80 // atoms for Gnome WM hints
81 WIN_SUPPORTING_WM_CHECK,
82 WIN_PROTOCOLS,
83 WIN_WORKSPACE_COUNT,
84 WIN_WORKSPACE,
85 WIN_LAYER,
86 WIN_STATE,
87 WIN_HINTS,
88 WIN_APP_STATE,
89 WIN_EXPANDED_SIZE,
90 WIN_ICONS,
91 WIN_CLIENT_LIST,
93 // atoms for general WM hints
94 WM_STATE,
95 MOTIF_WM_HINTS,
96 WM_PROTOCOLS,
97 WM_DELETE_WINDOW,
98 WM_TAKE_FOCUS,
99 WM_CLIENT_LEADER,
100 WM_COMMAND,
101 WM_LOCALE_NAME,
102 WM_TRANSIENT_FOR,
104 // special atoms
105 SAL_QUITEVENT,
106 SAL_USEREVENT,
107 SAL_EXTTEXTEVENT,
108 SAL_GETTIMEEVENT,
109 VCL_SYSTEM_SETTINGS,
110 XSETTINGS,
111 XEMBED,
112 XEMBED_INFO,
113 NetAtomMax
117 * flags for frame decoration
119 static const int decoration_Title = 0x00000001;
120 static const int decoration_Border = 0x00000002;
121 static const int decoration_Resize = 0x00000004;
122 static const int decoration_MinimizeBtn = 0x00000008;
123 static const int decoration_MaximizeBtn = 0x00000010;
124 static const int decoration_CloseBtn = 0x00000020;
125 static const int decoration_All = 0x10000000;
127 protected:
128 SalDisplay* m_pSalDisplay; // Display to use
129 Display* m_pDisplay; // X Display of SalDisplay
130 OUString m_aWMName;
131 Atom m_aWMAtoms[ NetAtomMax];
132 int m_nDesktops;
133 bool m_bEqualWorkAreas;
134 ::std::vector< tools::Rectangle >
135 m_aWMWorkAreas;
136 bool m_bEnableAlwaysOnTopWorks;
137 bool m_bLegacyPartialFullscreen;
138 int m_nWinGravity;
139 int m_nInitWinGravity;
140 bool m_bWMshouldSwitchWorkspace;
141 bool m_bWMshouldSwitchWorkspaceInit;
143 WMAdaptor( SalDisplay * )
145 void initAtoms();
146 bool getNetWmName();
149 * returns whether this instance is useful
150 * only useful for createWMAdaptor
152 virtual bool isValid() const;
154 bool getWMshouldSwitchWorkspace() const;
155 public:
156 virtual ~WMAdaptor();
159 * creates a valid WMAdaptor instance for the SalDisplay
161 static std::unique_ptr<WMAdaptor> createWMAdaptor( SalDisplay* );
164 * may return an empty string if the window manager could
165 * not be identified.
167 const OUString& getWindowManagerName() const
168 { return m_aWMName; }
171 * gets the current work area/desktop number: [0,m_nDesktops[ or -1 if unknown
173 int getCurrentWorkArea() const;
175 * gets the workarea the specified window is on (or -1)
177 int getWindowWorkArea( ::Window aWindow ) const;
179 * gets the specified workarea
181 const tools::Rectangle& getWorkArea( int n ) const
182 { return m_aWMWorkAreas[n]; }
185 * attempt to switch the desktop to a certain workarea (ie. virtual desktops)
187 void switchToWorkArea( int nWorkArea ) const;
190 * sets window title
192 virtual void setWMName( X11SalFrame* pFrame, const OUString& rWMName ) const;
195 * set NET_WM_PID
197 void setPID( X11SalFrame const * pFrame ) const;
200 * set WM_CLIENT_MACHINE
202 void setClientMachine( X11SalFrame const * pFrame ) const;
204 void answerPing( X11SalFrame const *, XClientMessageEvent const * ) const;
207 * maximizes frame
208 * maximization can be toggled in either direction
209 * to get the original position and size
210 * use maximizeFrame( pFrame, false, false )
212 virtual void maximizeFrame( X11SalFrame* pFrame, bool bHorizontal = true, bool bVertical = true ) const;
214 * start/stop fullscreen mode on a frame
216 virtual void showFullScreen( X11SalFrame* pFrame, bool bFullScreen ) const;
218 * tell whether legacy partial full screen handling is necessary
219 * see #i107249#: NET_WM_STATE_FULLSCREEN is not well defined, but de facto
220 * modern WM's interpret it the "right" way, namely they make "full screen"
221 * taking twin view or Xinerama into account and honor the positioning hints
222 * to see which screen actually was meant to use for fullscreen.
224 bool isLegacyPartialFullscreen() const
225 { return m_bLegacyPartialFullscreen; }
227 * set _NET_WM_USER_TIME property, if NetWM
229 virtual void setUserTime( X11SalFrame* i_pFrame, tools::Long i_nUserTime ) const;
232 * tells whether fullscreen mode is supported by WM
234 bool supportsFullScreen() const { return m_aWMAtoms[ NET_WM_STATE_FULLSCREEN ] != 0; }
237 * set hints what decoration is needed;
238 * must be called before showing the frame
240 virtual void setFrameTypeAndDecoration( X11SalFrame* pFrame, WMWindowType eType, int nDecorationFlags, X11SalFrame* pTransientFrame ) const;
243 * tells whether there is WM support for splash screens
245 bool supportsSplash() const { return m_aWMAtoms[ NET_WM_WINDOW_TYPE_SPLASH ] != 0; }
248 * enables always on top or equivalent if possible
250 virtual void enableAlwaysOnTop( X11SalFrame* pFrame, bool bEnable ) const;
253 * tells whether enableAlwaysOnTop actually works with this WM
255 bool isAlwaysOnTopOK() const { return m_bEnableAlwaysOnTopWorks; }
258 * handle WM messages (especially WM state changes)
260 virtual int handlePropertyNotify( X11SalFrame* pFrame, XPropertyEvent* pEvent ) const;
263 * called by SalFrame::Show: time to update state properties
265 virtual void frameIsMapping( X11SalFrame* ) const;
268 * gets a WM atom
270 Atom getAtom( WMAtom eAtom ) const
271 { return m_aWMAtoms[ eAtom ]; }
273 int getPositionWinGravity () const
274 { return m_nWinGravity; }
275 int getInitWinGravity() const
276 { return m_nInitWinGravity; }
279 * changes the transient hint of a window to reference frame
280 * if reference frame is NULL the root window is used instead
282 void changeReferenceFrame( X11SalFrame* pFrame, X11SalFrame const * pReferenceFrame ) const;
285 * Requests the change of active window by sending
286 * _NET_ACTIVE_WINDOW message to the frame. The frame
287 * has to be mapped
289 void activateWindow( X11SalFrame const *pFrame, Time nTimestamp );
292 } // namespace
294 #endif
296 /* vim:set shiftwidth=4 softtabstop=4 expandtab: */