c0823c29a0
...so rip out all the corresponding, apparently obsolete, functionality. Change-Id: Ie1ca3fcf7f729464e4c11070caafc90a34da2d68
348 lines
10 KiB
C++
348 lines
10 KiB
C++
/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
|
|
/*************************************************************************
|
|
*
|
|
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
|
*
|
|
* Copyright 2000, 2010 Oracle and/or its affiliates.
|
|
*
|
|
* OpenOffice.org - a multi-platform office productivity suite
|
|
*
|
|
* This file is part of OpenOffice.org.
|
|
*
|
|
* OpenOffice.org is free software: you can redistribute it and/or modify
|
|
* it under the terms of the GNU Lesser General Public License version 3
|
|
* only, as published by the Free Software Foundation.
|
|
*
|
|
* OpenOffice.org is distributed in the hope that it will be useful,
|
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
* GNU Lesser General Public License version 3 for more details
|
|
* (a copy is included in the LICENSE file that accompanied this code).
|
|
*
|
|
* You should have received a copy of the GNU Lesser General Public License
|
|
* version 3 along with OpenOffice.org. If not, see
|
|
* <http://www.openoffice.org/license.html>
|
|
* for a copy of the LGPLv3 License.
|
|
*
|
|
************************************************************************/
|
|
|
|
#ifndef _VCL_WMADAPTOR_HXX_
|
|
#define _VCL_WMADAPTOR_HXX_
|
|
|
|
#include <tools/string.hxx>
|
|
#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_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_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 ]; }
|
|
|
|
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;
|
|
};
|
|
|
|
} // namespace
|
|
|
|
#endif
|
|
|
|
/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
|