📄 screen.c
字号:
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 + -