2010-12-02 10 views
2

私はUNIXベースのシステムで動作するように書かれたC++プログラム(C#と思った)を持っていると思います。 X11コールが含まれています。 Windows XPでPC上で実行するようコンパイルする方法はありますか? 私はmingwをインストールしました。Windowsでx11を呼び出すC++プログラムをコンパイルする

SCIDチェスデータベースパッケージへの入力を許可するハードウェア(DreamCheeky usbチェス盤)を取得するために書かれた 'パッチ'プログラムです(Windows版にインストールされていますが、その開発は非常にunix/tcl/tkなど)

プログラムは以下の通りです。 それを書いた人は、Windows版を作成する時間があるかもしれません(または私は恐怖かもしれません) しかし、私はそれが私の窓のラップトップで動作するようにしようとする必死です。

//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すべて

ジェリージェリー

+0

X11の呼び出しにはどのような機能がありますか? –

+0

もっと謝罪します!あなたのコメントTimへの返信を投稿する方法が不明です。コメントの追加オプションでは、500文字しか使用できず、フォーマットが明確にできません。 – JerryK

+0

元の投稿を編集してソースコードを追加してください – Simon

答えて

1

mingwのは、それがコンパイルされた場合でも、それを実行することはできません。

実行するにはXサーバとcygwinが必要です。

+0

これは私の窓の中でUNIXのような 'シェル'を動かす必要があることを意味しますか? – JerryK

+0

実際はそうですが、それは簡単です。それ以外の場合は、Xが正しく動作するようにするためには、後ろの痛みです。 – Joshua

1

"Xming"や "Cygwin/X"を試してみるべきでしょうか?私はそれについての経験はありませんが、助けになるかもしれません。

+0

あなたは精緻化できますか? xmingサイトをすばやく見てからの私の理解は、xmingがx-windowsタイプのアプリケーションを実行できるようにすることです。私はそれを持っているとは思わない。私はコンパイルするためにx11 libairiesへのアクセスが必要なソースコードを持っています。 – JerryK

+0

@JerryK:コンパイルしたら、どうしたらいいですか?あなたがライブラリを持っていない、またはうまくいけないと、コンパイルされたコードは私には役に立たないようです。 –

+0

monitorcheekyプログラムが「正しく」コンパイルされたとき(つまり、x11手続きなどのすべての機能がプログラム実行時に確実に実行可能コードにコンパイルされていれば、 USBバス経由でusbのchessboadが接続されていて、 'それを'私のPC上で実行していたscidプログラムに渡します。コードを書いた人は、彼のunix/linnux上のものとまったく同じように動作していますシステム。 – JerryK

関連する問題