2010-12-02 23 views
2

Ich denke, ich habe ein C++ - Programm (ich dachte, es war C#), die geschrieben wurde, um auf einem Unix-basierten System zu laufen. Es enthält X11-Anrufe. Gibt es eine Möglichkeit für mich, es zu kompilieren, um auf einem PC unter Windows XP zu laufen? Ich habe mingw installiert.kompilieren C++ Programm Aufruf X11 auf Windows

Es ist ein "Patch" -Programm geschrieben, um ein Stück Hardware (ein DreamCheeky USB-Schachbrett) zu erhalten, um Eingabe in die SCID-Schach-Datenbank-Paket (ich habe das in der Windows-Version installiert, aber die Entwicklung ist es sehr viel unix/tcl/tk usw.)

Das Programm ist wie folgt. Die Person, die es geschrieben hat, kann Zeit haben, eine Windows-Version zu erstellen (Oder ich fürchte, vielleicht nicht) Aber ich bin verzweifelt zu versuchen, es auf meinem Windows-Laptop zu arbeiten.

//compile with g++ -o monitorcheeky monitorcheeky.c -L/usr/X11R6/lib -lX11 

#include <sys/types.h> 
#include <sys/socket.h> 
#include <stdio.h> 
#include <netinet/in.h> 
#include <arpa/inet.h> 
#include <unistd.h> 
#include <X11/Xlib.h> 
#include <X11/keysym.h> 
#include <string.h> 

#define KEY_DOWN True 
#define KEY_UP False 
#define KEYCODE_a 38 
#define KEYCODE_b 56 
#define KEYCODE_c 54 
#define KEYCODE_d 40 
#define KEYCODE_e 26 
#define KEYCODE_f 41 
#define KEYCODE_g 42 
#define KEYCODE_h 43 
#define KEYCODE_1 10 
#define KEYCODE_2 11 
#define KEYCODE_3 12 
#define KEYCODE_4 13 
#define KEYCODE_5 14 
#define KEYCODE_6 15 
#define KEYCODE_7 16 
#define KEYCODE_8 17 
#define KEYCODE_EQUALS 21 
#define KEYCODE_Q 24 
#define KEYCODE_R 27 
#define KEYCODE_B 56 
#define KEYCODE_N 57 
#define KEYCODE_RTN 36 

Display *dpy; 


// Function to create a keyboard event 
XKeyEvent createKeyEvent(Display *display, Window &win, 
          Window &winRoot, bool press, 
          int keycode, int modifiers) 
{ 
    XKeyEvent event; 

    event.display  = display; 
    event.window  = win; 
    event.root  = winRoot; 
    event.subwindow = None; 
    event.time  = CurrentTime; 
    event.x   = 1; 
    event.y   = 1; 
    event.x_root  = 1; 
    event.y_root  = 1; 
    event.same_screen = True; 
    event.keycode  = keycode; 
    event.state  = modifiers; 

    if(press) 
     event.type = KeyPress; 
    else 
     event.type = KeyRelease; 

return event; 
} 

int sendKeyPress(Window winRoot, char letter, int revert) { 
    Window winFocus; 
    int keycode; 

    switch(letter) 
    { 
     case 'a': 
     keycode = KEYCODE_a; 
    break; 
     case 'b': 
     keycode = KEYCODE_b; 
    break; 
     case 'c': 
     keycode = KEYCODE_c; 
    break; 
     case 'd': 
     keycode = KEYCODE_d; 
    break; 
     case 'e': 
     keycode = KEYCODE_e; 
    break; 
     case 'f': 
     keycode = KEYCODE_f; 
    break; 
     case 'g': 
     keycode = KEYCODE_g; 
    break; 
     case 'h': 
     keycode = KEYCODE_h; 
    break; 
     case '1': 
     keycode = KEYCODE_1; 
    break; 
     case '2': 
     keycode = KEYCODE_2; 
    break; 
     case '3': 
     keycode = KEYCODE_3; 
    break; 
     case '4': 
     keycode = KEYCODE_4; 
    break; 
     case '5': 
     keycode = KEYCODE_5; 
    break; 
     case '6': 
     keycode = KEYCODE_6; 
    break; 
     case '7': 
     keycode = KEYCODE_7; 
    break; 
     case '8': 
     keycode = KEYCODE_8; 
    break; 
     default : 
    keycode = KEYCODE_RTN; 
    } 

    XGetInputFocus(dpy, &winFocus, &revert); 
    // Send a fake key press event to the window. 
    XKeyEvent event = createKeyEvent(dpy, winFocus, winRoot, KEY_DOWN, keycode, 0); 
    XSendEvent(event.display, event.window, True, KeyPressMask, (XEvent *)&event); 
    // Send a fake key release event to the window. 
    event = createKeyEvent(dpy, winFocus, winRoot, KEY_UP, keycode, 0); 
    XSendEvent(event.display, event.window, True, KeyPressMask, (XEvent *)&event); 
    XFlush(dpy); 
    return 0; 
} 

int main() { 
    int sockfd; 
    int len; 
    struct sockaddr_in address; 
    int result; 
    char input[5]; 
    int revert; 

    /* init */ 
    dpy = XOpenDisplay(NULL); 
    if (!dpy) return 1; 
    // Get the root window for the current display. 
    Window winRoot = XDefaultRootWindow(dpy); 

    sockfd = socket(AF_INET, SOCK_STREAM, 0); 

    address.sin_family = AF_INET; 
    address.sin_addr.s_addr = inet_addr("127.0.0.1"); 
    address.sin_port = htons(8796); 
    len = sizeof(address); 

    result = connect(sockfd, (struct sockaddr *)&address, len); 

    if (result == -1) { 
    perror("oops: client1"); 
    return 1; 
    } 
    while (1) { 
    read(sockfd, input ,5); 
    // printf("%s",input); 
    // fflush(stdin); 

    sendKeyPress(winRoot, input[0], revert); 
    sendKeyPress(winRoot, input[1], revert); 
    sendKeyPress(winRoot, input[2], revert); 
    sendKeyPress(winRoot, input[3], revert); 
    } 

    /* cleanup */ 
    XCloseDisplay(dpy); 
    return 0; 
} 

thnx alle

Jerry Jerry

+0

Was wird verwendet, um X11 aufzurufen? –

+0

Weitere Entschuldigungen! : Ich bin mir nicht sicher, wie man eine Antwort auf deinen Kommentar schreibt. Tim. Die Option Kommentar hinzufügen erlaubt nur 500 Zeichen und keine Formatierung! – JerryK

+0

Bearbeiten Sie einfach Ihre ursprüngliche Posting und fügen Sie den Quellcode – Simon

Antwort

1

mingw wird es nicht einmal in der Lage zu laufen, wenn es kompiliert.

Sie benötigen cygwin mit dem X-Server zu laufen.

+0

Bedeutet das, dass ich eine unixartige "Shell" in meinen Fenstern laufen lassen muss? – JerryK

+0

Eigentlich nicht, aber es ist einfacher so. Ansonsten ist es ein Schmerz im Hinterteil, um X richtig laufen zu lassen. – Joshua

1

Vielleicht sollten Sie "Xming" oder "Cygwin/X" versuchen? Ich habe keine Erfahrung damit, aber es könnte helfen.

+0

Können Sie es ausarbeiten. Mein Verständnis von schnell auf die xming-Website ist, dass xming x-Windows-Anwendungen ermöglicht zu laufen. Ich glaube nicht, dass ich das habe. Ich habe Quellcode, der Zugriff auf x11 libairies benötigt, um kompilieren zu können. – JerryK

+0

@JerryK: Sobald es kompiliert, was hast du vor damit zu tun? Wenn Sie die Bibliotheken nicht haben, oder sie nicht funktionieren, scheint der kompilierte Code nutzlos zu sein. –

+0

Wenn das Programm monitorcheeky "korrekt" kompiliert wird (dh alle Funktionen der x11-Prozeduren usw. wurden beim Ausführen des Programms sicher in den ausführbaren Code kompiliert), wird es das tun, wofür es vorgesehen ist: das sind die Daten der Datenübernahme über den usb port, wo die usb chessboad angeschlossen ist und 'weiterleiten' an das scid programm (welches ich auch auf meinem pc laufen hätte) Die person, die den code geschrieben hat, funktioniert genau so auf seinem unix/linnux – JerryK

Verwandte Themen