diff options
author | Matthias Clasen <mclasen@redhat.com> | 2017-08-25 22:52:09 -0400 |
---|---|---|
committer | Matthias Clasen <mclasen@redhat.com> | 2017-08-25 22:52:09 -0400 |
commit | ccdcc9a0dd7b5cf211a07172e3bcabb878d3af95 (patch) | |
tree | 31c8548ef87ff54dc56036221c67cce056f1e14d | |
parent | 3e8af5cebfc6647c9eef376a4d657fda4d915055 (diff) | |
download | gtk+-ccdcc9a0dd7b5cf211a07172e3bcabb878d3af95.tar.gz |
dnd: Convert to GdkEvent API
-rw-r--r-- | gtk/gtkdnd.c | 200 |
1 files changed, 63 insertions, 137 deletions
diff --git a/gtk/gtkdnd.c b/gtk/gtkdnd.c index 196b61be56..7726712b6c 100644 --- a/gtk/gtkdnd.c +++ b/gtk/gtkdnd.c @@ -233,9 +233,6 @@ static gboolean gtk_drag_motion_cb (GtkWidget *widget, static gboolean gtk_drag_key_cb (GtkWidget *widget, GdkEventKey *event, gpointer data); -static gboolean gtk_drag_grab_broken_event_cb (GtkWidget *widget, - GdkEventGrabBroken *event, - gpointer data); static void gtk_drag_grab_notify_cb (GtkWidget *widget, gboolean was_grabbed, gpointer data); @@ -378,43 +375,6 @@ gtk_drag_release_ipc_widget (GtkWidget *widget) drag_widgets); } -static guint32 -gtk_drag_get_event_time (GdkEvent *event) -{ - guint32 tm = GDK_CURRENT_TIME; - - if (event) - switch (event->type) - { - case GDK_MOTION_NOTIFY: - tm = event->motion.time; break; - case GDK_BUTTON_PRESS: - case GDK_2BUTTON_PRESS: - case GDK_3BUTTON_PRESS: - case GDK_BUTTON_RELEASE: - tm = event->button.time; break; - case GDK_KEY_PRESS: - case GDK_KEY_RELEASE: - tm = event->key.time; break; - case GDK_ENTER_NOTIFY: - case GDK_LEAVE_NOTIFY: - tm = event->crossing.time; break; - case GDK_PROPERTY_NOTIFY: - tm = event->property.time; break; - case GDK_SELECTION_CLEAR: - case GDK_SELECTION_REQUEST: - case GDK_SELECTION_NOTIFY: - tm = event->selection.time; break; - case GDK_PROXIMITY_IN: - case GDK_PROXIMITY_OUT: - tm = event->proximity.time; break; - default: /* use current time */ - break; - } - - return tm; -} - static void gtk_drag_get_event_actions (const GdkEvent *event, gint button, @@ -428,29 +388,8 @@ gtk_drag_get_event_actions (const GdkEvent *event, if (event) { GdkModifierType state = 0; - - switch (event->type) - { - case GDK_MOTION_NOTIFY: - state = event->motion.state; - break; - case GDK_BUTTON_PRESS: - case GDK_2BUTTON_PRESS: - case GDK_3BUTTON_PRESS: - case GDK_BUTTON_RELEASE: - state = event->button.state; - break; - case GDK_KEY_PRESS: - case GDK_KEY_RELEASE: - state = event->key.state; - break; - case GDK_ENTER_NOTIFY: - case GDK_LEAVE_NOTIFY: - state = event->crossing.state; - break; - default: - break; - } + + gdk_event_get_state (event, &state); if ((button == GDK_BUTTON_MIDDLE || button == GDK_BUTTON_SECONDARY) && (actions & GDK_ACTION_ASK)) { @@ -780,16 +719,20 @@ _gtk_drag_dest_handle_event (GtkWidget *toplevel, { GtkDragDestInfo *info; GdkDragContext *context; + guint32 time; + GdkEventType event_type; g_return_if_fail (toplevel != NULL); g_return_if_fail (event != NULL); - context = event->dnd.context; + event_type = gdk_event_get_event_type (event); + gdk_event_get_drag_context (event, &context); + time = gdk_event_get_time (event); info = gtk_drag_get_dest_info (context, TRUE); /* Find the widget for the event */ - switch (event->type) + switch (event_type) { case GDK_DRAG_ENTER: break; @@ -797,7 +740,7 @@ _gtk_drag_dest_handle_event (GtkWidget *toplevel, case GDK_DRAG_LEAVE: if (info->widget) { - gtk_drag_dest_leave (info->widget, context, event->dnd.time); + gtk_drag_dest_leave (info->widget, context, time); gtk_drag_dest_set_widget (info, NULL); } break; @@ -807,9 +750,10 @@ _gtk_drag_dest_handle_event (GtkWidget *toplevel, { GdkWindow *window; gint tx, ty; + double x_root, y_root; gboolean found; - if (event->type == GDK_DROP_START) + if (event_type == GDK_DROP_START) { info->dropped = TRUE; /* We send a leave here so that the widget unhighlights @@ -817,7 +761,7 @@ _gtk_drag_dest_handle_event (GtkWidget *toplevel, */ if (info->widget) { - gtk_drag_dest_leave (info->widget, context, event->dnd.time); + gtk_drag_dest_leave (info->widget, context, time); gtk_drag_dest_set_widget (info, NULL); } } @@ -825,33 +769,34 @@ _gtk_drag_dest_handle_event (GtkWidget *toplevel, window = gtk_widget_get_window (toplevel); gdk_window_get_position (window, &tx, &ty); + gdk_event_get_root_coords (event, &x_root, &y_root); found = gtk_drag_find_widget (toplevel, context, info, - event->dnd.x_root - tx, - event->dnd.y_root - ty, - event->dnd.time, - (event->type == GDK_DRAG_MOTION) ? + x_root - tx, + y_root - ty, + time, + (event_type == GDK_DRAG_MOTION) ? gtk_drag_dest_motion : gtk_drag_dest_drop); if (info->widget && !found) { - gtk_drag_dest_leave (info->widget, context, event->dnd.time); + gtk_drag_dest_leave (info->widget, context, time); gtk_drag_dest_set_widget (info, NULL); } /* Send a reply. */ - if (event->type == GDK_DRAG_MOTION) + if (event_type == GDK_DRAG_MOTION) { if (!found) - gdk_drag_status (context, 0, event->dnd.time); + gdk_drag_status (context, 0, time); } - else if (event->type == GDK_DROP_START) + else if (event_type == GDK_DROP_START) { - gdk_drop_reply (context, found, event->dnd.time); + gdk_drop_reply (context, found, time); } } break; @@ -1270,7 +1215,7 @@ gtk_drag_begin_internal (GtkWidget *widget, GdkCursor *cursor; GdkDevice *pointer, *keyboard; GdkWindow *ipc_window; - gint start_x, start_y; + int start_x, start_y; GdkAtom selection; gboolean managed; @@ -1363,10 +1308,13 @@ gtk_drag_begin_internal (GtkWidget *widget, gdk_window_get_root_coords (gtk_widget_get_window (toplevel), x, y, &start_x, &start_y); } - else if (event && event->type == GDK_MOTION_NOTIFY) + else if (event && gdk_event_get_event_type (event) == GDK_MOTION_NOTIFY) { - start_x = event->motion.x_root; - start_y = event->motion.y_root; + double x, y; + + gdk_event_get_root_coords (event, &x, &y); + start_x = (int)x; + start_y = (int)y; } else gdk_device_get_position (pointer, NULL, &start_x, &start_y); @@ -1453,13 +1401,11 @@ gtk_drag_begin_internal (GtkWidget *widget, info->cur_x = info->start_x; info->cur_y = info->start_y; - if (event && event->type == GDK_MOTION_NOTIFY) + if (event && gdk_event_get_event_type (event) == GDK_MOTION_NOTIFY) gtk_drag_motion_cb (info->ipc_widget, (GdkEventMotion *)event, info); else gtk_drag_update (info, info->cur_screen, info->cur_x, info->cur_y, event); - g_signal_connect (info->ipc_widget, "grab-broken-event", - G_CALLBACK (gtk_drag_grab_broken_event_cb), info); g_signal_connect (info->ipc_widget, "grab-notify", G_CALLBACK (gtk_drag_grab_notify_cb), info); g_signal_connect (info->ipc_widget, "button-release-event", @@ -1836,16 +1782,19 @@ _gtk_drag_source_handle_event (GtkWidget *widget, { GtkDragSourceInfo *info; GdkDragContext *context; + guint32 time; g_return_if_fail (widget != NULL); g_return_if_fail (event != NULL); - context = event->dnd.context; + gdk_event_get_drag_context (event, &context); + time = gdk_event_get_time (event); + info = gtk_drag_get_source_info (context, FALSE); if (!info) return; - switch (event->type) + switch (gdk_event_get_event_type (event)) { case GDK_DRAG_STATUS: { @@ -1854,7 +1803,7 @@ _gtk_drag_source_handle_event (GtkWidget *widget, { cursor = gtk_drag_get_cursor (widget, gtk_widget_get_display (widget), - gdk_drag_context_get_selected_action (event->dnd.context), + gdk_drag_context_get_selected_action (context), info); if (info->cursor != cursor) { @@ -1876,7 +1825,7 @@ _gtk_drag_source_handle_event (GtkWidget *widget, break; case GDK_DROP_FINISHED: - gtk_drag_drop_finished (info, GTK_DRAG_RESULT_SUCCESS, event->dnd.time); + gtk_drag_drop_finished (info, GTK_DRAG_RESULT_SUCCESS, time); break; default: g_assert_not_reached (); @@ -2101,9 +2050,6 @@ gtk_drag_source_info_destroy (GtkDragSourceInfo *info) info); g_signal_handlers_disconnect_by_func (info->ipc_widget, - gtk_drag_grab_broken_event_cb, - info); - g_signal_handlers_disconnect_by_func (info->ipc_widget, gtk_drag_grab_notify_cb, info); g_signal_handlers_disconnect_by_func (info->ipc_widget, @@ -2162,7 +2108,7 @@ gtk_drag_update_idle (gpointer data) if (info->last_event) { - time = gtk_drag_get_event_time (info->last_event); + time = gdk_event_get_time (info->last_event); gtk_drag_get_event_actions (info->last_event, info->button, info->possible_actions, @@ -2274,9 +2220,6 @@ gtk_drag_end (GtkDragSourceInfo *info, info->have_grab = FALSE; g_signal_handlers_disconnect_by_func (info->ipc_widget, - gtk_drag_grab_broken_event_cb, - info); - g_signal_handlers_disconnect_by_func (info->ipc_widget, gtk_drag_grab_notify_cb, info); g_signal_handlers_disconnect_by_func (info->ipc_widget, @@ -2366,20 +2309,12 @@ gtk_drag_motion_cb (GtkWidget *widget, { GtkDragSourceInfo *info = (GtkDragSourceInfo *)data; GdkScreen *screen; - gint x_root, y_root; + double x_root, y_root; - if (event->is_hint) - { - gdk_device_get_position (event->device, &screen, &x_root, &y_root); - event->x_root = x_root; - event->y_root = y_root; - } - else - screen = gdk_event_get_screen ((GdkEvent *)event); + gdk_event_get_root_coords ((GdkEvent *)event, &x_root, &y_root); + screen = gdk_event_get_screen ((GdkEvent *)event); - x_root = (gint)(event->x_root + 0.5); - y_root = (gint)(event->y_root + 0.5); - gtk_drag_update (info, screen, x_root, y_root, (GdkEvent *) event); + gtk_drag_update (info, screen, (int)x_root, (int)y_root, (GdkEvent *) event); return TRUE; } @@ -2392,12 +2327,18 @@ gtk_drag_key_cb (GtkWidget *widget, { GtkDragSourceInfo *info = (GtkDragSourceInfo *)data; - if (event->type == GDK_KEY_PRESS) + if (gdk_event_get_event_type ((GdkEvent *)event) == GDK_KEY_PRESS) { - switch (event->keyval) + guint keyval; + guint32 time; + + gdk_event_get_keyval ((GdkEvent *)event, &keyval); + time = gdk_event_get_time ((GdkEvent *)event); + + switch (keyval) { case GDK_KEY_Escape: - gtk_drag_cancel_internal (info, GTK_DRAG_RESULT_USER_CANCELLED, event->time); + gtk_drag_cancel_internal (info, GTK_DRAG_RESULT_USER_CANCELLED, time); break; case GDK_KEY_space: @@ -2408,12 +2349,12 @@ gtk_drag_key_cb (GtkWidget *widget, if ((gdk_drag_context_get_selected_action (info->context) != 0) && (gdk_drag_context_get_dest_window (info->context) != NULL)) { - gtk_drag_end (info, event->time); - gtk_drag_drop (info, event->time); + gtk_drag_end (info, time); + gtk_drag_drop (info, time); } else { - gtk_drag_cancel_internal (info, GTK_DRAG_RESULT_NO_TARGET, event->time); + gtk_drag_cancel_internal (info, GTK_DRAG_RESULT_NO_TARGET, time); } break; } @@ -2422,26 +2363,6 @@ gtk_drag_key_cb (GtkWidget *widget, return TRUE; } -static gboolean -gtk_drag_grab_broken_event_cb (GtkWidget *widget, - GdkEventGrabBroken *event, - gpointer data) -{ - GtkDragSourceInfo *info = (GtkDragSourceInfo *)data; - - /* Don't cancel if we break the implicit grab from the initial button_press. - * Also, don't cancel if we re-grab on the widget or on our IPC window, for - * example, when changing the drag cursor. - */ - if (event->implicit - || event->grab_window == gtk_widget_get_window (info->widget) - || event->grab_window == gtk_widget_get_window (info->ipc_widget)) - return FALSE; - - gtk_drag_cancel_internal (info, GTK_DRAG_RESULT_GRAB_BROKEN, gtk_get_current_event_time ()); - return TRUE; -} - static void gtk_drag_grab_notify_cb (GtkWidget *widget, gboolean was_grabbed, @@ -2470,19 +2391,24 @@ gtk_drag_button_release_cb (GtkWidget *widget, gpointer data) { GtkDragSourceInfo *info = (GtkDragSourceInfo *)data; + guint button; + guint32 time; + + gdk_event_get_button ((GdkEvent *)event, &button); + time = gdk_event_get_time ((GdkEvent *)event); - if (event->button != info->button) + if (button != info->button) return FALSE; if ((gdk_drag_context_get_selected_action (info->context) != 0) && (gdk_drag_context_get_dest_window (info->context) != NULL)) { - gtk_drag_end (info, event->time); - gtk_drag_drop (info, event->time); + gtk_drag_end (info, time); + gtk_drag_drop (info, time); } else { - gtk_drag_cancel_internal (info, GTK_DRAG_RESULT_NO_TARGET, event->time); + gtk_drag_cancel_internal (info, GTK_DRAG_RESULT_NO_TARGET, time); } return TRUE; |