398
static void do_keyboard_grab(VncDisplay *obj, gboolean quiet)
399
#if !GTK_CHECK_VERSION(3, 0, 0)
400
static void do_keyboard_grab_all(GdkWindow *window)
400
VncDisplayPrivate *priv = obj->priv;
402
gdk_keyboard_grab(gtk_widget_get_window(GTK_WIDGET(obj)),
402
gdk_keyboard_grab(window,
404
404
GDK_CURRENT_TIME);
406
static void do_keyboard_ungrab_all(GdkWindow *window G_GNUC_UNUSED)
408
gdk_keyboard_ungrab(GDK_CURRENT_TIME);
410
static void do_pointer_grab_all(GdkWindow *window,
413
gdk_pointer_grab(window,
414
FALSE, /* All events to come to our window directly */
415
GDK_POINTER_MOTION_MASK |
416
GDK_BUTTON_PRESS_MASK |
417
GDK_BUTTON_RELEASE_MASK |
418
GDK_BUTTON_MOTION_MASK |
420
NULL, /* Allow cursor to move over entire desktop */
424
static void do_pointer_ungrab_all(GdkWindow *window G_GNUC_UNUSED)
426
gdk_pointer_ungrab(GDK_CURRENT_TIME);
429
static void do_keyboard_grab_all(GdkWindow *window)
431
GdkDeviceManager *mgr = gdk_display_get_device_manager(gdk_window_get_display(window));
432
GList *devices = gdk_device_manager_list_devices(mgr, GDK_DEVICE_TYPE_MASTER);
433
GList *tmp = devices;
435
GdkDevice *dev = tmp->data;
436
if (gdk_device_get_source(dev) == GDK_SOURCE_KEYBOARD)
441
GDK_KEY_PRESS_MASK | GDK_KEY_RELEASE_MASK,
446
g_list_free(devices);
449
static void do_keyboard_ungrab_all(GdkWindow *window)
451
GdkDeviceManager *mgr = gdk_display_get_device_manager(gdk_window_get_display(window));
452
GList *devices = gdk_device_manager_list_devices(mgr, GDK_DEVICE_TYPE_MASTER);
453
GList *tmp = devices;
455
GdkDevice *dev = tmp->data;
456
if (gdk_device_get_source(dev) == GDK_SOURCE_KEYBOARD)
457
gdk_device_ungrab(dev,
461
g_list_free(devices);
464
static void do_pointer_grab_all(GdkWindow *window,
467
GdkDeviceManager *mgr = gdk_display_get_device_manager(gdk_window_get_display(window));
468
GList *devices = gdk_device_manager_list_devices(mgr, GDK_DEVICE_TYPE_MASTER);
469
GList *tmp = devices;
471
GdkDevice *dev = tmp->data;
472
if (gdk_device_get_source(dev) == GDK_SOURCE_MOUSE)
476
FALSE, /* All events to come to our window directly */
477
GDK_POINTER_MOTION_MASK |
478
GDK_BUTTON_PRESS_MASK |
479
GDK_BUTTON_RELEASE_MASK |
480
GDK_BUTTON_MOTION_MASK |
486
g_list_free(devices);
489
static void do_pointer_ungrab_all(GdkWindow *window)
491
GdkDeviceManager *mgr = gdk_display_get_device_manager(gdk_window_get_display(window));
492
GList *devices = gdk_device_manager_list_devices(mgr, GDK_DEVICE_TYPE_MASTER);
493
GList *tmp = devices;
495
GdkDevice *dev = tmp->data;
496
if (gdk_device_get_source(dev) == GDK_SOURCE_MOUSE)
497
gdk_device_ungrab(dev,
501
g_list_free(devices);
505
static void do_keyboard_grab(VncDisplay *obj, gboolean quiet)
507
VncDisplayPrivate *priv = obj->priv;
509
do_keyboard_grab_all(gtk_widget_get_window(GTK_WIDGET(obj)));
405
510
priv->in_keyboard_grab = TRUE;
407
512
g_signal_emit(obj, signals[VNC_KEYBOARD_GRAB], 0);
448
553
* what window the pointer is actally over, so use 'FALSE' for
449
554
* 'owner_events' parameter
451
gdk_pointer_grab(gtk_widget_get_window(GTK_WIDGET(obj)),
452
FALSE, /* All events to come to our window directly */
453
GDK_POINTER_MOTION_MASK |
454
GDK_BUTTON_PRESS_MASK |
455
GDK_BUTTON_RELEASE_MASK |
456
GDK_BUTTON_MOTION_MASK |
458
NULL, /* Allow cursor to move over entire desktop */
459
priv->remote_cursor ? priv->remote_cursor : priv->null_cursor,
556
do_pointer_grab_all(gtk_widget_get_window(GTK_WIDGET(obj)),
557
priv->remote_cursor ? priv->remote_cursor : priv->null_cursor);
461
558
priv->in_pointer_grab = TRUE;
463
560
g_signal_emit(obj, signals[VNC_POINTER_GRAB], 0);
647
743
if (y >= (gdk_screen_get_height(screen) - 1)) y -= 200;
649
745
if (x != (int)motion->x_root || y != (int)motion->y_root) {
746
#if GTK_CHECK_VERSION(3, 0, 0)
747
GdkDevice *dev = gdk_event_get_device((GdkEvent*)motion);
748
gdk_device_warp(dev, screen, x, y);
750
GdkDisplay *display = gtk_widget_get_display(widget);
650
751
gdk_display_warp_pointer(display, screen, x, y);
651
753
priv->last_x = -1;
652
754
priv->last_y = -1;
1529
gboolean vnc_display_open_fd_with_hostname(VncDisplay *obj, int fd, const char *hostname)
1531
VncDisplayPrivate *priv = obj->priv;
1533
if (vnc_connection_is_open(priv->conn))
1536
if (!vnc_connection_set_shared(priv->conn, priv->shared_flag))
1539
if (!vnc_connection_open_fd_with_hostname(priv->conn, fd, hostname))
1542
g_object_ref(G_OBJECT(obj));
1548
gboolean vnc_display_open_addr(VncDisplay *obj, GSocketAddress *addr, const char *hostname)
1550
VncDisplayPrivate *priv = obj->priv;
1552
if (vnc_connection_is_open(priv->conn))
1555
if (!vnc_connection_set_shared(priv->conn, priv->shared_flag))
1558
if (!vnc_connection_open_addr(priv->conn, addr, hostname))
1561
g_object_ref(G_OBJECT(obj));
1426
1567
gboolean vnc_display_open_host(VncDisplay *obj, const char *host, const char *port)
1428
1569
VncDisplayPrivate *priv = obj->priv;
2061
2202
do_pointer_ungrab(obj, FALSE);
2207
* vnc_display_set_grab_keys:
2208
* @obj: (transfer none): the vnc display object
2209
* @seq: (transfer none): the new grab sequence
2211
* Set the key grab sequence
2064
2213
void vnc_display_set_grab_keys(VncDisplay *obj, VncGrabSequence *seq)
2066
2215
if (obj->priv->vncgrabseq) {
2073
2222
obj->priv->vncgrabseq = vnc_grab_sequence_new_from_string("Control_L+Alt_L");
2074
2223
obj->priv->vncactiveseq = g_new0(gboolean, obj->priv->vncgrabseq->nkeysyms);
2224
if (G_UNLIKELY(vnc_util_get_debug())) {
2225
gchar *str = vnc_grab_sequence_as_string(obj->priv->vncgrabseq);
2226
VNC_DEBUG("Grab sequence is now %s", str);
2233
* vnc_display_get_grab_keys:
2234
* @obj: the vnc display object
2236
* Get the current grab key sequence
2238
* Returns: (transfer none): the current grab keys
2077
2240
VncGrabSequence *vnc_display_get_grab_keys(VncDisplay *obj)
2079
2242
return obj->priv->vncgrabseq;