/* This routine is deeply sticked to the two panels idea. What should it do in more panels. ANSWER - don't use it in any multiple panels environment. */ void swap_panels () { Widget tmp; Widget *tmp_widget; WPanel panel; WPanel *panel1, *panel2; int tmp_type; #if 0 #ifdef HAVE_PORTABLE_TOKEN_PASTING #define panelswap(e) panel.##e = panel1->##e; panel1->##e = panel2->##e; panel2->##e = panel.##e; #define panelswapstr(e) strcpy (panel.##e, panel1->##e); strcpy (panel1->##e, panel2->##e); strcpy (panel2->##e, panel.##e); #else #define panelswap(e) panel./**/e = panel1->/**/e; panel1->/**/e = panel2->/**/e; panel2->/**/e = panel./**/e; #define panelswapstr(e) strcpy (panel./**/e, panel1->/**/e); strcpy (panel1->/**/e, panel2->/**/e); strcpy (panel2->/**/e, panel./**/e); #endif #endif #define panelswap(x) panel. x = panel1-> x; panel1-> x = panel2-> x; panel2-> x = panel. x; #define panelswapstr(e) strcpy (panel. e, panel1-> e); \ strcpy (panel1-> e, panel2-> e); \ strcpy (panel2-> e, panel. e); panel1 = (WPanel *) panels [0].widget; panel2 = (WPanel *) panels [1].widget; if (panels [0].type == view_listing && panels [1].type == view_listing) { /* Change everything except format/sort/panel_name etc. */ panelswap (dir); panelswap (active); panelswapstr (cwd); panelswapstr (lwd); panelswap (count); panelswap (marked); panelswap (dirs_marked); panelswap (total); panelswap (top_file); panelswap (selected); panelswap (is_panelized); panelswap (dir_stat); panel1->searching = 0; panel2->searching = 0; if (cpanel == panel1) current_panel = panel2; else current_panel = panel1; if (midnight_dlg->current->widget == panels [0].widget) dlg_select_widget (midnight_dlg, (void *) panels [1].widget); else if (midnight_dlg->current->widget == panels [1].widget) dlg_select_widget (midnight_dlg, (void *) panels [0].widget); } else { WPanel *tmp_panel; tmp_panel=right_panel; right_panel=left_panel; left_panel=tmp_panel; if (panels [0].type == view_listing) { if (!strcmp (panel1->panel_name, get_nth_panel_name (0))) { free (panel1->panel_name); panel1->panel_name = strdup (get_nth_panel_name (1)); } } if (panels [1].type == view_listing) { if (!strcmp (panel2->panel_name, get_nth_panel_name (1))) { free (panel2->panel_name); panel2->panel_name = strdup (get_nth_panel_name (0)); } } tmp.x = panels [0].widget->x; tmp.y = panels [0].widget->y; tmp.cols = panels [0].widget->cols; tmp.lines = panels [0].widget->lines; panels [0].widget->x = panels [1].widget->x; panels [0].widget->y = panels [1].widget->y; panels [0].widget->cols = panels [1].widget->cols; panels [0].widget->lines = panels [1].widget->lines; panels [1].widget->x = tmp.x; panels [1].widget->y = tmp.y; panels [1].widget->cols = tmp.cols; panels [1].widget->lines = tmp.lines; tmp_widget = panels [0].widget; panels [0].widget = panels [1].widget; panels [1].widget = tmp_widget; tmp_type = panels [0].type; panels [0].type = panels [1].type; panels [1].type = tmp_type; } }
void swap_panels (void) { WPanel *panel1, *panel2; Widget *tmp_widget; panel1 = (WPanel *) panels[0].widget; panel2 = (WPanel *) panels[1].widget; if (panels[0].type == view_listing && panels[1].type == view_listing && !mc_config_get_bool (mc_main_config, CONFIG_PANELS_SECTION, "simple_swap", FALSE)) { WPanel panel; #define panelswap(x) panel.x = panel1->x; panel1->x = panel2->x; panel2->x = panel.x; #define panelswapstr(e) strcpy (panel.e, panel1->e); \ strcpy (panel1->e, panel2->e); \ strcpy (panel2->e, panel.e); /* Change content and related stuff */ panelswap (dir); panelswap (active); panelswapstr (cwd); panelswapstr (lwd); panelswap (count); panelswap (marked); panelswap (dirs_marked); panelswap (total); panelswap (top_file); panelswap (selected); panelswap (is_panelized); panelswap (dir_stat); #undef panelswapstr #undef panelswap panel1->searching = FALSE; panel2->searching = FALSE; if (current_panel == panel1) current_panel = panel2; else current_panel = panel1; /* if sort options are different -> resort panels */ if (memcmp (&panel1->sort_info, &panel2->sort_info, sizeof (panel_sort_info_t)) != 0) { panel_re_sort (other_panel); panel_re_sort (current_panel); } if (dlg_widget_active (panels[0].widget)) dlg_select_widget (panels[1].widget); else if (dlg_widget_active (panels[1].widget)) dlg_select_widget (panels[0].widget); } else { WPanel *tmp_panel; int x, y, cols, lines; int tmp_type; tmp_panel = right_panel; right_panel = left_panel; left_panel = tmp_panel; if (panels[0].type == view_listing) { if (strcmp (panel1->panel_name, get_nth_panel_name (0)) == 0) { g_free (panel1->panel_name); panel1->panel_name = g_strdup (get_nth_panel_name (1)); } } if (panels[1].type == view_listing) { if (strcmp (panel2->panel_name, get_nth_panel_name (1)) == 0) { g_free (panel2->panel_name); panel2->panel_name = g_strdup (get_nth_panel_name (0)); } } x = panels[0].widget->x; y = panels[0].widget->y; cols = panels[0].widget->cols; lines = panels[0].widget->lines; panels[0].widget->x = panels[1].widget->x; panels[0].widget->y = panels[1].widget->y; panels[0].widget->cols = panels[1].widget->cols; panels[0].widget->lines = panels[1].widget->lines; panels[1].widget->x = x; panels[1].widget->y = y; panels[1].widget->cols = cols; panels[1].widget->lines = lines; tmp_widget = panels[0].widget; panels[0].widget = panels[1].widget; panels[1].widget = tmp_widget; tmp_type = panels[0].type; panels[0].type = panels[1].type; panels[1].type = tmp_type; /* force update formats because of possible changed sizes */ if (panels[0].type == view_listing) set_panel_formats ((WPanel *) panels[0].widget); if (panels[1].type == view_listing) set_panel_formats ((WPanel *) panels[1].widget); } }