home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
PC Shareware 1999 March
/
PCShareware-3-99.iso
/
IMPLE
/
DJGPP.RAR
/
DJGPP2
/
XLIB-SR0.ZIP
/
SRC
/
XLIBEMU
/
POINTER.C
< prev
next >
Wrap
C/C++ Source or Header
|
1994-01-26
|
9KB
|
327 lines
/* $Id: pointer.c 1.3 1994/01/26 19:27:22 ulrich Exp $ */
/*
* pointer.c
*
* X library functions for pointer grabbing and querying.
*/
#include "Xlibemu.h"
int XGrabPointer
( Display * dpy,
Window grab_window,
Bool owner_events,
unsigned int event_mask,
int pointer_mode,
int keyboard_mode,
Window confine_to,
Cursor cursor,
Time time)
{
XEvent xe;
_WQueueEvent ev;
Window pointer_window;
_WCheckWindow (dpy, grab_window, X_GrabPointer);
if (_PointerGrab.active != 0 && _PointerGrab.display != dpy)
return AlreadyGrabbed;
if ((! grab_window->viewable) ||
(confine_to && ! confine_to->viewable))
return GrabNotViewable;
_PointerGrab.display = dpy;
_PointerGrab.grab_window = grab_window;
_PointerGrab.owner_events = owner_events;
_PointerGrab.event_mask = event_mask;
_PointerGrab.pointer_mode = pointer_mode;
_PointerGrab.keyboard_mode = keyboard_mode;
_PointerGrab.confine_to = confine_to;
_PointerGrab.cursor = cursor;
_PointerGrab.time = (time == CurrentTime) ? _WCurrentTime() : time;
_PointerGrab.pointer_x = -1;
_PointerGrab.pointer_y = -1;
_WQueueQuery (&ev);
pointer_window = _WPointToWindow (dpy, ev.x, ev.y);
if (confine_to != None && confine_to != pointer_window &&
! _WIsInferior (confine_to, pointer_window)) {
_PointerGrab.pointer_x = ev.x;
_PointerGrab.pointer_y = ev.y;
XWarpPointer (dpy, None, confine_to, 0, 0, 0, 0, 0, 0);
}
xe.xcrossing.send_event = 0;
xe.xcrossing.display = dpy;
xe.xcrossing.root = DefaultRootWindow (dpy);
xe.xcrossing.subwindow = None;
xe.xcrossing.time = (time == CurrentTime) ? _WCurrentTime() : time;
xe.xcrossing.x = ev.x - pointer_window->window_port.x1;
xe.xcrossing.y = ev.y - pointer_window->window_port.y1;
xe.xcrossing.x_root = ev.x;
xe.xcrossing.y_root = ev.y;
xe.xcrossing.mode = NotifyGrab;
xe.xcrossing.detail = 0;
xe.xcrossing.same_screen = True;
xe.xcrossing.focus = 0;
xe.xcrossing.state = 0;
if (pointer_window->event_mask & LeaveWindowMask) {
xe.xcrossing.type = LeaveNotify;
xe.xcrossing.window = pointer_window;
xe.xcrossing.focus = _WIsFocus (xe.xcrossing.root, xe.xcrossing.window);
_XEnq (dpy, &xe);
}
if (grab_window->event_mask & EnterWindowMask) {
xe.xcrossing.type = EnterNotify;
xe.xcrossing.window = grab_window;
xe.xcrossing.focus = _WIsFocus (xe.xcrossing.root, xe.xcrossing.window);
_XEnq (dpy, &xe);
}
if (cursor) _WDefineCursor (cursor);
_PointerGrab.active = 1;
return GrabSuccess;
}
int XUngrabPointer (Display *dpy, Time time)
{
XEvent xe;
_WQueueEvent ev;
Window pointer_window;
if (_PointerGrab.active == 0 || _PointerGrab.display != dpy)
return 0;
if (time != CurrentTime &&
(time < _PointerGrab.time || time > _WCurrentTime ()))
return 0;
_PointerGrab.active = 0;
_PointerGrab.display = NULL;
_WQueueQuery (&ev);
pointer_window = _WPointToWindow (dpy, ev.x, ev.y);
xe.xcrossing.send_event = 0;
xe.xcrossing.display = dpy;
xe.xcrossing.root = DefaultRootWindow (dpy);
xe.xcrossing.subwindow = None;
xe.xcrossing.time = (time == CurrentTime) ? _WCurrentTime() : time;
xe.xcrossing.x = ev.x - pointer_window->window_port.x1;
xe.xcrossing.y = ev.y - pointer_window->window_port.y1;
xe.xcrossing.x_root = ev.x;
xe.xcrossing.y_root = ev.y;
xe.xcrossing.mode = NotifyUngrab;
xe.xcrossing.detail = 0;
xe.xcrossing.same_screen = True;
xe.xcrossing.focus = 0;
xe.xcrossing.state = 0;
if (_PointerGrab.grab_window->event_mask & LeaveWindowMask) {
xe.xcrossing.window = _PointerGrab.grab_window;
xe.xcrossing.type = LeaveNotify;
_XEnq (dpy, &xe);
}
if (pointer_window->event_mask & EnterWindowMask) {
xe.xcrossing.window = pointer_window;
xe.xcrossing.type = EnterNotify;
_XEnq (dpy, &xe);
}
if (_PointerGrab.confine_to != None
&& _PointerGrab.pointer_x > 0
&& _PointerGrab.pointer_y > 0) {
XWarpPointer (dpy,
_PointerGrab.confine_to, _PointerGrab.grab_window,
0, 0, 0, 0,
_PointerGrab.pointer_x - _PointerGrab.grab_window->window_port.x1,
_PointerGrab.pointer_y - _PointerGrab.grab_window->window_port.y1);
}
if (_PointerGrab.cursor) {
_WDefineCursor (_WGetWindowCursor (_PointerGrab.grab_window));
}
return 0;
}
int XChangeActivePointerGrab
( Display * dpy,
unsigned int event_mask,
Cursor cursor,
Time time)
{
if (_PointerGrab.active == 0 || _PointerGrab.display != dpy)
return 0;
if (time != CurrentTime &&
(time < _PointerGrab.time || time > _WCurrentTime()))
return 0;
_PointerGrab.event_mask = event_mask;
_PointerGrab.cursor = cursor;
_PointerGrab.time = (time == CurrentTime) ? _WCurrentTime() : time;
_WDefineCursor (cursor); /* request cursor change */
return 1;
}
int XWarpPointer
( Display * dpy,
Window src_w,
Window dest_w,
int src_x,
int src_y,
unsigned int src_width,
unsigned int src_height,
int dest_x,
int dest_y)
{
Window enter_window, leave_window;
XEvent xe;
_WQueueEvent ev;
/* first determine window containing the pointer */
_WQueueQuery (&ev);
/* test condition if any */
if (src_w != None &&
src_w == _WPointToWindow (dpy, ev.x, ev.y)) {
BoxRec port;
port = src_w->window_port;
port.x1 += src_x;
port.y1 += src_y;
if (port.x1 >= port.x2 || port.y1 >= port.y2)
return 0;
if (port.x1 + src_width < port.x2)
port.x2 = port.x1 + src_width;
if (port.y1 + src_height < port.y2)
port.y2 = port.y1 + src_height;
if (! INBOX(port, ev.x, ev.y))
return 0;
}
/* move relative or window absolute */
if (dest_w != None) {
dest_x += dest_w->window_port.x1;
dest_y += dest_w->window_port.y1;
}
else {
dest_x = ev.x;
dest_y = ev.y;
}
_WMouseWarp (dest_x, dest_y);
leave_window = _WPointToWindow (dpy, ev.x, ev.y);
enter_window = _WPointToWindow (dpy, dest_x, dest_y);
xe.xany.send_event = 0;
xe.xany.display = dpy;
if (leave_window == enter_window) {
xe.xmotion.type = MotionNotify;
xe.xmotion.window = enter_window;
xe.xmotion.root = DefaultRootWindow (dpy);
xe.xmotion.subwindow = None;
xe.xmotion.x = dest_x - enter_window->window_port.x1;
xe.xmotion.y = dest_y - enter_window->window_port.y1;
xe.xmotion.x_root = dest_x;
xe.xmotion.y_root = dest_y;
xe.xmotion.state = _WButtonAndModifierState (&ev);
xe.xmotion.is_hint = NotifyHint;
xe.xmotion.same_screen = True;
_WDispatchEvent (&xe);
return 0;
}
if (leave_window->event_mask & LeaveWindowMask) {
xe.xcrossing.type = LeaveNotify;
xe.xcrossing.window = leave_window;
xe.xcrossing.root = DefaultRootWindow (dpy);
xe.xcrossing.subwindow = (enter_window->parent == leave_window) ? enter_window : None;
xe.xcrossing.time = _WCurrentTime ();
xe.xcrossing.x = ev.x - leave_window->window_port.x1;
xe.xcrossing.y = ev.y - leave_window->window_port.y1;
xe.xcrossing.x_root = ev.x;
xe.xcrossing.y_root = ev.y;
xe.xcrossing.mode = NotifyNormal;
if (_WIsInferior (leave_window, enter_window))
xe.xcrossing.detail = NotifyAncestor;
else if (_WIsInferior (enter_window, leave_window))
xe.xcrossing.detail = NotifyInferior;
else
xe.xcrossing.detail = NotifyNonlinear;
xe.xcrossing.same_screen = True;
xe.xcrossing.focus = 0;
xe.xcrossing.state = _WButtonAndModifierState (&ev);
_WDispatchEvent (&xe);
}
if (enter_window->event_mask & EnterWindowMask) {
xe.xcrossing.type = EnterNotify;
xe.xcrossing.window = enter_window;
xe.xcrossing.root = DefaultRootWindow (dpy);
xe.xcrossing.subwindow = None;
xe.xcrossing.time = _WCurrentTime ();
xe.xcrossing.x = dest_x - enter_window->window_port.x1;
xe.xcrossing.y = dest_y - enter_window->window_port.y1;
xe.xcrossing.x_root = dest_x;
xe.xcrossing.y_root = dest_y;
xe.xcrossing.mode = NotifyNormal;
if (_WIsInferior (enter_window, leave_window))
xe.xcrossing.detail = NotifyAncestor;
else if (_WIsInferior (leave_window, enter_window))
xe.xcrossing.detail = NotifyInferior;
else
xe.xcrossing.detail = NotifyNonlinear;
xe.xcrossing.same_screen = True;
xe.xcrossing.focus = 0;
xe.xcrossing.state = _WButtonAndModifierState (&ev);
_WDispatchEvent (&xe);
}
return 0;
}
Bool XQueryPointer
( Display* dpy,
Window w,
Window* root_return,
Window* child_return,
int* root_x_return,
int* root_y_return,
int* win_x_return,
int* win_y_return,
unsigned int* mask_return)
{
int x, y;
_WQueueEvent ev;
Window child;
_WQueueQuery (&ev);
x = y = 0;
if (w != None) {
x = w->window_port.x1;
y = w->window_port.y1;
}
child = _WPointToWindow (dpy, ev.x, ev.y);
while (child != None && child->parent != w) {
child = child->parent;
}
*root_return = DefaultRootWindow (dpy);
*child_return = child;
*root_x_return = ev.x;
*root_y_return = ev.y;
*win_x_return = ev.x - x;
*win_y_return = ev.y - y;
*mask_return = _WButtonAndModifierState (&ev);
return True;
}