компиляция c ++ программы, вызывающей x11 на windows - PullRequest
2 голосов
/ 02 декабря 2010

Я думаю, что у меня есть программа на c ++ (я думал, что это был c #), которая была написана для работы в Unix-системах. Включает звонки X11. Есть ли способ для меня, чтобы скомпилировать его для запуска на ПК под Windows XP? Я установил Mingw.

Это программа-патч, написанная для получения части аппаратного обеспечения (USB-шахматная доска DreamCheeky), позволяющая вводить данные в пакет базы данных шахмат SCID (он установлен в версии для Windows, но его разработка очень много unix / tcl / tk и т. д.)

Программа работает следующим образом. Человек, который написал это, может иметь время, чтобы создать версию для Windows (или я боюсь, что нет) Но я отчаянно пытаюсь заставить его работать на моем ноутбуке с 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 all

Джерри Джерри

Ответы [ 2 ]

1 голос
/ 02 декабря 2010

Может быть, вам стоит попробовать "Xming" или "Cygwin / X"?У меня нет опыта, но это может помочь.

1 голос
/ 02 декабря 2010

Mingw не сможет запустить его, даже если он компилируется.

Для запуска вам потребуется Cygwin с X-сервером.

...