diff --git a/lib/CMakeLists.txt b/lib/CMakeLists.txt index dc96eda1aa..fd5eae4ae3 100644 --- a/lib/CMakeLists.txt +++ b/lib/CMakeLists.txt @@ -47,6 +47,19 @@ endif(OPENGL_FOUND) if (X11_Xrender_FOUND) target_link_libraries(kwineffects ${X11_Xrender_LIB}) endif (X11_Xrender_FOUND) +if (X11_Xrandr_FOUND) + target_link_libraries(kwineffects ${X11_Xrandr_LIB}) +endif (X11_Xrandr_FOUND) +if (X11_Xcomposite_FOUND) + target_link_libraries(kwineffects ${X11_Xcomposite_LIB}) +endif (X11_Xcomposite_FOUND) +if (X11_Xdamage_FOUND) + target_link_libraries(kwineffects ${X11_Xdamage_LIB}) +endif (X11_Xdamage_FOUND) +if (X11_Xfixes_FOUND) + target_link_libraries(kwineffects ${X11_Xfixes_LIB}) +endif (X11_Xfixes_FOUND) + install( FILES kwinglobals.h kwineffects.h DESTINATION ${INCLUDE_INSTALL_DIR}) diff --git a/lib/kwinglobals.cpp b/lib/kwinglobals.cpp index c709d1da79..e5faf82a64 100644 --- a/lib/kwinglobals.cpp +++ b/lib/kwinglobals.cpp @@ -10,8 +10,183 @@ License. See the file "COPYING" for the exact licensing terms. #include "kwinglobals.h" +#include +#include + +#include + +#include +#include + +#ifdef HAVE_XRENDER +#include +#endif +#ifdef HAVE_XFIXES +#include +#endif +#ifdef HAVE_XDAMAGE +#include +#endif +#ifdef HAVE_XRANDR +#include +#endif +#ifdef HAVE_XCOMPOSITE +#include +#endif +#ifdef HAVE_OPENGL +#include +#endif +#ifdef HAVE_XSYNC +#include +#endif + namespace KWin { +int Extensions::shape_version = 0; +int Extensions::shape_event_base = 0; +bool Extensions::has_randr = false; +int Extensions::randr_event_base = 0; +bool Extensions::has_damage = false; +int Extensions::damage_event_base = 0; +int Extensions::composite_version = 0; +int Extensions::fixes_version = 0; +int Extensions::render_version = 0; +bool Extensions::has_glx = false; +bool Extensions::has_sync = false; +int Extensions::sync_event_base = 0; + +void Extensions::init() + { + int dummy; + shape_version = 0; + if( XShapeQueryExtension( display(), &shape_event_base, &dummy )) + { + int major, minor; + if( XShapeQueryVersion( display(), &major, &minor )) + shape_version = major * 0x10 + minor; + } +#ifdef HAVE_XRANDR + has_randr = XRRQueryExtension( display(), &randr_event_base, &dummy ); + if( has_randr ) + { + int major, minor; + XRRQueryVersion( display(), &major, &minor ); + has_randr = ( major > 1 || ( major == 1 && minor >= 1 ) ); + } +#else + has_randr = false; +#endif +#ifdef HAVE_XDAMAGE + has_damage = XDamageQueryExtension( display(), &damage_event_base, &dummy ); +#else + has_damage = false; +#endif + composite_version = 0; +#ifdef HAVE_XCOMPOSITE + if( XCompositeQueryExtension( display(), &dummy, &dummy )) + { + int major = 0, minor = 0; + XCompositeQueryVersion( display(), &major, &minor ); + composite_version = major * 0x10 + minor; + } +#endif + fixes_version = 0; +#ifdef HAVE_XFIXES + if( XFixesQueryExtension( display(), &dummy, &dummy )) + { + int major = 0, minor = 0; + XFixesQueryVersion( display(), &major, &minor ); + fixes_version = major * 0x10 + minor; + } +#endif + render_version = 0; +#ifdef HAVE_XRENDER + if( XRenderQueryExtension( display(), &dummy, &dummy )) + { + int major = 0, minor = 0; + XRenderQueryVersion( display(), &major, &minor ); + render_version = major * 0x10 + minor; + } +#endif + has_glx = false; +#ifdef HAVE_OPENGL + has_glx = glXQueryExtension( display(), &dummy, &dummy ); +#endif +#ifdef HAVE_XSYNC + if( XSyncQueryExtension( display(), &sync_event_base, &dummy )) + { + int major = 0, minor = 0; + if( XSyncInitialize( display(), &major, &minor )) + has_sync = true; + } +#endif + kDebug( 1212 ) << "Extensions: shape: 0x" << QString::number( shape_version, 16 ) + << " composite: 0x" << QString::number( composite_version, 16 ) + << " render: 0x" << QString::number( render_version, 16 ) + << " fixes: 0x" << QString::number( fixes_version, 16 ) << endl; + } + +int Extensions::shapeNotifyEvent() + { + return shape_event_base + ShapeNotify; + } + +// does the window w need a shape combine mask around it? +bool Extensions::hasShape( Window w ) + { + int xws, yws, xbs, ybs; + unsigned int wws, hws, wbs, hbs; + int boundingShaped = 0, clipShaped = 0; + if( !shapeAvailable()) + return false; + XShapeQueryExtents(display(), w, + &boundingShaped, &xws, &yws, &wws, &hws, + &clipShaped, &xbs, &ybs, &wbs, &hbs); + return boundingShaped != 0; + } + +bool Extensions::shapeInputAvailable() + { + return shape_version >= 0x11; // 1.1 + } + +int Extensions::randrNotifyEvent() + { +#ifdef HAVE_XRANDR + return randr_event_base + RRScreenChangeNotify; +#else + return 0; +#endif + } + +int Extensions::damageNotifyEvent() + { +#ifdef HAVE_XDAMAGE + return damage_event_base + XDamageNotify; +#else + return 0; +#endif + } + +bool Extensions::compositeOverlayAvailable() + { + return composite_version >= 0x03; // 0.3 + } + +bool Extensions::fixesRegionAvailable() + { + return fixes_version >= 0x30; // 3 + } + +int Extensions::syncAlarmNotifyEvent() + { +#ifdef HAVE_XSYNC + return sync_event_base + XSyncAlarmNotify; +#else + return 0; +#endif + } + } // namespace diff --git a/lib/kwinglobals.h b/lib/kwinglobals.h index 39e928fe3b..02297be4d8 100644 --- a/lib/kwinglobals.h +++ b/lib/kwinglobals.h @@ -95,6 +95,41 @@ KWIN_EXPORT int displayHeight() return XDisplayHeight( display(), DefaultScreen( display())); } +class KWIN_EXPORT Extensions + { + public: + static void init(); + static bool shapeAvailable() { return shape_version > 0; } + static bool shapeInputAvailable(); + static int shapeNotifyEvent(); + static bool hasShape( Window w ); + static bool randrAvailable() { return has_randr; } + static int randrNotifyEvent(); + static bool damageAvailable() { return has_damage; } + static int damageNotifyEvent(); + static bool compositeAvailable() { return composite_version > 0; } + static bool compositeOverlayAvailable(); + static bool renderAvailable() { return render_version > 0; } + static bool fixesAvailable() { return fixes_version > 0; } + static bool fixesRegionAvailable(); + static bool glxAvailable() { return has_glx; } + static bool syncAvailable() { return has_sync; } + static int syncAlarmNotifyEvent(); + private: + static int shape_version; + static int shape_event_base; + static bool has_randr; + static int randr_event_base; + static bool has_damage; + static int damage_event_base; + static int composite_version; + static int render_version; + static int fixes_version; + static bool has_glx; + static bool has_sync; + static int sync_event_base; + }; + } // namespace #endif diff --git a/utils.cpp b/utils.cpp index e5c42adc31..3a65ab80c1 100644 --- a/utils.cpp +++ b/utils.cpp @@ -67,151 +67,6 @@ namespace KWin #ifndef KCMRULES -int Extensions::shape_version = 0; -int Extensions::shape_event_base = 0; -bool Extensions::has_randr = false; -int Extensions::randr_event_base = 0; -bool Extensions::has_damage = false; -int Extensions::damage_event_base = 0; -int Extensions::composite_version = 0; -int Extensions::fixes_version = 0; -int Extensions::render_version = 0; -bool Extensions::has_glx = false; -bool Extensions::has_sync = false; -int Extensions::sync_event_base = 0; - -void Extensions::init() - { - int dummy; - shape_version = 0; - if( XShapeQueryExtension( display(), &shape_event_base, &dummy )) - { - int major, minor; - if( XShapeQueryVersion( display(), &major, &minor )) - shape_version = major * 0x10 + minor; - } -#ifdef HAVE_XRANDR - has_randr = XRRQueryExtension( display(), &randr_event_base, &dummy ); - if( has_randr ) - { - int major, minor; - XRRQueryVersion( display(), &major, &minor ); - has_randr = ( major > 1 || ( major == 1 && minor >= 1 ) ); - } -#else - has_randr = false; -#endif -#ifdef HAVE_XDAMAGE - has_damage = XDamageQueryExtension( display(), &damage_event_base, &dummy ); -#else - has_damage = false; -#endif - composite_version = 0; -#ifdef HAVE_XCOMPOSITE - if( XCompositeQueryExtension( display(), &dummy, &dummy )) - { - int major = 0, minor = 0; - XCompositeQueryVersion( display(), &major, &minor ); - composite_version = major * 0x10 + minor; - } -#endif - fixes_version = 0; -#ifdef HAVE_XFIXES - if( XFixesQueryExtension( display(), &dummy, &dummy )) - { - int major = 0, minor = 0; - XFixesQueryVersion( display(), &major, &minor ); - fixes_version = major * 0x10 + minor; - } -#endif - render_version = 0; -#ifdef HAVE_XRENDER - if( XRenderQueryExtension( display(), &dummy, &dummy )) - { - int major = 0, minor = 0; - XRenderQueryVersion( display(), &major, &minor ); - render_version = major * 0x10 + minor; - } -#endif - has_glx = false; -#ifdef HAVE_OPENGL - has_glx = glXQueryExtension( display(), &dummy, &dummy ); -#endif -#ifdef HAVE_XSYNC - if( XSyncQueryExtension( display(), &sync_event_base, &dummy )) - { - int major = 0, minor = 0; - if( XSyncInitialize( display(), &major, &minor )) - has_sync = true; - } -#endif - kDebug( 1212 ) << "Extensions: shape: 0x" << QString::number( shape_version, 16 ) - << " composite: 0x" << QString::number( composite_version, 16 ) - << " render: 0x" << QString::number( render_version, 16 ) - << " fixes: 0x" << QString::number( fixes_version, 16 ) << endl; - } - -int Extensions::shapeNotifyEvent() - { - return shape_event_base + ShapeNotify; - } - -// does the window w need a shape combine mask around it? -bool Extensions::hasShape( Window w ) - { - int xws, yws, xbs, ybs; - unsigned int wws, hws, wbs, hbs; - int boundingShaped = 0, clipShaped = 0; - if( !shapeAvailable()) - return false; - XShapeQueryExtents(display(), w, - &boundingShaped, &xws, &yws, &wws, &hws, - &clipShaped, &xbs, &ybs, &wbs, &hbs); - return boundingShaped != 0; - } - -bool Extensions::shapeInputAvailable() - { - return shape_version >= 0x11; // 1.1 - } - -int Extensions::randrNotifyEvent() - { -#ifdef HAVE_XRANDR - return randr_event_base + RRScreenChangeNotify; -#else - return 0; -#endif - } - -int Extensions::damageNotifyEvent() - { -#ifdef HAVE_XDAMAGE - return damage_event_base + XDamageNotify; -#else - return 0; -#endif - } - -bool Extensions::compositeOverlayAvailable() - { - return composite_version >= 0x03; // 0.3 - } - -bool Extensions::fixesRegionAvailable() - { - return fixes_version >= 0x30; // 3 - } - -int Extensions::syncAlarmNotifyEvent() - { -#ifdef HAVE_XSYNC - return sync_event_base + XSyncAlarmNotify; -#else - return 0; -#endif - } - void Motif::readFlags( WId w, bool& noborder, bool& resize, bool& move, bool& minimize, bool& maximize, bool& close ) { diff --git a/utils.h b/utils.h index b0218f1a5c..639dcd77d9 100644 --- a/utils.h +++ b/utils.h @@ -133,41 +133,6 @@ enum HiddenPreviews // whether to keep all windows mapped when compositing HiddenPreviewsActive // keep windows mapped }; -class Extensions - { - public: - static void init(); - static bool shapeAvailable() { return shape_version > 0; } - static bool shapeInputAvailable(); - static int shapeNotifyEvent(); - static bool hasShape( Window w ); - static bool randrAvailable() { return has_randr; } - static int randrNotifyEvent(); - static bool damageAvailable() { return has_damage; } - static int damageNotifyEvent(); - static bool compositeAvailable() { return composite_version > 0; } - static bool compositeOverlayAvailable(); - static bool renderAvailable() { return render_version > 0; } - static bool fixesAvailable() { return fixes_version > 0; } - static bool fixesRegionAvailable(); - static bool glxAvailable() { return has_glx; } - static bool syncAvailable() { return has_sync; } - static int syncAlarmNotifyEvent(); - private: - static int shape_version; - static int shape_event_base; - static bool has_randr; - static int randr_event_base; - static bool has_damage; - static int damage_event_base; - static int composite_version; - static int render_version; - static int fixes_version; - static bool has_glx; - static bool has_sync; - static int sync_event_base; - }; - // compile with XShape older than 1.0 #ifndef ShapeInput const int ShapeInput = 2;