mirror of
https://github.com/radareorg/radare2.git
synced 2025-03-03 11:50:02 +00:00
Visual panels layout save/load via 'v' command ##panels
This commit is contained in:
parent
7684a03d31
commit
3a235b49c2
@ -266,7 +266,7 @@ R_API void r_config_list(RConfig *cfg, const char *str, int rad) {
|
||||
}
|
||||
|
||||
R_API RConfigNode* r_config_node_get(RConfig *cfg, const char *name) {
|
||||
r_return_val_if_fail (cfg && name && *name, NULL);
|
||||
r_return_val_if_fail (cfg && name, NULL);
|
||||
return ht_pp_find (cfg->ht, name, NULL);
|
||||
}
|
||||
|
||||
|
@ -1670,6 +1670,25 @@ static int cmd_panels(void *data, const char *input) {
|
||||
if (core->vmode) {
|
||||
return false;
|
||||
}
|
||||
if (*input == '?') {
|
||||
eprintf ("Usage: v[*i]\n");
|
||||
eprintf ("v.test # save curren layout with name test\n");
|
||||
eprintf ("v test # load saved layout with name test\n");
|
||||
eprintf ("vi ... # launch 'vim'\n");
|
||||
return false;
|
||||
}
|
||||
if (*input == ' ') {
|
||||
if (core->panels) {
|
||||
r_load_panels_layout (core, input + 1);
|
||||
}
|
||||
r_config_set (core->config, "scr.layout", input + 1);
|
||||
return true;
|
||||
}
|
||||
if (*input == '=') {
|
||||
r_save_panels_layout (core, input + 1);
|
||||
r_config_set (core->config, "scr.layout", input + 1);
|
||||
return true;
|
||||
}
|
||||
if (*input == 'i') {
|
||||
r_sys_cmdf ("v%s", input);
|
||||
return false;
|
||||
|
@ -365,8 +365,8 @@ static void __panels_layout_refresh(RCore *core);
|
||||
static void __panels_layout(RPanels *panels);
|
||||
static void __layout_default(RPanels *panels);
|
||||
static void __layout_equal_hor(RPanels *panels);
|
||||
static void __save_panels_layout(RCore *core);
|
||||
static int __load_saved_panels_layout(RCore *core, const char *_name);
|
||||
R_API void r_save_panels_layout(RCore *core, const char *_name);
|
||||
R_API bool r_load_panels_layout(RCore *core, const char *_name);
|
||||
static void __split_panel_vertical(RCore *core, RPanel *p, const char *name, const char *cmd);
|
||||
static void __split_panel_horizontal(RCore *core, RPanel *p, const char *name, const char *cmd);
|
||||
static void __panel_print(RCore *core, RConsCanvas *can, RPanel *panel, int color);
|
||||
@ -3188,7 +3188,7 @@ int __load_layout_saved_cb(void *user) {
|
||||
RPanelsMenu *menu = core->panels->panels_menu;
|
||||
RPanelsMenuItem *parent = menu->history[menu->depth - 1];
|
||||
RPanelsMenuItem *child = parent->sub[parent->selectedIndex];
|
||||
if (!__load_saved_panels_layout (core, child->name)) {
|
||||
if (!r_load_panels_layout (core, child->name)) {
|
||||
__create_default_panels (core);
|
||||
__panels_layout (core->panels);
|
||||
}
|
||||
@ -3217,7 +3217,7 @@ int __close_file_cb(void *user) {
|
||||
|
||||
int __save_layout_cb(void *user) {
|
||||
RCore *core = (RCore *)user;
|
||||
__save_panels_layout (core);
|
||||
r_save_panels_layout (core, NULL);
|
||||
(void)__show_status (core, "Panels layout saved!");
|
||||
return 0;
|
||||
}
|
||||
@ -5449,10 +5449,18 @@ char *__get_panels_config_path() {
|
||||
return newPath;
|
||||
}
|
||||
|
||||
void __save_panels_layout(RCore *core) {
|
||||
void r_save_panels_layout(RCore *core, const char *_name) {
|
||||
int i;
|
||||
if (!core->panels) {
|
||||
return;
|
||||
}
|
||||
char *config_path = __get_panels_config_path ();
|
||||
char *name = __show_status_input (core, "Name for the layout: ");
|
||||
const char *name;
|
||||
if (_name) {
|
||||
name = _name;
|
||||
} else {
|
||||
name = __show_status_input (core, "Name for the layout: ");
|
||||
}
|
||||
RPanels *panels = core->panels;
|
||||
PJ *pj = NULL;
|
||||
pj = pj_new ();
|
||||
@ -5468,7 +5476,7 @@ void __save_panels_layout(RCore *core) {
|
||||
pj_kn (pj, "h", panel->view->pos.h);
|
||||
pj_end (pj);
|
||||
}
|
||||
FILE *file = fopen (config_path, "a");
|
||||
FILE *file = fopen (config_path, "w");
|
||||
if (!file) {
|
||||
free (config_path);
|
||||
return;
|
||||
@ -5476,7 +5484,9 @@ void __save_panels_layout(RCore *core) {
|
||||
fprintf (file, "%s", pj_drain (pj));
|
||||
fprintf (file, "\n");
|
||||
fclose (file);
|
||||
__update_menu (core, "File.Load Layout.Saved", __init_menu_saved_layout);
|
||||
if (!_name) {
|
||||
__update_menu (core, "File.Load Layout.Saved", __init_menu_saved_layout);
|
||||
}
|
||||
}
|
||||
|
||||
char *__parse_panels_config(const char *cfg, int len) {
|
||||
@ -5510,11 +5520,14 @@ void __load_config_menu(RCore *core) {
|
||||
}
|
||||
}
|
||||
|
||||
int __load_saved_panels_layout(RCore *core, const char *_name) {
|
||||
bool r_load_panels_layout(RCore *core, const char *_name) {
|
||||
if (!core->panels) {
|
||||
return false;
|
||||
}
|
||||
char *config_path = __get_panels_config_path();
|
||||
char *panels_config = r_file_slurp (config_path, NULL);
|
||||
if (!panels_config) {
|
||||
return 0;
|
||||
return false;
|
||||
}
|
||||
RPanels *panels = core->panels;
|
||||
int count = r_str_split (panels_config, '\n');
|
||||
@ -5554,7 +5567,7 @@ int __load_saved_panels_layout(RCore *core, const char *_name) {
|
||||
RStrBuf *rsb = r_strbuf_new (NULL);
|
||||
r_core_visual_append_help (rsb, "Visual Ascii Art Panels", help_msg_panels);
|
||||
if (!rsb) {
|
||||
return 0;
|
||||
return false;
|
||||
}
|
||||
__set_read_only (p, r_strbuf_drain (rsb));
|
||||
}
|
||||
@ -5567,10 +5580,10 @@ int __load_saved_panels_layout(RCore *core, const char *_name) {
|
||||
}
|
||||
free (panels_config);
|
||||
if (!panels->n_panels) {
|
||||
return 0;
|
||||
return false;
|
||||
}
|
||||
__set_refresh_all (core, true, false);
|
||||
return 1;
|
||||
return true;
|
||||
}
|
||||
|
||||
void __maximize_panel_size(RPanels *panels) {
|
||||
@ -6153,6 +6166,12 @@ R_API int r_core_visual_panels_root(RCore *core, RPanelsRoot *panels_root) {
|
||||
panels_root->cur_pdc_cache = sdb;
|
||||
}
|
||||
}
|
||||
{
|
||||
const char *l = r_config_get (core->config, "scr.layout");
|
||||
if (l && *l) {
|
||||
r_core_cmdf (core, "v %s", l);
|
||||
}
|
||||
}
|
||||
while (panels_root->n_panels) {
|
||||
__set_root_state (core, DEFAULT);
|
||||
__panels_process (core, panels_root->panels[panels_root->cur_panels]);
|
||||
@ -6440,7 +6459,13 @@ void __panels_process(RCore *core, RPanels *panels) {
|
||||
|
||||
bool originVmode = core->vmode;
|
||||
core->vmode = true;
|
||||
|
||||
{
|
||||
const char *layout = r_config_get (core->config, "scr.layout");
|
||||
if (layout && *layout) {
|
||||
r_load_panels_layout (core, layout);
|
||||
r_save_panels_layout (core, layout);
|
||||
}
|
||||
}
|
||||
r_cons_enable_mouse (false);
|
||||
repeat:
|
||||
r_cons_enable_mouse (r_config_get_i (core->config, "scr.wheel"));
|
||||
@ -6551,6 +6576,14 @@ repeat:
|
||||
case ';':
|
||||
__handleComment (core);
|
||||
break;
|
||||
case '$':
|
||||
if (core->print->cur_enabled) {
|
||||
r_core_cmdf (core, "dr PC=$$+%d", core->print->cur);
|
||||
} else {
|
||||
r_core_cmd0 (core, "dr PC=$$");
|
||||
}
|
||||
__set_refresh_all (core, false, false);
|
||||
break;
|
||||
case 's':
|
||||
__panel_single_step_in (core);
|
||||
if (__check_panel_type (cur, PANEL_CMD_DISASSEMBLY)) {
|
||||
@ -6822,7 +6855,7 @@ repeat:
|
||||
__set_refresh_all (core, false, false);
|
||||
break;
|
||||
case 'W':
|
||||
__move_panel_to_dir(core, cur, panels->curnode);
|
||||
__move_panel_to_dir (core, cur, panels->curnode);
|
||||
break;
|
||||
case 0x0d: // "\\n"
|
||||
__toggle_zoom_mode (core);
|
||||
|
Loading…
x
Reference in New Issue
Block a user