Commit b52a040f authored by cutealien's avatar cutealien

Allow caching cursor position on X11 to work around slow XQueryPointer calls....

Allow caching cursor position on X11 to work around slow XQueryPointer calls. Resolves patch 3476712. Thanks @ hendu for reporting and patch-proposal. For more info: http://irrlicht.sourceforge.net/forum/viewtopic.php?f=7&t=45525


git-svn-id: svn://svn.code.sf.net/p/irrlicht/code/trunk@4251 dfc29bdd-3216-0410-991c-e03cc46cb475
parent 90052d1e
Changes in 1.8 (??.??.2011)
- Allow caching cursor position on X11 to work around slow XQueryPointer calls.
- Struct packing works now with gcc 4.7 changes on MinGW (thx @Sudi for reporting).
- Struct packing uses now same solution throughout (by including headers in corresponding places)
......
......@@ -78,6 +78,21 @@ namespace gui
core::position2d<s32> HotSpot;
};
//! platform specific behavior flags for the cursor
enum ECURSOR_PLATFORM_BEHAVIOR
{
//! default - no platform specific behaviour
ECPB_NONE = 0,
//! On X11 try caching cursor updates as XQueryPointer calls can be expensive.
/** Update cursor positions only when the irrlicht timer has been updated or the timer is stopped.
This means you usually get one cursor update per device->run() which will be fine in most cases.
See this forum-thread for a more detailed explanation:
http://irrlicht.sourceforge.net/forum/viewtopic.php?f=7&t=45525
*/
ECPB_X11_CACHE_UPDATES = 1
};
//! Interface to manipulate the mouse cursor.
class ICursorControl : public virtual IReferenceCounted
{
......@@ -159,6 +174,14 @@ namespace gui
//! Return a system-specific size which is supported for cursors. Larger icons will fail, smaller icons might work.
virtual core::dimension2di getSupportedIconSize() const { return core::dimension2di(0,0); }
//! Set platform specific behavior flags.
virtual void setPlatformBehavior(ECURSOR_PLATFORM_BEHAVIOR behavior) {}
//! Return platform specific behavior.
/** \return Behavior set by setPlatformBehavior or ECPB_NONE for platforms not implementing specific behaviors.
*/
virtual ECURSOR_PLATFORM_BEHAVIOR getPlatformBehavior() const { return ECPB_NONE; }
};
......
......@@ -2090,7 +2090,11 @@ Cursor CIrrDeviceLinux::TextureToCursor(irr::video::ITexture * tex, const core::
CIrrDeviceLinux::CCursorControl::CCursorControl(CIrrDeviceLinux* dev, bool null)
: Device(dev), IsVisible(true), Null(null), UseReferenceRect(false)
: Device(dev)
#ifdef _IRR_COMPILE_WITH_X11_
, PlatformBehavior(gui::ECPB_NONE), lastQuery(0)
#endif
, IsVisible(true), Null(null), UseReferenceRect(false)
, ActiveIcon(gui::ECI_NORMAL), ActiveIconStartTime(0)
{
#ifdef _IRR_COMPILE_WITH_X11_
......
......@@ -13,6 +13,7 @@
#include "IrrlichtDevice.h"
#include "IImagePresenter.h"
#include "ICursorControl.h"
#include "os.h"
#ifdef _IRR_COMPILE_WITH_X11_
......@@ -293,6 +294,12 @@ namespace irr
virtual core::dimension2di getSupportedIconSize() const;
#ifdef _IRR_COMPILE_WITH_X11_
//! Set platform specific behavior flags.
virtual void setPlatformBehavior(gui::ECURSOR_PLATFORM_BEHAVIOR behavior) {PlatformBehavior = behavior; }
//! Return platform specific behavior.
virtual gui::ECURSOR_PLATFORM_BEHAVIOR getPlatformBehavior() const { return PlatformBehavior; }
void update();
void clearCursors();
#endif
......@@ -304,6 +311,14 @@ namespace irr
if (Null)
return;
if ( PlatformBehavior&gui::ECPB_X11_CACHE_UPDATES && !os::Timer::isStopped() )
{
u32 now = os::Timer::getTime();
if (now <= lastQuery)
return;
lastQuery = now;
}
Window tmp;
int itmp1, itmp2;
unsigned int maskreturn;
......@@ -327,6 +342,8 @@ namespace irr
core::position2d<s32> CursorPos;
core::rect<s32> ReferenceRect;
#ifdef _IRR_COMPILE_WITH_X11_
gui::ECURSOR_PLATFORM_BEHAVIOR PlatformBehavior;
u32 lastQuery;
Cursor invisCursor;
struct CursorFrameX11
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment