mirror of
https://github.com/MidnightCommander/mc
synced 2025-01-03 01:54:24 +03:00
reimplemented diffviewer to use new keymap system
Signed-off-by: Slava Zanko <slavazanko@gmail.com>
This commit is contained in:
parent
0f89dbc39a
commit
47f0dfd636
@ -4,6 +4,7 @@ libdiffviewer_la_SOURCES = \
|
||||
events.c \
|
||||
execute.c execute.h \
|
||||
internal.h \
|
||||
keymaps.c \
|
||||
options.c options.h \
|
||||
search.c \
|
||||
tools.c \
|
||||
|
@ -529,7 +529,8 @@ mc_diffviewer_cmd_quit (event_info_t * event_info, gpointer data, GError ** erro
|
||||
(void) event_info;
|
||||
(void) error;
|
||||
|
||||
dview->view_quit = 1;
|
||||
dview->view_quit = TRUE;
|
||||
dlg_stop (WIDGET (data)->owner);
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
|
@ -90,7 +90,7 @@ typedef struct WDiff
|
||||
int ndiff; /* number of hunks */
|
||||
DSRC dsrc; /* data source: memory or temporary file */
|
||||
|
||||
int view_quit:1; /* Quit flag */
|
||||
gboolean view_quit; /* Quit flag */
|
||||
|
||||
int height;
|
||||
int half1;
|
||||
@ -140,6 +140,7 @@ typedef struct WDiff
|
||||
/*** declarations of public functions ************************************************************/
|
||||
|
||||
void mc_diffviewer_init_events (GError ** error);
|
||||
void mc_diffviewer_init_keymaps (GError ** error);
|
||||
|
||||
/* search.c */
|
||||
gboolean mc_diffviewer_cmd_search (event_info_t * event_info, gpointer data, GError ** error);
|
||||
|
163
src/diffviewer/keymaps.c
Normal file
163
src/diffviewer/keymaps.c
Normal file
@ -0,0 +1,163 @@
|
||||
/*
|
||||
Default values for keymapping engine
|
||||
|
||||
Copyright (C) 2009-2014
|
||||
Free Software Foundation, Inc.
|
||||
|
||||
Written by:
|
||||
Vitja Makarov, 2005
|
||||
Ilia Maslakov <il.smind@gmail.com>, 2009, 2010
|
||||
Andrew Borodin <aborodin@vmail.ru>, 2010, 2011
|
||||
|
||||
This file is part of the Midnight Commander.
|
||||
|
||||
The Midnight Commander is free software: you can redistribute it
|
||||
and/or modify it under the terms of the GNU General Public License as
|
||||
published by the Free Software Foundation, either version 3 of the License,
|
||||
or (at your option) any later version.
|
||||
|
||||
The Midnight Commander is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
#include <config.h>
|
||||
|
||||
#include "lib/global.h"
|
||||
#include "lib/widget.h" /* dialog_map, input_map, listbox_map */
|
||||
#include "lib/keymap.h"
|
||||
|
||||
#include "src/keybind-defaults.h"
|
||||
#include "internal.h"
|
||||
|
||||
/*** global variables ****************************************************************************/
|
||||
|
||||
GArray *diff_keymap = NULL;
|
||||
|
||||
/*** file scope macro definitions ****************************************************************/
|
||||
|
||||
/*** file scope type declarations ****************************************************************/
|
||||
|
||||
/* default keymaps in ini (key=value) format */
|
||||
|
||||
/*** file scope variables ************************************************************************/
|
||||
|
||||
/* diff viewer */
|
||||
static const default_keymap_ini_t default_diff_keymap[] = {
|
||||
{"ShowSymbols", "alt-s; s"},
|
||||
{"ShowNumbers", "alt-n; l"},
|
||||
{"SplitFull", "f"},
|
||||
{"SplitEqual", "equal"},
|
||||
{"SplitMore", "gt"},
|
||||
{"SplitLess", "lt"},
|
||||
{"Tab2", "2"},
|
||||
{"Tab3", "3"},
|
||||
{"Tab4", "4"},
|
||||
{"Tab8", "8"},
|
||||
{"Swap", "ctrl-u"},
|
||||
{"Redo", "ctrl-r"},
|
||||
{"HunkNext", "n; enter; space"},
|
||||
{"HunkPrev", "p; backspace"},
|
||||
{"Goto", "g; shift-g"},
|
||||
{"Save", "f2"},
|
||||
{"Edit", "f4"},
|
||||
{"EditOther", "f14"},
|
||||
{"Merge", "f5"},
|
||||
{"MergeOther", "f15"},
|
||||
{"Search", "f7"},
|
||||
{"SearchContinue", "f17"},
|
||||
{"Options", "f9"},
|
||||
{"Top", "ctrl-home"},
|
||||
{"Bottom", "ctrl-end"},
|
||||
{"Down", "down"},
|
||||
{"Up", "up"},
|
||||
{"LeftQuick", "ctrl-left"},
|
||||
{"RightQuick", "ctrl-right"},
|
||||
{"Left", "left"},
|
||||
{"Right", "right"},
|
||||
{"PageDown", "pgdn"},
|
||||
{"PageUp", "pgup"},
|
||||
{"Home", "home"},
|
||||
{"End", "end"},
|
||||
{"Quit", "f10; q; shift-q; esc"},
|
||||
#ifdef HAVE_CHARSET
|
||||
{"SelectCodepage", "alt-e"},
|
||||
#endif
|
||||
{"Shell", "ctrl-o"},
|
||||
{NULL, NULL}
|
||||
};
|
||||
|
||||
|
||||
static const mc_keymap_event_init_group_t mc_keymap_event_diffview[] = {
|
||||
{"ShowSymbols", MCEVENT_GROUP_DIFFVIEWER, "show_symbols"},
|
||||
{"ShowNumbers", MCEVENT_GROUP_DIFFVIEWER, "show_numbers"},
|
||||
{"SplitFull", MCEVENT_GROUP_DIFFVIEWER, "split_full"},
|
||||
{"SplitEqual", MCEVENT_GROUP_DIFFVIEWER, "split_equal"},
|
||||
{"SplitMore", MCEVENT_GROUP_DIFFVIEWER, "split_more"},
|
||||
{"SplitLess", MCEVENT_GROUP_DIFFVIEWER, "split_less"},
|
||||
{"Tab2", MCEVENT_GROUP_DIFFVIEWER, "tab_size_2"},
|
||||
{"Tab3", MCEVENT_GROUP_DIFFVIEWER, "tab_size_3"},
|
||||
{"Tab4", MCEVENT_GROUP_DIFFVIEWER, "tab_size_4"},
|
||||
{"Tab8", MCEVENT_GROUP_DIFFVIEWER, "tab_size_8"},
|
||||
{"Swap", MCEVENT_GROUP_DIFFVIEWER, "swap"},
|
||||
{"Redo", MCEVENT_GROUP_DIFFVIEWER, "redo"},
|
||||
{"HunkNext", MCEVENT_GROUP_DIFFVIEWER, "hunk_next"},
|
||||
{"HunkPrev", MCEVENT_GROUP_DIFFVIEWER, "hunk_prev"},
|
||||
{"Goto", MCEVENT_GROUP_DIFFVIEWER, "goto_line"},
|
||||
{"Save", MCEVENT_GROUP_DIFFVIEWER, "save_changes"},
|
||||
{"Edit", MCEVENT_GROUP_DIFFVIEWER, "edit_current"},
|
||||
{"EditOther", MCEVENT_GROUP_DIFFVIEWER, "edit_other"},
|
||||
{"Merge", MCEVENT_GROUP_DIFFVIEWER, "merge_from_left_to_right"},
|
||||
{"MergeOther", MCEVENT_GROUP_DIFFVIEWER, "merge_from_right_to_left"},
|
||||
{"Search", MCEVENT_GROUP_DIFFVIEWER, "search"},
|
||||
{"SearchContinue", MCEVENT_GROUP_DIFFVIEWER, "continue_search"},
|
||||
{"Options", MCEVENT_GROUP_DIFFVIEWER, "options_show_dialog"},
|
||||
{"Top", MCEVENT_GROUP_DIFFVIEWER, "goto_top"},
|
||||
{"Bottom", MCEVENT_GROUP_DIFFVIEWER, "goto_bottom"},
|
||||
{"Down", MCEVENT_GROUP_DIFFVIEWER, "goto_down"},
|
||||
{"Up", MCEVENT_GROUP_DIFFVIEWER, "goto_up"},
|
||||
{"LeftQuick", MCEVENT_GROUP_DIFFVIEWER, "goto_left_quick"},
|
||||
{"RightQuick", MCEVENT_GROUP_DIFFVIEWER, "goto_right_quick"},
|
||||
{"Left", MCEVENT_GROUP_DIFFVIEWER, "goto_left"},
|
||||
{"Right", MCEVENT_GROUP_DIFFVIEWER, "goto_right"},
|
||||
{"PageDown", MCEVENT_GROUP_DIFFVIEWER, "goto_page_down"},
|
||||
{"PageUp", MCEVENT_GROUP_DIFFVIEWER, "goto_page_up"},
|
||||
{"Home", MCEVENT_GROUP_DIFFVIEWER, "goto_start_of_line"},
|
||||
{"Quit", MCEVENT_GROUP_DIFFVIEWER, "quit"},
|
||||
#ifdef HAVE_CHARSET
|
||||
{"SelectCodepage", MCEVENT_GROUP_DIFFVIEWER, "select_encoding_show_dialog"},
|
||||
#endif
|
||||
{"Shell", MCEVENT_GROUP_FILEMANAGER, "view_other"},
|
||||
{NULL, NULL, NULL}
|
||||
};
|
||||
|
||||
|
||||
static const mc_keymap_event_init_t mc_keymap_event_defaults[] = {
|
||||
{KEYMAP_SECTION_DIFFVIEWER, mc_keymap_event_diffview},
|
||||
{NULL, NULL}
|
||||
};
|
||||
|
||||
|
||||
/*** file scope macro definitions ****************************************************************/
|
||||
|
||||
/*** file scope type declarations ****************************************************************/
|
||||
|
||||
/*** file scope variables ************************************************************************/
|
||||
|
||||
/*** file scope functions ************************************************************************/
|
||||
/* --------------------------------------------------------------------------------------------- */
|
||||
|
||||
/* --------------------------------------------------------------------------------------------- */
|
||||
/*** public functions ****************************************************************************/
|
||||
/* --------------------------------------------------------------------------------------------- */
|
||||
|
||||
void
|
||||
mc_diffviewer_init_keymaps (GError ** error)
|
||||
{
|
||||
mc_core_keybind_mass_init (KEYMAP_SECTION_DIFFVIEWER, default_diff_keymap, FALSE, error);
|
||||
mc_keymap_mass_bind_event (mc_keymap_event_defaults, error);
|
||||
}
|
@ -1585,6 +1585,9 @@ mc_diffviewer_update (WDiff * dview)
|
||||
int width2;
|
||||
int last;
|
||||
|
||||
if (dview->view_quit)
|
||||
return;
|
||||
|
||||
last = dview->a[DIFF_LEFT]->len - 1;
|
||||
|
||||
if (dview->skip_rows > last)
|
||||
|
@ -44,6 +44,7 @@
|
||||
#include "lib/charsets.h"
|
||||
#endif
|
||||
#include "lib/event.h" /* mc_event_raise() */
|
||||
#include "lib/keymap.h"
|
||||
|
||||
#include "src/filemanager/cmd.h" /* edit_file_at_line(), view_other_cmd() */
|
||||
#include "src/filemanager/panel.h"
|
||||
@ -149,7 +150,7 @@ dview_init (WDiff * dview, const char *args, const char *file1, const char *file
|
||||
|
||||
dview->ndiff = ndiff;
|
||||
|
||||
dview->view_quit = 0;
|
||||
dview->view_quit = FALSE;
|
||||
|
||||
dview->bias = 0;
|
||||
dview->new_frame = 1;
|
||||
@ -192,13 +193,13 @@ dview_labels (WDiff * dview)
|
||||
h = d->owner;
|
||||
b = find_buttonbar (h);
|
||||
|
||||
buttonbar_set_label (b, 1, Q_ ("ButtonBar|Help"), diff_map, d);
|
||||
buttonbar_set_label (b, 2, Q_ ("ButtonBar|Save"), diff_map, d);
|
||||
buttonbar_set_label (b, 4, Q_ ("ButtonBar|Edit"), diff_map, d);
|
||||
buttonbar_set_label (b, 5, Q_ ("ButtonBar|Merge"), diff_map, d);
|
||||
buttonbar_set_label (b, 7, Q_ ("ButtonBar|Search"), diff_map, d);
|
||||
buttonbar_set_label (b, 9, Q_ ("ButtonBar|Options"), diff_map, d);
|
||||
buttonbar_set_label (b, 10, Q_ ("ButtonBar|Quit"), diff_map, d);
|
||||
buttonbar_init_button (b, 1, Q_ ("ButtonBar|Help"), KEYMAP_SECTION_DIFFVIEWER, d);
|
||||
buttonbar_init_button (b, 2, Q_ ("ButtonBar|Save"), KEYMAP_SECTION_DIFFVIEWER, d);
|
||||
buttonbar_init_button (b, 4, Q_ ("ButtonBar|Edit"), KEYMAP_SECTION_DIFFVIEWER, d);
|
||||
buttonbar_init_button (b, 5, Q_ ("ButtonBar|Merge"), KEYMAP_SECTION_DIFFVIEWER, d);
|
||||
buttonbar_init_button (b, 7, Q_ ("ButtonBar|Search"), KEYMAP_SECTION_DIFFVIEWER, d);
|
||||
buttonbar_init_button (b, 9, Q_ ("ButtonBar|Options"), KEYMAP_SECTION_DIFFVIEWER, d);
|
||||
buttonbar_init_button (b, 10, Q_ ("ButtonBar|Quit"), KEYMAP_SECTION_DIFFVIEWER, d);
|
||||
}
|
||||
|
||||
/* --------------------------------------------------------------------------------------------- */
|
||||
@ -279,160 +280,26 @@ dview_ok_to_exit (WDiff * dview)
|
||||
}
|
||||
|
||||
/* --------------------------------------------------------------------------------------------- */
|
||||
|
||||
static cb_ret_t
|
||||
dview_execute_cmd (WDiff * dview, unsigned long command)
|
||||
{
|
||||
cb_ret_t res = MSG_NOT_HANDLED;
|
||||
const char *event_name = NULL;
|
||||
const char *event_group_name = MCEVENT_GROUP_DIFFVIEWER;
|
||||
|
||||
switch (command)
|
||||
{
|
||||
case CK_ShowSymbols:
|
||||
event_name = "show_symbols";
|
||||
break;
|
||||
case CK_ShowNumbers:
|
||||
event_name = "show_numbers";
|
||||
break;
|
||||
case CK_SplitFull:
|
||||
event_name = "split_full";
|
||||
break;
|
||||
case CK_SplitEqual:
|
||||
event_name = "split_equal";
|
||||
break;
|
||||
case CK_SplitMore:
|
||||
event_name = "split_more";
|
||||
break;
|
||||
case CK_SplitLess:
|
||||
event_name = "split_less";
|
||||
break;
|
||||
case CK_Tab2:
|
||||
event_name = "tab_size_2";
|
||||
break;
|
||||
case CK_Tab3:
|
||||
event_name = "tab_size_3";
|
||||
break;
|
||||
case CK_Tab4:
|
||||
event_name = "tab_size_4";
|
||||
break;
|
||||
case CK_Tab8:
|
||||
event_name = "tab_size_8";
|
||||
break;
|
||||
case CK_Swap:
|
||||
event_name = "swap";
|
||||
break;
|
||||
case CK_Redo:
|
||||
event_name = "redo";
|
||||
break;
|
||||
case CK_HunkNext:
|
||||
event_name = "hunk_next";
|
||||
break;
|
||||
case CK_HunkPrev:
|
||||
event_name = "hunk_prev";
|
||||
break;
|
||||
case CK_Goto:
|
||||
event_name = "goto_line";
|
||||
break;
|
||||
case CK_Edit:
|
||||
event_name = "edit_current";
|
||||
break;
|
||||
case CK_Merge:
|
||||
event_name = "merge_from_left_to_right";
|
||||
break;
|
||||
case CK_MergeOther:
|
||||
event_name = "merge_from_right_to_left";
|
||||
break;
|
||||
case CK_EditOther:
|
||||
event_name = "edit_other";
|
||||
break;
|
||||
case CK_Search:
|
||||
event_name = "search";
|
||||
break;
|
||||
case CK_SearchContinue:
|
||||
event_name = "continue_search";
|
||||
break;
|
||||
case CK_Top:
|
||||
event_name = "goto_top";
|
||||
break;
|
||||
case CK_Bottom:
|
||||
event_name = "goto_bottom";
|
||||
break;
|
||||
case CK_Up:
|
||||
event_name = "goto_up";
|
||||
break;
|
||||
case CK_Down:
|
||||
event_name = "goto_down";
|
||||
break;
|
||||
case CK_PageDown:
|
||||
event_name = "goto_page_down";
|
||||
break;
|
||||
case CK_PageUp:
|
||||
event_name = "goto_page_up";
|
||||
break;
|
||||
case CK_Left:
|
||||
event_name = "goto_left";
|
||||
break;
|
||||
case CK_Right:
|
||||
event_name = "goto_right";
|
||||
break;
|
||||
case CK_LeftQuick:
|
||||
event_name = "goto_left_quick";
|
||||
break;
|
||||
case CK_RightQuick:
|
||||
event_name = "goto_right_quick";
|
||||
break;
|
||||
case CK_Home:
|
||||
event_name = "goto_start_of_line";
|
||||
break;
|
||||
case CK_Shell:
|
||||
event_group_name = MCEVENT_GROUP_FILEMANAGER;
|
||||
event_name = "view_other";
|
||||
res = MSG_HANDLED;
|
||||
break;
|
||||
case CK_Quit:
|
||||
event_name = "quit";
|
||||
break;
|
||||
case CK_Save:
|
||||
event_name = "save_changes";
|
||||
break;
|
||||
case CK_Options:
|
||||
event_name = "options_show_dialog";
|
||||
break;
|
||||
#ifdef HAVE_CHARSET
|
||||
case CK_SelectCodepage:
|
||||
event_name = "select_encoding_show_dialog";
|
||||
break;
|
||||
#endif
|
||||
case CK_Cancel:
|
||||
/* don't close diffviewer due to SIGINT */
|
||||
break;
|
||||
default:;
|
||||
}
|
||||
|
||||
if (event_name != NULL && mc_event_raise (event_group_name, event_name, dview, NULL, NULL))
|
||||
res = MSG_HANDLED;
|
||||
|
||||
return res;
|
||||
}
|
||||
|
||||
/* --------------------------------------------------------------------------------------------- */
|
||||
|
||||
static cb_ret_t
|
||||
dview_handle_key (WDiff * dview, int key)
|
||||
dview_handle_key (WDiff * dview, int key, GError ** error)
|
||||
{
|
||||
unsigned long command;
|
||||
cb_ret_t ret_value = MSG_NOT_HANDLED;
|
||||
event_return_t ret;
|
||||
|
||||
#ifdef HAVE_CHARSET
|
||||
key = convert_from_input_c (key);
|
||||
#endif
|
||||
|
||||
command = keybind_lookup_keymap_command (diff_map, key);
|
||||
if ((command != CK_IgnoreKey) && (dview_execute_cmd (dview, command) == MSG_HANDLED))
|
||||
return MSG_HANDLED;
|
||||
ret.b = TRUE;
|
||||
|
||||
/* Key not used */
|
||||
return MSG_NOT_HANDLED;
|
||||
if (mc_keymap_process_group (KEYMAP_SECTION_DIFFVIEWER, key, (void *) dview, &ret, error))
|
||||
ret_value = (ret.b) ? MSG_HANDLED : MSG_NOT_HANDLED;
|
||||
|
||||
mc_diffviewer_update (dview);
|
||||
|
||||
return ret_value;
|
||||
}
|
||||
|
||||
/* --------------------------------------------------------------------------------------------- */
|
||||
@ -441,8 +308,6 @@ static cb_ret_t
|
||||
dview_callback (Widget * w, Widget * sender, widget_msg_t msg, int parm, void *data)
|
||||
{
|
||||
WDiff *dview = (WDiff *) w;
|
||||
WDialog *h = w->owner;
|
||||
cb_ret_t i;
|
||||
|
||||
switch (msg)
|
||||
{
|
||||
@ -458,20 +323,7 @@ dview_callback (Widget * w, Widget * sender, widget_msg_t msg, int parm, void *d
|
||||
return MSG_HANDLED;
|
||||
|
||||
case MSG_KEY:
|
||||
i = dview_handle_key (dview, parm);
|
||||
if (dview->view_quit)
|
||||
dlg_stop (h);
|
||||
else
|
||||
mc_diffviewer_update (dview);
|
||||
return i;
|
||||
|
||||
case MSG_ACTION:
|
||||
i = dview_execute_cmd (dview, parm);
|
||||
if (dview->view_quit)
|
||||
dlg_stop (h);
|
||||
else
|
||||
mc_diffviewer_update (dview);
|
||||
return i;
|
||||
return dview_handle_key (dview, parm, NULL);
|
||||
|
||||
case MSG_DESTROY:
|
||||
mc_event_raise (MCEVENT_GROUP_DIFFVIEWER, "options_save", dview, NULL, NULL);
|
||||
@ -514,21 +366,6 @@ dview_dialog_callback (Widget * w, Widget * sender, widget_msg_t msg, int parm,
|
||||
dview_adjust_size (h);
|
||||
return MSG_HANDLED;
|
||||
|
||||
case MSG_ACTION:
|
||||
/* shortcut */
|
||||
if (sender == NULL)
|
||||
return dview_execute_cmd (NULL, parm);
|
||||
/* message from buttonbar */
|
||||
if (sender == WIDGET (find_buttonbar (h)))
|
||||
{
|
||||
if (data != NULL)
|
||||
return send_message (data, NULL, MSG_ACTION, parm, NULL);
|
||||
|
||||
dview = (WDiff *) find_widget_type (h, dview_callback);
|
||||
return dview_execute_cmd (dview, parm);
|
||||
}
|
||||
return MSG_NOT_HANDLED;
|
||||
|
||||
case MSG_VALIDATE:
|
||||
dview = (WDiff *) find_widget_type (h, dview_callback);
|
||||
h->state = DLG_ACTIVE; /* don't stop the dialog before final decision */
|
||||
@ -696,6 +533,7 @@ void
|
||||
mc_diffviewer_init (GError ** error)
|
||||
{
|
||||
mc_diffviewer_init_events (error);
|
||||
mc_diffviewer_init_keymaps (error);
|
||||
}
|
||||
|
||||
/* --------------------------------------------------------------------------------------------- */
|
||||
|
@ -29,9 +29,11 @@
|
||||
|
||||
#include "lib/global.h"
|
||||
#include "lib/widget.h" /* dialog_map, input_map, listbox_map */
|
||||
#include "lib/keymap.h"
|
||||
|
||||
#include "keybind-defaults.h"
|
||||
|
||||
|
||||
/*** global variables ****************************************************************************/
|
||||
|
||||
GArray *main_keymap = NULL;
|
||||
@ -48,9 +50,6 @@ GArray *editor_x_keymap = NULL;
|
||||
#endif
|
||||
GArray *viewer_keymap = NULL;
|
||||
GArray *viewer_hex_keymap = NULL;
|
||||
#ifdef USE_DIFF_VIEW
|
||||
GArray *diff_keymap = NULL;
|
||||
#endif
|
||||
|
||||
const global_keymap_t *main_map = NULL;
|
||||
const global_keymap_t *main_x_map = NULL;
|
||||
@ -64,25 +63,17 @@ const global_keymap_t *editor_x_map = NULL;
|
||||
#endif
|
||||
const global_keymap_t *viewer_map = NULL;
|
||||
const global_keymap_t *viewer_hex_map = NULL;
|
||||
#ifdef USE_DIFF_VIEW
|
||||
const global_keymap_t *diff_map = NULL;
|
||||
#endif
|
||||
|
||||
/*** file scope macro definitions ****************************************************************/
|
||||
|
||||
/*** file scope type declarations ****************************************************************/
|
||||
|
||||
/* default keymaps in ini (key=value) format */
|
||||
typedef struct global_keymap_ini_t
|
||||
{
|
||||
const char *key;
|
||||
const char *value;
|
||||
} global_keymap_ini_t;
|
||||
|
||||
/*** file scope variables ************************************************************************/
|
||||
|
||||
/* midnight */
|
||||
static const global_keymap_ini_t default_main_keymap[] = {
|
||||
static const default_keymap_ini_t default_main_keymap[] = {
|
||||
{"Help", "f1"},
|
||||
{"UserMenu", "f2"},
|
||||
{"View", "f3"},
|
||||
@ -133,7 +124,7 @@ static const global_keymap_ini_t default_main_keymap[] = {
|
||||
{NULL, NULL}
|
||||
};
|
||||
|
||||
static const global_keymap_ini_t default_main_x_keymap[] = {
|
||||
static const default_keymap_ini_t default_main_x_keymap[] = {
|
||||
{"CompareDirs", "d"},
|
||||
#ifdef USE_DIFF_VIEW
|
||||
{"CompareFiles", "ctrl-d"},
|
||||
@ -164,7 +155,7 @@ static const global_keymap_ini_t default_main_x_keymap[] = {
|
||||
};
|
||||
|
||||
/* panel */
|
||||
static const global_keymap_ini_t default_panel_keymap[] = {
|
||||
static const default_keymap_ini_t default_panel_keymap[] = {
|
||||
{"PanelOtherCd", "alt-o"},
|
||||
{"PanelOtherCdLink", "alt-l"},
|
||||
{"CopySingle", "f15"},
|
||||
@ -204,7 +195,7 @@ static const global_keymap_ini_t default_panel_keymap[] = {
|
||||
};
|
||||
|
||||
/* dialog */
|
||||
static const global_keymap_ini_t default_dialog_keymap[] = {
|
||||
static const default_keymap_ini_t default_dialog_keymap[] = {
|
||||
{"Ok", "enter"},
|
||||
{"Cancel", "f10; esc; ctrl-g"},
|
||||
{"Up", "up; left"},
|
||||
@ -223,7 +214,7 @@ static const global_keymap_ini_t default_dialog_keymap[] = {
|
||||
};
|
||||
|
||||
/* input line */
|
||||
static const global_keymap_ini_t default_input_keymap[] = {
|
||||
static const default_keymap_ini_t default_input_keymap[] = {
|
||||
/* Motion */
|
||||
{"Home", "ctrl-a; alt-lt; home; a1"},
|
||||
{"End", "ctrl-e; alt-gt; end; c1"},
|
||||
@ -258,7 +249,7 @@ static const global_keymap_ini_t default_input_keymap[] = {
|
||||
};
|
||||
|
||||
/* listbox */
|
||||
static const global_keymap_ini_t default_listbox_keymap[] = {
|
||||
static const default_keymap_ini_t default_listbox_keymap[] = {
|
||||
{"Up", "up; ctrl-p"},
|
||||
{"Down", "down; ctrl-n"},
|
||||
{"Top", "home; alt-lt; a1"},
|
||||
@ -271,7 +262,7 @@ static const global_keymap_ini_t default_listbox_keymap[] = {
|
||||
};
|
||||
|
||||
/* tree */
|
||||
static const global_keymap_ini_t default_tree_keymap[] = {
|
||||
static const default_keymap_ini_t default_tree_keymap[] = {
|
||||
{"Help = f1"},
|
||||
{"Rescan = f2; ctrl-r"},
|
||||
{"Forget = f3"},
|
||||
@ -296,7 +287,7 @@ static const global_keymap_ini_t default_tree_keymap[] = {
|
||||
};
|
||||
|
||||
/* help */
|
||||
static const global_keymap_ini_t default_help_keymap[] = {
|
||||
static const default_keymap_ini_t default_help_keymap[] = {
|
||||
{"Help", "f1"},
|
||||
{"Index", "f2; c"},
|
||||
{"Back", "f3; left; l"},
|
||||
@ -318,7 +309,7 @@ static const global_keymap_ini_t default_help_keymap[] = {
|
||||
};
|
||||
|
||||
#ifdef USE_INTERNAL_EDIT
|
||||
static const global_keymap_ini_t default_editor_keymap[] = {
|
||||
static const default_keymap_ini_t default_editor_keymap[] = {
|
||||
{"Enter", "enter"},
|
||||
{"Return", "shift-enter; ctrl-enter; ctrl-shift-enter"}, /* useful for pasting multiline text */
|
||||
{"Tab", "tab; shift-tab; ctrl-tab; ctrl-shift-tab"}, /* ditto */
|
||||
@ -423,13 +414,13 @@ static const global_keymap_ini_t default_editor_keymap[] = {
|
||||
};
|
||||
|
||||
/* emacs keyboard layout emulation */
|
||||
static const global_keymap_ini_t default_editor_x_keymap[] = {
|
||||
static const default_keymap_ini_t default_editor_x_keymap[] = {
|
||||
{NULL, NULL}
|
||||
};
|
||||
#endif /* USE_INTERNAL_EDIT */
|
||||
|
||||
/* viewer */
|
||||
static const global_keymap_ini_t default_viewer_keymap[] = {
|
||||
static const default_keymap_ini_t default_viewer_keymap[] = {
|
||||
{"Help", "f1"},
|
||||
{"WrapMode", "f2"},
|
||||
{"Quit", "f3; f10; q; esc"},
|
||||
@ -470,7 +461,7 @@ static const global_keymap_ini_t default_viewer_keymap[] = {
|
||||
};
|
||||
|
||||
/* hex viewer */
|
||||
static const global_keymap_ini_t default_viewer_hex_keymap[] = {
|
||||
static const default_keymap_ini_t default_viewer_hex_keymap[] = {
|
||||
{"Help", "f1"},
|
||||
{"HexEditMode", "f2"},
|
||||
{"Quit", "f3; f10; q; esc"},
|
||||
@ -503,53 +494,10 @@ static const global_keymap_ini_t default_viewer_hex_keymap[] = {
|
||||
{NULL, NULL}
|
||||
};
|
||||
|
||||
#ifdef USE_DIFF_VIEW
|
||||
/* diff viewer */
|
||||
static const global_keymap_ini_t default_diff_keymap[] = {
|
||||
{"ShowSymbols", "alt-s; s"},
|
||||
{"ShowNumbers", "alt-n; l"},
|
||||
{"SplitFull", "f"},
|
||||
{"SplitEqual", "equal"},
|
||||
{"SplitMore", "gt"},
|
||||
{"SplitLess", "lt"},
|
||||
{"Tab2", "2"},
|
||||
{"Tab3", "3"},
|
||||
{"Tab4", "4"},
|
||||
{"Tab8", "8"},
|
||||
{"Swap", "ctrl-u"},
|
||||
{"Redo", "ctrl-r"},
|
||||
{"HunkNext", "n; enter; space"},
|
||||
{"HunkPrev", "p; backspace"},
|
||||
{"Goto", "g; shift-g"},
|
||||
{"Save", "f2"},
|
||||
{"Edit", "f4"},
|
||||
{"EditOther", "f14"},
|
||||
{"Merge", "f5"},
|
||||
{"MergeOther", "f15"},
|
||||
{"Search", "f7"},
|
||||
{"SearchContinue", "f17"},
|
||||
{"Options", "f9"},
|
||||
{"Top", "ctrl-home"},
|
||||
{"Bottom", "ctrl-end"},
|
||||
{"Down", "down"},
|
||||
{"Up", "up"},
|
||||
{"LeftQuick", "ctrl-left"},
|
||||
{"RightQuick", "ctrl-right"},
|
||||
{"Left", "left"},
|
||||
{"Right", "right"},
|
||||
{"PageDown", "pgdn"},
|
||||
{"PageUp", "pgup"},
|
||||
{"Home", "home"},
|
||||
{"End", "end"},
|
||||
{"Help", "f1"},
|
||||
{"Quit", "f10; q; shift-q; esc"},
|
||||
#ifdef HAVE_CHARSET
|
||||
{"SelectCodepage", "alt-e"},
|
||||
#endif
|
||||
{"Shell", "ctrl-o"},
|
||||
static const mc_keymap_event_init_t mc_keymap_event_defaults[] = {
|
||||
{NULL, NULL}
|
||||
};
|
||||
#endif
|
||||
|
||||
|
||||
/*** file scope macro definitions ****************************************************************/
|
||||
|
||||
@ -562,7 +510,7 @@ static const global_keymap_ini_t default_diff_keymap[] = {
|
||||
|
||||
static void
|
||||
create_default_keymap_section (mc_config_t * keymap, const char *section,
|
||||
const global_keymap_ini_t * k)
|
||||
const default_keymap_ini_t * k)
|
||||
{
|
||||
size_t i;
|
||||
|
||||
@ -574,8 +522,20 @@ create_default_keymap_section (mc_config_t * keymap, const char *section,
|
||||
/*** public functions ****************************************************************************/
|
||||
/* --------------------------------------------------------------------------------------------- */
|
||||
|
||||
void
|
||||
mc_core_keybind_mass_init (const char *keymap_group, const default_keymap_ini_t * k,
|
||||
gboolean isDeleteOld, GError ** error)
|
||||
{
|
||||
size_t i;
|
||||
|
||||
for (i = 0; k[i].key != NULL; i++)
|
||||
mc_keymap_bind_keycode (keymap_group, k[i].key, k[i].value, isDeleteOld, error);
|
||||
}
|
||||
|
||||
/* --------------------------------------------------------------------------------------------- */
|
||||
|
||||
mc_config_t *
|
||||
create_default_keymap (void)
|
||||
create_default_keymap (GError ** error)
|
||||
{
|
||||
mc_config_t *keymap;
|
||||
|
||||
@ -595,9 +555,10 @@ create_default_keymap (void)
|
||||
#endif
|
||||
create_default_keymap_section (keymap, KEYMAP_SECTION_VIEWER, default_viewer_keymap);
|
||||
create_default_keymap_section (keymap, KEYMAP_SECTION_VIEWER_HEX, default_viewer_hex_keymap);
|
||||
#ifdef USE_DIFF_VIEW
|
||||
create_default_keymap_section (keymap, KEYMAP_SECTION_DIFFVIEWER, default_diff_keymap);
|
||||
#endif
|
||||
|
||||
mc_keymap_mass_bind_event (mc_keymap_event_defaults, error);
|
||||
|
||||
return keymap;
|
||||
}
|
||||
|
||||
/* --------------------------------------------------------------------------------------------- */
|
||||
|
@ -11,6 +11,12 @@
|
||||
|
||||
/*** structures declarations (and typedefs of structures)*****************************************/
|
||||
|
||||
typedef struct global_keymap_ini_t
|
||||
{
|
||||
const char *key;
|
||||
const char *value;
|
||||
} default_keymap_ini_t;
|
||||
|
||||
/*** global variables defined in .c file *********************************************************/
|
||||
|
||||
extern GArray *main_keymap;
|
||||
@ -27,9 +33,6 @@ extern GArray *editor_x_keymap;
|
||||
#endif
|
||||
extern GArray *viewer_keymap;
|
||||
extern GArray *viewer_hex_keymap;
|
||||
#ifdef USE_DIFF_VIEW
|
||||
extern GArray *diff_keymap;
|
||||
#endif
|
||||
|
||||
|
||||
extern const global_keymap_t *main_map;
|
||||
@ -44,13 +47,12 @@ extern const global_keymap_t *editor_x_map;
|
||||
#endif
|
||||
extern const global_keymap_t *viewer_map;
|
||||
extern const global_keymap_t *viewer_hex_map;
|
||||
#ifdef USE_DIFF_VIEW
|
||||
extern const global_keymap_t *diff_map;
|
||||
#endif
|
||||
|
||||
/*** declarations of public functions ************************************************************/
|
||||
|
||||
mc_config_t *create_default_keymap (void);
|
||||
mc_config_t *create_default_keymap (GError ** error);
|
||||
void mc_core_keybind_mass_init (const char *keymap_group, const default_keymap_ini_t * k,
|
||||
gboolean isDeleteOld, GError ** error);
|
||||
|
||||
/*** inline functions ****************************************************************************/
|
||||
|
||||
|
10
src/main.c
10
src/main.c
@ -44,6 +44,7 @@
|
||||
#include "lib/global.h"
|
||||
|
||||
#include "lib/event.h"
|
||||
#include "lib/keymap.h"
|
||||
#include "lib/tty/tty.h"
|
||||
#include "lib/tty/key.h" /* For init_key() */
|
||||
#include "lib/tty/mouse.h" /* init_mouse() */
|
||||
@ -291,6 +292,12 @@ main (int argc, char *argv[])
|
||||
goto startup_exit_falure;
|
||||
}
|
||||
|
||||
if (!mc_keymap_init (&mcerror))
|
||||
{
|
||||
mc_event_deinit (NULL);
|
||||
goto startup_exit_falure;
|
||||
}
|
||||
|
||||
vfs_init ();
|
||||
vfs_plugins_init ();
|
||||
|
||||
@ -366,7 +373,7 @@ main (int argc, char *argv[])
|
||||
/* Removing this from the X code let's us type C-c */
|
||||
load_key_defs ();
|
||||
|
||||
load_keymap_defs (!mc_args__nokeymap);
|
||||
load_keymap_defs (!mc_args__nokeymap, &mcerror);
|
||||
|
||||
macros_list = g_array_new (TRUE, FALSE, sizeof (macros_t));
|
||||
|
||||
@ -434,6 +441,7 @@ main (int argc, char *argv[])
|
||||
tty_shutdown ();
|
||||
|
||||
done_setup ();
|
||||
mc_keymap_deinit (&mcerror);
|
||||
|
||||
if (mc_global.tty.console_flag != '\0' && (quit & SUBSHELL_EXIT) == 0)
|
||||
handle_console (CONSOLE_RESTORE);
|
||||
|
41
src/setup.c
41
src/setup.c
@ -33,6 +33,7 @@
|
||||
#include <sys/stat.h>
|
||||
|
||||
#include "lib/global.h"
|
||||
#include "lib/keymap.h"
|
||||
|
||||
#include "lib/tty/tty.h"
|
||||
#include "lib/tty/key.h"
|
||||
@ -721,7 +722,7 @@ load_setup_get_keymap_profile_config (gboolean load_from_file)
|
||||
char *fname, *fname2;
|
||||
|
||||
/* 0) Create default keymap */
|
||||
keymap_config = create_default_keymap ();
|
||||
keymap_config = create_default_keymap (NULL);
|
||||
if (!load_from_file)
|
||||
return keymap_config;
|
||||
|
||||
@ -1234,7 +1235,7 @@ load_anon_passwd (void)
|
||||
/* --------------------------------------------------------------------------------------------- */
|
||||
|
||||
void
|
||||
load_keymap_defs (gboolean load_from_file)
|
||||
load_keymap_defs (gboolean load_from_file, GError ** error)
|
||||
{
|
||||
/*
|
||||
* Load keymap from GLOBAL_KEYMAP_FILE before ${XDG_CONFIG_HOME}/mc/mc.keymap, so that the user
|
||||
@ -1246,6 +1247,30 @@ load_keymap_defs (gboolean load_from_file)
|
||||
|
||||
if (mc_global_keymap != NULL)
|
||||
{
|
||||
char **keymap_sections, **section_name;
|
||||
|
||||
keymap_sections = mc_config_get_groups (mc_global_keymap, NULL);
|
||||
|
||||
for (section_name = keymap_sections; *section_name != NULL; section_name++)
|
||||
{
|
||||
char **keymap_names, **param_name;
|
||||
|
||||
keymap_names = mc_config_get_keys (mc_global_keymap, *section_name, NULL);
|
||||
for (param_name = keymap_names; *param_name != NULL; param_name++)
|
||||
{
|
||||
char *value;
|
||||
|
||||
value =
|
||||
mc_config_get_string_raw (mc_global_keymap, *section_name, *param_name, NULL);
|
||||
|
||||
if (value != NULL)
|
||||
mc_keymap_bind_keycode (*section_name, *param_name, value, TRUE, error);
|
||||
}
|
||||
g_strfreev (keymap_names);
|
||||
}
|
||||
g_strfreev (keymap_sections);
|
||||
|
||||
|
||||
main_keymap = g_array_new (TRUE, FALSE, sizeof (global_keymap_t));
|
||||
load_keymap_from_section (KEYMAP_SECTION_MAIN, main_keymap, mc_global_keymap);
|
||||
main_x_keymap = g_array_new (TRUE, FALSE, sizeof (global_keymap_t));
|
||||
@ -1281,11 +1306,6 @@ load_keymap_defs (gboolean load_from_file)
|
||||
viewer_hex_keymap = g_array_new (TRUE, FALSE, sizeof (global_keymap_t));
|
||||
load_keymap_from_section (KEYMAP_SECTION_VIEWER_HEX, viewer_hex_keymap, mc_global_keymap);
|
||||
|
||||
#ifdef USE_DIFF_VIEW
|
||||
diff_keymap = g_array_new (TRUE, FALSE, sizeof (global_keymap_t));
|
||||
load_keymap_from_section (KEYMAP_SECTION_DIFFVIEWER, diff_keymap, mc_global_keymap);
|
||||
#endif
|
||||
|
||||
mc_config_deinit (mc_global_keymap);
|
||||
}
|
||||
|
||||
@ -1303,9 +1323,6 @@ load_keymap_defs (gboolean load_from_file)
|
||||
#endif
|
||||
viewer_map = (global_keymap_t *) viewer_keymap->data;
|
||||
viewer_hex_map = (global_keymap_t *) viewer_hex_keymap->data;
|
||||
#ifdef USE_DIFF_VIEW
|
||||
diff_map = (global_keymap_t *) diff_keymap->data;
|
||||
#endif
|
||||
}
|
||||
|
||||
/* --------------------------------------------------------------------------------------------- */
|
||||
@ -1339,10 +1356,6 @@ free_keymap_defs (void)
|
||||
g_array_free (viewer_keymap, TRUE);
|
||||
if (viewer_hex_keymap != NULL)
|
||||
g_array_free (viewer_hex_keymap, TRUE);
|
||||
#ifdef USE_DIFF_VIEW
|
||||
if (diff_keymap != NULL)
|
||||
g_array_free (diff_keymap, TRUE);
|
||||
#endif
|
||||
}
|
||||
|
||||
/* --------------------------------------------------------------------------------------------- */
|
||||
|
@ -150,7 +150,7 @@ void load_key_defs (void);
|
||||
char *load_anon_passwd (void);
|
||||
#endif /* ENABLE_VFS_FTP */
|
||||
|
||||
void load_keymap_defs (gboolean load_from_file);
|
||||
void load_keymap_defs (gboolean load_from_file, GError ** error);
|
||||
void free_keymap_defs (void);
|
||||
|
||||
void panel_load_setup (WPanel * panel, const char *section);
|
||||
|
Loading…
Reference in New Issue
Block a user