📄 screen.c
字号:
if (panel->selected < 0)
panel->selected = 0;
if (panel->selected > panel->count-1)
panel->selected = panel->count - 1;
if (panel->top_file > panel->count-1){
repaint = 1;
panel->top_file = panel->count-1;
}
if ((panel->count - panel->top_file) < items){
repaint = 1;
panel->top_file = panel->count - items;
if (panel->top_file < 0)
panel->top_file = 0;
}
if (panel->selected < panel->top_file){
repaint = 1;
panel->top_file = panel->selected;
}
if ((panel->selected - panel->top_file) >= items){
repaint = 1;
panel->top_file = panel->selected - items + 1;
}
#ifndef HAVE_X
if (repaint)
paint_panel (panel);
else
repaint_file (panel, panel->selected, 1, 2*selection (panel)->f.marked+1, 0);
#else
if (old_top != panel->top_file)
x_adjust_top_file (panel);
x_select_item (panel);
#endif
display_mini_info (panel);
execute_hooks (select_file_hook);
}
/* Clears all files in the panel, used only when one file was marked */
void
unmark_files (WPanel *panel)
{
int i;
if (!panel->marked)
return;
for (i = 0; i < panel->count; i++)
file_mark (panel, i, 0);
panel->dirs_marked = 0;
panel->marked = 0;
panel->total = 0;
}
#ifdef HAVE_X
void
unselect_item (WPanel *panel)
{
x_unselect_item (panel);
}
#else
void
unselect_item (WPanel *panel)
{
repaint_file (panel, panel->selected, 1, 2*selection (panel)->f.marked, 0);
}
#endif
static void
do_move_down (WPanel *panel)
{
if (panel->selected+1 == panel->count)
return;
unselect_item (panel);
panel->selected++;
#ifndef HAVE_X
if (panel->selected - panel->top_file == ITEMS (panel) &&
panel_scroll_pages){
/* Scroll window half screen */
panel->top_file += ITEMS (panel)/2;
if (panel->top_file > panel->count - ITEMS (panel))
panel->top_file = panel->count - ITEMS (panel);
paint_dir (panel);
select_item (panel);
}
#endif
select_item (panel);
}
static void
do_move_up (WPanel *panel)
{
if (panel->selected == 0)
return;
unselect_item (panel);
panel->selected--;
#ifndef HAVE_X
if (panel->selected < panel->top_file && panel_scroll_pages){
/* Scroll window half screen */
panel->top_file -= ITEMS (panel)/2;
if (panel->top_file < 0) panel->top_file = 0;
paint_dir (panel);
}
#endif
select_item (panel);
}
static int
move_rel (WPanel *panel, int rel)
{
unselect_item (panel);
if (rel < 0){
if (panel->selected + rel < 0)
panel->selected = 0;
else
panel->selected = panel->selected + rel;
} else {
if (panel->selected + rel >= panel->count)
panel->selected = panel->count - 1;
else
panel->selected = panel->selected + rel;
}
select_item (panel);
}
/* */
/* Panel key binded commands */
/* */
static void
move_up (WPanel *panel)
{
if (panel->list_type == list_icons){
move_rel (panel, -ICONS_PER_ROW (panel));
} else
do_move_up (panel);
}
static void
move_down (WPanel *panel)
{
if (panel->list_type == list_icons){
move_rel (panel, ICONS_PER_ROW (panel));
} else
do_move_down (panel);
}
/* Changes the selection by lines (may be negative) */
static void
move_selection (WPanel *panel, int lines)
{
int new_pos;
int adjust = 0;
new_pos = panel->selected + lines;
if (new_pos >= panel->count)
new_pos = panel->count-1;
if (new_pos < 0)
new_pos = 0;
unselect_item (panel);
panel->selected = new_pos;
#ifndef HAVE_X
if (panel->selected - panel->top_file >= ITEMS (panel)){
panel->top_file += lines;
adjust = 1;
}
if (panel->selected - panel->top_file < 0){
panel->top_file += lines;
adjust = 1;
}
if (adjust){
if (panel->top_file > panel->selected)
panel->top_file = panel->selected;
if (panel->top_file < 0)
panel->top_file = 0;
paint_dir (panel);
}
#endif
select_item (panel);
}
static int
move_left (WPanel *panel, int c_code)
{
if (panel->list_type == list_icons){
do_move_up (panel);
return 1;
} else {
if (panel->split){
move_selection (panel, -llines (panel));
return 1;
} else
return maybe_cd (c_code, 0);
}
}
static int
move_right (WPanel *panel, int c_code)
{
if (panel->list_type == list_icons){
do_move_down (panel);
return 1;
} else {
if (panel->split){
move_selection (panel, llines (panel));
return 1;
} else
return maybe_cd (c_code, 1);
}
}
static void
prev_page (WPanel *panel)
{
int items;
if (!panel->selected && !panel->top_file)
return;
unselect_item (panel);
items = ITEMS (panel);
if (panel->top_file < items)
items = panel->top_file;
if (!items)
panel->selected = 0;
else
panel->selected -= items;
panel->top_file -= items;
/* This keeps the selection in a reasonable place */
if (panel->selected < 0)
panel->selected = 0;
if (panel->top_file < 0)
panel->top_file = 0;
x_adjust_top_file (panel);
select_item (panel);
#ifndef HAVE_X
paint_dir (panel);
#endif
}
static void
prev_page_key (WPanel *panel)
{
if (console_flag && ctrl_pressed ()){
do_cd ("..", cd_exact);
} else
prev_page (panel);
}
static void
next_page (WPanel *panel)
{
int items;
if (panel->selected == panel->count - 1)
return;
unselect_item (panel);
items = ITEMS (panel);
if (panel->top_file > panel->count - 2 * items)
items = panel->count - items - panel->top_file;
if (panel->top_file + items < 0)
items = - panel->top_file;
if (!items)
panel->selected = panel->count - 1;
else
panel->selected += items;
panel->top_file += items;
/* This keeps the selection in it's relative position */
if (panel->selected >= panel->count)
panel->selected = panel->count - 1;
if (panel->top_file >= panel->count)
panel->top_file = panel->count - 1;
x_adjust_top_file (panel);
select_item (panel);
#ifndef HAVE_X
paint_dir (panel);
#endif
}
static void next_page_key (WPanel *panel)
{
if (console_flag&&ctrl_pressed()&&
(S_ISDIR(selection (panel)->buf.st_mode) ||
link_isdir (selection (panel))))
do_cd (selection (panel)->fname, cd_exact);
else
next_page (panel);
}
static void
goto_top_file (WPanel *panel)
{
unselect_item (panel);
panel->selected = panel->top_file;
select_item (panel);
}
static void
goto_middle_file (WPanel *panel)
{
unselect_item (panel);
panel->selected = panel->top_file + (ITEMS (panel)/2);
if (panel->selected >= panel->count)
panel->selected = panel->count - 1;
select_item (panel);
}
static void
goto_bottom_file (WPanel *panel)
{
unselect_item (panel);
panel->selected = panel->top_file + ITEMS (panel)-1;
if (panel->selected >= panel->count)
panel->selected = panel->count - 1;
select_item (panel);
}
static void
move_home (WPanel *panel)
{
if (panel->selected == 0)
return;
unselect_item (panel);
if (torben_fj_mode){
int middle_pos = panel->top_file + (ITEMS (panel)/2);
if (panel->selected > middle_pos){
goto_middle_file (panel);
return;
}
if (panel->selected != panel->top_file){
goto_top_file (panel);
return;
}
}
panel->top_file = 0;
panel->selected = 0;
#ifndef HAVE_X
paint_dir (panel);
#endif
select_item (panel);
}
static void
move_end (WPanel *panel)
{
if (panel->selected == panel->count-1)
return;
unselect_item (panel);
if (torben_fj_mode){
int middle_pos = panel->top_file + (ITEMS (panel)/2);
if (panel->selected < middle_pos){
goto_middle_file (panel);
return;
}
if (panel->selected != (panel->top_file + ITEMS(panel)-1)){
goto_bottom_file (panel);
return;
}
}
panel->selected = panel->count-1;
#ifndef HAVE_X
paint_dir (panel);
#endif
select_item (panel);
}
/* This routine marks a file or a directory */
void
do_file_mark (WPanel *panel, int idx, int mark)
{
if (panel->dir.list [idx].f.marked == mark)
return;
/*
* Only '..' can't be marked, '.' isn't visible.
*/
if (strcmp (panel->dir.list [idx].fname, "..")){
file_mark (panel, idx, mark);
if (panel->dir.list [idx].f.marked){
panel->marked++;
if (S_ISDIR (panel->dir.list [idx].buf.st_mode)) {
if (panel->has_dir_sizes)
panel->total += panel->dir.list [idx].buf.st_size;
panel->dirs_marked++;
} else
panel->total += panel->dir.list [idx].buf.st_size;
#ifndef HAVE_XVIEW
set_colors (panel);
#endif
} else {
if (S_ISDIR(panel->dir.list [idx].buf.st_mode)) {
if (panel->has_dir_sizes)
panel->total -= panel->dir.list [idx].buf.st_size;
panel->dirs_marked--;
} else
panel->total -= panel->dir.list [idx].buf.st_size;
panel->marked--;
}
}
}
void
do_file_mark_range (WPanel *panel, int r1, int r2)
{
const int start = min (r1, r2);
const int end = max (r1, r2);
int i, mark;
mark = !panel->dir.list [start].f.marked;
for (i = start; i < end; i++)
do_file_mark (panel, i, mark);
}
static void
do_mark_file (WPanel *panel, int do_move)
{
int idx = panel->selected;
do_file_mark (panel, idx, selection (panel)->f.marked ? 0 : 1);
#ifndef HAVE_XVIEW
repaint_file (panel, idx, 1, 2*panel->dir.list [idx].f.marked+1, 0);
#endif
if (mark_moves_down && do_move)
move_down (panel);
display_mini_info (panel);
}
static void
mark_file (WPanel *panel)
{
do_mark_file (panel, 1);
}
/* Incremental search of a file name in the panel */
static void
do_search (WPanel *panel, int c_code)
{
int l, i;
int wrapped = 0;
int found;
l = strlen (panel->search_buffer);
if (l && (c_code == 8 || c_code == 0177 || c_code == KEY_BACKSPACE))
panel->search_buffer [--l] = 0;
else {
if (c_code && l < sizeof (panel->search_buffer)){
panel->search_buffer [l] = c_code;
panel->search_buffer [l+1] = 0;
l++;
}
}
found = 0;
for (i = panel->selected; !wrapped || i != panel->selected; i++){
if (i >= panel->count){
i = 0;
if (wrapped)
break;
wrapped = 1;
}
if (STRNCOMP (panel->dir.list [i].fname, panel->search_buffer, l) == 0){
unselect_item (panel);
panel->selected = i;
select_item (panel);
found = 1;
break;
}
}
if (!found)
panel->search_buffer [--l] = 0;
#ifndef HAVE_X
paint_panel (panel);
#endif
}
static void
start_search (WPanel *panel)
{
if (panel->searching){
if (panel->selected+1 == panel->count)
panel->selected = 0;
else
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -