📄 testdnd.c
字号:
have_drag = FALSE; gtk_pixmap_set (GTK_PIXMAP (widget), trashcan_closed, trashcan_closed_mask); if (context->targets) { gtk_drag_get_data (widget, context, GPOINTER_TO_INT (context->targets->data), time); return TRUE; } return FALSE;}void target_drag_data_received (GtkWidget *widget, GdkDragContext *context, gint x, gint y, GtkSelectionData *data, guint info, guint time){ if ((data->length >= 0) && (data->format == 8)) { g_print ("Received \"%s\" in trashcan\n", (gchar *)data->data); gtk_drag_finish (context, TRUE, FALSE, time); return; } gtk_drag_finish (context, FALSE, FALSE, time);} void label_drag_data_received (GtkWidget *widget, GdkDragContext *context, gint x, gint y, GtkSelectionData *data, guint info, guint time){ if ((data->length >= 0) && (data->format == 8)) { g_print ("Received \"%s\" in label\n", (gchar *)data->data); gtk_drag_finish (context, TRUE, FALSE, time); return; } gtk_drag_finish (context, FALSE, FALSE, time);}void source_drag_data_get (GtkWidget *widget, GdkDragContext *context, GtkSelectionData *selection_data, guint info, guint time, gpointer data){ if (info == TARGET_ROOTWIN) g_print ("I was dropped on the rootwin\n"); else if (info == TARGET_URL) gtk_selection_data_set (selection_data, selection_data->target, 8, "file:///home/otaylor/images/weave.png", 37); else gtk_selection_data_set (selection_data, selection_data->target, 8, "I'm Data!", 9);} /* The following is a rather elaborate example demonstrating/testing * changing of the window heirarchy during a drag - in this case, * via a "spring-loaded" popup window. */static GtkWidget *popup_window = NULL;static gboolean popped_up = FALSE;static gboolean in_popup = FALSE;static guint popdown_timer = 0;static guint popup_timer = 0;gintpopdown_cb (gpointer data){ popdown_timer = 0; gtk_widget_hide (popup_window); popped_up = FALSE; return FALSE;}gbooleanpopup_motion (GtkWidget *widget, GdkDragContext *context, gint x, gint y, guint time){ if (!in_popup) { in_popup = TRUE; if (popdown_timer) { g_print ("removed popdown\n"); gtk_timeout_remove (popdown_timer); popdown_timer = 0; } } return TRUE;}void popup_leave (GtkWidget *widget, GdkDragContext *context, guint time){ if (in_popup) { in_popup = FALSE; if (!popdown_timer) { g_print ("added popdown\n"); popdown_timer = gtk_timeout_add (500, popdown_cb, NULL); } }}gintpopup_cb (gpointer data){ if (!popped_up) { if (!popup_window) { GtkWidget *button; GtkWidget *table; int i, j; popup_window = gtk_window_new (GTK_WINDOW_POPUP); gtk_window_set_position (GTK_WINDOW (popup_window), GTK_WIN_POS_MOUSE); table = gtk_table_new (3,3, FALSE); for (i=0; i<3; i++) for (j=0; j<3; j++) { char buffer[128]; g_snprintf(buffer, sizeof(buffer), "%d,%d", i, j); button = gtk_button_new_with_label (buffer); gtk_table_attach (GTK_TABLE (table), button, i, i+1, j, j+1, GTK_EXPAND | GTK_FILL, GTK_EXPAND | GTK_FILL, 0, 0); gtk_drag_dest_set (button, GTK_DEST_DEFAULT_ALL, target_table, n_targets - 1, /* no rootwin */ GDK_ACTION_COPY | GDK_ACTION_MOVE); gtk_signal_connect (GTK_OBJECT (button), "drag_motion", GTK_SIGNAL_FUNC (popup_motion), NULL); gtk_signal_connect (GTK_OBJECT (button), "drag_leave", GTK_SIGNAL_FUNC (popup_leave), NULL); } gtk_widget_show_all (table); gtk_container_add (GTK_CONTAINER (popup_window), table); } gtk_widget_show (popup_window); popped_up = TRUE; } popdown_timer = gtk_timeout_add (500, popdown_cb, NULL); g_print ("added popdown\n"); popup_timer = FALSE; return FALSE;}gbooleanpopsite_motion (GtkWidget *widget, GdkDragContext *context, gint x, gint y, guint time){ if (!popup_timer) popup_timer = gtk_timeout_add (500, popup_cb, NULL); return TRUE;}void popsite_leave (GtkWidget *widget, GdkDragContext *context, guint time){ if (popup_timer) { gtk_timeout_remove (popup_timer); popup_timer = 0; }}void source_drag_data_delete (GtkWidget *widget, GdkDragContext *context, gpointer data){ g_print ("Delete the data!\n");} int main (int argc, char **argv){ GtkWidget *window; GtkWidget *table; GtkWidget *label; GtkWidget *pixmap; GtkWidget *button; GdkPixmap *drag_icon; GdkPixmap *drag_mask; gtk_init (&argc, &argv); window = gtk_window_new (GTK_WINDOW_TOPLEVEL); gtk_signal_connect (GTK_OBJECT(window), "destroy", GTK_SIGNAL_FUNC (gtk_main_quit), NULL); table = gtk_table_new (2, 2, FALSE); gtk_container_add (GTK_CONTAINER (window), table); drag_icon = gdk_pixmap_colormap_create_from_xpm_d (NULL, gtk_widget_get_colormap (window), &drag_mask, NULL, drag_icon_xpm); trashcan_open = gdk_pixmap_colormap_create_from_xpm_d (NULL, gtk_widget_get_colormap (window), &trashcan_open_mask, NULL, trashcan_open_xpm); trashcan_closed = gdk_pixmap_colormap_create_from_xpm_d (NULL, gtk_widget_get_colormap (window), &trashcan_closed_mask, NULL, trashcan_closed_xpm); label = gtk_label_new ("Drop Here\n"); gtk_drag_dest_set (label, GTK_DEST_DEFAULT_ALL, target_table, n_targets - 1, /* no rootwin */ GDK_ACTION_COPY | GDK_ACTION_MOVE); gtk_signal_connect( GTK_OBJECT(label), "drag_data_received", GTK_SIGNAL_FUNC( label_drag_data_received), NULL); gtk_table_attach (GTK_TABLE (table), label, 0, 1, 0, 1, GTK_EXPAND | GTK_FILL, GTK_EXPAND | GTK_FILL, 0, 0); label = gtk_label_new ("Popup\n"); gtk_drag_dest_set (label, GTK_DEST_DEFAULT_ALL, target_table, n_targets - 1, /* no rootwin */ GDK_ACTION_COPY | GDK_ACTION_MOVE); gtk_table_attach (GTK_TABLE (table), label, 1, 2, 1, 2, GTK_EXPAND | GTK_FILL, GTK_EXPAND | GTK_FILL, 0, 0); gtk_signal_connect (GTK_OBJECT (label), "drag_motion", GTK_SIGNAL_FUNC (popsite_motion), NULL); gtk_signal_connect (GTK_OBJECT (label), "drag_leave", GTK_SIGNAL_FUNC (popsite_leave), NULL); pixmap = gtk_pixmap_new (trashcan_closed, trashcan_closed_mask); gtk_drag_dest_set (pixmap, 0, NULL, 0, 0); gtk_table_attach (GTK_TABLE (table), pixmap, 1, 2, 0, 1, GTK_EXPAND | GTK_FILL, GTK_EXPAND | GTK_FILL, 0, 0); gtk_signal_connect (GTK_OBJECT (pixmap), "drag_leave", GTK_SIGNAL_FUNC (target_drag_leave), NULL); gtk_signal_connect (GTK_OBJECT (pixmap), "drag_motion", GTK_SIGNAL_FUNC (target_drag_motion), NULL); gtk_signal_connect (GTK_OBJECT (pixmap), "drag_drop", GTK_SIGNAL_FUNC (target_drag_drop), NULL); gtk_signal_connect (GTK_OBJECT (pixmap), "drag_data_received", GTK_SIGNAL_FUNC (target_drag_data_received), NULL); /* Drag site */ button = gtk_button_new_with_label ("Drag Here\n"); gtk_drag_source_set (button, GDK_BUTTON1_MASK | GDK_BUTTON3_MASK, target_table, n_targets, GDK_ACTION_COPY | GDK_ACTION_MOVE); gtk_drag_source_set_icon (button, gtk_widget_get_colormap (window), drag_icon, drag_mask); gdk_pixmap_unref (drag_icon); gdk_pixmap_unref (drag_mask); gtk_table_attach (GTK_TABLE (table), button, 0, 1, 1, 2, GTK_EXPAND | GTK_FILL, GTK_EXPAND | GTK_FILL, 0, 0); gtk_signal_connect (GTK_OBJECT (button), "drag_data_get", GTK_SIGNAL_FUNC (source_drag_data_get), NULL); gtk_signal_connect (GTK_OBJECT (button), "drag_data_delete", GTK_SIGNAL_FUNC (source_drag_data_delete), NULL); gtk_widget_show_all (window); gtk_main (); return 0;}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -