blob: eb7d05dbd7e52313def5cc30fb4c4fc870dd5c7a [file] [log] [blame]
/**************************************************************
*
* 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
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*
*************************************************************/
#ifndef _VCL_WMADAPTOR_HXX_
#define _VCL_WMADAPTOR_HXX_
#ifndef _TL_STRING_HXX
#include <tools/string.hxx>
#endif
#include <tools/gen.hxx>
#ifndef _PREX_H
#include <tools/prex.h>
#include <X11/Xlib.h>
#include <tools/postx.h>
#endif
#include <vclpluginapi.h>
#include <vector>
class SalDisplay;
class X11SalFrame;
namespace vcl_sal {
class VCLPLUG_GEN_PUBLIC WMAdaptor
{
public:
enum WMAtom {
// atoms for types
UTF8_STRING,
// atoms for extended WM hints
NET_SUPPORTED,
NET_SUPPORTING_WM_CHECK,
NET_WM_NAME,
NET_WM_DESKTOP,
NET_WM_ICON_NAME,
NET_WM_PID,
NET_WM_PING,
NET_WM_STATE,
NET_WM_STATE_MAXIMIZED_HORZ,
NET_WM_STATE_MAXIMIZED_VERT,
NET_WM_STATE_MODAL,
NET_WM_STATE_SHADED,
NET_WM_STATE_SKIP_PAGER,
NET_WM_STATE_SKIP_TASKBAR,
NET_WM_STATE_STAYS_ON_TOP,
NET_WM_STATE_STICKY,
NET_WM_STATE_FULLSCREEN,
NET_WM_FULLSCREEN_MONITORS,
NET_WM_STRUT,
NET_WM_STRUT_PARTIAL,
NET_WM_USER_TIME,
NET_WM_WINDOW_TYPE,
NET_WM_WINDOW_TYPE_DESKTOP,
NET_WM_WINDOW_TYPE_DIALOG,
NET_WM_WINDOW_TYPE_DOCK,
NET_WM_WINDOW_TYPE_MENU,
NET_WM_WINDOW_TYPE_NORMAL,
NET_WM_WINDOW_TYPE_TOOLBAR,
KDE_NET_WM_WINDOW_TYPE_OVERRIDE,
NET_WM_WINDOW_TYPE_SPLASH,
NET_WM_WINDOW_TYPE_UTILITY,
NET_NUMBER_OF_DESKTOPS,
NET_CURRENT_DESKTOP,
NET_WORKAREA,
// atoms for Gnome WM hints
WIN_SUPPORTING_WM_CHECK,
WIN_PROTOCOLS,
WIN_WORKSPACE_COUNT,
WIN_WORKSPACE,
WIN_LAYER,
WIN_STATE,
WIN_HINTS,
WIN_APP_STATE,
WIN_EXPANDED_SIZE,
WIN_ICONS,
WIN_WORKSPACE_NAMES,
WIN_CLIENT_LIST,
// atoms for general WM hints
WM_STATE,
MOTIF_WM_HINTS,
WM_PROTOCOLS,
WM_DELETE_WINDOW,
WM_TAKE_FOCUS,
WM_SAVE_YOURSELF,
WM_CLIENT_LEADER,
WM_COMMAND,
WM_LOCALE_NAME,
WM_TRANSIENT_FOR,
// special atoms
SAL_QUITEVENT,
SAL_USEREVENT,
SAL_EXTTEXTEVENT,
SAL_GETTIMEEVENT,
DTWM_IS_RUNNING,
VCL_SYSTEM_SETTINGS,
XSETTINGS,
XEMBED,
XEMBED_INFO,
NetAtomMax
};
/*
* flags for frame decoration
*/
static const int decoration_Title = 0x00000001;
static const int decoration_Border = 0x00000002;
static const int decoration_Resize = 0x00000004;
static const int decoration_MinimizeBtn = 0x00000008;
static const int decoration_MaximizeBtn = 0x00000010;
static const int decoration_CloseBtn = 0x00000020;
static const int decoration_All = 0x10000000;
/*
* window type
*/
enum WMWindowType
{
windowType_Normal,
windowType_ModalDialogue,
windowType_ModelessDialogue,
windowType_Utility,
windowType_Splash,
windowType_Toolbar,
windowType_Dock
};
protected:
SalDisplay* m_pSalDisplay; // Display to use
Display* m_pDisplay; // X Display of SalDisplay
String m_aWMName;
Atom m_aWMAtoms[ NetAtomMax];
int m_nDesktops;
bool m_bEqualWorkAreas;
::std::vector< Rectangle >
m_aWMWorkAreas;
bool m_bTransientBehaviour;
bool m_bEnableAlwaysOnTopWorks;
bool m_bLegacyPartialFullscreen;
int m_nWinGravity;
int m_nInitWinGravity;
bool m_bWMshouldSwitchWorkspace;
bool m_bWMshouldSwitchWorkspaceInit;
WMAdaptor( SalDisplay * )
;
void initAtoms();
bool getNetWmName();
/*
* returns whether this instance is useful
* only useful for createWMAdaptor
*/
virtual bool isValid() const;
bool getWMshouldSwitchWorkspace() const;
public:
virtual ~WMAdaptor();
/*
* creates a vaild WMAdaptor instance for the SalDisplay
*/
static WMAdaptor* createWMAdaptor( SalDisplay* );
/*
* may return an empty string if the window manager could
* not be identified.
*/
const String& getWindowManagerName() const
{ return m_aWMName; }
/*
* gets the number of workareas
*/
int getWorkAreaCount() const
{ return m_aWMWorkAreas.size(); }
/*
* gets the current work area/desktop number: [0,m_nDesktops[ or -1 if unknown
*/
int getCurrentWorkArea() const;
/*
* gets the workarea the specified window is on (or -1)
*/
int getWindowWorkArea( XLIB_Window aWindow ) const;
/*
* gets the specified workarea
*/
const Rectangle& getWorkArea( int n ) const
{ return m_aWMWorkAreas[n]; }
/*
* attemp to switch the desktop to a certain workarea
* if bConsiderWM is true, then on some WMs the call will not result in any action
*/
void switchToWorkArea( int nWorkArea, bool bConsiderWM = true ) const;
/*
* sets window title
*/
virtual void setWMName( X11SalFrame* pFrame, const String& rWMName ) const;
/*
* set NET_WM_PID
*/
virtual void setPID( X11SalFrame* pFrame ) const;
/*
* set WM_CLIENT_MACHINE
*/
virtual void setClientMachine( X11SalFrame* pFrame ) const;
virtual void answerPing( X11SalFrame*, XClientMessageEvent* ) const;
/*
* maximizes frame
* maximization can be toggled in either direction
* to get the original position and size
* use maximizeFrame( pFrame, false, false )
*/
virtual void maximizeFrame( X11SalFrame* pFrame, bool bHorizontal = true, bool bVertical = true ) const;
/*
* start/stop fullscreen mode on a frame
*/
virtual void showFullScreen( X11SalFrame* pFrame, bool bFullScreen ) const;
/*
* tell whether legacy partial full screen handling is necessary
* see #i107249#: NET_WM_STATE_FULLSCREEN is not well defined, but de facto
* modern WM's interpret it the "right" way, namely they make "full screen"
* taking twin view or Xinerama into accound and honor the positioning hints
* to see which screen actually was meant to use for fullscreen.
*/
bool isLegacyPartialFullscreen() const
{ return m_bLegacyPartialFullscreen; }
/*
* set window struts
*/
virtual void setFrameStruts( X11SalFrame*pFrame,
int left, int right, int top, int bottom,
int left_start_y, int left_end_y,
int right_start_y, int right_end_y,
int top_start_x, int top_end_x,
int bottom_start_x, int bottom_end_x ) const;
/*
* set _NET_WM_USER_TIME property, if NetWM
*/
virtual void setUserTime( X11SalFrame* i_pFrame, long i_nUserTime ) const;
/*
* tells whether fullscreen mode is supported by WM
*/
bool supportsFullScreen() const { return m_aWMAtoms[ NET_WM_STATE_FULLSCREEN ] != 0; }
/*
* shade/unshade frame
*/
virtual void shade( X11SalFrame* pFrame, bool bToShaded ) const;
/*
* set hints what decoration is needed;
* must be called before showing the frame
*/
virtual void setFrameTypeAndDecoration( X11SalFrame* pFrame, WMWindowType eType, int nDecorationFlags, X11SalFrame* pTransientFrame = NULL ) const;
/*
* tells whether there is WM support for splash screens
*/
bool supportsSplash() const { return m_aWMAtoms[ NET_WM_WINDOW_TYPE_SPLASH ] != 0; }
/*
* tells whteher there is WM support for NET_WM_WINDOW_TYPE_TOOLBAR
*/
bool supportsToolbar() const { return m_aWMAtoms[ NET_WM_WINDOW_TYPE_TOOLBAR ] != 0; }
/*
* enables always on top or equivalent if possible
*/
virtual void enableAlwaysOnTop( X11SalFrame* pFrame, bool bEnable ) const;
/*
* tells whether enableAlwaysOnTop actually works with this WM
*/
bool isAlwaysOnTopOK() const { return m_bEnableAlwaysOnTopWorks; }
/*
* handle WM messages (especially WM state changes)
*/
virtual int handlePropertyNotify( X11SalFrame* pFrame, XPropertyEvent* pEvent ) const;
/*
* called by SalFrame::Show: time to update state properties
*/
virtual void frameIsMapping( X11SalFrame* ) const;
/*
* gets a WM atom
*/
Atom getAtom( WMAtom eAtom ) const
{ return m_aWMAtoms[ eAtom ]; }
/*
* supports correct positioning
*/
virtual bool supportsICCCMPos () const;
int getPositionWinGravity () const
{ return m_nWinGravity; }
int getInitWinGravity() const
{ return m_nInitWinGravity; }
/*
* expected behaviour is that the WM will not allow transient
* windows to get stacked behind the windows they are transient for
*/
bool isTransientBehaviourAsExpected() const
{ return m_bTransientBehaviour; }
/*
* changes the transient hint of a window to reference frame
* if reference frame is NULL the root window is used instead
*/
void changeReferenceFrame( X11SalFrame* pFrame, X11SalFrame* pReferenceFrame ) const;
/* set fullscreen monitor range; takes X11 window as input since it is also used by gtk plugin
*/
virtual void setFullScreenMonitors( XLIB_Window i_aWindow, sal_Int32 i_nScreen );
};
} // namespace
#endif