Anmelden

Archiv verlassen und diese Seite im Standarddesign anzeigen : x-server



rkw
08-12-2005, 15:20
Hi beisammen,
weiss jemand, wie man dem x-server mitteilt, dass er einen Textstring als event an die aktive Anwendung sendet.
Hintergrund:
Ich moechte ein Formular, das im Browser angezeigt wird extern mit Werten fuellen. Also ohne Tastatur.
Waer super dankbar fuer einen Tipp.
Gruss rkw

d.j.peters
09-12-2005, 17:13
Hallo rkw,
im Prinziep läuft das genau so ab wie unter z.B. Windows auch Du holst Dir den Handle des InputWindows welches im BrowserFormular auf eine Eingabe wartet und schickst dann TasturEvents die dann die Eingabe des Stringes als Tasteneingaben implementiert

Du stellst eine Verbindung zum X Server her mit XOpen holst dir den Handle vom Desktop (DefaultRootWindow) der Browser ist dann ein ClientWindow vom Rootwindow und die ForumlarEingabe ein ChildInputwindow from ClientWindow.

Du must Dich aber in in die XLib Programmierung eingearbeitet haben.

Ich habe das nur mit bekommen weil ich ca. 600 Prototypen der XLib für FreeBASIC portiert habe.

Grüsse Joshy

rkw
09-12-2005, 20:24
Hi Joshy,
danke fuer die Antwort.
Du hast recht, ich bin grad dabei, mich mit xlib zu befassen.
Die zentrale Funktion ist hier XSendEvent().
Da muss ich mich noch mit den Parametern rumschlagen.
Ich hab schon ne Weile nichts mehr mit C in Verbindung mit Linux gemacht.
Der Einstieg ist halt recht zaeh, wenn man sich die Funktionen muehsam zusammensuchen muss. ( Ich hasse englische Dokus )


Grüsse Reinhold

rkw
12-12-2005, 19:43
Hi,
so geht's:


#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <X11/keysym.h>
#include <X11/Xlib.h>
#include <X11/Xutil.h>

static Display *display; // VerbindungsID zum Server
static Window w; // die ZielanwendungsID
static int w_state; // brauch ich nicht
static XKeyEvent event; // Datensatz zum Uebertragen der Event's

Bool setConnection(){ // initialisiert die Verbindung und setzt die Vorgaben
display = XOpenDisplay (NULL); /* X-Sitzung öffnen */
if (display == NULL) { /* Fehlerüberprüfung */
printf ("Verbindung zum X-Server fehlgeschlagen\n");
return False;
}
XGetInputFocus(display,&w,&w_state); // die ID der Zielanwendung wird ermittelt
memset(&event,0,sizeof(event)); // Eventdatensatz initialisieren
event.display = display;
event.window = w;
event.root = w;
event.subwindow = None;
event.time = CurrentTime;
event.x = 1;
event.y = 1;
event.x_root = 1;
event.y_root = 1;
event.same_screen = True; // ist anscheinend True, wenn XSendEvent() verwendet wird
return True;
}

void closeConnection(){ // habe fertig, Flasche leer
XCloseDisplay(display);
}


void sendChar(KeyCode keycode,int state){ // sendet die Events
event.keycode = keycode;
event.state = state; // state=0--> Kleinbuchstabe , state=1--> Grossbuchstabe

event.type=KeyPress; // Taste druecken
event.time = CurrentTime;
XSendEvent(event.display, event.window, False, KeyPressMask, (XEvent *)&event);

event.type = KeyRelease; // Taste loslassen
event.time = CurrentTime;
XSendEvent(event.display, event.window, False, KeyReleaseMask, (XEvent *)&event);

XSync(display,False); // ohne dieses
usleep(10); // verschluckt sich der Client anscheinend
}

void sendStringToApp(char *s){ // vorbereiten und Senden des Strings
KeyCode keycode;
while(*s != 0){ // erwartet String mit abschliessender Null
if(*s >= ' '){ // duerfte ein Buchstabe sein
keycode=XKeysymToKeycode(display,*s);

// falls Rueckgabe == char --> ist ein Kleinbuchstabe und state ist 0
if((int)XKeycodeToKeysym(display,keycode,0)==*s){
sendChar(keycode,0);
}
else{ // Rueckgabe ist != char --> Grossbuchstabe und state daher 1
sendChar(keycode,1);
}
// hab den Block so aehnlich aus Beispiel uebernommen
// keine rechte Doku zu event.state gefunden
}
else{ // char ist Steuerzeichen
if(*s == '\t'){
sendChar(XKeysymToKeycode(display,0xFF09),0); // Tabulator
}
}
s++; // char-Zeiger erhoehen
}
}



int main (int argc, char **argv) {

if(setConnection()==False) // Verbindung aufbauen
exit(EXIT_FAILURE);

sendStringToApp("Wird an das aktive Fenster mit dem Focus gesendet\tEnde"); // Testausgabe

closeConnection();

return EXIT_SUCCESS;
}



Gruss rkw