mirror of
https://git.davidovski.xyz/anyscroll.git
synced 2024-08-15 00:43:38 +00:00
added second thread
This commit is contained in:
parent
fc9fa1e4a2
commit
dc1db3a1f5
6 changed files with 112 additions and 33 deletions
3
Makefile
3
Makefile
|
@ -1,6 +1,7 @@
|
||||||
|
|
||||||
PROG = anyscroll
|
PROG = anyscroll
|
||||||
FLAGS = -lX11 -lXtst
|
FLAGS = -lX11 -lXtst -lXi -lpthread
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
${PROG}: ${PROG}.o
|
${PROG}: ${PROG}.o
|
||||||
|
|
106
anyscroll.c
106
anyscroll.c
|
@ -4,25 +4,68 @@
|
||||||
#include <X11/Xlib.h>
|
#include <X11/Xlib.h>
|
||||||
#include <X11/extensions/XTest.h>
|
#include <X11/extensions/XTest.h>
|
||||||
#include <unistd.h>
|
#include <unistd.h>
|
||||||
|
#include <X11/extensions/XInput2.h>
|
||||||
|
#include <pthread.h>
|
||||||
|
|
||||||
static Display *dpy;
|
static Display *dpy;
|
||||||
static int scr, sw, sh;
|
static int scr, sw, sh;
|
||||||
|
static int sx, sy;
|
||||||
static Window root;
|
static Window root;
|
||||||
|
|
||||||
static void pressButton(int btn) {
|
static void select_events(Display *dpy, Window win) {
|
||||||
XTestFakeButtonEvent(dpy, btn, True, CurrentTime);
|
XIEventMask evmasks[1];
|
||||||
XFlush(dpy);
|
unsigned char mask1[(XI_LASTEVENT + 7)/8];
|
||||||
}
|
|
||||||
static void releaseButton(int btn) {
|
memset(mask1, 0, sizeof(mask1));
|
||||||
XTestFakeButtonEvent(dpy, btn, False, CurrentTime);
|
|
||||||
|
/* select for button and key events from all master devices */
|
||||||
|
XISetMask(mask1, XI_RawButtonPress);
|
||||||
|
XISetMask(mask1, XI_RawButtonRelease);
|
||||||
|
|
||||||
|
evmasks[0].deviceid = XIAllMasterDevices;
|
||||||
|
evmasks[0].mask_len = sizeof(mask1);
|
||||||
|
evmasks[0].mask = mask1;
|
||||||
|
|
||||||
|
XISelectEvents(dpy, win, evmasks, 1);
|
||||||
XFlush(dpy);
|
XFlush(dpy);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void getmousepos(int *px, int *py) {
|
||||||
|
Window r, child;
|
||||||
|
int rx, ry;
|
||||||
|
unsigned int mask;
|
||||||
|
XQueryPointer(dpy, root, &r, &child, px, py, &rx, &ry, &mask);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void* loop() {
|
||||||
|
int px, py, lx, ly, dx, dy;
|
||||||
|
while (1) {
|
||||||
|
lx = px, ly = py;
|
||||||
|
getmousepos(&px, &py);
|
||||||
|
dx = px - lx;
|
||||||
|
dy = py - ly;
|
||||||
|
printf("(%d, %d) from (%d, %d)\n", px, py, sx, sy);
|
||||||
|
sleep(1);
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static void mouse_down(XIRawEvent *xev) {
|
||||||
|
getmousepos(&sx, &sy);
|
||||||
|
|
||||||
|
printf("Button pressed %d @ %d, %d\n", xev->detail, sx, sy);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
static void mouse_up(XIRawEvent *xev) {
|
||||||
|
sx = -1;
|
||||||
|
sy = -1;
|
||||||
|
printf("Button released %d %d\n", xev->detail);
|
||||||
|
}
|
||||||
|
|
||||||
int main(int argc, const char **argv) {
|
int main(int argc, const char **argv) {
|
||||||
|
XInitThreads();
|
||||||
for (int i = 1; i < argc; i++) {
|
for (int i = 1; i < argc; i++) {
|
||||||
if (argv[i][1] == 'h') {
|
if (argv[i][1] == 'h') {
|
||||||
fprintf(stdout, "there is no help to be given\n");
|
fprintf(stdout, "there is no help to be given\n");
|
||||||
|
@ -38,33 +81,36 @@ int main(int argc, const char **argv) {
|
||||||
|
|
||||||
fprintf(stdout, "waiting for events\n");
|
fprintf(stdout, "waiting for events\n");
|
||||||
|
|
||||||
const long mask = ButtonPressMask|ButtonReleaseMask;
|
|
||||||
// XGrabPointer(dpy, root, True, mask, GrabModeSync, GrabModeAsync, None, None, CurrentTime);
|
|
||||||
XGrabButton(dpy, 2, AnyModifier, root, True, mask, GrabModeSync, GrabModeAsync, None, None);
|
|
||||||
//XSelectInput(dpy, root, KeyPressMask | KeyReleaseMask | ButtonPressMask | ButtonReleaseMask);
|
|
||||||
|
|
||||||
XEvent ev;
|
XEvent ev;
|
||||||
XButtonEvent *eb;
|
XIEvent *xi_event;
|
||||||
|
XIRawEvent *xev;
|
||||||
|
XGenericEventCookie *cookie = &ev.xcookie;
|
||||||
|
|
||||||
int grab = 0;
|
select_events(dpy, root);
|
||||||
|
|
||||||
|
pthread_t id[2];
|
||||||
|
pthread_create(&id[0], NULL, loop, &argv);
|
||||||
|
|
||||||
for (;;) {
|
for (;;) {
|
||||||
XNextEvent(dpy, &ev);
|
if (XCheckTypedEvent(dpy, GenericEvent ,&ev)) {
|
||||||
if (ev.type == ButtonPress) {
|
if (cookie->type != GenericEvent || !XGetEventData(dpy, cookie)) {
|
||||||
eb = &ev.xbutton;
|
continue;
|
||||||
printf("%d button pressed!\n", eb->button);
|
|
||||||
// XGrabPointer(dpy, root, True, PointerMotionMask|ButtonReleaseMask, GrabModeAsync, GrabModeAsync, None, None, CurrentTime);
|
|
||||||
|
|
||||||
} else if (ev.type == ButtonRelease) {
|
|
||||||
eb = &ev.xbutton;
|
|
||||||
printf("%d button released!\n", eb->button);
|
|
||||||
//releaseButton(2);
|
|
||||||
// XUngrabPointer(dpy, CurrentTime);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
XAllowEvents(dpy, ReplayPointer, CurrentTime);
|
|
||||||
XSync(dpy, 0);
|
xi_event = (XIEvent *) cookie->data;
|
||||||
// XFlush(dpy);
|
xev = (XIRawEvent *) xi_event;
|
||||||
|
switch (cookie->evtype) {
|
||||||
|
case XI_RawButtonPress:
|
||||||
|
if (xev->detail == 2) mouse_down(xev);
|
||||||
|
break;
|
||||||
|
case XI_RawButtonRelease:
|
||||||
|
if (xev->detail == 2) mouse_up(xev);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
XFreeEventData(dpy, cookie);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
XCloseDisplay(dpy);
|
XCloseDisplay(dpy);
|
||||||
return 0;
|
return 0;
|
||||||
|
|
BIN
mids
Executable file
BIN
mids
Executable file
Binary file not shown.
BIN
mids.o
Normal file
BIN
mids.o
Normal file
Binary file not shown.
BIN
window
Executable file
BIN
window
Executable file
Binary file not shown.
32
window.c
Normal file
32
window.c
Normal file
|
@ -0,0 +1,32 @@
|
||||||
|
#include <X11/Xlib.h>
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include <string.h>
|
||||||
|
|
||||||
|
int main(int argc, const char **argv) {
|
||||||
|
Display *d;
|
||||||
|
XEvent e;
|
||||||
|
const char *message = "do you see the fun in gcc?";
|
||||||
|
|
||||||
|
d = XOpenDisplay(NULL);
|
||||||
|
if (d == NULL) {
|
||||||
|
fprintf(stderr, "error opening display\n");
|
||||||
|
exit(1);
|
||||||
|
}
|
||||||
|
|
||||||
|
int s = DefaultScreen(d);
|
||||||
|
Window w = XCreateSimpleWindow(d, RootWindow(d, s), 10, 10, 100, 100, 1, BlackPixel(d, s), WhitePixel(d, s));
|
||||||
|
|
||||||
|
XSelectInput(d, w, ExposureMask | KeyPressMask);
|
||||||
|
XMapWindow(d, w);
|
||||||
|
|
||||||
|
while (1) {
|
||||||
|
XNextEvent(d, &e);
|
||||||
|
if (e.type == Expose) {
|
||||||
|
XDrawString(d, w, DefaultGC(d, s), 10, 50, message, strlen(message));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
XCloseDisplay(d);
|
||||||
|
return 0;
|
||||||
|
}
|
Loading…
Reference in a new issue