C GTK3中的gdk_测试_模拟_按钮不工作的问题

C GTK3中的gdk_测试_模拟_按钮不工作的问题,c,gtk3,gdk,C,Gtk3,Gdk,无法使gdk_测试_模拟_按钮工作。谁能帮我一下,哪里出了错 按下鼠标右键 计时器启动了 计时器运行后,模拟左键按下 #包括 #包括 #包括 int x_根=0; int y_根=0; gboolean模拟左按钮(gpointer用户数据){ GdkWindow*GdkWindow=gtk_小部件_获取_窗口(用户_数据); Display*Display=GDK\u WINDOW\u XDISPLAY(gdkwindow); Window Window=GDK_Window_XID(gdkwi

无法使gdk_测试_模拟_按钮工作。谁能帮我一下,哪里出了错

  • 按下鼠标右键
  • 计时器启动了
  • 计时器运行后,模拟左键按下
  • #包括
    #包括
    #包括
    int x_根=0;
    int y_根=0;
    gboolean模拟左按钮(gpointer用户数据){
    GdkWindow*GdkWindow=gtk_小部件_获取_窗口(用户_数据);
    Display*Display=GDK\u WINDOW\u XDISPLAY(gdkwindow);
    Window Window=GDK_Window_XID(gdkwindow);
    窗口根=默认根窗口(显示);
    窗口子窗口=无;
    int x=0,y=0;
    x平移坐标(显示、根、窗口、x_根、y_根、&x和&y、,
    &子窗口);
    printf(“XID:0x%08lx\n”,窗口);
    printf(“x\u root=%d,y\u root=%d\n”,x\u root,y\u root);
    printf(“x=%d,y=%d\n”,x,y);
    如果(!gdk_测试_模拟_按钮)(gdkwindow,x,y,1,gdk_按钮1_掩码,
    GDK_按钮(按下按钮)){
    fprintf(标准,“gdk测试模拟按钮()\n”);
    }
    返回FALSE;
    }
    gboolean on_按钮按下(GtkWidget*小部件,GdkEventButton*事件,
    GDKW(楔形边缘){
    如果(事件->类型!=GDK_按钮_按下)
    返回TRUE;
    如果(事件->按钮==3){
    printf(“右XID:0x%08lx\n”,GDK_窗口(gtk_窗口小部件(窗口小部件));
    printf(“右x=%f,y=%f\n”,事件->x\u根,事件->y\u根);
    x_root=事件->x_root;
    y_root=事件->y_root;
    g_timeout_add(1000,模拟左按钮,小部件);
    }else if(事件->按钮==1){
    printf(“左XID:0x%08lx\n”,GDK_窗口(gtk_窗口小部件(窗口小部件));
    printf(“左x=%f,y=%f\n”,事件->x\u根,事件->y\u根);
    }否则{
    printf(“未知x=%f,y=%f\n”,事件->x\u根,事件->y\u根);
    }
    返回FALSE;
    }
    int main(int argc,char*argv[]){
    GtkWidget*窗口=NULL;
    gtk_init(&argc,&argv);
    窗口=gtk_窗口_新建(gtk_窗口_顶层);
    gtk_窗口设置位置(gtk_窗口(窗口)、gtk_WIN_位置中心);
    gtk_窗口设置默认大小(gtk_窗口(窗口),230,150);
    gtk_窗口设置标题(gtk_窗口(窗口),“模拟左按钮”);
    gtk_窗_套_装饰(gtk_窗(窗),假);
    gtk_小部件_添加_事件(窗口、GDK_按钮_按下_掩码);
    g_信号连接(g_对象(窗口),“按钮按下事件”,
    G_回调(按按钮),空;
    g_信号连接交换(g_对象(窗口),“销毁”,
    G_回调(gtk_main_quit),G_对象(window));
    gtk_widget_show(窗口);
    gtk_main();
    返回0;
    }
    //Build命令:clang-Wall-g`pkg config--cflags--libs gtk+-3.0`-lX11 test.c
    
    在窗口左上角边缘附近按下鼠标右键并经过1秒后的实际输出:

    右XID:0x03c00003
    右x=817.465820,y=410.487183
    XID:0x03c00003
    x_根=817,y_根=410
    x=4,y=6
    
    经过1秒后的预期输出:

    右XID:0x03c00003
    右x=817.465820,y=410.487183
    XID:0x03c00003
    x_根=817,y_根=410
    x=4,y=6
    
    左XID:0x03c00003我使用函数
    gdk\u event\u put
    而不是
    gdk\u test\u simulate\u按钮解决了这个问题

    gboolean simulate_left_button(gpointer user_data) {
      GdkWindow* gdkwindow = gtk_widget_get_window(user_data);
      GdkDisplay* gdkdisplay = gdk_display_get_default();
      GdkDeviceManager* device_manager = gdk_display_get_device_manager(gdkdisplay);
      Display *display = GDK_WINDOW_XDISPLAY(gdkwindow);
      Window window = GDK_WINDOW_XID(gdkwindow);
      Window root = DefaultRootWindow(display);
      Window subwindow = None;
      GdkEvent* event = NULL;
      GdkEventButton* event_button = NULL;
      int x = 0, y = 0;
    
      XTranslateCoordinates(display, root, window, x_root, y_root, &x, &y,
        &subwindow);
    
      printf("XID: 0x%08lx\n", window);
      printf("x_root = %d, y_root = %d\n", x_root, y_root);
      printf("x = %d, y = %d\n", x, y);
    
      event = gdk_event_new(GDK_BUTTON_PRESS);
      event_button = &event->button;
      event_button->type = GDK_BUTTON_PRESS;
      event_button->window = gdkwindow;
      event_button->send_event = 1;
      event_button->time = GDK_CURRENT_TIME;
      event_button->x = x;
      event_button->y = y;
      event_button->state = GDK_BUTTON1_MASK;
      event_button->button = 1;
      event_button->device = gdk_device_manager_get_client_pointer(device_manager);
      event_button->x_root = x_root;
      event_button->y_root = y_root;
    
      gdk_event_put(event);
      gdk_event_free(event);
      return FALSE;
    }
    
    gboolean simulate_left_button(gpointer user_data) {
      GdkWindow* gdkwindow = gtk_widget_get_window(user_data);
      GdkDisplay* gdkdisplay = gdk_display_get_default();
      GdkDeviceManager* device_manager = gdk_display_get_device_manager(gdkdisplay);
      Display *display = GDK_WINDOW_XDISPLAY(gdkwindow);
      Window window = GDK_WINDOW_XID(gdkwindow);
      Window root = DefaultRootWindow(display);
      Window subwindow = None;
      GdkEvent* event = NULL;
      GdkEventButton* event_button = NULL;
      int x = 0, y = 0;
    
      XTranslateCoordinates(display, root, window, x_root, y_root, &x, &y,
        &subwindow);
    
      printf("XID: 0x%08lx\n", window);
      printf("x_root = %d, y_root = %d\n", x_root, y_root);
      printf("x = %d, y = %d\n", x, y);
    
      event = gdk_event_new(GDK_BUTTON_PRESS);
      event_button = &event->button;
      event_button->type = GDK_BUTTON_PRESS;
      event_button->window = gdkwindow;
      event_button->send_event = 1;
      event_button->time = GDK_CURRENT_TIME;
      event_button->x = x;
      event_button->y = y;
      event_button->state = GDK_BUTTON1_MASK;
      event_button->button = 1;
      event_button->device = gdk_device_manager_get_client_pointer(device_manager);
      event_button->x_root = x_root;
      event_button->y_root = y_root;
    
      gdk_event_put(event);
      gdk_event_free(event);
      return FALSE;
    }