C GTK3中的gdk_测试_模拟_按钮不工作的问题
无法使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
#包括
#包括
#包括
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;
}