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

📄 screen.c

📁 这是一个开放源代码的与WINNT/WIN2K/WIN2003兼容的操作系统
💻 C
📖 第 1 页 / 共 5 页
字号:
	    move_down (panel);
	do_search (panel, 0);
    } else {
	panel->searching = 1;
	panel->search_buffer [0] = 0;
	display_mini_info (panel);
	mc_refresh ();
    }
}

void
do_enter (WPanel *panel)
{
    if (S_ISDIR (selection (panel)->buf.st_mode)
	|| link_isdir (selection (panel))){
	do_cd (selection (panel)->fname, cd_exact);
	return;
    } else {
	if (is_exe (selection (panel)->buf.st_mode) &&
	    if_link_is_exe (selection (panel))) {
#ifdef USE_VFS
	    if (vfs_current_is_local ())
#endif
	    {
	        char *tmp = name_quote (selection (panel)->fname, 0);
	        char *cmd = copy_strings (".", PATH_SEP_STR, tmp, 0);
	        if (!confirm_execute || (query_dialog (_(" The Midnight Commander "),
						       _(" Do you really want to execute? "),
						       0, 2, _("&Yes"), _("&No")) == 0))
	            execute (cmd);
	        free (tmp);
	        free (cmd);
	    }
#ifdef USE_VFS
	    else if (vfs_current_is_extfs ()) {
	        char *tmp = vfs_get_current_dir();
	        char *tmp2;

		tmp2 = concat_dir_and_file (tmp, selection (panel)->fname);
	        extfs_run(tmp2);
	        free (tmp2);
	    }
#endif /* USE_VFS */
	    return;
	} else {
	    regex_command (selection (panel)->fname, "Open", NULL, 0);
	}
    }
}

static void
chdir_other_panel (WPanel *panel)
{
    char *new_dir;

    if (get_other_type () != view_listing)
	return;

    if (!S_ISDIR (panel->dir.list [panel->selected].buf.st_mode))
	new_dir = concat_dir_and_file (panel->cwd, "..");
    else
	new_dir = concat_dir_and_file (panel->cwd, panel->dir.list [panel->selected].fname);

    change_panel ();
    do_cd (new_dir, cd_exact);
    change_panel ();

    move_down (panel);

    free (new_dir);
}

static void
chdir_to_readlink (WPanel *panel)
{
    char *new_dir;

    if (get_other_type () != view_listing)
	return;

    if (S_ISLNK (panel->dir.list [panel->selected].buf.st_mode)) {
	char buffer [MC_MAXPATHLEN], *p;
	int i;
	struct stat mybuf;

	i = readlink (selection (panel)->fname, buffer, MC_MAXPATHLEN);
	if (i < 0)
	    return;
	if (mc_stat (selection (panel)->fname, &mybuf) < 0)
	    return;
	buffer [i] = 0;
	if (!S_ISDIR (mybuf.st_mode)) {
	    p = strrchr (buffer, PATH_SEP);
	    if (p && !p[1]) {
		*p = 0;
		p = strrchr (buffer, PATH_SEP);
	    }
	    if (!p)
	        return;
	    p[1] = 0;
	}
	if (*buffer == PATH_SEP)
	    new_dir = strdup (buffer);
	else
	    new_dir = concat_dir_and_file (panel->cwd, buffer);

	change_panel ();
	do_cd (new_dir, cd_exact);
	change_panel ();

	move_down (panel);

	free (new_dir);
    }
}

static key_map panel_keymap [] = {
    { KEY_DOWN,   move_down },
    { KEY_UP, 	move_up },

    /* The action button :-) */
    { '\n',       do_enter },
    { KEY_ENTER,  do_enter },

    { KEY_IC,     mark_file },
    { KEY_HOME,	  move_home },
    { KEY_C1,     move_end },
    { KEY_END,    move_end },
    { KEY_A1,     move_home },
    { KEY_NPAGE,  next_page_key },
    { KEY_PPAGE,  prev_page_key },

    /* To quickly move in the panel */
    { ALT('g'),   goto_top_file },
    { ALT('r'),   goto_middle_file }, /* M-r like emacs */
    { ALT('j'),   goto_bottom_file },

#ifdef OS2_NT
    { ALT(KEY_F(11)), drive_cmd_a },
    { ALT(KEY_F(12)), drive_cmd_b },
    { ALT('d'),   drive_chg },
#endif

    /* Emacs-like bindings */
    { XCTRL('v'), next_page },		/* C-v like emacs */
    { ALT('v'),   prev_page },		/* M-v like emacs */
    { XCTRL('p'), move_up },		/* C-p like emacs */
    { XCTRL('n'), move_down },		/* C-n like emacs */
    { XCTRL('s'), start_search },	/* C-s like emacs */
    { ALT('s'),   start_search },	/* M-s not like emacs */
    { XCTRL('t'), mark_file },
    { ALT('o'),   chdir_other_panel },
    { ALT('l'),   chdir_to_readlink },
    { KEY_F(13),  view_simple_cmd },
    { KEY_F(14),  edit_cmd_new },
    { ALT('y'),   directory_history_prev },
    { ALT('u'),   directory_history_next },
    { ALT('H'),   directory_history_list },
    { ALT('+'),	  select_cmd_panel },
    { KEY_KP_ADD, select_cmd_panel },
    { ALT('\\'),  unselect_cmd_panel },
    { ALT('-'),	  unselect_cmd_panel },
    { KEY_KP_SUBTRACT, unselect_cmd_panel },
    { ALT('*'),	  reverse_selection_cmd_panel },
    { KEY_KP_MULTIPLY, reverse_selection_cmd_panel },


#ifdef HAVE_GNOME
    { '+',        select_cmd_panel },
    { '\\',       unselect_cmd_panel },
    { '-',        unselect_cmd_panel },
    { '*',	  reverse_selection_cmd_panel },
    { XCTRL('r'), reread_cmd },
    { KEY_F(3),   view_panel_cmd },
    { KEY_F(5),   copy_cmd },
    { KEY_F(6),   ren_cmd },
    { KEY_F(7),   mkdir_panel_cmd },
    { KEY_F(8),   delete_cmd },
#endif

    { 0, 0 }
};

static inline int
panel_key (WPanel *panel, int key)
{
    int i;

    for (i = 0; panel_keymap [i].key_code; i++){
	if (key == panel_keymap [i].key_code){
	    if (panel_keymap [i].fn != start_search)
               panel->searching = 0;
	    (*panel_keymap [i].fn)(panel);
	    return 1;
	}
    }
    if (torben_fj_mode && key == ALT('h')) {
	goto_middle_file (panel);
	return 1;
    }

    /* We do not want to take a key press if nothing can be done with it */
    /* The command line widget may do something more usefull */
    if (key == KEY_LEFT)
	return move_left (panel, key);

    if (key == KEY_RIGHT)
	return move_right (panel, key);

    if (is_abort_char (key)) {
	panel->searching = 0;
	display_mini_info (panel);
	return 1;
    }

    /* Do not eat characters not meant for the panel below ' ' (e.g. C-l). */
    if ((key >= ' '&& key <= 255) || key == 8 || key == KEY_BACKSPACE) {
	if (panel->searching){
	    do_search (panel, key);
	    return 1;
	}

	if (!command_prompt) {
	    start_search (panel);
	    do_search (panel, key);
	    return 1;
	}
    }

    return 0;
}

static int
panel_callback (Dlg_head *h, WPanel *panel, int msg, int par)
{
    switch (msg){
    case WIDGET_INIT:
#ifdef HAVE_X
	define_label (h, (Widget *)panel, 1, _("Help"), help_cmd);
	define_label (h, (Widget *)panel, 2, _("Menu"), user_menu_cmd);
	define_label (h, (Widget *)panel, 3, _("View"), view_panel_cmd);
	define_label (h, (Widget *)panel, 4, _("Edit"), edit_panel_cmd);
	define_label (h, (Widget *)panel, 5, _("Copy"), copy_cmd);
	define_label (h, (Widget *)panel, 6, _("RenMov"), ren_cmd);
	define_label (h, (Widget *)panel, 7, _("Mkdir"), mkdir_panel_cmd);
	define_label (h, (Widget *)panel, 8, _("Delete"), delete_cmd);
	x_create_panel (h, h->wdata, panel);
#endif
	return 1;

    case WIDGET_DRAW:
#ifndef HAVE_XVIEW
	paint_panel (panel);
#else
	show_dir (panel);
#endif
	break;

    case WIDGET_FOCUS:
#ifndef HAVE_GNOME
	current_panel = panel;
#endif
	panel->active = 1;
	if (mc_chdir (panel->cwd) != 0){
	    message (1, " Error ", " Can't chdir to %s \n %s ",
		     panel->cwd, unix_error_string (errno));
	} else
	    subshell_chdir (panel->cwd);

	show_dir (panel);
	focus_select_item (panel);
#ifndef HAVE_X
	define_label (h, (Widget *)panel, 1, _("Help"), help_cmd);
	define_label (h, (Widget *)panel, 2, _("Menu"), user_menu_cmd);
	define_label (h, (Widget *)panel, 3, _("View"), view_panel_cmd);
	define_label (h, (Widget *)panel, 4, _("Edit"), edit_panel_cmd);
	define_label (h, (Widget *)panel, 5, _("Copy"), copy_cmd);
	define_label (h, (Widget *)panel, 6, _("RenMov"), ren_cmd);
	define_label (h, (Widget *)panel, 7, _("Mkdir"), mkdir_panel_cmd);
	define_label (h, (Widget *)panel, 8, _("Delete"), delete_cmd);
	redraw_labels (h, (Widget *)panel);
#endif
	/* Chain behaviour */
	default_proc (h, WIDGET_FOCUS, par);
	return 1;

    case WIDGET_UNFOCUS:
	/* Janne: look at this for the multiple panel options */
	if (panel->searching){
	    panel->searching = 0;
	    display_mini_info (panel);
	}
#ifdef HAVE_X
	show_dir (panel);
	unfocus_unselect_item (panel);
	panel->active = 0;
#else
	panel->active = 0;
	show_dir (panel);
	unselect_item (panel);
#endif
	return 1;

    case WIDGET_KEY:
	return panel_key (panel, par);
	break;
    }
    return default_proc (h, msg, par);
}

/*                                     */
/* Panel mouse events support routines */
/*                                     */
static int mouse_marking = 0;

static void
mouse_toggle_mark (WPanel *panel)
{
    do_mark_file (panel, 0);
    mouse_marking = selection (panel)->f.marked;
}

static void
mouse_set_mark (WPanel *panel)
{
    if (mouse_marking && !(selection (panel)->f.marked))
	do_mark_file (panel, 0);
    else if (!mouse_marking && (selection (panel)->f.marked))
	do_mark_file (panel, 0);
}

static inline int
mark_if_marking (WPanel *panel, Gpm_Event *event)
{
    if (event->buttons & GPM_B_RIGHT){
	if (event->type & GPM_DOWN)
	    mouse_toggle_mark (panel);
	else
	    mouse_set_mark (panel);
	return 1;
    }
    return 0;
}

void
file_mark (WPanel *panel, int index, int val)
{
    panel->dir.list [index].f.marked = val;
    x_panel_select_item (panel, index, val);
}

#ifdef PORT_WANTS_GET_SORT_FN
sortfn *
get_sort_fn (char *name)
{
    int i;

    /* First, try the long name options, from dir.c */
    for (i = 0; i < SORT_TYPES_TOTAL; i++)
	if (strcmp (name, sort_orders [i].sort_name) == 0)
	    return (sortfn *)sort_orders [i].sort_fn;

    /* Then try the short name options, from our local table */
    for (i = 0; i < ELEMENTS (formats); i++){
	if (strcmp (name, formats [i].id) == 0 && formats [i].sort_routine)
	    return formats [i].sort_routine;
    }
    return NULL;
}

/* not static because it's called from Tk's version */
int
panel_event (Gpm_Event *event, WPanel *panel)
{
    const int lines = panel->count;

    int my_index;
    extern void change_panel (void);

    event->y -= 2;
    if ((event->type & (GPM_DOWN|GPM_DRAG))){

	if (panel != (WPanel *) current_dlg->current->widget)
	    change_panel ();

	if (event->y <= 0){
	    mark_if_marking (panel, event);
	    return MOU_REPEAT;
	}

	if (!((panel->top_file + event->y <= panel->count) &&
	      event->y <= lines)){
	    mark_if_marking (panel, event);
	    return MOU_REPEAT;
	}
	my_index = panel->top_file + event->y - 1;
	if (panel->split){
	    if (event->x > ((panel->widget.cols-2)/2))
		my_index += llines (panel);
	}

	if (my_index >= panel->count)
	    my_index = panel->count - 1;

	if (my_index != panel->selected){
	    unselect_item (panel);
	    panel->selected = my_index;
	    select_item (panel);
	}

	/* This one is new */
	mark_if_marking (panel, event);

    } else if ((event->type & (GPM_UP|GPM_DOUBLE)) == (GPM_UP|GPM_DOUBLE)){
            if (event->y > 0 && event->y <= lines)
		do_enter (panel);
    }
    return MOU_NORMAL;
}

#else

int
panel_event (Gpm_Event *event, WPanel *panel)
{
    const int lines = llines (panel);

    int my_index;
    extern void change_panel (void);

    if (event->type & GPM_DOWN && event->x == 1 + 1 && event->y == 0 + 1) {
	directory_history_prev (panel);
	return MOU_NORMAL;
    }

    if (event->type & GPM_DOWN && event->x == panel->widget.cols - 2 + 1 && event->y == 0 + 1) {
	directory_history_next (panel);
	return MOU_NORMAL;
    }

    if (event->type & GPM_DOWN && event->x == panel->widget.cols - 3 + 1 && event->y == 0 + 1) {
	directory_history_list (panel);
	return MOU_NORMAL;
    }

    event->y -= 2;
    if ((event->type & (GPM_DOWN|GPM_DRAG))){

	if (panel != (WPanel *) current_dlg->current->widget)
	    change_panel ();

	if (event->y <= 0){
	    mark_if_marking (panel, event);
	    if (mouse_move_pages)
		prev_page (panel);
	    else
		move_up (panel);
	    return MOU_REPEAT;
	}

	if (!((panel->top_file + event->y <= panel->count) &&
	      event->y <= lines)){
	    mark_if_marking (panel, event);
	    if (mouse_move_pages)
		next_page (panel);
	    else
		move_down (panel);
	    return MOU_REPEAT;
	}
	my_index = panel->top_file + event->y - 1;
	if (panel->split){
	    if (event->x > ((panel->widget.cols-2)/2))
		my_index += llines (panel);
	}

	if (my_index >= panel->count)
	    my_index = panel->count - 1;

	if (my_index != panel->selected){
	    unselect_item (panel);
	    panel->selected = my_index;
	    select_item (panel);
	}

	/* This one is new */
	mark_if_marking (panel, event);

    } else if ((event->type & (GPM_UP|GPM_DOUBLE)) == (GPM_UP|GPM_DOUBLE)){
            if (event->y > 0 && event->y <= lines)
		do_enter (panel);
    }
    return MOU_NORMAL;
}
#endif

void
panel_update_marks (WPanel *panel)
{
#ifdef PORT_HAS_UPDATE_MARKS
	x_panel_update_marks (panel);
#endif
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -