Re: [AD] Using system mouse cursor |
[ Thread Index |
Date Index
| More lists.liballeg.org/allegro-developers Archives
]
Evert Glebbeek wrote:
I've used the mickeys function directly and I've tried just
repositioning the mouse and getting the difference myself. They both
have stuttering problems, though the mickeys function moreso.
Weird... I don't understand this problem at all really... I'll see if I can
reproduce it when I use some of my own programs a bit more (not just the
tests provided by Allegro).
Well.. one think I suppose I should've mentioned, I'm polling a Vorbis
stream in a timer, too. :x Don't totally freak out though, I'm making
sure that Allegro's multithreading before even attempting that. AFAIK,
X's input thread is seperate from the timer thread, so I don't see that
really being a problem anyway.
What I'd propose is the following: disable the mouse warping hack in X11
windowed mode (so that it behaves as Windows does), but have a default
warping mode in fullscreen mode. In this case, Allegro is responsible for
drawing the mouse cursor, otherwise we can use the system cursor.
Add a function that allows the user to override this behavior explicitly
say,
int set_mouse_mode(int mode)
where mode can be any of (say) MOUSE_WARP, MOUSE_NORMAL, MOUSE_AUTO.
MOUSE_WARP enables the mouse warping, MOUSE_NORMAL disables it, MOUSE_AUTO
switches to whatever is the default (non-warped for X11 Windowed, warped
for X11 fullscreen and non-warped for Windows in any case. Not sure how
the MacOS X port handles these things). Returns 0 on succes, non-zero on
failure (in Windows, it wouldn't do anything with the current design, or
rather, it wouldn't be nescessary).
We can add a flag to gfx_capabilities to tell the user wether or not mouse
mickeys requires warping the cursor (although this may be abuse of the
gfx_capabilities variable).
Sounds quite complex. I'm trying to get away from any kind of mouse
warping though.. I would like the OS's cursor position to be the same as
Allegro's cursor position as much as possible. AFAIK, this is 100%
possible.. set_mouse_position calls XWarpMouse (or whatever it is) and
offsets Allegro's internal position trackers so the next mouse movement
event that re-positions the mouse is ignored (I thought I read the
XWarpMouse causes X to send a mouse movement event), but otherwise the
internal variables are updated as given by X.
Now, this obviously breaks Allegro programs.. get_mouse_mickeys is
gauranteed (by default) unlimited mouse movement. So what I propose is
this. Take a function like I've described, but extend it like so:
int enable_soft_mouse(int enable);
Enables/disables the software mouse cursor. When enabled, this
causes Allegro to always trap the OS mouse position to the center of the
program area, but still update mouse_x/mouse_y to cover the mouse range
and provide unlimited mouse mickeys while using the timer to draw the
mouse cursor. Turning it off will disable get_mouse_mickeys, but untrap
the mouse and possibly allow Allegro to have the OS handle drawing the
cursor. The mouse_* vars will still be updated as expected. Default is
/enabled/ to maintain compatibility with existing programs.
So, this is sort of like a mouse warp hack, but it's not really a hack
anymore since it would be a clean implemention at API-level.
- Kitty Cat