⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 screen.c

📁 ReactOS是一些高手根据Windows XP的内核编写出的类XP。内核实现机理和API函数调用几乎相同。甚至可以兼容XP的程序。喜欢研究系统内核的人可以看一看。
💻 C
📖 第 1 页 / 共 5 页
字号:
    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 + -