diff --git a/src/browser.c b/src/browser.c index 9ebeee8..59a071d 100644 --- a/src/browser.c +++ b/src/browser.c @@ -129,6 +129,7 @@ unsigned int browser_cnt = 0; /* public */ /* functions */ /* browser_new */ +static gboolean _new_idle(gpointer data); static int _new_pixbufs(Browser * browser); static GtkListStore * _create_store(Browser * browser); @@ -147,6 +148,7 @@ Browser * browser_new(char const * directory) GtkWidget * menu; GtkWidget * menuitem; #endif + char * p; if((browser = malloc(sizeof(*browser))) == NULL) { @@ -322,10 +324,6 @@ Browser * browser_new(char const * directory) browser_set_view(browser, BV_DETAILS); gtk_widget_grab_focus(browser->detailview); #endif - if(directory != NULL) - browser_set_location(browser, directory); - else - browser_go_home(browser); /* preferences */ browser->pr_window = NULL; @@ -333,12 +331,36 @@ Browser * browser_new(char const * directory) /* about */ browser->ab_window = NULL; + /* open directory */ + if(directory != NULL && (p = strdup(directory)) != NULL) + browser->current = g_list_append(browser->current, p); + g_idle_add(_new_idle, browser); + + gtk_container_add(GTK_CONTAINER(browser->window), vbox); gtk_widget_show_all(browser->window); browser_cnt++; return browser; } +static gboolean _new_idle(gpointer data) +{ + Browser * browser = data; + char * p; + + if(browser->current == NULL) + browser_go_home(browser); + else + { + p = browser->current->data; + browser->current = g_list_delete_link(browser->current, + browser->current); + browser_set_location(browser, p); + free(p); + } + return FALSE; +} + static int _new_pixbufs(Browser * browser) { char * file[] = { "gnome-fs-regular", @@ -486,7 +508,7 @@ int browser_error(Browser * browser, char const * message, int ret) GTK_DIALOG_DESTROY_WITH_PARENT, GTK_MESSAGE_ERROR, GTK_BUTTONS_CLOSE, "%s", "Error"); gtk_message_dialog_format_secondary_text(GTK_MESSAGE_DIALOG(dialog), - "%s", message); + "%s: %s", message, strerror(errno)); gtk_window_set_title(GTK_WINDOW(dialog), "Error"); if(ret < 0) { @@ -655,7 +677,7 @@ void browser_refresh(Browser * browser) || fstat(fd, &st) != 0 || (dir = fdopendir(fd)) == NULL) { - browser_error(browser, strerror(errno), 0); + browser_error(browser, browser->current->data, 0); if(fd >= 0) close(fd); return; @@ -663,13 +685,13 @@ void browser_refresh(Browser * browser) #else if((dir = opendir(browser->current->data)) == NULL) { - browser_error(browser, strerror(errno), 0); + browser_error(browser, browser->current->data, 0); return; } fd = dirfd(dir); if(fstat(fd, &st) != 0) { - browser_error(browser, strerror(errno), 0); + browser_error(browser, browser->current->data, 0); closedir(dir); return; } @@ -738,8 +760,8 @@ static void _refresh_path(Browser * browser) /* _refresh_new */ -static int _new_loop(Browser * browser); -static gboolean _new_idle(gpointer data); +static int _refresh_new_loop(Browser * browser); +static gboolean _refresh_new_idle(gpointer data); static void _refresh_done(Browser * browser); static void _refresh_new(Browser * browser) @@ -747,21 +769,22 @@ static void _refresh_new(Browser * browser) unsigned int i; gtk_list_store_clear(browser->store); - for(i = 0; i < IDLE_LOOP_ICON_CNT && _new_loop(browser) == 0; i++); + for(i = 0; i < IDLE_LOOP_ICON_CNT + && _refresh_new_loop(browser) == 0; i++); if(i == IDLE_LOOP_ICON_CNT) - browser->refresh_id = g_idle_add(_new_idle, browser); + browser->refresh_id = g_idle_add(_refresh_new_idle, browser); else _refresh_done(browser); } -/* _new_loop */ +/* _refresh_new_loop */ static int _loop_status(Browser * browser); static void _loop_insert(Browser * browser, GtkTreeIter * iter, char const * path, char const * display, struct stat * lst, struct stat * st, gboolean updated); -static int _new_loop(Browser * browser) +static int _refresh_new_loop(Browser * browser) { struct dirent * de; GtkTreeIter iter; @@ -1029,12 +1052,13 @@ static void _insert_dir(Browser * browser, GdkPixbuf ** icon_24, #endif } -static gboolean _new_idle(gpointer data) +static gboolean _refresh_new_idle(gpointer data) { Browser * browser = data; unsigned int i; - for(i = 0; i < IDLE_LOOP_ICON_CNT && _new_loop(browser) == 0; i++); + for(i = 0; i < IDLE_LOOP_ICON_CNT + && _refresh_new_loop(browser) == 0; i++); if(i == IDLE_LOOP_ICON_CNT) return TRUE; _refresh_done(browser); @@ -1260,7 +1284,7 @@ void browser_set_location(Browser * browser, char const * path) return; } else - browser_error(browser, realpath, 0); /* XXX call strerror() */ + browser_error(browser, realpath, 0); free(realpath); } diff --git a/src/callbacks.c b/src/callbacks.c index a387396..cfc7faf 100644 --- a/src/callbacks.c +++ b/src/callbacks.c @@ -77,12 +77,12 @@ void on_file_new_folder(GtkWidget * widget, gpointer data) if((path = malloc(strlen(cur) + sizeof(newfolder) + 1)) == NULL) { - browser_error(browser, strerror(errno), 0); + browser_error(browser, "malloc", 0); return; } sprintf(path, "%s/%s", cur, newfolder); if(mkdir(path, 0777) != 0) - browser_error(browser, strerror(errno), 0); + browser_error(browser, path, 0); free(path); } @@ -655,7 +655,6 @@ void on_updir(GtkWidget * widget, gpointer data) Browser * browser = data; char * dir; - browser = data; dir = g_path_get_dirname(browser->current->data); browser_set_location(browser, dir); g_free(dir); @@ -764,14 +763,14 @@ void on_filename_edited(GtkCellRendererText * renderer, gchar * arg1, { q = g_filename_from_utf8(p, -1, NULL, NULL, NULL); if(rename(path, q != NULL ? q : p) != 0) - browser_error(browser, strerror(errno), 0); + browser_error(browser, path, 0); else gtk_list_store_set(browser->store, &iter, BR_COL_PATH, p, BR_COL_DISPLAY_NAME, arg2, -1); free(q); } else if(link(path, p) != 0 || unlink(path) != 0) - browser_error(browser, strerror(errno), 0); + browser_error(browser, path, 0); else gtk_list_store_set(browser->store, &iter, BR_COL_PATH, p, BR_COL_DISPLAY_NAME, arg2, -1); @@ -1039,12 +1038,12 @@ static void _on_popup_new_text_file(GtkWidget * widget, gpointer data) if((path = malloc(strlen(cur) + sizeof(newtext) + 1)) == NULL) { - browser_error(browser, strerror(errno), 0); + browser_error(browser, "malloc", 0); return; } sprintf(path, "%s/%s", cur, newtext); if((fd = creat(path, 0666)) < 0) - browser_error(browser, strerror(errno), 0); + browser_error(browser, path, 0); else close(fd); free(path); @@ -1240,11 +1239,11 @@ static void _on_icon_run(GtkWidget * widget, gpointer data) if(res != GTK_RESPONSE_YES) return; if((pid = fork()) == -1) - browser_error(cb->browser, strerror(errno), 0); + browser_error(cb->browser, "fork", 0); else if(pid == 0) { execl(cb->path, cb->path, NULL); - browser_error(cb->browser, strerror(errno), 0); + browser_error(cb->browser, "fork", 0); exit(127); } } @@ -1271,5 +1270,5 @@ static void _on_icon_unmount(GtkWidget * widget, gpointer data) IconCallback * cb = data; if(unmount(cb->path, 0) != 0) - browser_error(cb->browser, strerror(errno), 0); + browser_error(cb->browser, cb->path, 0); }