Functions also for converting from X11 mouse/keyboard state

to Qt mouse/keyboard state.


svn path=/branches/work/kwin_composite/; revision=620299
This commit is contained in:
Luboš Luňák 2007-01-05 16:32:32 +00:00
parent 9f48b9dd02
commit 2e84c74fc8
3 changed files with 160 additions and 51 deletions

View file

@ -1093,37 +1093,6 @@ void Client::updateMouseGrab()
} }
} }
int qtToX11Button( Qt::ButtonState button )
{
if( button == Qt::LeftButton )
return Button1;
else if( button == Qt::MidButton )
return Button2;
else if( button == Qt::RightButton )
return Button3;
return AnyButton;
}
int qtToX11State( Qt::ButtonState buttons, Qt::KeyboardModifiers modifiers )
{
int ret = 0;
if( buttons & Qt::LeftButton )
ret |= Button1Mask;
if( buttons & Qt::MidButton )
ret |= Button2Mask;
if( buttons & Qt::RightButton )
ret |= Button3Mask;
if( modifiers & Qt::ShiftModifier )
ret |= ShiftMask;
if( modifiers & Qt::ControlModifier )
ret |= ControlMask;
if( modifiers & Qt::AltModifier )
ret |= KKeyServer::modXAlt();
if( modifiers & Qt::MetaModifier )
ret |= KKeyServer::modXMeta();
return ret;
}
// Qt propagates mouse events up the widget hierachy, which means events // Qt propagates mouse events up the widget hierachy, which means events
// for the decoration window cannot be (easily) intercepted as X11 events // for the decoration window cannot be (easily) intercepted as X11 events
bool Client::eventFilter( QObject* o, QEvent* e ) bool Client::eventFilter( QObject* o, QEvent* e )

View file

@ -25,6 +25,7 @@ License. See the file "COPYING" for the exact licensing terms.
#include <assert.h> #include <assert.h>
#include <kdebug.h> #include <kdebug.h>
#include <kshortcut.h> #include <kshortcut.h>
#include <kkeyserver.h>
#include <X11/Xlib.h> #include <X11/Xlib.h>
#include <X11/extensions/shape.h> #include <X11/extensions/shape.h>
@ -351,6 +352,77 @@ bool grabbedXServer()
{ {
return server_grab_count > 0; return server_grab_count > 0;
} }
// converting between X11 mouse/keyboard state mask and Qt button/keyboard states
int qtToX11Button( Qt::MouseButton button )
{
if( button == Qt::LeftButton )
return Button1;
else if( button == Qt::MidButton )
return Button2;
else if( button == Qt::RightButton )
return Button3;
return AnyButton; // 0
}
Qt::MouseButton x11ToQtMouseButton( int button )
{
if( button == Button1 )
return Qt::LeftButton;
if( button == Button2 )
return Qt::MidButton;
if( button == Button3 )
return Qt::RightButton;
return Qt::NoButton;
}
int qtToX11State( Qt::MouseButtons buttons, Qt::KeyboardModifiers modifiers )
{
int ret = 0;
if( buttons & Qt::LeftButton )
ret |= Button1Mask;
if( buttons & Qt::MidButton )
ret |= Button2Mask;
if( buttons & Qt::RightButton )
ret |= Button3Mask;
if( modifiers & Qt::ShiftModifier )
ret |= ShiftMask;
if( modifiers & Qt::ControlModifier )
ret |= ControlMask;
if( modifiers & Qt::AltModifier )
ret |= KKeyServer::modXAlt();
if( modifiers & Qt::MetaModifier )
ret |= KKeyServer::modXMeta();
return ret;
}
Qt::MouseButtons x11ToQtMouseButtons( int state )
{
Qt::MouseButtons ret = 0;
if( state & Button1Mask )
ret |= Qt::LeftButton;
if( state & Button2Mask )
ret |= Qt::MidButton;
if( state & Button3Mask )
ret |= Qt::RightButton;
return ret;
}
Qt::KeyboardModifiers x11ToQtKeyboardModifiers( int state )
{
Qt::KeyboardModifiers ret = 0;
if( state & ShiftMask )
ret |= Qt::ShiftModifier;
if( state & ControlMask )
ret |= Qt::ControlModifier;
if( state & KKeyServer::modXAlt())
ret |= Qt::AltModifier;
if( state & KKeyServer::modXMeta())
ret |= Qt::MetaModifier;
return ret;
}
#endif #endif
bool isLocalMachine( const QByteArray& host ) bool isLocalMachine( const QByteArray& host )

108
utils.h
View file

@ -12,6 +12,32 @@ License. See the file "COPYING" for the exact licensing terms.
#ifndef KWIN_UTILS_H #ifndef KWIN_UTILS_H
#define KWIN_UTILS_H #define KWIN_UTILS_H
#include <config.h>
#include <config-X11.h>
#include <X11/Xlib.h>
#ifdef HAVE_XRANDR
#include <X11/extensions/Xrandr.h>
#endif
#ifdef HAVE_XCOMPOSITE
#include <X11/extensions/Xcomposite.h>
#if XCOMPOSITE_MAJOR > 0 || XCOMPOSITE_MINOR >= 3
#define HAVE_XCOMPOSITE_OVERLAY
#endif
#endif
#ifdef HAVE_XDAMAGE
#include <X11/extensions/Xdamage.h>
#endif
#ifdef HAVE_XFIXES
#include <X11/extensions/Xfixes.h>
#endif
#include <fixx11h.h>
#include <QWidget> #include <QWidget>
#include <kmanagerselection.h> #include <kmanagerselection.h>
#include <netwm_def.h> #include <netwm_def.h>
@ -22,6 +48,13 @@ License. See the file "COPYING" for the exact licensing terms.
namespace KWinInternal namespace KWinInternal
{ {
#ifndef HAVE_XDAMAGE
typedef long Damage;
struct XDamageNotifyEvent
{
};
#endif
const int SUPPORTED_WINDOW_TYPES_MASK = NET::NormalMask | NET::DesktopMask | NET::DockMask const int SUPPORTED_WINDOW_TYPES_MASK = NET::NormalMask | NET::DesktopMask | NET::DockMask
| NET::ToolbarMask | NET::MenuMask | NET::DialogMask /*| NET::OverrideMask*/ | NET::TopMenuMask | NET::ToolbarMask | NET::MenuMask | NET::DialogMask /*| NET::OverrideMask*/ | NET::TopMenuMask
| NET::UtilityMask | NET::SplashMask; | NET::UtilityMask | NET::SplashMask;
@ -39,12 +72,18 @@ const long ClientWinMask = KeyPressMask | KeyReleaseMask |
const QPoint invalidPoint( INT_MIN, INT_MIN ); const QPoint invalidPoint( INT_MIN, INT_MIN );
class Toplevel;
class Client; class Client;
class Unmanaged;
class Group; class Group;
class Options; class Options;
typedef QList< Toplevel* > ToplevelList;
typedef QList< const Toplevel* > ConstToplevelList;
typedef QList< Client* > ClientList; typedef QList< Client* > ClientList;
typedef QList< const Client* > ConstClientList; typedef QList< const Client* > ConstClientList;
typedef QList< Unmanaged* > UnmanagedList;
typedef QList< const Unmanaged* > ConstUnmanagedList;
typedef QList< Group* > GroupList; typedef QList< Group* > GroupList;
typedef QList< const Group* > ConstGroupList; typedef QList< const Group* > ConstGroupList;
@ -87,6 +126,7 @@ enum allowed_t { Allowed };
// some enums to have more readable code, instead of using bools // some enums to have more readable code, instead of using bools
enum ForceGeometry_t { NormalGeometrySet, ForceGeometrySet }; enum ForceGeometry_t { NormalGeometrySet, ForceGeometrySet };
// Areas, mostly related to Xinerama // Areas, mostly related to Xinerama
enum clientAreaOption enum clientAreaOption
{ {
@ -109,24 +149,32 @@ enum ShadeMode
ShadeActivated // "shaded", but visible due to alt+tab to the window ShadeActivated // "shaded", but visible due to alt+tab to the window
}; };
class Shape class Extensions
{ {
public: public:
static bool available() { return kwin_shape_version > 0; }
static int version() { return kwin_shape_version; } // as 16*major+minor, i.e. two hex digits
static bool hasShape( WId w);
static int shapeEvent();
static void init(); static void init();
static bool shapeAvailable() { return has_shape; }
static int shapeNotifyEvent();
static bool randrAvailable() { return has_randr; }
static int randrNotifyEvent();
static bool damageAvailable() { return has_damage; }
static int damageNotifyEvent();
static bool compositeAvailable() { return has_composite; }
static bool compositeOverlayAvailable() { return has_composite && has_composite_overlay; }
static bool fixesAvailable() { return has_fixes; }
static bool hasShape( Window w );
private: private:
static int kwin_shape_version; static bool has_shape;
static int kwin_shape_event; static int shape_event_base;
static bool has_randr;
static int randr_event_base;
static bool has_damage;
static int damage_event_base;
static bool has_composite;
static bool has_composite_overlay;
static bool has_fixes;
}; };
// compile with XShape older than 1.0
#ifndef ShapeInput
const int ShapeInput = 2;
#endif
class Motif class Motif
{ {
public: public:
@ -226,34 +274,38 @@ int displayHeight()
return XDisplayHeight( display(), DefaultScreen( display())); return XDisplayHeight( display(), DefaultScreen( display()));
} }
class Scene;
extern Scene* scene;
inline bool compositing() { return scene != NULL; }
// the docs say it's UrgencyHint, but it's often #defined as XUrgencyHint // the docs say it's UrgencyHint, but it's often #defined as XUrgencyHint
#ifndef UrgencyHint #ifndef UrgencyHint
#define UrgencyHint XUrgencyHint #define UrgencyHint XUrgencyHint
#endif #endif
// for STL-like algo's // for STL-like algo's
#define KWIN_CHECK_PREDICATE( name, check ) \ #define KWIN_CHECK_PREDICATE( name, cls, check ) \
struct name \ struct name \
{ \ { \
inline bool operator()( const Client* cl ) { return check; }; \ inline bool operator()( const cls* cl ) { return check; }; \
} }
#define KWIN_COMPARE_PREDICATE( name, type, check ) \ #define KWIN_COMPARE_PREDICATE( name, cls, type, check ) \
struct name \ struct name \
{ \ { \
typedef type type_helper; /* in order to work also with type being 'const Client*' etc. */ \ typedef type type_helper; /* in order to work also with type being 'const Client*' etc. */ \
inline name( const type_helper& compare_value ) : value( compare_value ) {}; \ inline name( const type_helper& compare_value ) : value( compare_value ) {}; \
inline bool operator()( const Client* cl ) { return check; }; \ inline bool operator()( const cls* cl ) { return check; }; \
const type_helper& value; \ const type_helper& value; \
} }
#define KWIN_PROCEDURE( name, action ) \ #define KWIN_PROCEDURE( name, cls, action ) \
struct name \ struct name \
{ \ { \
inline void operator()( Client* cl ) { action; }; \ inline void operator()( cls* cl ) { action; }; \
} }
KWIN_CHECK_PREDICATE( TruePredicate, cl == cl /*true, avoid warning about 'cl' */ ); KWIN_CHECK_PREDICATE( TruePredicate, Client, cl == cl /*true, avoid warning about 'cl' */ );
template< typename T > template< typename T >
Client* findClientInList( const ClientList& list, T predicate ) Client* findClientInList( const ClientList& list, T predicate )
@ -266,6 +318,17 @@ Client* findClientInList( const ClientList& list, T predicate )
return NULL; return NULL;
} }
template< typename T >
Unmanaged* findUnmanagedInList( const UnmanagedList& list, T predicate )
{
for ( UnmanagedList::ConstIterator it = list.begin(); it != list.end(); ++it)
{
if ( predicate( const_cast< const Unmanaged* >( *it)))
return *it;
}
return NULL;
}
inline inline
int timestampCompare( Time time1, Time time2 ) // like strcmp() int timestampCompare( Time time1, Time time2 ) // like strcmp()
{ {
@ -280,7 +343,12 @@ Time timestampDiff( Time time1, Time time2 ) // returns time2 - time1
bool isLocalMachine( const QByteArray& host ); bool isLocalMachine( const QByteArray& host );
void checkNonExistentClients(); // converting between X11 mouse/keyboard state mask and Qt button/keyboard states
int qtToX11Button( Qt::MouseButton button );
Qt::MouseButton x11ToQtMouseButton( int button );
int qtToX11State( Qt::MouseButtons buttons, Qt::KeyboardModifiers modifiers );
Qt::MouseButtons x11ToQtMouseButtons( int state );
Qt::KeyboardModifiers x11ToQtKeyboardModifiers( int state );
#ifndef KCMRULES #ifndef KCMRULES
// Qt dialogs emit no signal when closed :( // Qt dialogs emit no signal when closed :(