OOo einen Klick senden

06/11/2010 - 12:14 von Markus Wichmann | Report spam
Hi all,

ich hab hier ein Problem mit einer Pràsentation, bei der sich eine Folie
so seltsam verhàlt, dass man sie trotz aller Einstellungen anklicken
muss. Eh ich mich mit OOo rumschlage, wollte ich ein Programm basteln,
dass diesen Klick selbst macht. Aber wie?

Mein Quelltext bisher:

#include <X11/Xlib.h>
#include <X11/Xutil.h>
#include <stdio.h>
#include <stdlib.h>
#include <sys/time.h>
#include <string.h>
#include <unistd.h>

Window find_soffice(Display* d, Window root)
{
static Bool first = True;
Window* w, rv = 0, root_dummy, parent_dummy;
unsigned int n;
XClassHint* xc;
xc = XAllocClassHint();
if (!xc) return 0;
else {
if (XGetClassHint(d, root, xc)) {
if (strcmp(xc->res_name, "VCLSalFrame") == 0) {
if (first) first = False;
else rv = root;
/* OOo macht zwei Fenster mit gleichem Namen und
* gleicher Klasse. Das Pràsi-Fenster ist das zweite.
*/
}
XFree(xc->res_name);
XFree(xc->res_class);
}
XFree(xc);
}
if (rv) return rv;

if (!XQueryTree(d, root, &root_dummy, &parent_dummy, &w, &n)) return 0;
while (n--) {
rv = find_soffice(d, w[n]);
if (rv) {
XFree(w);
return rv;
}
}
XFree(w);
return 0;
}

int main()
{
Display* d;
Window soffice_win = 0, rootwin;
XButtonPressedEvent click;
struct timeval tv;

d = XOpenDisplay(NULL);
if (!d)
{
fputs("Could not open display", stderr);
return 1;
}
rootwin = XDefaultRootWindow(d);
while (!soffice_win)
soffice_win = find_soffice(d, rootwin);

printf("rootwin: 0x%lx", rootwin);
printf("soffice window id: 0x%lx", soffice_win);
for(;;) {
click.type = ButtonPress;
click.serial = 0;
click.send_event = False; /*trial and error */
click.display = d;
click.root = rootwin;
click.window = soffice_win;
click.subwindow = None;
click.x = 100;
click.y = 100;
click.x_root = 100;
click.y_root = 100;
click.state = 0;
click.button = Button1;
click.same_screen = True;
gettimeofday(&tv, NULL);
click.time = tv.tv_sec * 1000 + tv.tv_usec / 1000;
XSendEvent(d, soffice_win, True, ButtonPressMask,(XEvent*)& click);

click.type = ButtonRelease;
click.state = Button1Mask;
click.button = Button1;
gettimeofday(&tv, NULL);
click.time = tv.tv_sec * 1000 + tv.tv_usec / 1000;
XSendEvent(d, soffice_win, True, ButtonReleaseMask, (XEvent*) &click);

sleep(8);
}


return 0;
}

Aber xev zeigt auf dieses Fenster angesetzt keine Events an. Was mache
ich falsch?

Tschö,
Markus
 

Lesen sie die antworten

#1 Dirk Thierbach
12/11/2010 - 14:14 | Warnen spam
Markus Wichmann wrote:

XSendEvent(d, soffice_win, True, ButtonReleaseMask, (XEvent*) &click);


Aber xev zeigt auf dieses Fenster angesetzt keine Events an. Was mache
ich falsch?



Wenn sonst niemand will, und Du das Problem mittlerweile nicht geloest
hat: Ich wuerde mal auf Verdacht einen XFlush nach dem XSendEvent einbauen.

Im uebrigen koennen alle Applikationen synthetische Events auch ignorieren,
wenn sie wollen.

- Dirk

Ähnliche fragen