Skip to content

Commit 02a535b

Browse files
committed
Merge branch 'master' into dev
2 parents a7b6c48 + bd32510 commit 02a535b

File tree

9 files changed

+198
-10
lines changed

9 files changed

+198
-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
{
@@ -1294,7 +1314,7 @@ curses_viewinfo_page::curses_viewinfo_page(sinsp_cursesui* parent,
12941314
config.m_scroll_on_append = false;
12951315
config.m_bounding_box = true;
12961316
config.m_do_wrap = true;
1297-
1317+
parent->m_selected_view_sort_sidemenu_entry = 0;
12981318
m_ctext->set_config(&config);
12991319

13001320
//
@@ -1654,6 +1674,16 @@ curses_mainhelp_page::curses_mainhelp_page(sinsp_cursesui* parent)
16541674
wattrset(m_win, parent->m_colors[sinsp_cursesui::PROCESS]);
16551675
m_ctext->printf(": open the view's actions panel\n");
16561676

1677+
wattrset(m_win, parent->m_colors[sinsp_cursesui::PROCESS_MEGABYTES]);
1678+
m_ctext->printf("<shift>1-9");
1679+
wattrset(m_win, parent->m_colors[sinsp_cursesui::PROCESS]);
1680+
m_ctext->printf(": sort column <n> ");
1681+
1682+
wattrset(m_win, parent->m_colors[sinsp_cursesui::PROCESS_MEGABYTES]);
1683+
m_ctext->printf("F9 >");
1684+
wattrset(m_win, parent->m_colors[sinsp_cursesui::PROCESS]);
1685+
m_ctext->printf(": open the column sort panel\n");
1686+
16571687
//
16581688
// Text windows keys
16591689
//

userspace/libsinsp/cursescomponents.h

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

125126
curses_table_sidemenu(sidemenu_type type,
@@ -231,5 +232,6 @@ class curses_viewinfo_page
231232
ctext* m_ctext;
232233
};
233234

235+
234236
#endif // NOCURSESUI
235-
#endif // CSYSDIG
237+
#endif // CSYSDIG

userspace/libsinsp/cursestable.cpp

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -748,6 +748,22 @@ sysdig_table_action curses_table::handle_input(int ch)
748748
}
749749
}
750750

751+
for(uint32_t i = 0; i < vinfo->max_col_sort_hotkeys; i++)
752+
{
753+
if(vinfo->m_col_sort_hotkeys[i] == ch)
754+
{
755+
if(i < vinfo->m_columns.size())
756+
{
757+
m_table->set_sorting_col(i + 1);
758+
m_table->sort_sample();
759+
update_data(m_data);
760+
set_x_start(0);
761+
recreate_win(m_parent->m_screenh - 3);
762+
render(true);
763+
break;
764+
}
765+
}
766+
}
751767
return STA_PARENT_HANDLE;
752768
}
753769

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: 117 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -102,6 +102,9 @@ sinsp_cursesui::sinsp_cursesui(sinsp* inspector,
102102
m_viewinfo_page = NULL;
103103
m_mainhelp_page = NULL;
104104

105+
m_view_sort_sidemenu = NULL;
106+
m_selected_view_sort_sidemenu_entry = 0;
107+
105108
if(!m_raw_output)
106109
{
107110
//
@@ -183,6 +186,7 @@ sinsp_cursesui::sinsp_cursesui(sinsp* inspector,
183186
m_menuitems.push_back(sinsp_menuitem_info("F6", "Dig", sinsp_menuitem_info::TABLE, KEY_F(6)));
184187
m_menuitems.push_back(sinsp_menuitem_info("F7", "Legend", sinsp_menuitem_info::ALL, KEY_F(7)));
185188
m_menuitems.push_back(sinsp_menuitem_info("F8", "Actions", sinsp_menuitem_info::ALL, KEY_F(8)));
189+
m_menuitems.push_back(sinsp_menuitem_info("F9", "Sort", sinsp_menuitem_info::ALL, KEY_F(9)));
186190
m_menuitems.push_back(sinsp_menuitem_info("CTRL+F", "Search", sinsp_menuitem_info::ALL, 6));
187191
m_menuitems.push_back(sinsp_menuitem_info("p", "Pause", sinsp_menuitem_info::ALL, 'p'));
188192
m_menuitems.push_back(sinsp_menuitem_info("c", "Clear", sinsp_menuitem_info::LIST, 'c'));
@@ -267,6 +271,8 @@ void sinsp_cursesui::configure(sinsp_view_manager* views)
267271
m_selected_view = m_views.get_selected_view();
268272
m_selected_view_sidemenu_entry = m_selected_view;
269273
m_selected_action_sidemenu_entry = 0;
274+
m_selected_view_sort_sidemenu_entry = 0;
275+
m_sidemenu_sorting_col = -1;
270276
}
271277

272278
void sinsp_cursesui::start(bool is_drilldown, bool is_spy_switch)
@@ -890,6 +896,11 @@ void sinsp_cursesui::render()
890896
m_view_sidemenu->render();
891897
}
892898

899+
if(m_view_sort_sidemenu)
900+
{
901+
m_view_sort_sidemenu->render();
902+
}
903+
893904
if(m_action_sidemenu)
894905
{
895906
m_action_sidemenu->render();
@@ -954,6 +965,39 @@ void sinsp_cursesui::populate_view_sidemenu(string field, vector<sidemenu_list_e
954965
}
955966
}
956967

968+
void sinsp_cursesui::populate_view_cols_sidemenu()
969+
{
970+
int32_t k = 0;
971+
972+
vector<sidemenu_list_entry> viewlist;
973+
sinsp_view_info* vinfo = get_selected_view();
974+
975+
for(auto it : vinfo->m_columns)
976+
{
977+
if(it.m_name != "NA")
978+
{
979+
if(m_sidemenu_sorting_col == k)
980+
{
981+
viewlist.push_back(sidemenu_list_entry(it.m_name, k++));
982+
continue;
983+
}
984+
viewlist.push_back(sidemenu_list_entry(it.m_name, k++));
985+
}
986+
}
987+
988+
if(viewlist.size() == 0)
989+
{
990+
viewlist.push_back(sidemenu_list_entry("<NO COLUMNS>", 0));
991+
}
992+
993+
if(m_view_sort_sidemenu != NULL)
994+
{
995+
m_view_sort_sidemenu->set_entries(&viewlist);
996+
}
997+
}
998+
999+
1000+
9571001
void sinsp_cursesui::populate_action_sidemenu()
9581002
{
9591003
uint32_t k = 0;
@@ -1174,6 +1218,9 @@ void sinsp_cursesui::switch_view(bool is_spy_switch)
11741218

11751219
delete m_action_sidemenu;
11761220
m_action_sidemenu = NULL;
1221+
1222+
delete m_view_sort_sidemenu;
1223+
m_view_sort_sidemenu = NULL;
11771224

11781225
if(m_viz != NULL)
11791226
{
@@ -1761,6 +1808,7 @@ sysdig_table_action sinsp_cursesui::handle_input(int ch)
17611808
//
17621809
// Avoid parsing keys during file load
17631810
//
1811+
17641812
if((!m_inspector->is_live()) && !is_eof())
17651813
{
17661814
if(ch != KEY_BACKSPACE &&
@@ -1817,7 +1865,6 @@ sysdig_table_action sinsp_cursesui::handle_input(int ch)
18171865
delete m_viewinfo_page;
18181866
m_viewinfo_page = NULL;
18191867
}
1820-
18211868
return ta;
18221869
}
18231870
else if(ta != STA_PARENT_HANDLE)
@@ -1860,6 +1907,37 @@ sysdig_table_action sinsp_cursesui::handle_input(int ch)
18601907
return STA_NONE;
18611908
}
18621909
}
1910+
1911+
if(m_view_sort_sidemenu != NULL)
1912+
{
1913+
sysdig_table_action ta = m_view_sort_sidemenu->handle_input(ch);
1914+
if(ta == STA_SWITCH_VIEW || ta == STA_DESTROY_CHILD)
1915+
{
1916+
if(ta == STA_SWITCH_VIEW)
1917+
{
1918+
sinsp_view_info* vinfo = get_selected_view();
1919+
ASSERT(m_selected_view_sort_sidemenu_entry < vinfo->m_columns.size());
1920+
m_datatable->set_sorting_col(m_selected_view_sort_sidemenu_entry+1);
1921+
m_datatable->sort_sample();
1922+
m_viz->update_data(m_viz->m_data);
1923+
}
1924+
delete m_view_sort_sidemenu;
1925+
m_view_sort_sidemenu = NULL;
1926+
m_viz->set_x_start(0);
1927+
m_viz->recreate_win(m_screenh - 3);
1928+
m_viz->render(true);
1929+
render();
1930+
if(ta == STA_SWITCH_VIEW)
1931+
{
1932+
return STA_NONE;
1933+
}
1934+
}
1935+
else if(ta != STA_PARENT_HANDLE)
1936+
{
1937+
return STA_NONE;
1938+
}
1939+
}
1940+
18631941
}
18641942

18651943
if(m_output_filtering || m_output_searching || m_search_caller_interface != NULL)
@@ -1983,8 +2061,40 @@ sysdig_table_action sinsp_cursesui::handle_input(int ch)
19832061
curs_set(1);
19842062
render();
19852063
break;
1986-
//case KEY_F(3):
1987-
// break;
2064+
case KEY_F(9):
2065+
case '>': // sort columns
2066+
if(m_view_sidemenu != NULL)
2067+
{
2068+
break;
2069+
}
2070+
if(m_view_sort_sidemenu == NULL)
2071+
{
2072+
m_viz->set_x_start(VIEW_SIDEMENU_WIDTH);
2073+
m_sidemenu_sorting_col = m_datatable->get_sorting_col() -1;
2074+
m_view_sort_sidemenu = new curses_table_sidemenu(curses_table_sidemenu::ST_COLUMNS,
2075+
this, m_sidemenu_sorting_col, VIEW_SIDEMENU_WIDTH);
2076+
2077+
populate_view_cols_sidemenu();
2078+
m_view_sort_sidemenu->set_title("Select sort column");
2079+
2080+
m_viz->set_x_start(VIEW_SIDEMENU_WIDTH);
2081+
m_viz->recreate_win(m_screenh - 3);
2082+
render();
2083+
m_viewinfo_page = NULL;
2084+
}
2085+
else
2086+
{
2087+
m_viz->set_x_start(0);
2088+
delete m_view_sort_sidemenu;
2089+
m_view_sort_sidemenu = NULL;
2090+
m_viz->set_x_start(0);
2091+
m_viz->recreate_win(m_screenh - 3);
2092+
m_viz->render(true);
2093+
m_viz->render(true);
2094+
render();
2095+
}
2096+
2097+
break;
19882098
case '\\':
19892099
case KEY_F(4):
19902100
m_search_caller_interface = NULL;
@@ -2119,6 +2229,10 @@ sysdig_table_action sinsp_cursesui::handle_input(int ch)
21192229
{
21202230
event = &m_view_sidemenu->m_last_mevent;
21212231
}
2232+
else if(m_view_sort_sidemenu != NULL)
2233+
{
2234+
event = &m_view_sort_sidemenu->m_last_mevent;
2235+
}
21222236
else if(m_action_sidemenu != NULL)
21232237
{
21242238
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
@@ -565,6 +565,7 @@ class sinsp_cursesui
565565
int32_t m_prev_selected_view;
566566
uint32_t m_selected_view_sidemenu_entry;
567567
uint32_t m_selected_action_sidemenu_entry;
568+
uint32_t m_selected_view_sort_sidemenu_entry;
568569
sinsp_ui_selection_hierarchy m_sel_hierarchy;
569570
uint32_t m_screenw;
570571
uint32_t m_screenh;
@@ -577,6 +578,8 @@ class sinsp_cursesui
577578
curses_table_sidemenu* m_view_sidemenu;
578579
curses_table_sidemenu* m_action_sidemenu;
579580
curses_viewinfo_page* m_viewinfo_page;
581+
curses_table_sidemenu* m_view_sort_sidemenu;
582+
int32_t m_sidemenu_sorting_col;
580583
curses_mainhelp_page* m_mainhelp_page;
581584
curses_textbox* m_spy_box;
582585
sinsp_evt::param_fmt m_spybox_text_format;
@@ -606,6 +609,7 @@ class sinsp_cursesui
606609
sysdig_table_action handle_input(int ch);
607610
void populate_view_sidemenu(string field, vector<sidemenu_list_entry>* viewlist);
608611
void populate_action_sidemenu();
612+
void populate_view_cols_sidemenu();
609613
void print_progress(double progress);
610614
void show_selected_view_info();
611615
#endif
@@ -644,4 +648,4 @@ class sinsp_cursesui
644648
bool m_truncated_input;
645649
};
646650

647-
#endif // CSYSDIG
651+
#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)