Skip to content

Commit 7400cc0

Browse files
committed
merge dev
2 parents 822e043 + 02a535b commit 7400cc0

File tree

9 files changed

+201
-10
lines changed

9 files changed

+201
-10
lines changed

userspace/libsinsp/cursescomponents.cpp

Lines changed: 32 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -249,6 +249,15 @@ void curses_table_sidemenu::render()
249249

250250
// add the new line
251251
mvwaddnstr(m_win, j - m_firstrow + 1, 0, m_entries.at(j).m_name.c_str(), m_w);
252+
// put sorting order indicator at the right end of this row
253+
if(m_parent->m_sidemenu_sorting_col == j)
254+
{
255+
wmove(m_win, j - m_firstrow + 1, m_w - 4);
256+
char sort_order = m_parent->m_datatable->is_sorting_ascending() ? '^' : 'V';
257+
waddch(m_win, '(');
258+
waddch(m_win, sort_order);
259+
waddch(m_win, ')');
260+
}
252261

253262
// white space at the right
254263
wattrset(m_win, m_parent->m_colors[sinsp_cursesui::PROCESS]);
@@ -308,7 +317,9 @@ sysdig_table_action curses_table_sidemenu::handle_input(int ch)
308317
}
309318

310319
m_parent->m_selected_view_sidemenu_entry = m_selct;
311-
}
320+
} else if(m_type == ST_COLUMNS) {
321+
m_parent->m_selected_view_sort_sidemenu_entry = m_selct;
322+
}
312323
else
313324
{
314325
m_parent->m_selected_action_sidemenu_entry = m_selct;
@@ -332,6 +343,11 @@ sysdig_table_action curses_table_sidemenu::handle_input(int ch)
332343

333344
return STA_SWITCH_VIEW;
334345
}
346+
else if(m_type == ST_COLUMNS)
347+
{
348+
m_parent->m_selected_view_sort_sidemenu_entry = m_selct_ori;
349+
return STA_DESTROY_CHILD;
350+
}
335351
else
336352
{
337353
m_parent->m_selected_action_sidemenu_entry = m_selct_ori;
@@ -538,6 +554,10 @@ sysdig_table_action curses_table_sidemenu::handle_input(int ch)
538554
if(m_type == ST_VIEWS)
539555
{
540556
m_parent->m_selected_view_sidemenu_entry = m_selct;
557+
}
558+
else if(m_type == ST_COLUMNS)
559+
{
560+
m_parent->m_selected_view_sort_sidemenu_entry = m_selct;
541561
}
542562
else
543563
{
@@ -1312,7 +1332,7 @@ curses_viewinfo_page::curses_viewinfo_page(sinsp_cursesui* parent,
13121332
config.m_scroll_on_append = false;
13131333
config.m_bounding_box = true;
13141334
config.m_do_wrap = true;
1315-
1335+
parent->m_selected_view_sort_sidemenu_entry = 0;
13161336
m_ctext->set_config(&config);
13171337

13181338
//
@@ -1672,6 +1692,16 @@ curses_mainhelp_page::curses_mainhelp_page(sinsp_cursesui* parent)
16721692
wattrset(m_win, parent->m_colors[sinsp_cursesui::PROCESS]);
16731693
m_ctext->printf(": open the view's actions panel\n");
16741694

1695+
wattrset(m_win, parent->m_colors[sinsp_cursesui::PROCESS_MEGABYTES]);
1696+
m_ctext->printf("<shift>1-9");
1697+
wattrset(m_win, parent->m_colors[sinsp_cursesui::PROCESS]);
1698+
m_ctext->printf(": sort column <n> ");
1699+
1700+
wattrset(m_win, parent->m_colors[sinsp_cursesui::PROCESS_MEGABYTES]);
1701+
m_ctext->printf("F9 >");
1702+
wattrset(m_win, parent->m_colors[sinsp_cursesui::PROCESS]);
1703+
m_ctext->printf(": open the column sort panel\n");
1704+
16751705
//
16761706
// Text windows keys
16771707
//

userspace/libsinsp/cursescomponents.h

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -119,6 +119,7 @@ class curses_table_sidemenu : public curses_scrollable_list
119119
ST_NONE,
120120
ST_VIEWS,
121121
ST_ACTIONS,
122+
ST_COLUMNS,
122123
};
123124

124125
curses_table_sidemenu(sidemenu_type type,
@@ -230,5 +231,6 @@ class curses_viewinfo_page
230231
ctext* m_ctext;
231232
};
232233

234+
233235
#endif // NOCURSESUI
234-
#endif // CSYSDIG
236+
#endif // CSYSDIG

userspace/libsinsp/cursestable.cpp

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -744,6 +744,22 @@ sysdig_table_action curses_table::handle_input(int ch)
744744
}
745745
}
746746

747+
for(uint32_t i = 0; i < vinfo->max_col_sort_hotkeys; i++)
748+
{
749+
if(vinfo->m_col_sort_hotkeys[i] == ch)
750+
{
751+
if(i < vinfo->m_columns.size())
752+
{
753+
m_table->set_sorting_col(i + 1);
754+
m_table->sort_sample();
755+
update_data(m_data);
756+
set_x_start(0);
757+
recreate_win(m_parent->m_screenh - 3);
758+
render(true);
759+
break;
760+
}
761+
}
762+
}
747763
return STA_PARENT_HANDLE;
748764
}
749765

userspace/libsinsp/cursestable.h

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -86,7 +86,8 @@ class curses_table :
8686
sinsp_table::tabletype m_type;
8787

8888
friend class curses_table_sidemenu;
89+
friend class sinsp_cursesui; // for access to m_data in sinsp_cursesui::handle_input
8990
};
9091

9192
#endif // NOCURSESUI
92-
#endif // CSYSDIG
93+
#endif // CSYSDIG

userspace/libsinsp/cursesui.cpp

Lines changed: 120 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -114,6 +114,9 @@ sinsp_cursesui::sinsp_cursesui(sinsp* inspector,
114114
}
115115
}
116116

117+
m_view_sort_sidemenu = NULL;
118+
m_selected_view_sort_sidemenu_entry = 0;
119+
117120
if(!m_raw_output)
118121
{
119122
//
@@ -200,7 +203,11 @@ sinsp_cursesui::sinsp_cursesui(sinsp* inspector,
200203
m_menuitems.push_back(sinsp_menuitem_info("F6", "Dig", sinsp_menuitem_info::TABLE, KEY_F(6)));
201204
m_menuitems.push_back(sinsp_menuitem_info("F7", "Legend", sinsp_menuitem_info::ALL, KEY_F(7)));
202205
m_menuitems.push_back(sinsp_menuitem_info("F8", "Actions", sinsp_menuitem_info::ALL, KEY_F(8)));
206+
<<<<<<< HEAD
203207
m_menuitems.push_back(sinsp_menuitem_info("F12", "Spectro", sinsp_menuitem_info::ALL, KEY_F(8)));
208+
=======
209+
m_menuitems.push_back(sinsp_menuitem_info("F9", "Sort", sinsp_menuitem_info::ALL, KEY_F(9)));
210+
>>>>>>> dev
204211
m_menuitems.push_back(sinsp_menuitem_info("CTRL+F", "Search", sinsp_menuitem_info::ALL, 6));
205212
m_menuitems.push_back(sinsp_menuitem_info("p", "Pause", sinsp_menuitem_info::ALL, 'p'));
206213
m_menuitems.push_back(sinsp_menuitem_info("c", "Clear", sinsp_menuitem_info::LIST, 'c'));
@@ -291,6 +298,8 @@ void sinsp_cursesui::configure(sinsp_view_manager* views)
291298
m_selected_view = m_views.get_selected_view();
292299
m_selected_view_sidemenu_entry = m_selected_view;
293300
m_selected_action_sidemenu_entry = 0;
301+
m_selected_view_sort_sidemenu_entry = 0;
302+
m_sidemenu_sorting_col = -1;
294303
}
295304

296305
void sinsp_cursesui::start(bool is_drilldown, bool is_spy_switch)
@@ -965,6 +974,11 @@ void sinsp_cursesui::render()
965974
m_view_sidemenu->render();
966975
}
967976

977+
if(m_view_sort_sidemenu)
978+
{
979+
m_view_sort_sidemenu->render();
980+
}
981+
968982
if(m_action_sidemenu)
969983
{
970984
m_action_sidemenu->render();
@@ -1029,6 +1043,39 @@ void sinsp_cursesui::populate_view_sidemenu(string field, vector<sidemenu_list_e
10291043
}
10301044
}
10311045

1046+
void sinsp_cursesui::populate_view_cols_sidemenu()
1047+
{
1048+
int32_t k = 0;
1049+
1050+
vector<sidemenu_list_entry> viewlist;
1051+
sinsp_view_info* vinfo = get_selected_view();
1052+
1053+
for(auto it : vinfo->m_columns)
1054+
{
1055+
if(it.m_name != "NA")
1056+
{
1057+
if(m_sidemenu_sorting_col == k)
1058+
{
1059+
viewlist.push_back(sidemenu_list_entry(it.m_name, k++));
1060+
continue;
1061+
}
1062+
viewlist.push_back(sidemenu_list_entry(it.m_name, k++));
1063+
}
1064+
}
1065+
1066+
if(viewlist.size() == 0)
1067+
{
1068+
viewlist.push_back(sidemenu_list_entry("<NO COLUMNS>", 0));
1069+
}
1070+
1071+
if(m_view_sort_sidemenu != NULL)
1072+
{
1073+
m_view_sort_sidemenu->set_entries(&viewlist);
1074+
}
1075+
}
1076+
1077+
1078+
10321079
void sinsp_cursesui::populate_action_sidemenu()
10331080
{
10341081
uint32_t k = 0;
@@ -1269,6 +1316,9 @@ void sinsp_cursesui::switch_view(bool is_spy_switch)
12691316

12701317
delete m_action_sidemenu;
12711318
m_action_sidemenu = NULL;
1319+
1320+
delete m_view_sort_sidemenu;
1321+
m_view_sort_sidemenu = NULL;
12721322

12731323
if(m_viz != NULL)
12741324
{
@@ -1939,6 +1989,7 @@ sysdig_table_action sinsp_cursesui::handle_input(int ch)
19391989
//
19401990
// Avoid parsing keys during file load
19411991
//
1992+
19421993
if((!m_inspector->is_live()) && !is_eof())
19431994
{
19441995
if(ch != KEY_BACKSPACE &&
@@ -1999,7 +2050,6 @@ sysdig_table_action sinsp_cursesui::handle_input(int ch)
19992050
delete m_viewinfo_page;
20002051
m_viewinfo_page = NULL;
20012052
}
2002-
20032053
return ta;
20042054
}
20052055
else if(ta != STA_PARENT_HANDLE)
@@ -2054,6 +2104,37 @@ sysdig_table_action sinsp_cursesui::handle_input(int ch)
20542104
return STA_NONE;
20552105
}
20562106
}
2107+
2108+
if(m_view_sort_sidemenu != NULL)
2109+
{
2110+
sysdig_table_action ta = m_view_sort_sidemenu->handle_input(ch);
2111+
if(ta == STA_SWITCH_VIEW || ta == STA_DESTROY_CHILD)
2112+
{
2113+
if(ta == STA_SWITCH_VIEW)
2114+
{
2115+
sinsp_view_info* vinfo = get_selected_view();
2116+
ASSERT(m_selected_view_sort_sidemenu_entry < vinfo->m_columns.size());
2117+
m_datatable->set_sorting_col(m_selected_view_sort_sidemenu_entry+1);
2118+
m_datatable->sort_sample();
2119+
m_viz->update_data(m_viz->m_data);
2120+
}
2121+
delete m_view_sort_sidemenu;
2122+
m_view_sort_sidemenu = NULL;
2123+
m_viz->set_x_start(0);
2124+
m_viz->recreate_win(m_screenh - 3);
2125+
m_viz->render(true);
2126+
render();
2127+
if(ta == STA_SWITCH_VIEW)
2128+
{
2129+
return STA_NONE;
2130+
}
2131+
}
2132+
else if(ta != STA_PARENT_HANDLE)
2133+
{
2134+
return STA_NONE;
2135+
}
2136+
}
2137+
20572138
}
20582139

20592140
if(m_output_filtering || m_output_searching || m_search_caller_interface != NULL)
@@ -2206,8 +2287,40 @@ sysdig_table_action sinsp_cursesui::handle_input(int ch)
22062287
curs_set(1);
22072288
render();
22082289
break;
2209-
//case KEY_F(3):
2210-
// break;
2290+
case KEY_F(9):
2291+
case '>': // sort columns
2292+
if(m_view_sidemenu != NULL)
2293+
{
2294+
break;
2295+
}
2296+
if(m_view_sort_sidemenu == NULL)
2297+
{
2298+
m_viz->set_x_start(VIEW_SIDEMENU_WIDTH);
2299+
m_sidemenu_sorting_col = m_datatable->get_sorting_col() -1;
2300+
m_view_sort_sidemenu = new curses_table_sidemenu(curses_table_sidemenu::ST_COLUMNS,
2301+
this, m_sidemenu_sorting_col, VIEW_SIDEMENU_WIDTH);
2302+
2303+
populate_view_cols_sidemenu();
2304+
m_view_sort_sidemenu->set_title("Select sort column");
2305+
2306+
m_viz->set_x_start(VIEW_SIDEMENU_WIDTH);
2307+
m_viz->recreate_win(m_screenh - 3);
2308+
render();
2309+
m_viewinfo_page = NULL;
2310+
}
2311+
else
2312+
{
2313+
m_viz->set_x_start(0);
2314+
delete m_view_sort_sidemenu;
2315+
m_view_sort_sidemenu = NULL;
2316+
m_viz->set_x_start(0);
2317+
m_viz->recreate_win(m_screenh - 3);
2318+
m_viz->render(true);
2319+
m_viz->render(true);
2320+
render();
2321+
}
2322+
2323+
break;
22112324
case '\\':
22122325
case KEY_F(4):
22132326
m_search_caller_interface = NULL;
@@ -2354,6 +2467,10 @@ sysdig_table_action sinsp_cursesui::handle_input(int ch)
23542467
{
23552468
event = &m_view_sidemenu->m_last_mevent;
23562469
}
2470+
else if(m_view_sort_sidemenu != NULL)
2471+
{
2472+
event = &m_view_sort_sidemenu->m_last_mevent;
2473+
}
23572474
else if(m_action_sidemenu != NULL)
23582475
{
23592476
event = &m_action_sidemenu->m_last_mevent;

userspace/libsinsp/cursesui.h

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -600,6 +600,7 @@ class sinsp_cursesui
600600
int32_t m_prev_selected_view;
601601
uint32_t m_selected_view_sidemenu_entry;
602602
uint32_t m_selected_action_sidemenu_entry;
603+
uint32_t m_selected_view_sort_sidemenu_entry;
603604
sinsp_ui_selection_hierarchy m_sel_hierarchy;
604605
uint32_t m_screenw;
605606
uint32_t m_screenh;
@@ -613,6 +614,8 @@ class sinsp_cursesui
613614
curses_table_sidemenu* m_view_sidemenu;
614615
curses_table_sidemenu* m_action_sidemenu;
615616
curses_viewinfo_page* m_viewinfo_page;
617+
curses_table_sidemenu* m_view_sort_sidemenu;
618+
int32_t m_sidemenu_sorting_col;
616619
curses_mainhelp_page* m_mainhelp_page;
617620
curses_textbox* m_spy_box;
618621
sinsp_evt::param_fmt m_spybox_text_format;
@@ -644,6 +647,7 @@ class sinsp_cursesui
644647
sysdig_table_action handle_textbox_input(int ch);
645648
void populate_view_sidemenu(string field, vector<sidemenu_list_entry>* viewlist);
646649
void populate_action_sidemenu();
650+
void populate_view_cols_sidemenu();
647651
void print_progress(double progress);
648652
void show_selected_view_info();
649653
#endif
@@ -679,4 +683,4 @@ class sinsp_cursesui
679683
bool m_truncated_input;
680684
};
681685

682-
#endif // CSYSDIG
686+
#endif // CSYSDIG

userspace/libsinsp/viewinfo.cpp

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -75,6 +75,19 @@ sinsp_view_info::sinsp_view_info(viewtype type,
7575
m_filter = filter;
7676
m_valid = true;
7777
m_actions = actions;
78+
// init the array for hotkeys for sorting columns
79+
set_col_sorting_hotkeys();
80+
}
81+
82+
void sinsp_view_info::set_col_sorting_hotkeys()
83+
{
84+
const char shift_number_keys [] = {'!', '@', '#', '$', '%', '^', '&', '*', '('};
85+
uint32_t size = sizeof(shift_number_keys) / sizeof(shift_number_keys[0]);
86+
for(uint32_t i=0; i<size; i++)
87+
{
88+
m_col_sort_hotkeys.push_back(shift_number_keys[i]);
89+
}
90+
max_col_sort_hotkeys = m_col_sort_hotkeys.size();
7891
}
7992

8093
void sinsp_view_info::set_sorting_col()

0 commit comments

Comments
 (0)