Mercurial > pidgin.yaz
diff src/gtkrequest.c @ 8843:1bbe99a07e36
[gaim-migrate @ 9610]
Pekka Riikonen has provided us with a nice file selector request API.
This is it.
committer: Tailor Script <tailor@pidgin.im>
author | Ethan Blanton <elb@pidgin.im> |
---|---|
date | Fri, 30 Apr 2004 03:00:05 +0000 |
parents | 5a2b5e4abf3a |
children | 56e6b9bdcdbc |
line wrap: on
line diff
--- a/src/gtkrequest.c Thu Apr 29 02:42:31 2004 +0000 +++ b/src/gtkrequest.c Fri Apr 30 03:00:05 2004 +0000 @@ -1358,12 +1358,77 @@ g_free(data); } +static void +file_ok_cb(GtkWidget *button, GaimGtkRequestData *data) +{ + const char *name; + + if (!GTK_WIDGET_HAS_FOCUS(button)) + gtk_widget_grab_focus(button); + + if (data->cbs[0] != NULL) { + name = gtk_file_selection_get_filename(GTK_FILE_SELECTION(data->dialog)); + if (gaim_gtk_check_if_dir(name, GTK_FILE_SELECTION(data->dialog))) + name = NULL; + + ((GaimRequestInputCb)data->cbs[0])(data->user_data, name); + } + + gaim_request_close(GAIM_REQUEST_INPUT, data); +} + +static void +file_cancel_cb(GtkWidget *button, GaimGtkRequestData *data) +{ + if (data->cbs[1] != NULL) + ((GaimRequestInputCb)data->cbs[1])(data->user_data, NULL); + + gaim_request_close(GAIM_REQUEST_INPUT, data); +} + +static void * +gaim_gtk_request_file(const char *title, const char *filename, + GCallback ok_cb, GCallback cancel_cb, + void *user_data) +{ + GaimGtkRequestData *data; + GtkWidget *filesel; + char *cur_dir, *init_str, tmp[512]; + + data = g_new0(GaimGtkRequestData, 1); + data->type = GAIM_REQUEST_INPUT; + data->user_data = user_data; + data->cb_count = 2; + data->cbs = g_new0(GCallback, 2); + data->cbs[0] = ok_cb; + data->cbs[1] = cancel_cb; + + filesel = gtk_file_selection_new(title ? title : _("")); + cur_dir = g_get_current_dir(); + g_snprintf(tmp, sizeof(tmp), "%s" G_DIR_SEPARATOR_S, cur_dir); + init_str = g_build_filename(tmp, filename, NULL); + gtk_file_selection_set_filename(GTK_FILE_SELECTION(filesel), init_str); + g_signal_connect(G_OBJECT(GTK_FILE_SELECTION(filesel)), + "delete_event", G_CALLBACK(file_cancel_cb), data); + g_signal_connect(G_OBJECT(GTK_FILE_SELECTION(filesel)->cancel_button), + "clicked", G_CALLBACK(file_cancel_cb), data); + g_signal_connect(G_OBJECT(GTK_FILE_SELECTION(filesel)->ok_button), + "clicked", G_CALLBACK(file_ok_cb), data); + gtk_widget_show(filesel); + g_free(cur_dir); + g_free(init_str); + + data->dialog = filesel; + return (void *)data; +} + static GaimRequestUiOps ops = { gaim_gtk_request_input, gaim_gtk_request_choice, gaim_gtk_request_action, gaim_gtk_request_fields, + gaim_gtk_request_file, gaim_gtk_close_request };