Mercurial > pidgin.yaz
diff src/gtkrequest.c @ 13282:a651bfe0a922
[gaim-migrate @ 15648]
Part of SF Patch #1175520 from Dennis Nezic with changes by Sadrul to support GTK+ < 2.4
This adds the folder selection function to the request API.
committer: Tailor Script <tailor@pidgin.im>
author | Richard Laager <rlaager@wiktel.com> |
---|---|
date | Tue, 14 Feb 2006 07:45:07 +0000 |
parents | 3de53fe8345f |
children | d278dac585a5 |
line wrap: on
line diff
--- a/src/gtkrequest.c Tue Feb 14 07:28:58 2006 +0000 +++ b/src/gtkrequest.c Tue Feb 14 07:45:07 2006 +0000 @@ -1774,7 +1774,7 @@ if (id == 1) { if (data->cbs[1] != NULL) ((GaimRequestFileCb)data->cbs[1])(data->user_data, data->u.file.name); - gaim_request_close(GAIM_REQUEST_FILE, data); + gaim_request_close(data->type, data); } } @@ -1789,7 +1789,7 @@ if (response != GTK_RESPONSE_ACCEPT) { if (data->cbs[0] != NULL) ((GaimRequestFileCb)data->cbs[0])(data->user_data, NULL); - gaim_request_close(GAIM_REQUEST_FILE, data); + gaim_request_close(data->type, data); return; } @@ -1817,10 +1817,24 @@ name = gtk_file_selection_get_filename(GTK_FILE_SELECTION(data->dialog)); /* If name is a directory then change directories */ - if (gaim_gtk_check_if_dir(name, GTK_FILE_SELECTION(data->dialog))) - return; + if (data->type == GAIM_REQUEST_FILE) { + if (gaim_gtk_check_if_dir(name, GTK_FILE_SELECTION(data->dialog))) + return; + } current_folder = g_path_get_dirname(name); + + g_free(data->u.file.name); + if (data->type == GAIM_REQUEST_FILE) + data->u.file.name = g_strdup(name); + else + { + if (g_file_test(name, G_FILE_TEST_IS_DIR)) + data->u.file.name = g_strdup(name); + else + data->u.file.name = g_strdup(current_folder); + } + if (current_folder != NULL) { if (data->u.file.savedialog) { gaim_prefs_set_string("/gaim/gtk/filelocations/last_save_folder", current_folder); @@ -1830,8 +1844,6 @@ g_free(current_folder); } - data->u.file.name = g_strdup(name); - #endif /* FILECHOOSER */ if ((data->u.file.savedialog == TRUE) && @@ -1853,7 +1865,7 @@ if (data->cbs[0] != NULL) ((GaimRequestFileCb)data->cbs[0])(data->user_data, NULL); - gaim_request_close(GAIM_REQUEST_FILE, data); + gaim_request_close(data->type, data); } #endif /* FILECHOOSER */ @@ -1951,6 +1963,57 @@ return (void *)data; } +static void * +gaim_gtk_request_folder(const char *title, const char *dirname, + GCallback ok_cb, GCallback cancel_cb, + void *user_data) +{ + GaimGtkRequestData *data; + GtkWidget *dirsel; + + data = g_new0(GaimGtkRequestData, 1); + data->type = GAIM_REQUEST_FOLDER; + data->user_data = user_data; + data->cb_count = 2; + data->cbs = g_new0(GCallback, 2); + data->cbs[0] = cancel_cb; + data->cbs[1] = ok_cb; + data->u.file.savedialog = FALSE; + +#if GTK_CHECK_VERSION(2,4,0) /* FILECHOOSER */ + /* Use a translated "Select Folder..." in place of NULL after strings thaw. */ + dirsel = gtk_file_chooser_dialog_new( + title ? title : NULL, + NULL, + GTK_FILE_CHOOSER_ACTION_SELECT_FOLDER, + GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL, + GTK_STOCK_OK, GTK_RESPONSE_ACCEPT, + NULL); + gtk_dialog_set_default_response(GTK_DIALOG(dirsel), GTK_RESPONSE_ACCEPT); + + if ((dirname != NULL) && (*dirname != '\0')) + gtk_file_chooser_set_current_folder(GTK_FILE_CHOOSER(dirsel), dirname); + + g_signal_connect(G_OBJECT(GTK_FILE_CHOOSER(dirsel)), "response", + G_CALLBACK(file_ok_check_if_exists_cb), data); +#else + /* Use a translated "Select Folder..." in place of NULL after strings thaw. */ + dirsel = gtk_file_selection_new(title ? title : NULL); + + g_signal_connect_swapped(G_OBJECT(dirsel), "delete_event", + G_CALLBACK(file_cancel_cb), data); + g_signal_connect_swapped(G_OBJECT(GTK_FILE_SELECTION(dirsel)->cancel_button), + "clicked", G_CALLBACK(file_cancel_cb), data); + g_signal_connect(G_OBJECT(GTK_FILE_SELECTION(dirsel)->ok_button), "clicked", + G_CALLBACK(file_ok_check_if_exists_cb), data); +#endif + + data->dialog = dirsel; + gtk_widget_show(dirsel); + + return (void *)data; +} + static void gaim_gtk_close_request(GaimRequestType type, void *ui_handle) { @@ -1976,7 +2039,8 @@ gaim_gtk_request_action, gaim_gtk_request_fields, gaim_gtk_request_file, - gaim_gtk_close_request + gaim_gtk_close_request, + gaim_gtk_request_folder }; GaimRequestUiOps *