Programación con arrastrar y soltar
Me di cuenta de uno simple, no estoy seguro si eso es lo que quieres.
Este programa puede arrastrar un archivo desde naulitus al GtkEntry de la ventana.
Luego, la ruta del archivo se mostrará en GtkEntry y el archivo se abrirá usando el programa predeterminado del sistema.
El código fuente es el siguiente. Si tienes alguna duda, por favor pregunta.
# include <GTK/GTK.h>
/*Esto es obligatorio; de lo contrario, se llamará a on_drag_data_received dos veces.
*No sé el motivo específico, así que lo bloquearé temporalmente usando este método.
*/
Gbooleano estático on_drag_drop()
{
? Devuelve VERDADERO
}
vacío estático on_drag_data_received(GtkWidget *widget,
?GdkDragContext *context,
?gint ?gpointer user_data)
{
? GdkAtom átomo = GTK_selection_data_get_data_type(datos);
? if(GTK_targets_include_uri(&atom,1)){
gchar * * URI = GTK_selection_data_get_URIs(datos);
gint I = 0;
mientras( uri[I]!=NULL){
? g_printf("%s\n ",uri[I]);
? i++;
}
GTK_ENTRY_set_text(GTK_ENTRY(widget),uri[0]);
/*Usa el programa predeterminado Abrir */
g_app_info_launch_default_for_uri(uri[0], NULL, NULL);
g_strfreev(uri);
p>? }
? gtk_drag_finish(contexto, VERDADERO, VERDADERO, hora)
}
int main(int argc, char *argv[])
{
? GTK_init(& argc & argv);
? Widget GTK * VENTANA = GTK _ VENTANA _ nuevo(GTK _ventana_nivel superior
? GTK_WINDOW_set_position(GTK_WINDOW(Ventana),GTK_WIN_POS_CENTER);
? GTK_WINDOW_set_default_size(GTK_WINDOW(ventana), 380, 160);
? g_signal_connect(G_OBJECT(ventana), "destruir",
G_CALLBACK(gtk_main_quit), NULL);
? GtkWidget * entrada = GTK _ entrada _ nuevo();
? GtkTargetEntry target={
"text/uri-list",
GTK_target_other_application,
1
? };
? gtk_drag_dest_set(entrada,
GTK DEST DEFAULT DROP,
& destino, 1,
gdk_action_dest
? G_signal_connect(G_OBJECT(entrada),"Arrastrar-Datos-Recibir",
g_CALLBACK(on_dr
ag_data_received), NULL);
? G_signal_connect(G_OBJECT(entrada), "arrastrar y soltar",
G_CALLBACK(on_drag_drop), NULL);
? GTK_CONTAINER_add(GTK_container(ventana),entrada);
? gtk_widget_show_all(ventana);
? GTK_main();
? Devuelve 0;
}