2011-10-13 15:52:46 +04:00
# include "../util.h"
2011-10-18 21:50:51 +04:00
# include "../cache.h"
2011-10-13 15:52:46 +04:00
# include "../../perf.h"
2010-08-11 21:51:47 +04:00
# include "libslang.h"
2011-02-09 16:38:43 +03:00
# include "ui.h"
2011-10-25 19:45:16 +04:00
# include "util.h"
2010-08-11 21:51:47 +04:00
# include <linux/compiler.h>
2010-08-07 00:35:02 +04:00
# include <linux/list.h>
# include <linux/rbtree.h>
# include <stdlib.h>
# include <sys/ttydefaults.h>
# include "browser.h"
2010-08-10 22:44:20 +04:00
# include "helpline.h"
2011-10-20 22:59:15 +04:00
# include "keysyms.h"
2010-08-07 00:35:02 +04:00
# include "../color.h"
2011-10-13 15:52:46 +04:00
2011-10-18 20:31:35 +04:00
static int ui_browser__percent_color ( struct ui_browser * browser ,
double percent , bool current )
2010-08-07 00:35:02 +04:00
{
2011-10-18 20:31:35 +04:00
if ( current & & ( ! browser - > use_navkeypressed | | browser - > navkeypressed ) )
2010-08-07 00:35:02 +04:00
return HE_COLORSET_SELECTED ;
if ( percent > = MIN_RED )
return HE_COLORSET_TOP ;
if ( percent > = MIN_GREEN )
return HE_COLORSET_MEDIUM ;
return HE_COLORSET_NORMAL ;
}
2012-04-02 19:48:56 +04:00
int ui_browser__set_color ( struct ui_browser * browser , int color )
2010-08-11 21:51:47 +04:00
{
2012-04-02 19:48:56 +04:00
int ret = browser - > current_color ;
browser - > current_color = color ;
2010-08-11 21:51:47 +04:00
SLsmg_set_color ( color ) ;
2012-04-02 19:48:56 +04:00
return ret ;
2010-08-11 21:51:47 +04:00
}
2012-05-30 05:42:18 +04:00
void ui_browser__set_percent_color ( struct ui_browser * browser ,
2010-08-11 21:51:47 +04:00
double percent , bool current )
{
2012-05-30 05:42:18 +04:00
int color = ui_browser__percent_color ( browser , percent , current ) ;
ui_browser__set_color ( browser , color ) ;
2010-08-11 21:51:47 +04:00
}
2012-05-30 05:42:18 +04:00
void ui_browser__gotorc ( struct ui_browser * browser , int y , int x )
2010-08-11 21:51:47 +04:00
{
2012-05-30 05:42:18 +04:00
SLsmg_gotorc ( browser - > y + y , browser - > x + x ) ;
2010-08-11 21:51:47 +04:00
}
2011-10-14 19:27:54 +04:00
static struct list_head *
ui_browser__list_head_filter_entries ( struct ui_browser * browser ,
struct list_head * pos )
{
do {
if ( ! browser - > filter | | ! browser - > filter ( browser , pos ) )
return pos ;
pos = pos - > next ;
} while ( pos ! = browser - > entries ) ;
return NULL ;
}
static struct list_head *
ui_browser__list_head_filter_prev_entries ( struct ui_browser * browser ,
struct list_head * pos )
{
do {
if ( ! browser - > filter | | ! browser - > filter ( browser , pos ) )
return pos ;
pos = pos - > prev ;
} while ( pos ! = browser - > entries ) ;
return NULL ;
}
2012-05-30 05:42:18 +04:00
void ui_browser__list_head_seek ( struct ui_browser * browser , off_t offset , int whence )
2010-08-07 00:35:02 +04:00
{
2012-05-30 05:42:18 +04:00
struct list_head * head = browser - > entries ;
2010-08-07 00:35:02 +04:00
struct list_head * pos ;
2012-05-30 05:42:18 +04:00
if ( browser - > nr_entries = = 0 )
2011-10-14 19:27:54 +04:00
return ;
2010-08-07 00:35:02 +04:00
switch ( whence ) {
case SEEK_SET :
2012-05-30 05:42:18 +04:00
pos = ui_browser__list_head_filter_entries ( browser , head - > next ) ;
2010-08-07 00:35:02 +04:00
break ;
case SEEK_CUR :
2012-05-30 05:42:18 +04:00
pos = browser - > top ;
2010-08-07 00:35:02 +04:00
break ;
case SEEK_END :
2012-05-30 05:42:18 +04:00
pos = ui_browser__list_head_filter_prev_entries ( browser , head - > prev ) ;
2010-08-07 00:35:02 +04:00
break ;
default :
return ;
}
2011-10-14 19:27:54 +04:00
assert ( pos ! = NULL ) ;
2010-08-07 00:35:02 +04:00
if ( offset > 0 ) {
while ( offset - - ! = 0 )
2012-05-30 05:42:18 +04:00
pos = ui_browser__list_head_filter_entries ( browser , pos - > next ) ;
2010-08-07 00:35:02 +04:00
} else {
while ( offset + + ! = 0 )
2012-05-30 05:42:18 +04:00
pos = ui_browser__list_head_filter_prev_entries ( browser , pos - > prev ) ;
2010-08-07 00:35:02 +04:00
}
2012-05-30 05:42:18 +04:00
browser - > top = pos ;
2010-08-07 00:35:02 +04:00
}
2012-05-30 05:42:18 +04:00
void ui_browser__rb_tree_seek ( struct ui_browser * browser , off_t offset , int whence )
2010-08-07 00:35:02 +04:00
{
2012-05-30 05:42:18 +04:00
struct rb_root * root = browser - > entries ;
2010-08-07 00:35:02 +04:00
struct rb_node * nd ;
switch ( whence ) {
case SEEK_SET :
nd = rb_first ( root ) ;
break ;
case SEEK_CUR :
2012-05-30 05:42:18 +04:00
nd = browser - > top ;
2010-08-07 00:35:02 +04:00
break ;
case SEEK_END :
nd = rb_last ( root ) ;
break ;
default :
return ;
}
if ( offset > 0 ) {
while ( offset - - ! = 0 )
nd = rb_next ( nd ) ;
} else {
while ( offset + + ! = 0 )
nd = rb_prev ( nd ) ;
}
2012-05-30 05:42:18 +04:00
browser - > top = nd ;
2010-08-07 00:35:02 +04:00
}
2012-05-30 05:42:18 +04:00
unsigned int ui_browser__rb_tree_refresh ( struct ui_browser * browser )
2010-08-07 00:35:02 +04:00
{
struct rb_node * nd ;
int row = 0 ;
2012-05-30 05:42:18 +04:00
if ( browser - > top = = NULL )
browser - > top = rb_first ( browser - > entries ) ;
2010-08-07 00:35:02 +04:00
2012-05-30 05:42:18 +04:00
nd = browser - > top ;
2010-08-07 00:35:02 +04:00
while ( nd ! = NULL ) {
2012-05-30 05:42:18 +04:00
ui_browser__gotorc ( browser , row , 0 ) ;
browser - > write ( browser , nd , row ) ;
perf ui browser: Add ->rows to disambiguate from ->height
The ui_browser->height is about the whole browser "window", including
any header, status lines or any other space needed for some "Yes", "No",
etc buttons a descendent browser, like hist_browser, may have.
Since the navigation is done mostly on the ui_browser methods, it needs
to know how many rows are on the screen, while details about what other
components are, say, if a header (that may be composed of multiple
lines, etc) is present.
Besides this we'll need to add a ui_browser->refresh_dimensions() hook
so that browsers like hist_browser can update ->rows in response to
screen resizes, this will come in a follow up patch.
This patch just adds ->rows and updates it when updating ->height, keeps
using ->height for the only other widget that can come with ui_browser,
the scrollbar, that goes on using all the height on the rightmost column
in the screen, using ->rows for the keyboard navigation needs.
Cc: Adrian Hunter <adrian.hunter@intel.com>
Cc: David Ahern <dsahern@gmail.com>
Cc: Don Zickus <dzickus@redhat.com>
Cc: Frederic Weisbecker <fweisbec@gmail.com>
Cc: Jiri Olsa <jolsa@redhat.com>
Cc: Mike Galbraith <efault@gmx.de>
Cc: Namhyung Kim <namhyung@kernel.org>
Cc: Paul Mackerras <paulus@samba.org>
Cc: Peter Zijlstra <peterz@infradead.org>
Cc: Stephane Eranian <eranian@google.com>
Link: http://lkml.kernel.org/n/tip-xexmwg1mv7u03j5imn66jdak@git.kernel.org
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
2014-07-01 18:07:54 +04:00
if ( + + row = = browser - > rows )
2010-08-07 00:35:02 +04:00
break ;
nd = rb_next ( nd ) ;
}
return row ;
}
2012-05-30 05:42:18 +04:00
bool ui_browser__is_current_entry ( struct ui_browser * browser , unsigned row )
2010-08-07 00:35:02 +04:00
{
2012-05-30 05:42:18 +04:00
return browser - > top_idx + row = = browser - > index ;
2010-08-07 00:35:02 +04:00
}
2012-05-30 05:42:18 +04:00
void ui_browser__refresh_dimensions ( struct ui_browser * browser )
2010-08-07 00:35:02 +04:00
{
2012-05-30 05:42:18 +04:00
browser - > width = SLtt_Screen_Cols - 1 ;
perf ui browser: Add ->rows to disambiguate from ->height
The ui_browser->height is about the whole browser "window", including
any header, status lines or any other space needed for some "Yes", "No",
etc buttons a descendent browser, like hist_browser, may have.
Since the navigation is done mostly on the ui_browser methods, it needs
to know how many rows are on the screen, while details about what other
components are, say, if a header (that may be composed of multiple
lines, etc) is present.
Besides this we'll need to add a ui_browser->refresh_dimensions() hook
so that browsers like hist_browser can update ->rows in response to
screen resizes, this will come in a follow up patch.
This patch just adds ->rows and updates it when updating ->height, keeps
using ->height for the only other widget that can come with ui_browser,
the scrollbar, that goes on using all the height on the rightmost column
in the screen, using ->rows for the keyboard navigation needs.
Cc: Adrian Hunter <adrian.hunter@intel.com>
Cc: David Ahern <dsahern@gmail.com>
Cc: Don Zickus <dzickus@redhat.com>
Cc: Frederic Weisbecker <fweisbec@gmail.com>
Cc: Jiri Olsa <jolsa@redhat.com>
Cc: Mike Galbraith <efault@gmx.de>
Cc: Namhyung Kim <namhyung@kernel.org>
Cc: Paul Mackerras <paulus@samba.org>
Cc: Peter Zijlstra <peterz@infradead.org>
Cc: Stephane Eranian <eranian@google.com>
Link: http://lkml.kernel.org/n/tip-xexmwg1mv7u03j5imn66jdak@git.kernel.org
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
2014-07-01 18:07:54 +04:00
browser - > height = browser - > rows = SLtt_Screen_Rows - 2 ;
2012-05-30 05:42:18 +04:00
browser - > y = 1 ;
browser - > x = 0 ;
2010-08-07 00:35:02 +04:00
}
2011-10-26 18:04:37 +04:00
void ui_browser__handle_resize ( struct ui_browser * browser )
{
ui__refresh_dimensions ( false ) ;
ui_browser__show ( browser , browser - > title , ui_helpline__current ) ;
ui_browser__refresh ( browser ) ;
}
2011-10-29 18:15:04 +04:00
int ui_browser__warning ( struct ui_browser * browser , int timeout ,
const char * format , . . . )
2011-10-26 18:04:37 +04:00
{
va_list args ;
2011-10-29 18:15:04 +04:00
char * text ;
int key = 0 , err ;
2011-10-26 18:04:37 +04:00
va_start ( args , format ) ;
2011-10-29 18:15:04 +04:00
err = vasprintf ( & text , format , args ) ;
2011-10-26 18:04:37 +04:00
va_end ( args ) ;
2011-10-29 18:15:04 +04:00
if ( err < 0 ) {
va_start ( args , format ) ;
ui_helpline__vpush ( format , args ) ;
va_end ( args ) ;
} else {
2014-05-30 04:53:58 +04:00
while ( ( key = ui__question_window ( " Warning! " , text ,
2011-10-29 18:15:04 +04:00
" Press any key... " ,
timeout ) ) = = K_RESIZE )
ui_browser__handle_resize ( browser ) ;
free ( text ) ;
}
2011-10-26 18:04:37 +04:00
return key ;
}
int ui_browser__help_window ( struct ui_browser * browser , const char * text )
{
int key ;
while ( ( key = ui__help_window ( text ) ) = = K_RESIZE )
ui_browser__handle_resize ( browser ) ;
return key ;
}
bool ui_browser__dialog_yesno ( struct ui_browser * browser , const char * text )
{
int key ;
while ( ( key = ui__dialog_yesno ( text ) ) = = K_RESIZE )
ui_browser__handle_resize ( browser ) ;
return key = = K_ENTER | | toupper ( key ) = = ' Y ' ;
}
2012-05-30 05:42:18 +04:00
void ui_browser__reset_index ( struct ui_browser * browser )
2010-08-07 00:35:02 +04:00
{
2012-05-30 05:42:18 +04:00
browser - > index = browser - > top_idx = 0 ;
browser - > seek ( browser , 0 , SEEK_SET ) ;
2010-08-07 00:35:02 +04:00
}
2011-02-25 17:33:31 +03:00
void __ui_browser__show_title ( struct ui_browser * browser , const char * title )
{
SLsmg_gotorc ( 0 , 0 ) ;
2013-03-28 18:34:10 +04:00
ui_browser__set_color ( browser , HE_COLORSET_ROOT ) ;
2011-10-13 15:52:46 +04:00
slsmg_write_nstring ( title , browser - > width + 1 ) ;
2011-02-25 17:33:31 +03:00
}
void ui_browser__show_title ( struct ui_browser * browser , const char * title )
{
pthread_mutex_lock ( & ui__lock ) ;
__ui_browser__show_title ( browser , title ) ;
pthread_mutex_unlock ( & ui__lock ) ;
}
2012-05-30 05:42:18 +04:00
int ui_browser__show ( struct ui_browser * browser , const char * title ,
2010-08-10 22:44:20 +04:00
const char * helpline , . . . )
2010-08-07 00:35:02 +04:00
{
2011-10-13 15:52:46 +04:00
int err ;
2010-08-10 22:44:20 +04:00
va_list ap ;
2014-07-01 23:34:42 +04:00
if ( browser - > refresh_dimensions = = NULL )
browser - > refresh_dimensions = ui_browser__refresh_dimensions ;
browser - > refresh_dimensions ( browser ) ;
2010-08-07 00:35:02 +04:00
2011-02-09 16:38:43 +03:00
pthread_mutex_lock ( & ui__lock ) ;
2012-05-30 05:42:18 +04:00
__ui_browser__show_title ( browser , title ) ;
2010-09-13 17:25:04 +04:00
2012-05-30 05:42:18 +04:00
browser - > title = title ;
2013-12-27 00:41:15 +04:00
zfree ( & browser - > helpline ) ;
2010-08-10 22:44:20 +04:00
va_start ( ap , helpline ) ;
2012-05-30 05:42:18 +04:00
err = vasprintf ( & browser - > helpline , helpline , ap ) ;
2010-08-10 22:44:20 +04:00
va_end ( ap ) ;
2011-10-13 15:52:46 +04:00
if ( err > 0 )
2012-05-30 05:42:18 +04:00
ui_helpline__push ( browser - > helpline ) ;
2011-02-09 16:38:43 +03:00
pthread_mutex_unlock ( & ui__lock ) ;
2011-10-13 15:52:46 +04:00
return err ? 0 : - 1 ;
2010-08-07 00:35:02 +04:00
}
2013-12-19 23:25:17 +04:00
void ui_browser__hide ( struct ui_browser * browser )
2010-08-10 22:44:20 +04:00
{
2011-02-09 16:38:43 +03:00
pthread_mutex_lock ( & ui__lock ) ;
2010-08-10 22:44:20 +04:00
ui_helpline__pop ( ) ;
2013-12-27 00:41:15 +04:00
zfree ( & browser - > helpline ) ;
2011-02-09 16:38:43 +03:00
pthread_mutex_unlock ( & ui__lock ) ;
2010-08-10 22:44:20 +04:00
}
2011-10-13 15:52:46 +04:00
static void ui_browser__scrollbar_set ( struct ui_browser * browser )
{
int height = browser - > height , h = 0 , pct = 0 ,
col = browser - > width ,
2014-06-19 15:41:14 +04:00
row = 0 ;
2011-10-13 15:52:46 +04:00
if ( browser - > nr_entries > 1 ) {
pct = ( ( browser - > index * ( browser - > height - 1 ) ) /
( browser - > nr_entries - 1 ) ) ;
}
2011-10-26 14:19:05 +04:00
SLsmg_set_char_set ( 1 ) ;
2011-10-13 15:52:46 +04:00
while ( h < height ) {
ui_browser__gotorc ( browser , row + + , col ) ;
2011-10-26 14:19:05 +04:00
SLsmg_write_char ( h = = pct ? SLSMG_DIAMOND_CHAR : SLSMG_CKBRD_CHAR ) ;
2011-10-13 15:52:46 +04:00
+ + h ;
}
2011-10-26 14:19:05 +04:00
SLsmg_set_char_set ( 0 ) ;
2011-10-13 15:52:46 +04:00
}
static int __ui_browser__refresh ( struct ui_browser * browser )
2010-08-07 00:35:02 +04:00
{
int row ;
2011-10-18 20:31:35 +04:00
int width = browser - > width ;
2010-08-07 00:35:02 +04:00
2011-10-13 15:52:46 +04:00
row = browser - > refresh ( browser ) ;
ui_browser__set_color ( browser , HE_COLORSET_NORMAL ) ;
2011-10-18 20:31:35 +04:00
if ( ! browser - > use_navkeypressed | | browser - > navkeypressed )
ui_browser__scrollbar_set ( browser ) ;
else
width + = 1 ;
2011-10-13 15:52:46 +04:00
SLsmg_fill_region ( browser - > y + row , browser - > x ,
2011-10-18 20:31:35 +04:00
browser - > height - row , width , ' ' ) ;
2011-10-13 15:52:46 +04:00
return 0 ;
}
int ui_browser__refresh ( struct ui_browser * browser )
{
2011-02-09 16:38:43 +03:00
pthread_mutex_lock ( & ui__lock ) ;
2011-10-13 15:52:46 +04:00
__ui_browser__refresh ( browser ) ;
2011-02-09 16:38:43 +03:00
pthread_mutex_unlock ( & ui__lock ) ;
2010-08-07 00:35:02 +04:00
return 0 ;
}
2011-10-11 23:15:39 +04:00
/*
* Here we ' re updating nr_entries _after_ we started browsing , i . e . we have to
* forget about any reference to any entry in the underlying data structure ,
* that is why we do a SEEK_SET . Think about ' perf top ' in the hists browser
* after an output_resort and hist decay .
*/
void ui_browser__update_nr_entries ( struct ui_browser * browser , u32 nr_entries )
{
off_t offset = nr_entries - browser - > nr_entries ;
browser - > nr_entries = nr_entries ;
if ( offset < 0 ) {
if ( browser - > top_idx < ( u64 ) - offset )
offset = - browser - > top_idx ;
browser - > index + = offset ;
browser - > top_idx + = offset ;
}
2011-10-14 16:31:53 +04:00
browser - > top = NULL ;
2011-10-11 23:15:39 +04:00
browser - > seek ( browser , browser - > top_idx , SEEK_SET ) ;
}
2012-05-30 05:42:18 +04:00
int ui_browser__run ( struct ui_browser * browser , int delay_secs )
2010-08-07 00:35:02 +04:00
{
2011-10-13 15:52:46 +04:00
int err , key ;
2010-08-11 17:07:43 +04:00
2010-08-07 00:35:02 +04:00
while ( 1 ) {
off_t offset ;
2011-10-13 15:52:46 +04:00
pthread_mutex_lock ( & ui__lock ) ;
2012-05-30 05:42:18 +04:00
err = __ui_browser__refresh ( browser ) ;
2011-10-13 15:52:46 +04:00
SLsmg_refresh ( ) ;
pthread_mutex_unlock ( & ui__lock ) ;
if ( err < 0 )
break ;
2011-10-20 22:59:15 +04:00
key = ui__getch ( delay_secs ) ;
2011-10-13 15:52:46 +04:00
2011-10-20 22:59:15 +04:00
if ( key = = K_RESIZE ) {
2011-10-25 19:45:16 +04:00
ui__refresh_dimensions ( false ) ;
2014-07-01 23:34:42 +04:00
browser - > refresh_dimensions ( browser ) ;
2012-05-30 05:42:18 +04:00
__ui_browser__show_title ( browser , browser - > title ) ;
ui_helpline__puts ( browser - > helpline ) ;
2011-10-13 15:52:46 +04:00
continue ;
}
2012-05-30 05:42:18 +04:00
if ( browser - > use_navkeypressed & & ! browser - > navkeypressed ) {
2011-10-20 22:59:15 +04:00
if ( key = = K_DOWN | | key = = K_UP | |
key = = K_PGDN | | key = = K_PGUP | |
key = = K_HOME | | key = = K_END | |
2011-10-18 20:31:35 +04:00
key = = ' ' ) {
2012-05-30 05:42:18 +04:00
browser - > navkeypressed = true ;
2011-10-18 20:31:35 +04:00
continue ;
} else
return key ;
}
2011-10-13 15:52:46 +04:00
switch ( key ) {
2011-10-20 22:59:15 +04:00
case K_DOWN :
2012-05-30 05:42:18 +04:00
if ( browser - > index = = browser - > nr_entries - 1 )
2010-08-07 00:35:02 +04:00
break ;
2012-05-30 05:42:18 +04:00
+ + browser - > index ;
perf ui browser: Add ->rows to disambiguate from ->height
The ui_browser->height is about the whole browser "window", including
any header, status lines or any other space needed for some "Yes", "No",
etc buttons a descendent browser, like hist_browser, may have.
Since the navigation is done mostly on the ui_browser methods, it needs
to know how many rows are on the screen, while details about what other
components are, say, if a header (that may be composed of multiple
lines, etc) is present.
Besides this we'll need to add a ui_browser->refresh_dimensions() hook
so that browsers like hist_browser can update ->rows in response to
screen resizes, this will come in a follow up patch.
This patch just adds ->rows and updates it when updating ->height, keeps
using ->height for the only other widget that can come with ui_browser,
the scrollbar, that goes on using all the height on the rightmost column
in the screen, using ->rows for the keyboard navigation needs.
Cc: Adrian Hunter <adrian.hunter@intel.com>
Cc: David Ahern <dsahern@gmail.com>
Cc: Don Zickus <dzickus@redhat.com>
Cc: Frederic Weisbecker <fweisbec@gmail.com>
Cc: Jiri Olsa <jolsa@redhat.com>
Cc: Mike Galbraith <efault@gmx.de>
Cc: Namhyung Kim <namhyung@kernel.org>
Cc: Paul Mackerras <paulus@samba.org>
Cc: Peter Zijlstra <peterz@infradead.org>
Cc: Stephane Eranian <eranian@google.com>
Link: http://lkml.kernel.org/n/tip-xexmwg1mv7u03j5imn66jdak@git.kernel.org
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
2014-07-01 18:07:54 +04:00
if ( browser - > index = = browser - > top_idx + browser - > rows ) {
2012-05-30 05:42:18 +04:00
+ + browser - > top_idx ;
browser - > seek ( browser , + 1 , SEEK_CUR ) ;
2010-08-07 00:35:02 +04:00
}
break ;
2011-10-20 22:59:15 +04:00
case K_UP :
2012-05-30 05:42:18 +04:00
if ( browser - > index = = 0 )
2010-08-07 00:35:02 +04:00
break ;
2012-05-30 05:42:18 +04:00
- - browser - > index ;
if ( browser - > index < browser - > top_idx ) {
- - browser - > top_idx ;
browser - > seek ( browser , - 1 , SEEK_CUR ) ;
2010-08-07 00:35:02 +04:00
}
break ;
2011-10-20 22:59:15 +04:00
case K_PGDN :
2010-08-07 00:35:02 +04:00
case ' ' :
perf ui browser: Add ->rows to disambiguate from ->height
The ui_browser->height is about the whole browser "window", including
any header, status lines or any other space needed for some "Yes", "No",
etc buttons a descendent browser, like hist_browser, may have.
Since the navigation is done mostly on the ui_browser methods, it needs
to know how many rows are on the screen, while details about what other
components are, say, if a header (that may be composed of multiple
lines, etc) is present.
Besides this we'll need to add a ui_browser->refresh_dimensions() hook
so that browsers like hist_browser can update ->rows in response to
screen resizes, this will come in a follow up patch.
This patch just adds ->rows and updates it when updating ->height, keeps
using ->height for the only other widget that can come with ui_browser,
the scrollbar, that goes on using all the height on the rightmost column
in the screen, using ->rows for the keyboard navigation needs.
Cc: Adrian Hunter <adrian.hunter@intel.com>
Cc: David Ahern <dsahern@gmail.com>
Cc: Don Zickus <dzickus@redhat.com>
Cc: Frederic Weisbecker <fweisbec@gmail.com>
Cc: Jiri Olsa <jolsa@redhat.com>
Cc: Mike Galbraith <efault@gmx.de>
Cc: Namhyung Kim <namhyung@kernel.org>
Cc: Paul Mackerras <paulus@samba.org>
Cc: Peter Zijlstra <peterz@infradead.org>
Cc: Stephane Eranian <eranian@google.com>
Link: http://lkml.kernel.org/n/tip-xexmwg1mv7u03j5imn66jdak@git.kernel.org
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
2014-07-01 18:07:54 +04:00
if ( browser - > top_idx + browser - > rows > browser - > nr_entries - 1 )
2010-08-07 00:35:02 +04:00
break ;
perf ui browser: Add ->rows to disambiguate from ->height
The ui_browser->height is about the whole browser "window", including
any header, status lines or any other space needed for some "Yes", "No",
etc buttons a descendent browser, like hist_browser, may have.
Since the navigation is done mostly on the ui_browser methods, it needs
to know how many rows are on the screen, while details about what other
components are, say, if a header (that may be composed of multiple
lines, etc) is present.
Besides this we'll need to add a ui_browser->refresh_dimensions() hook
so that browsers like hist_browser can update ->rows in response to
screen resizes, this will come in a follow up patch.
This patch just adds ->rows and updates it when updating ->height, keeps
using ->height for the only other widget that can come with ui_browser,
the scrollbar, that goes on using all the height on the rightmost column
in the screen, using ->rows for the keyboard navigation needs.
Cc: Adrian Hunter <adrian.hunter@intel.com>
Cc: David Ahern <dsahern@gmail.com>
Cc: Don Zickus <dzickus@redhat.com>
Cc: Frederic Weisbecker <fweisbec@gmail.com>
Cc: Jiri Olsa <jolsa@redhat.com>
Cc: Mike Galbraith <efault@gmx.de>
Cc: Namhyung Kim <namhyung@kernel.org>
Cc: Paul Mackerras <paulus@samba.org>
Cc: Peter Zijlstra <peterz@infradead.org>
Cc: Stephane Eranian <eranian@google.com>
Link: http://lkml.kernel.org/n/tip-xexmwg1mv7u03j5imn66jdak@git.kernel.org
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
2014-07-01 18:07:54 +04:00
offset = browser - > rows ;
2012-05-30 05:42:18 +04:00
if ( browser - > index + offset > browser - > nr_entries - 1 )
offset = browser - > nr_entries - 1 - browser - > index ;
browser - > index + = offset ;
browser - > top_idx + = offset ;
browser - > seek ( browser , + offset , SEEK_CUR ) ;
2010-08-07 00:35:02 +04:00
break ;
2011-10-20 22:59:15 +04:00
case K_PGUP :
2012-05-30 05:42:18 +04:00
if ( browser - > top_idx = = 0 )
2010-08-07 00:35:02 +04:00
break ;
perf ui browser: Add ->rows to disambiguate from ->height
The ui_browser->height is about the whole browser "window", including
any header, status lines or any other space needed for some "Yes", "No",
etc buttons a descendent browser, like hist_browser, may have.
Since the navigation is done mostly on the ui_browser methods, it needs
to know how many rows are on the screen, while details about what other
components are, say, if a header (that may be composed of multiple
lines, etc) is present.
Besides this we'll need to add a ui_browser->refresh_dimensions() hook
so that browsers like hist_browser can update ->rows in response to
screen resizes, this will come in a follow up patch.
This patch just adds ->rows and updates it when updating ->height, keeps
using ->height for the only other widget that can come with ui_browser,
the scrollbar, that goes on using all the height on the rightmost column
in the screen, using ->rows for the keyboard navigation needs.
Cc: Adrian Hunter <adrian.hunter@intel.com>
Cc: David Ahern <dsahern@gmail.com>
Cc: Don Zickus <dzickus@redhat.com>
Cc: Frederic Weisbecker <fweisbec@gmail.com>
Cc: Jiri Olsa <jolsa@redhat.com>
Cc: Mike Galbraith <efault@gmx.de>
Cc: Namhyung Kim <namhyung@kernel.org>
Cc: Paul Mackerras <paulus@samba.org>
Cc: Peter Zijlstra <peterz@infradead.org>
Cc: Stephane Eranian <eranian@google.com>
Link: http://lkml.kernel.org/n/tip-xexmwg1mv7u03j5imn66jdak@git.kernel.org
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
2014-07-01 18:07:54 +04:00
if ( browser - > top_idx < browser - > rows )
2012-05-30 05:42:18 +04:00
offset = browser - > top_idx ;
2010-08-07 00:35:02 +04:00
else
perf ui browser: Add ->rows to disambiguate from ->height
The ui_browser->height is about the whole browser "window", including
any header, status lines or any other space needed for some "Yes", "No",
etc buttons a descendent browser, like hist_browser, may have.
Since the navigation is done mostly on the ui_browser methods, it needs
to know how many rows are on the screen, while details about what other
components are, say, if a header (that may be composed of multiple
lines, etc) is present.
Besides this we'll need to add a ui_browser->refresh_dimensions() hook
so that browsers like hist_browser can update ->rows in response to
screen resizes, this will come in a follow up patch.
This patch just adds ->rows and updates it when updating ->height, keeps
using ->height for the only other widget that can come with ui_browser,
the scrollbar, that goes on using all the height on the rightmost column
in the screen, using ->rows for the keyboard navigation needs.
Cc: Adrian Hunter <adrian.hunter@intel.com>
Cc: David Ahern <dsahern@gmail.com>
Cc: Don Zickus <dzickus@redhat.com>
Cc: Frederic Weisbecker <fweisbec@gmail.com>
Cc: Jiri Olsa <jolsa@redhat.com>
Cc: Mike Galbraith <efault@gmx.de>
Cc: Namhyung Kim <namhyung@kernel.org>
Cc: Paul Mackerras <paulus@samba.org>
Cc: Peter Zijlstra <peterz@infradead.org>
Cc: Stephane Eranian <eranian@google.com>
Link: http://lkml.kernel.org/n/tip-xexmwg1mv7u03j5imn66jdak@git.kernel.org
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
2014-07-01 18:07:54 +04:00
offset = browser - > rows ;
2010-08-07 00:35:02 +04:00
2012-05-30 05:42:18 +04:00
browser - > index - = offset ;
browser - > top_idx - = offset ;
browser - > seek ( browser , - offset , SEEK_CUR ) ;
2010-08-07 00:35:02 +04:00
break ;
2011-10-20 22:59:15 +04:00
case K_HOME :
2012-05-30 05:42:18 +04:00
ui_browser__reset_index ( browser ) ;
2010-08-07 00:35:02 +04:00
break ;
2011-10-20 22:59:15 +04:00
case K_END :
perf ui browser: Add ->rows to disambiguate from ->height
The ui_browser->height is about the whole browser "window", including
any header, status lines or any other space needed for some "Yes", "No",
etc buttons a descendent browser, like hist_browser, may have.
Since the navigation is done mostly on the ui_browser methods, it needs
to know how many rows are on the screen, while details about what other
components are, say, if a header (that may be composed of multiple
lines, etc) is present.
Besides this we'll need to add a ui_browser->refresh_dimensions() hook
so that browsers like hist_browser can update ->rows in response to
screen resizes, this will come in a follow up patch.
This patch just adds ->rows and updates it when updating ->height, keeps
using ->height for the only other widget that can come with ui_browser,
the scrollbar, that goes on using all the height on the rightmost column
in the screen, using ->rows for the keyboard navigation needs.
Cc: Adrian Hunter <adrian.hunter@intel.com>
Cc: David Ahern <dsahern@gmail.com>
Cc: Don Zickus <dzickus@redhat.com>
Cc: Frederic Weisbecker <fweisbec@gmail.com>
Cc: Jiri Olsa <jolsa@redhat.com>
Cc: Mike Galbraith <efault@gmx.de>
Cc: Namhyung Kim <namhyung@kernel.org>
Cc: Paul Mackerras <paulus@samba.org>
Cc: Peter Zijlstra <peterz@infradead.org>
Cc: Stephane Eranian <eranian@google.com>
Link: http://lkml.kernel.org/n/tip-xexmwg1mv7u03j5imn66jdak@git.kernel.org
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
2014-07-01 18:07:54 +04:00
offset = browser - > rows - 1 ;
2012-05-30 05:42:18 +04:00
if ( offset > = browser - > nr_entries )
offset = browser - > nr_entries - 1 ;
2010-08-07 00:35:02 +04:00
2012-05-30 05:42:18 +04:00
browser - > index = browser - > nr_entries - 1 ;
browser - > top_idx = browser - > index - offset ;
browser - > seek ( browser , - offset , SEEK_END ) ;
2010-08-07 00:35:02 +04:00
break ;
default :
2011-10-13 15:52:46 +04:00
return key ;
2010-08-07 00:35:02 +04:00
}
}
2010-08-11 17:07:43 +04:00
return - 1 ;
2010-08-07 00:35:02 +04:00
}
2012-05-30 05:42:18 +04:00
unsigned int ui_browser__list_head_refresh ( struct ui_browser * browser )
2010-08-07 00:35:02 +04:00
{
struct list_head * pos ;
2012-05-30 05:42:18 +04:00
struct list_head * head = browser - > entries ;
2010-08-07 00:35:02 +04:00
int row = 0 ;
2012-05-30 05:42:18 +04:00
if ( browser - > top = = NULL | | browser - > top = = browser - > entries )
browser - > top = ui_browser__list_head_filter_entries ( browser , head - > next ) ;
2010-08-07 00:35:02 +04:00
2012-05-30 05:42:18 +04:00
pos = browser - > top ;
2010-08-07 00:35:02 +04:00
list_for_each_from ( pos , head ) {
2012-05-30 05:42:18 +04:00
if ( ! browser - > filter | | ! browser - > filter ( browser , pos ) ) {
ui_browser__gotorc ( browser , row , 0 ) ;
browser - > write ( browser , pos , row ) ;
perf ui browser: Add ->rows to disambiguate from ->height
The ui_browser->height is about the whole browser "window", including
any header, status lines or any other space needed for some "Yes", "No",
etc buttons a descendent browser, like hist_browser, may have.
Since the navigation is done mostly on the ui_browser methods, it needs
to know how many rows are on the screen, while details about what other
components are, say, if a header (that may be composed of multiple
lines, etc) is present.
Besides this we'll need to add a ui_browser->refresh_dimensions() hook
so that browsers like hist_browser can update ->rows in response to
screen resizes, this will come in a follow up patch.
This patch just adds ->rows and updates it when updating ->height, keeps
using ->height for the only other widget that can come with ui_browser,
the scrollbar, that goes on using all the height on the rightmost column
in the screen, using ->rows for the keyboard navigation needs.
Cc: Adrian Hunter <adrian.hunter@intel.com>
Cc: David Ahern <dsahern@gmail.com>
Cc: Don Zickus <dzickus@redhat.com>
Cc: Frederic Weisbecker <fweisbec@gmail.com>
Cc: Jiri Olsa <jolsa@redhat.com>
Cc: Mike Galbraith <efault@gmx.de>
Cc: Namhyung Kim <namhyung@kernel.org>
Cc: Paul Mackerras <paulus@samba.org>
Cc: Peter Zijlstra <peterz@infradead.org>
Cc: Stephane Eranian <eranian@google.com>
Link: http://lkml.kernel.org/n/tip-xexmwg1mv7u03j5imn66jdak@git.kernel.org
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
2014-07-01 18:07:54 +04:00
if ( + + row = = browser - > rows )
2011-10-14 19:27:54 +04:00
break ;
}
2010-08-07 00:35:02 +04:00
}
return row ;
}
2013-01-18 23:55:52 +04:00
static struct ui_browser_colorset {
2011-10-18 21:50:51 +04:00
const char * name , * fg , * bg ;
int colorset ;
} ui_browser__colorsets [ ] = {
{
. colorset = HE_COLORSET_TOP ,
. name = " top " ,
. fg = " red " ,
2011-10-19 06:30:32 +04:00
. bg = " default " ,
2011-10-18 21:50:51 +04:00
} ,
{
. colorset = HE_COLORSET_MEDIUM ,
. name = " medium " ,
. fg = " green " ,
2011-10-19 06:30:32 +04:00
. bg = " default " ,
2011-10-18 21:50:51 +04:00
} ,
{
. colorset = HE_COLORSET_NORMAL ,
. name = " normal " ,
2011-10-19 06:30:32 +04:00
. fg = " default " ,
. bg = " default " ,
2011-10-18 21:50:51 +04:00
} ,
{
. colorset = HE_COLORSET_SELECTED ,
. name = " selected " ,
. fg = " black " ,
. bg = " lightgray " ,
} ,
{
. colorset = HE_COLORSET_CODE ,
. name = " code " ,
. fg = " blue " ,
2011-10-19 06:30:32 +04:00
. bg = " default " ,
2011-10-18 21:50:51 +04:00
} ,
2012-04-02 19:59:01 +04:00
{
. colorset = HE_COLORSET_ADDR ,
. name = " addr " ,
. fg = " magenta " ,
. bg = " default " ,
} ,
2013-03-28 18:34:10 +04:00
{
. colorset = HE_COLORSET_ROOT ,
. name = " root " ,
. fg = " white " ,
. bg = " blue " ,
} ,
2011-10-18 21:50:51 +04:00
{
. name = NULL ,
}
2010-08-07 00:35:02 +04:00
} ;
2011-10-18 21:50:51 +04:00
static int ui_browser__color_config ( const char * var , const char * value ,
2012-09-11 02:15:03 +04:00
void * data __maybe_unused )
2011-10-18 21:50:51 +04:00
{
char * fg = NULL , * bg ;
int i ;
/* same dir for all commands */
if ( prefixcmp ( var , " colors. " ) ! = 0 )
return 0 ;
for ( i = 0 ; ui_browser__colorsets [ i ] . name ! = NULL ; + + i ) {
const char * name = var + 7 ;
if ( strcmp ( ui_browser__colorsets [ i ] . name , name ) ! = 0 )
continue ;
fg = strdup ( value ) ;
if ( fg = = NULL )
break ;
bg = strchr ( fg , ' , ' ) ;
if ( bg = = NULL )
break ;
* bg = ' \0 ' ;
while ( isspace ( * + + bg ) ) ;
ui_browser__colorsets [ i ] . bg = bg ;
ui_browser__colorsets [ i ] . fg = fg ;
return 0 ;
}
free ( fg ) ;
return - 1 ;
}
2011-10-26 13:11:03 +04:00
void ui_browser__argv_seek ( struct ui_browser * browser , off_t offset , int whence )
{
switch ( whence ) {
case SEEK_SET :
browser - > top = browser - > entries ;
break ;
case SEEK_CUR :
browser - > top = browser - > top + browser - > top_idx + offset ;
break ;
case SEEK_END :
2013-11-14 22:30:41 +04:00
browser - > top = browser - > top + browser - > nr_entries - 1 + offset ;
2011-10-26 13:11:03 +04:00
break ;
default :
return ;
}
}
unsigned int ui_browser__argv_refresh ( struct ui_browser * browser )
{
unsigned int row = 0 , idx = browser - > top_idx ;
char * * pos ;
if ( browser - > top = = NULL )
browser - > top = browser - > entries ;
pos = ( char * * ) browser - > top ;
while ( idx < browser - > nr_entries ) {
if ( ! browser - > filter | | ! browser - > filter ( browser , * pos ) ) {
ui_browser__gotorc ( browser , row , 0 ) ;
browser - > write ( browser , pos , row ) ;
perf ui browser: Add ->rows to disambiguate from ->height
The ui_browser->height is about the whole browser "window", including
any header, status lines or any other space needed for some "Yes", "No",
etc buttons a descendent browser, like hist_browser, may have.
Since the navigation is done mostly on the ui_browser methods, it needs
to know how many rows are on the screen, while details about what other
components are, say, if a header (that may be composed of multiple
lines, etc) is present.
Besides this we'll need to add a ui_browser->refresh_dimensions() hook
so that browsers like hist_browser can update ->rows in response to
screen resizes, this will come in a follow up patch.
This patch just adds ->rows and updates it when updating ->height, keeps
using ->height for the only other widget that can come with ui_browser,
the scrollbar, that goes on using all the height on the rightmost column
in the screen, using ->rows for the keyboard navigation needs.
Cc: Adrian Hunter <adrian.hunter@intel.com>
Cc: David Ahern <dsahern@gmail.com>
Cc: Don Zickus <dzickus@redhat.com>
Cc: Frederic Weisbecker <fweisbec@gmail.com>
Cc: Jiri Olsa <jolsa@redhat.com>
Cc: Mike Galbraith <efault@gmx.de>
Cc: Namhyung Kim <namhyung@kernel.org>
Cc: Paul Mackerras <paulus@samba.org>
Cc: Peter Zijlstra <peterz@infradead.org>
Cc: Stephane Eranian <eranian@google.com>
Link: http://lkml.kernel.org/n/tip-xexmwg1mv7u03j5imn66jdak@git.kernel.org
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
2014-07-01 18:07:54 +04:00
if ( + + row = = browser - > rows )
2011-10-26 13:11:03 +04:00
break ;
}
+ + idx ;
+ + pos ;
}
return row ;
}
2012-05-03 20:07:05 +04:00
void __ui_browser__vline ( struct ui_browser * browser , unsigned int column ,
u16 start , u16 end )
{
SLsmg_set_char_set ( 1 ) ;
ui_browser__gotorc ( browser , start , column ) ;
SLsmg_draw_vline ( end - start + 1 ) ;
SLsmg_set_char_set ( 0 ) ;
}
2012-09-11 02:15:03 +04:00
void ui_browser__write_graph ( struct ui_browser * browser __maybe_unused ,
int graph )
2012-04-20 23:26:14 +04:00
{
SLsmg_set_char_set ( 1 ) ;
SLsmg_write_char ( graph ) ;
SLsmg_set_char_set ( 0 ) ;
}
2012-04-27 23:27:52 +04:00
static void __ui_browser__line_arrow_up ( struct ui_browser * browser ,
unsigned int column ,
2012-05-03 20:12:49 +04:00
u64 start , u64 end )
2012-04-24 21:24:28 +04:00
{
unsigned int row , end_row ;
SLsmg_set_char_set ( 1 ) ;
perf ui browser: Add ->rows to disambiguate from ->height
The ui_browser->height is about the whole browser "window", including
any header, status lines or any other space needed for some "Yes", "No",
etc buttons a descendent browser, like hist_browser, may have.
Since the navigation is done mostly on the ui_browser methods, it needs
to know how many rows are on the screen, while details about what other
components are, say, if a header (that may be composed of multiple
lines, etc) is present.
Besides this we'll need to add a ui_browser->refresh_dimensions() hook
so that browsers like hist_browser can update ->rows in response to
screen resizes, this will come in a follow up patch.
This patch just adds ->rows and updates it when updating ->height, keeps
using ->height for the only other widget that can come with ui_browser,
the scrollbar, that goes on using all the height on the rightmost column
in the screen, using ->rows for the keyboard navigation needs.
Cc: Adrian Hunter <adrian.hunter@intel.com>
Cc: David Ahern <dsahern@gmail.com>
Cc: Don Zickus <dzickus@redhat.com>
Cc: Frederic Weisbecker <fweisbec@gmail.com>
Cc: Jiri Olsa <jolsa@redhat.com>
Cc: Mike Galbraith <efault@gmx.de>
Cc: Namhyung Kim <namhyung@kernel.org>
Cc: Paul Mackerras <paulus@samba.org>
Cc: Peter Zijlstra <peterz@infradead.org>
Cc: Stephane Eranian <eranian@google.com>
Link: http://lkml.kernel.org/n/tip-xexmwg1mv7u03j5imn66jdak@git.kernel.org
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
2014-07-01 18:07:54 +04:00
if ( start < browser - > top_idx + browser - > rows ) {
2012-04-24 21:24:28 +04:00
row = start - browser - > top_idx ;
ui_browser__gotorc ( browser , row , column ) ;
SLsmg_write_char ( SLSMG_LLCORN_CHAR ) ;
ui_browser__gotorc ( browser , row , column + 1 ) ;
2012-05-03 20:12:49 +04:00
SLsmg_draw_hline ( 2 ) ;
2012-04-24 21:24:28 +04:00
if ( row - - = = 0 )
goto out ;
} else
perf ui browser: Add ->rows to disambiguate from ->height
The ui_browser->height is about the whole browser "window", including
any header, status lines or any other space needed for some "Yes", "No",
etc buttons a descendent browser, like hist_browser, may have.
Since the navigation is done mostly on the ui_browser methods, it needs
to know how many rows are on the screen, while details about what other
components are, say, if a header (that may be composed of multiple
lines, etc) is present.
Besides this we'll need to add a ui_browser->refresh_dimensions() hook
so that browsers like hist_browser can update ->rows in response to
screen resizes, this will come in a follow up patch.
This patch just adds ->rows and updates it when updating ->height, keeps
using ->height for the only other widget that can come with ui_browser,
the scrollbar, that goes on using all the height on the rightmost column
in the screen, using ->rows for the keyboard navigation needs.
Cc: Adrian Hunter <adrian.hunter@intel.com>
Cc: David Ahern <dsahern@gmail.com>
Cc: Don Zickus <dzickus@redhat.com>
Cc: Frederic Weisbecker <fweisbec@gmail.com>
Cc: Jiri Olsa <jolsa@redhat.com>
Cc: Mike Galbraith <efault@gmx.de>
Cc: Namhyung Kim <namhyung@kernel.org>
Cc: Paul Mackerras <paulus@samba.org>
Cc: Peter Zijlstra <peterz@infradead.org>
Cc: Stephane Eranian <eranian@google.com>
Link: http://lkml.kernel.org/n/tip-xexmwg1mv7u03j5imn66jdak@git.kernel.org
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
2014-07-01 18:07:54 +04:00
row = browser - > rows - 1 ;
2012-04-24 21:24:28 +04:00
if ( end > browser - > top_idx )
end_row = end - browser - > top_idx ;
else
end_row = 0 ;
ui_browser__gotorc ( browser , end_row , column ) ;
SLsmg_draw_vline ( row - end_row + 1 ) ;
ui_browser__gotorc ( browser , end_row , column ) ;
if ( end > = browser - > top_idx ) {
SLsmg_write_char ( SLSMG_ULCORN_CHAR ) ;
ui_browser__gotorc ( browser , end_row , column + 1 ) ;
SLsmg_write_char ( SLSMG_HLINE_CHAR ) ;
ui_browser__gotorc ( browser , end_row , column + 2 ) ;
SLsmg_write_char ( SLSMG_RARROW_CHAR ) ;
}
out :
SLsmg_set_char_set ( 0 ) ;
}
2012-04-27 23:27:52 +04:00
static void __ui_browser__line_arrow_down ( struct ui_browser * browser ,
unsigned int column ,
2012-05-03 20:12:49 +04:00
u64 start , u64 end )
2012-04-27 23:27:52 +04:00
{
unsigned int row , end_row ;
SLsmg_set_char_set ( 1 ) ;
if ( start > = browser - > top_idx ) {
row = start - browser - > top_idx ;
ui_browser__gotorc ( browser , row , column ) ;
SLsmg_write_char ( SLSMG_ULCORN_CHAR ) ;
ui_browser__gotorc ( browser , row , column + 1 ) ;
2012-05-03 20:12:49 +04:00
SLsmg_draw_hline ( 2 ) ;
2012-04-27 23:27:52 +04:00
if ( row + + = = 0 )
goto out ;
} else
row = 0 ;
perf ui browser: Add ->rows to disambiguate from ->height
The ui_browser->height is about the whole browser "window", including
any header, status lines or any other space needed for some "Yes", "No",
etc buttons a descendent browser, like hist_browser, may have.
Since the navigation is done mostly on the ui_browser methods, it needs
to know how many rows are on the screen, while details about what other
components are, say, if a header (that may be composed of multiple
lines, etc) is present.
Besides this we'll need to add a ui_browser->refresh_dimensions() hook
so that browsers like hist_browser can update ->rows in response to
screen resizes, this will come in a follow up patch.
This patch just adds ->rows and updates it when updating ->height, keeps
using ->height for the only other widget that can come with ui_browser,
the scrollbar, that goes on using all the height on the rightmost column
in the screen, using ->rows for the keyboard navigation needs.
Cc: Adrian Hunter <adrian.hunter@intel.com>
Cc: David Ahern <dsahern@gmail.com>
Cc: Don Zickus <dzickus@redhat.com>
Cc: Frederic Weisbecker <fweisbec@gmail.com>
Cc: Jiri Olsa <jolsa@redhat.com>
Cc: Mike Galbraith <efault@gmx.de>
Cc: Namhyung Kim <namhyung@kernel.org>
Cc: Paul Mackerras <paulus@samba.org>
Cc: Peter Zijlstra <peterz@infradead.org>
Cc: Stephane Eranian <eranian@google.com>
Link: http://lkml.kernel.org/n/tip-xexmwg1mv7u03j5imn66jdak@git.kernel.org
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
2014-07-01 18:07:54 +04:00
if ( end > = browser - > top_idx + browser - > rows )
end_row = browser - > rows - 1 ;
2012-04-27 23:27:52 +04:00
else
2013-11-13 10:24:24 +04:00
end_row = end - browser - > top_idx ;
2012-04-27 23:27:52 +04:00
ui_browser__gotorc ( browser , row , column ) ;
SLsmg_draw_vline ( end_row - row + 1 ) ;
ui_browser__gotorc ( browser , end_row , column ) ;
perf ui browser: Add ->rows to disambiguate from ->height
The ui_browser->height is about the whole browser "window", including
any header, status lines or any other space needed for some "Yes", "No",
etc buttons a descendent browser, like hist_browser, may have.
Since the navigation is done mostly on the ui_browser methods, it needs
to know how many rows are on the screen, while details about what other
components are, say, if a header (that may be composed of multiple
lines, etc) is present.
Besides this we'll need to add a ui_browser->refresh_dimensions() hook
so that browsers like hist_browser can update ->rows in response to
screen resizes, this will come in a follow up patch.
This patch just adds ->rows and updates it when updating ->height, keeps
using ->height for the only other widget that can come with ui_browser,
the scrollbar, that goes on using all the height on the rightmost column
in the screen, using ->rows for the keyboard navigation needs.
Cc: Adrian Hunter <adrian.hunter@intel.com>
Cc: David Ahern <dsahern@gmail.com>
Cc: Don Zickus <dzickus@redhat.com>
Cc: Frederic Weisbecker <fweisbec@gmail.com>
Cc: Jiri Olsa <jolsa@redhat.com>
Cc: Mike Galbraith <efault@gmx.de>
Cc: Namhyung Kim <namhyung@kernel.org>
Cc: Paul Mackerras <paulus@samba.org>
Cc: Peter Zijlstra <peterz@infradead.org>
Cc: Stephane Eranian <eranian@google.com>
Link: http://lkml.kernel.org/n/tip-xexmwg1mv7u03j5imn66jdak@git.kernel.org
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
2014-07-01 18:07:54 +04:00
if ( end < browser - > top_idx + browser - > rows ) {
2012-04-27 23:27:52 +04:00
SLsmg_write_char ( SLSMG_LLCORN_CHAR ) ;
ui_browser__gotorc ( browser , end_row , column + 1 ) ;
SLsmg_write_char ( SLSMG_HLINE_CHAR ) ;
ui_browser__gotorc ( browser , end_row , column + 2 ) ;
SLsmg_write_char ( SLSMG_RARROW_CHAR ) ;
}
out :
SLsmg_set_char_set ( 0 ) ;
}
void __ui_browser__line_arrow ( struct ui_browser * browser , unsigned int column ,
2012-05-03 20:12:49 +04:00
u64 start , u64 end )
2012-04-27 23:27:52 +04:00
{
if ( start > end )
2012-05-03 20:12:49 +04:00
__ui_browser__line_arrow_up ( browser , column , start , end ) ;
2012-04-27 23:27:52 +04:00
else
2012-05-03 20:12:49 +04:00
__ui_browser__line_arrow_down ( browser , column , start , end ) ;
2012-04-27 23:27:52 +04:00
}
2010-08-07 00:35:02 +04:00
void ui_browser__init ( void )
{
2011-10-18 21:50:51 +04:00
int i = 0 ;
2010-08-07 00:35:02 +04:00
2011-10-18 21:50:51 +04:00
perf_config ( ui_browser__color_config , NULL ) ;
while ( ui_browser__colorsets [ i ] . name ) {
2013-01-18 23:55:52 +04:00
struct ui_browser_colorset * c = & ui_browser__colorsets [ i + + ] ;
2011-10-18 21:50:51 +04:00
sltt_set_color ( c - > colorset , c - > name , c - > fg , c - > bg ) ;
}
2012-05-30 05:06:30 +04:00
annotate_browser__init ( ) ;
2010-08-07 00:35:02 +04:00
}