1 /////////////////////////////////////////////////////////////////////////////
2 // Name: src/unix/uiactionx11.cpp
3 // Purpose: wxUIActionSimulator implementation
4 // Author: Kevin Ollivier
7 // RCS-ID: $Id: menu.cpp 54129 2008-06-11 19:30:52Z SC $
8 // Copyright: (c) Kevin Ollivier
9 // Licence: wxWindows licence
10 /////////////////////////////////////////////////////////////////////////////
13 #include <wx/uiaction.h>
16 #include <X11/Xutil.h>
17 #include <X11/extensions/XTest.h>
19 void SendButtonEvent(int button
, bool isDown
)
24 case wxMOUSE_BTN_LEFT
:
27 case wxMOUSE_BTN_RIGHT
:
30 case wxMOUSE_BTN_MIDDLE
:
34 wxFAIL_MSG("Unsupported button passed in.");
39 Display
*display
= XOpenDisplay(0);
40 wxASSERT_MSG(display
, "No display available!");
42 memset(&event
, 0x00, sizeof(event
));
45 event
.type
= ButtonPress
;
47 event
.type
= ButtonRelease
;
49 event
.xbutton
.button
= xbutton
;
50 event
.xbutton
.same_screen
= True
;
52 XQueryPointer(display
, RootWindow(display
, DefaultScreen(display
)), &event
.xbutton
.root
, &event
.xbutton
.window
, &event
.xbutton
.x_root
, &event
.xbutton
.y_root
, &event
.xbutton
.x
, &event
.xbutton
.y
, &event
.xbutton
.state
);
53 event
.xbutton
.subwindow
= event
.xbutton
.window
;
55 while (event
.xbutton
.subwindow
)
57 event
.xbutton
.window
= event
.xbutton
.subwindow
;
58 XQueryPointer(display
, event
.xbutton
.window
, &event
.xbutton
.root
, &event
.xbutton
.subwindow
, &event
.xbutton
.x_root
, &event
.xbutton
.y_root
, &event
.xbutton
.x
, &event
.xbutton
.y
, &event
.xbutton
.state
);
61 XSendEvent(display
, PointerWindow
, True
, 0xfff, &event
);
63 XCloseDisplay(display
);
66 bool wxUIActionSimulator::MouseDown(int button
)
68 SendButtonEvent(button
, true);
72 bool wxUIActionSimulator::MouseMove(long x
, long y
)
74 Display
*display
= XOpenDisplay(0);
75 wxASSERT_MSG(display
, "No display available!");
76 Window root
= DefaultRootWindow(display
);
77 XWarpPointer(display
, None
, root
, 0, 0, 0, 0, x
, y
);
79 XCloseDisplay(display
);
83 bool wxUIActionSimulator::MouseUp(int button
)
85 SendButtonEvent(button
, false);
89 bool wxUIActionSimulator::Key(int keycode
, bool isDown
, bool WXUNUSED(shiftDown
), bool WXUNUSED(cmdDown
), bool WXUNUSED(altDown
))
91 Display
*display
= XOpenDisplay(0);
92 wxASSERT_MSG(display
, "No display available!");
96 memset(&event
, 0x00, sizeof(event
));
99 event
.type
= KeyPress
;
103 event
.type
= KeyRelease
;
104 mask
= KeyReleaseMask
;
106 event
.same_screen
= True
;
108 XQueryPointer(display
, RootWindow(display
, DefaultScreen(display
)), &event
.root
, &event
.window
, &event
.x_root
, &event
.y_root
, &event
.x
, &event
.y
, &event
.state
);
109 event
.subwindow
= event
.window
;
111 while (event
.subwindow
)
113 event
.window
= event
.subwindow
;
114 XQueryPointer(display
, event
.window
, &event
.root
, &event
.subwindow
, &event
.x_root
, &event
.y_root
, &event
.x
, &event
.y
, &event
.state
);
117 XSendEvent(display
, PointerWindow
, True
, mask
, (XEvent
*) &event
);
119 XCloseDisplay(display
);