gboolean do_cd (const vfs_path_t * new_dir_vpath, enum cd_enum exact) { gboolean res; const vfs_path_t *_new_dir_vpath = new_dir_vpath; if (current_panel->is_panelized) { size_t new_vpath_len; new_vpath_len = vfs_path_len (new_dir_vpath); if (vfs_path_ncmp (new_dir_vpath, panelized_panel.root_vpath, new_vpath_len) == 0) _new_dir_vpath = panelized_panel.root_vpath; } res = do_panel_cd (current_panel, _new_dir_vpath, exact); #ifdef HAVE_CHARSET if (res) { const vfs_path_element_t *path_element; path_element = vfs_path_get_by_index (current_panel->cwd_vpath, -1); if (path_element->encoding != NULL) current_panel->codepage = get_codepage_index (path_element->encoding); else current_panel->codepage = SELECT_CHARSET_NO_TRANSLATE; } #endif /* HAVE_CHARSET */ return res; }
static void show_tree (WTree * tree) { Dlg_head *h = tree->widget.owner; tree_entry *current; int i, j, topsublevel; int x = 0, y = 0; int tree_lines, tree_cols; /* Initialize */ tree_lines = tlines (tree); tree_cols = tree->widget.cols; widget_move ((Widget *) tree, y, x); if (tree->is_panel) { tree_cols -= 2; x = y = 1; } g_free (tree->tree_shown); tree->tree_shown = g_new0 (tree_entry *, tree_lines); if (tree->store->tree_first) topsublevel = tree->store->tree_first->sublevel; else topsublevel = 0; if (!tree->selected_ptr) { tree->selected_ptr = tree->store->tree_first; tree->topdiff = 0; } current = tree->selected_ptr; /* Calculate the directory which is to be shown on the topmost line */ if (!tree_navigation_flag) current = back_ptr (current, &tree->topdiff); else { i = 0; while (current->prev && i < tree->topdiff) { char *current_name; current = current->prev; current_name = vfs_path_to_str (current->name); if (current->sublevel < tree->selected_ptr->sublevel) { if (vfs_path_cmp (current->name, tree->selected_ptr->name) == 0) i++; } else if (current->sublevel == tree->selected_ptr->sublevel) { for (j = strlen (current_name) - 1; current_name[j] != PATH_SEP; j--); if (vfs_path_ncmp (current->name, tree->selected_ptr->name, j) == 0) i++; } else { if (current->sublevel == tree->selected_ptr->sublevel + 1 && vfs_path_len (tree->selected_ptr->name) > 1) { if (vfs_path_ncmp (current->name, tree->selected_ptr->name, vfs_path_len (tree->selected_ptr->name)) == 0) i++; } } g_free (current_name); } tree->topdiff = i; } /* Loop for every line */ for (i = 0; i < tree_lines; i++) { tty_setcolor (tree->is_panel ? NORMAL_COLOR : TREE_NORMALC (h)); /* Move to the beginning of the line */ tty_draw_hline (tree->widget.y + y + i, tree->widget.x + x, ' ', tree_cols); if (current == NULL) continue; if (tree->is_panel) tty_setcolor (tree->active && current == tree->selected_ptr ? SELECTED_COLOR : NORMAL_COLOR); else tty_setcolor (current == tree->selected_ptr ? TREE_CURRENTC (h) : TREE_NORMALC (h)); tree->tree_shown[i] = current; if (current->sublevel == topsublevel) { /* Show full name */ char *current_name; current_name = vfs_path_to_str (current->name); tty_print_string (str_fit_to_term (current_name, tree_cols + (tree->is_panel ? 0 : 1), J_LEFT_FIT)); g_free (current_name); } else { /* Sub level directory */ tty_set_alt_charset (TRUE); /* Output branch parts */ for (j = 0; j < current->sublevel - topsublevel - 1; j++) { if (tree_cols - 8 - 3 * j < 9) break; tty_print_char (' '); if (current->submask & (1 << (j + topsublevel + 1))) tty_print_char (ACS_VLINE); else tty_print_char (' '); tty_print_char (' '); } tty_print_char (' '); j++; if (!current->next || !(current->next->submask & (1 << current->sublevel))) tty_print_char (ACS_LLCORNER); else tty_print_char (ACS_LTEE); tty_print_char (ACS_HLINE); tty_set_alt_charset (FALSE); /* Show sub-name */ tty_print_char (' '); tty_print_string (str_fit_to_term (current->subname, tree_cols - x - 3 * j, J_LEFT_FIT)); } /* Calculate the next value for current */ current = current->next; if (tree_navigation_flag) { while (current != NULL) { if (current->sublevel < tree->selected_ptr->sublevel) { if (vfs_path_ncmp (current->name, tree->selected_ptr->name, vfs_path_len (current->name)) == 0) break; } else if (current->sublevel == tree->selected_ptr->sublevel) { char *current_name; current_name = vfs_path_to_str (current->name); for (j = strlen (current_name) - 1; current_name[j] != PATH_SEP; j--) ; g_free (current_name); if (vfs_path_ncmp (current->name, tree->selected_ptr->name, j) == 0) break; } else if (current->sublevel == tree->selected_ptr->sublevel + 1 && vfs_path_len (tree->selected_ptr->name) > 1) { if (vfs_path_ncmp (current->name, tree->selected_ptr->name, vfs_path_len (tree->selected_ptr->name)) == 0) break; } current = current->next; } } } tree_show_mini_info (tree, tree_lines, tree_cols); }