src/gtkrequest.c

changeset 13283
89a0621d5d6a
parent 13281
3558cb15ebb9
child 13356
7a73221c8b6f
equal deleted inserted replaced
13282:83e33fe74de3 13283:89a0621d5d6a
1772 * (eg. file transfer) will be cancelled, then when a new filename is chosen 1772 * (eg. file transfer) will be cancelled, then when a new filename is chosen
1773 * things go BOOM */ 1773 * things go BOOM */
1774 if (id == 1) { 1774 if (id == 1) {
1775 if (data->cbs[1] != NULL) 1775 if (data->cbs[1] != NULL)
1776 ((GaimRequestFileCb)data->cbs[1])(data->user_data, data->u.file.name); 1776 ((GaimRequestFileCb)data->cbs[1])(data->user_data, data->u.file.name);
1777 gaim_request_close(GAIM_REQUEST_FILE, data); 1777 gaim_request_close(data->type, data);
1778 } 1778 }
1779 } 1779 }
1780 1780
1781 #if GTK_CHECK_VERSION(2,4,0) /* FILECHOOSER */ 1781 #if GTK_CHECK_VERSION(2,4,0) /* FILECHOOSER */
1782 static void 1782 static void
1787 generic_response_start(data); 1787 generic_response_start(data);
1788 1788
1789 if (response != GTK_RESPONSE_ACCEPT) { 1789 if (response != GTK_RESPONSE_ACCEPT) {
1790 if (data->cbs[0] != NULL) 1790 if (data->cbs[0] != NULL)
1791 ((GaimRequestFileCb)data->cbs[0])(data->user_data, NULL); 1791 ((GaimRequestFileCb)data->cbs[0])(data->user_data, NULL);
1792 gaim_request_close(GAIM_REQUEST_FILE, data); 1792 gaim_request_close(data->type, data);
1793 return; 1793 return;
1794 } 1794 }
1795 1795
1796 data->u.file.name = gtk_file_chooser_get_filename(GTK_FILE_CHOOSER(data->dialog)); 1796 data->u.file.name = gtk_file_chooser_get_filename(GTK_FILE_CHOOSER(data->dialog));
1797 current_folder = gtk_file_chooser_get_current_folder(GTK_FILE_CHOOSER(data->dialog)); 1797 current_folder = gtk_file_chooser_get_current_folder(GTK_FILE_CHOOSER(data->dialog));
1815 generic_response_start(data); 1815 generic_response_start(data);
1816 1816
1817 name = gtk_file_selection_get_filename(GTK_FILE_SELECTION(data->dialog)); 1817 name = gtk_file_selection_get_filename(GTK_FILE_SELECTION(data->dialog));
1818 1818
1819 /* If name is a directory then change directories */ 1819 /* If name is a directory then change directories */
1820 if (gaim_gtk_check_if_dir(name, GTK_FILE_SELECTION(data->dialog))) 1820 if (data->type == GAIM_REQUEST_FILE) {
1821 return; 1821 if (gaim_gtk_check_if_dir(name, GTK_FILE_SELECTION(data->dialog)))
1822 return;
1823 }
1822 1824
1823 current_folder = g_path_get_dirname(name); 1825 current_folder = g_path_get_dirname(name);
1826
1827 g_free(data->u.file.name);
1828 if (data->type == GAIM_REQUEST_FILE)
1829 data->u.file.name = g_strdup(name);
1830 else
1831 {
1832 if (g_file_test(name, G_FILE_TEST_IS_DIR))
1833 data->u.file.name = g_strdup(name);
1834 else
1835 data->u.file.name = g_strdup(current_folder);
1836 }
1837
1824 if (current_folder != NULL) { 1838 if (current_folder != NULL) {
1825 if (data->u.file.savedialog) { 1839 if (data->u.file.savedialog) {
1826 gaim_prefs_set_string("/gaim/gtk/filelocations/last_save_folder", current_folder); 1840 gaim_prefs_set_string("/gaim/gtk/filelocations/last_save_folder", current_folder);
1827 } else { 1841 } else {
1828 gaim_prefs_set_string("/gaim/gtk/filelocations/last_open_folder", current_folder); 1842 gaim_prefs_set_string("/gaim/gtk/filelocations/last_open_folder", current_folder);
1829 } 1843 }
1830 g_free(current_folder); 1844 g_free(current_folder);
1831 } 1845 }
1832
1833 data->u.file.name = g_strdup(name);
1834 1846
1835 #endif /* FILECHOOSER */ 1847 #endif /* FILECHOOSER */
1836 1848
1837 if ((data->u.file.savedialog == TRUE) && 1849 if ((data->u.file.savedialog == TRUE) &&
1838 (g_file_test(data->u.file.name, G_FILE_TEST_EXISTS))) { 1850 (g_file_test(data->u.file.name, G_FILE_TEST_EXISTS))) {
1851 generic_response_start(data); 1863 generic_response_start(data);
1852 1864
1853 if (data->cbs[0] != NULL) 1865 if (data->cbs[0] != NULL)
1854 ((GaimRequestFileCb)data->cbs[0])(data->user_data, NULL); 1866 ((GaimRequestFileCb)data->cbs[0])(data->user_data, NULL);
1855 1867
1856 gaim_request_close(GAIM_REQUEST_FILE, data); 1868 gaim_request_close(data->type, data);
1857 } 1869 }
1858 #endif /* FILECHOOSER */ 1870 #endif /* FILECHOOSER */
1859 1871
1860 static void * 1872 static void *
1861 gaim_gtk_request_file(const char *title, const char *filename, 1873 gaim_gtk_request_file(const char *title, const char *filename,
1949 gtk_widget_show(filesel); 1961 gtk_widget_show(filesel);
1950 1962
1951 return (void *)data; 1963 return (void *)data;
1952 } 1964 }
1953 1965
1966 static void *
1967 gaim_gtk_request_folder(const char *title, const char *dirname,
1968 GCallback ok_cb, GCallback cancel_cb,
1969 void *user_data)
1970 {
1971 GaimGtkRequestData *data;
1972 GtkWidget *dirsel;
1973
1974 data = g_new0(GaimGtkRequestData, 1);
1975 data->type = GAIM_REQUEST_FOLDER;
1976 data->user_data = user_data;
1977 data->cb_count = 2;
1978 data->cbs = g_new0(GCallback, 2);
1979 data->cbs[0] = cancel_cb;
1980 data->cbs[1] = ok_cb;
1981 data->u.file.savedialog = FALSE;
1982
1983 #if GTK_CHECK_VERSION(2,4,0) /* FILECHOOSER */
1984 /* Use a translated "Select Folder..." in place of NULL after strings thaw. */
1985 dirsel = gtk_file_chooser_dialog_new(
1986 title ? title : NULL,
1987 NULL,
1988 GTK_FILE_CHOOSER_ACTION_SELECT_FOLDER,
1989 GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL,
1990 GTK_STOCK_OK, GTK_RESPONSE_ACCEPT,
1991 NULL);
1992 gtk_dialog_set_default_response(GTK_DIALOG(dirsel), GTK_RESPONSE_ACCEPT);
1993
1994 if ((dirname != NULL) && (*dirname != '\0'))
1995 gtk_file_chooser_set_current_folder(GTK_FILE_CHOOSER(dirsel), dirname);
1996
1997 g_signal_connect(G_OBJECT(GTK_FILE_CHOOSER(dirsel)), "response",
1998 G_CALLBACK(file_ok_check_if_exists_cb), data);
1999 #else
2000 /* Use a translated "Select Folder..." in place of NULL after strings thaw. */
2001 dirsel = gtk_file_selection_new(title ? title : NULL);
2002
2003 g_signal_connect_swapped(G_OBJECT(dirsel), "delete_event",
2004 G_CALLBACK(file_cancel_cb), data);
2005 g_signal_connect_swapped(G_OBJECT(GTK_FILE_SELECTION(dirsel)->cancel_button),
2006 "clicked", G_CALLBACK(file_cancel_cb), data);
2007 g_signal_connect(G_OBJECT(GTK_FILE_SELECTION(dirsel)->ok_button), "clicked",
2008 G_CALLBACK(file_ok_check_if_exists_cb), data);
2009 #endif
2010
2011 data->dialog = dirsel;
2012 gtk_widget_show(dirsel);
2013
2014 return (void *)data;
2015 }
2016
1954 static void 2017 static void
1955 gaim_gtk_close_request(GaimRequestType type, void *ui_handle) 2018 gaim_gtk_close_request(GaimRequestType type, void *ui_handle)
1956 { 2019 {
1957 GaimGtkRequestData *data = (GaimGtkRequestData *)ui_handle; 2020 GaimGtkRequestData *data = (GaimGtkRequestData *)ui_handle;
1958 2021
1974 gaim_gtk_request_input, 2037 gaim_gtk_request_input,
1975 gaim_gtk_request_choice, 2038 gaim_gtk_request_choice,
1976 gaim_gtk_request_action, 2039 gaim_gtk_request_action,
1977 gaim_gtk_request_fields, 2040 gaim_gtk_request_fields,
1978 gaim_gtk_request_file, 2041 gaim_gtk_request_file,
1979 gaim_gtk_close_request 2042 gaim_gtk_close_request,
2043 gaim_gtk_request_folder
1980 }; 2044 };
1981 2045
1982 GaimRequestUiOps * 2046 GaimRequestUiOps *
1983 gaim_gtk_request_get_ui_ops(void) 2047 gaim_gtk_request_get_ui_ops(void)
1984 { 2048 {

mercurial