gtk: factor out gtk3 grab into the new gd_grab_devices function
Signed-off-by: Gerd Hoffmann <kraxel@redhat.com>
This commit is contained in:
		
							parent
							
								
									0a337ed067
								
							
						
					
					
						commit
						f50def915e
					
				
							
								
								
									
										94
									
								
								ui/gtk.c
								
								
								
								
							
							
						
						
									
										94
									
								
								ui/gtk.c
								
								
								
								
							| 
						 | 
					@ -1162,28 +1162,39 @@ static void gd_menu_zoom_fit(GtkMenuItem *item, void *opaque)
 | 
				
			||||||
    gd_update_full_redraw(vc);
 | 
					    gd_update_full_redraw(vc);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#if GTK_CHECK_VERSION(3, 0, 0)
 | 
				
			||||||
 | 
					static void gd_grab_devices(VirtualConsole *vc, bool grab,
 | 
				
			||||||
 | 
					                            GdkInputSource source, GdkEventMask mask,
 | 
				
			||||||
 | 
					                            GdkCursor *cursor)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					    GdkDisplay *display = gtk_widget_get_display(vc->gfx.drawing_area);
 | 
				
			||||||
 | 
					    GdkDeviceManager *mgr = gdk_display_get_device_manager(display);
 | 
				
			||||||
 | 
					    GList *devs = gdk_device_manager_list_devices(mgr, GDK_DEVICE_TYPE_MASTER);
 | 
				
			||||||
 | 
					    GList *tmp = devs;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    for (tmp = devs; tmp; tmp = tmp->next) {
 | 
				
			||||||
 | 
					        GdkDevice *dev = tmp->data;
 | 
				
			||||||
 | 
					        if (gdk_device_get_source(dev) != source) {
 | 
				
			||||||
 | 
					            continue;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        if (grab) {
 | 
				
			||||||
 | 
					            GdkWindow *win = gtk_widget_get_window(vc->gfx.drawing_area);
 | 
				
			||||||
 | 
					            gdk_device_grab(dev, win, GDK_OWNERSHIP_NONE, FALSE,
 | 
				
			||||||
 | 
					                            mask, cursor, GDK_CURRENT_TIME);
 | 
				
			||||||
 | 
					        } else {
 | 
				
			||||||
 | 
					            gdk_device_ungrab(dev, GDK_CURRENT_TIME);
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    g_list_free(devs);
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static void gd_grab_keyboard(VirtualConsole *vc)
 | 
					static void gd_grab_keyboard(VirtualConsole *vc)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
#if GTK_CHECK_VERSION(3, 0, 0)
 | 
					#if GTK_CHECK_VERSION(3, 0, 0)
 | 
				
			||||||
    GdkDisplay *display = gtk_widget_get_display(vc->gfx.drawing_area);
 | 
					    gd_grab_devices(vc, true, GDK_SOURCE_KEYBOARD,
 | 
				
			||||||
    GdkDeviceManager *mgr = gdk_display_get_device_manager(display);
 | 
					 | 
				
			||||||
    GList *devices = gdk_device_manager_list_devices(mgr,
 | 
					 | 
				
			||||||
                                                     GDK_DEVICE_TYPE_MASTER);
 | 
					 | 
				
			||||||
    GList *tmp = devices;
 | 
					 | 
				
			||||||
    while (tmp) {
 | 
					 | 
				
			||||||
        GdkDevice *dev = tmp->data;
 | 
					 | 
				
			||||||
        if (gdk_device_get_source(dev) == GDK_SOURCE_KEYBOARD) {
 | 
					 | 
				
			||||||
            gdk_device_grab(dev,
 | 
					 | 
				
			||||||
                            gtk_widget_get_window(vc->gfx.drawing_area),
 | 
					 | 
				
			||||||
                            GDK_OWNERSHIP_NONE,
 | 
					 | 
				
			||||||
                            FALSE,
 | 
					 | 
				
			||||||
                   GDK_KEY_PRESS_MASK | GDK_KEY_RELEASE_MASK,
 | 
					                   GDK_KEY_PRESS_MASK | GDK_KEY_RELEASE_MASK,
 | 
				
			||||||
                            NULL,
 | 
					                   NULL);
 | 
				
			||||||
                            GDK_CURRENT_TIME);
 | 
					 | 
				
			||||||
        }
 | 
					 | 
				
			||||||
        tmp = tmp->next;
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
    g_list_free(devices);
 | 
					 | 
				
			||||||
#else
 | 
					#else
 | 
				
			||||||
    gdk_keyboard_grab(gtk_widget_get_window(vc->gfx.drawing_area),
 | 
					    gdk_keyboard_grab(gtk_widget_get_window(vc->gfx.drawing_area),
 | 
				
			||||||
                      FALSE,
 | 
					                      FALSE,
 | 
				
			||||||
| 
						 | 
					@ -1203,20 +1214,7 @@ static void gd_ungrab_keyboard(GtkDisplayState *s)
 | 
				
			||||||
    s->kbd_owner = NULL;
 | 
					    s->kbd_owner = NULL;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#if GTK_CHECK_VERSION(3, 0, 0)
 | 
					#if GTK_CHECK_VERSION(3, 0, 0)
 | 
				
			||||||
    GdkDisplay *display = gtk_widget_get_display(vc->gfx.drawing_area);
 | 
					    gd_grab_devices(vc, false, GDK_SOURCE_KEYBOARD, 0, NULL);
 | 
				
			||||||
    GdkDeviceManager *mgr = gdk_display_get_device_manager(display);
 | 
					 | 
				
			||||||
    GList *devices = gdk_device_manager_list_devices(mgr,
 | 
					 | 
				
			||||||
                                                     GDK_DEVICE_TYPE_MASTER);
 | 
					 | 
				
			||||||
    GList *tmp = devices;
 | 
					 | 
				
			||||||
    while (tmp) {
 | 
					 | 
				
			||||||
        GdkDevice *dev = tmp->data;
 | 
					 | 
				
			||||||
        if (gdk_device_get_source(dev) == GDK_SOURCE_KEYBOARD) {
 | 
					 | 
				
			||||||
            gdk_device_ungrab(dev,
 | 
					 | 
				
			||||||
                              GDK_CURRENT_TIME);
 | 
					 | 
				
			||||||
        }
 | 
					 | 
				
			||||||
        tmp = tmp->next;
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
    g_list_free(devices);
 | 
					 | 
				
			||||||
#else
 | 
					#else
 | 
				
			||||||
    gdk_keyboard_ungrab(GDK_CURRENT_TIME);
 | 
					    gdk_keyboard_ungrab(GDK_CURRENT_TIME);
 | 
				
			||||||
#endif
 | 
					#endif
 | 
				
			||||||
| 
						 | 
					@ -1228,28 +1226,13 @@ static void gd_grab_pointer(VirtualConsole *vc)
 | 
				
			||||||
    GdkDisplay *display = gtk_widget_get_display(vc->gfx.drawing_area);
 | 
					    GdkDisplay *display = gtk_widget_get_display(vc->gfx.drawing_area);
 | 
				
			||||||
#if GTK_CHECK_VERSION(3, 0, 0)
 | 
					#if GTK_CHECK_VERSION(3, 0, 0)
 | 
				
			||||||
    GdkDeviceManager *mgr = gdk_display_get_device_manager(display);
 | 
					    GdkDeviceManager *mgr = gdk_display_get_device_manager(display);
 | 
				
			||||||
    GList *devices = gdk_device_manager_list_devices(mgr,
 | 
					    gd_grab_devices(vc, true, GDK_SOURCE_MOUSE,
 | 
				
			||||||
                                                     GDK_DEVICE_TYPE_MASTER);
 | 
					 | 
				
			||||||
    GList *tmp = devices;
 | 
					 | 
				
			||||||
    while (tmp) {
 | 
					 | 
				
			||||||
        GdkDevice *dev = tmp->data;
 | 
					 | 
				
			||||||
        if (gdk_device_get_source(dev) == GDK_SOURCE_MOUSE) {
 | 
					 | 
				
			||||||
            gdk_device_grab(dev,
 | 
					 | 
				
			||||||
                            gtk_widget_get_window(vc->gfx.drawing_area),
 | 
					 | 
				
			||||||
                            GDK_OWNERSHIP_NONE,
 | 
					 | 
				
			||||||
                            FALSE, /* All events to come to our
 | 
					 | 
				
			||||||
                                      window directly */
 | 
					 | 
				
			||||||
                    GDK_POINTER_MOTION_MASK |
 | 
					                    GDK_POINTER_MOTION_MASK |
 | 
				
			||||||
                    GDK_BUTTON_PRESS_MASK |
 | 
					                    GDK_BUTTON_PRESS_MASK |
 | 
				
			||||||
                    GDK_BUTTON_RELEASE_MASK |
 | 
					                    GDK_BUTTON_RELEASE_MASK |
 | 
				
			||||||
                    GDK_BUTTON_MOTION_MASK |
 | 
					                    GDK_BUTTON_MOTION_MASK |
 | 
				
			||||||
                    GDK_SCROLL_MASK,
 | 
					                    GDK_SCROLL_MASK,
 | 
				
			||||||
                            vc->s->null_cursor,
 | 
					                    vc->s->null_cursor);
 | 
				
			||||||
                            GDK_CURRENT_TIME);
 | 
					 | 
				
			||||||
        }
 | 
					 | 
				
			||||||
        tmp = tmp->next;
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
    g_list_free(devices);
 | 
					 | 
				
			||||||
    gdk_device_get_position(gdk_device_manager_get_client_pointer(mgr),
 | 
					    gdk_device_get_position(gdk_device_manager_get_client_pointer(mgr),
 | 
				
			||||||
                            NULL, &vc->s->grab_x_root, &vc->s->grab_y_root);
 | 
					                            NULL, &vc->s->grab_x_root, &vc->s->grab_y_root);
 | 
				
			||||||
#else
 | 
					#else
 | 
				
			||||||
| 
						 | 
					@ -1282,18 +1265,7 @@ static void gd_ungrab_pointer(GtkDisplayState *s)
 | 
				
			||||||
    GdkDisplay *display = gtk_widget_get_display(vc->gfx.drawing_area);
 | 
					    GdkDisplay *display = gtk_widget_get_display(vc->gfx.drawing_area);
 | 
				
			||||||
#if GTK_CHECK_VERSION(3, 0, 0)
 | 
					#if GTK_CHECK_VERSION(3, 0, 0)
 | 
				
			||||||
    GdkDeviceManager *mgr = gdk_display_get_device_manager(display);
 | 
					    GdkDeviceManager *mgr = gdk_display_get_device_manager(display);
 | 
				
			||||||
    GList *devices = gdk_device_manager_list_devices(mgr,
 | 
					    gd_grab_devices(vc, false, GDK_SOURCE_MOUSE, 0, NULL);
 | 
				
			||||||
                                                     GDK_DEVICE_TYPE_MASTER);
 | 
					 | 
				
			||||||
    GList *tmp = devices;
 | 
					 | 
				
			||||||
    while (tmp) {
 | 
					 | 
				
			||||||
        GdkDevice *dev = tmp->data;
 | 
					 | 
				
			||||||
        if (gdk_device_get_source(dev) == GDK_SOURCE_MOUSE) {
 | 
					 | 
				
			||||||
            gdk_device_ungrab(dev,
 | 
					 | 
				
			||||||
                              GDK_CURRENT_TIME);
 | 
					 | 
				
			||||||
        }
 | 
					 | 
				
			||||||
        tmp = tmp->next;
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
    g_list_free(devices);
 | 
					 | 
				
			||||||
    gdk_device_warp(gdk_device_manager_get_client_pointer(mgr),
 | 
					    gdk_device_warp(gdk_device_manager_get_client_pointer(mgr),
 | 
				
			||||||
                    gtk_widget_get_screen(vc->gfx.drawing_area),
 | 
					                    gtk_widget_get_screen(vc->gfx.drawing_area),
 | 
				
			||||||
                    vc->s->grab_x_root, vc->s->grab_y_root);
 | 
					                    vc->s->grab_x_root, vc->s->grab_y_root);
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
		Reference in New Issue