10985a948SNamhyung Kim #include <pthread.h> 2fc67297bSNamhyung Kim #include <dlfcn.h> 30985a948SNamhyung Kim 4ea251d51SNamhyung Kim #include "../util/cache.h" 5ea251d51SNamhyung Kim #include "../util/debug.h" 6ea251d51SNamhyung Kim #include "../util/hist.h" 7aca7a94dSNamhyung Kim 80985a948SNamhyung Kim pthread_mutex_t ui__lock = PTHREAD_MUTEX_INITIALIZER; 9fc67297bSNamhyung Kim void *perf_gtk_handle; 10fc67297bSNamhyung Kim 11fc67297bSNamhyung Kim #ifdef HAVE_GTK2_SUPPORT 12fc67297bSNamhyung Kim static int setup_gtk_browser(void) 13fc67297bSNamhyung Kim { 14fc67297bSNamhyung Kim int (*perf_ui_init)(void); 15fc67297bSNamhyung Kim 16fc67297bSNamhyung Kim if (perf_gtk_handle) 17fc67297bSNamhyung Kim return 0; 18fc67297bSNamhyung Kim 19fc67297bSNamhyung Kim perf_gtk_handle = dlopen(PERF_GTK_DSO, RTLD_LAZY); 20fc67297bSNamhyung Kim if (perf_gtk_handle == NULL) { 21fc67297bSNamhyung Kim char buf[PATH_MAX]; 22fc67297bSNamhyung Kim scnprintf(buf, sizeof(buf), "%s/%s", LIBDIR, PERF_GTK_DSO); 23fc67297bSNamhyung Kim perf_gtk_handle = dlopen(buf, RTLD_LAZY); 24fc67297bSNamhyung Kim } 25fc67297bSNamhyung Kim if (perf_gtk_handle == NULL) 26fc67297bSNamhyung Kim return -1; 27fc67297bSNamhyung Kim 28fc67297bSNamhyung Kim perf_ui_init = dlsym(perf_gtk_handle, "perf_gtk__init"); 29fc67297bSNamhyung Kim if (perf_ui_init == NULL) 30fc67297bSNamhyung Kim goto out_close; 31fc67297bSNamhyung Kim 32fc67297bSNamhyung Kim if (perf_ui_init() == 0) 33fc67297bSNamhyung Kim return 0; 34fc67297bSNamhyung Kim 35fc67297bSNamhyung Kim out_close: 36fc67297bSNamhyung Kim dlclose(perf_gtk_handle); 37fc67297bSNamhyung Kim return -1; 38fc67297bSNamhyung Kim } 39fc67297bSNamhyung Kim 40fc67297bSNamhyung Kim static void exit_gtk_browser(bool wait_for_ok) 41fc67297bSNamhyung Kim { 42fc67297bSNamhyung Kim void (*perf_ui_exit)(bool); 43fc67297bSNamhyung Kim 44fc67297bSNamhyung Kim if (perf_gtk_handle == NULL) 45fc67297bSNamhyung Kim return; 46fc67297bSNamhyung Kim 47fc67297bSNamhyung Kim perf_ui_exit = dlsym(perf_gtk_handle, "perf_gtk__exit"); 48fc67297bSNamhyung Kim if (perf_ui_exit == NULL) 49fc67297bSNamhyung Kim goto out_close; 50fc67297bSNamhyung Kim 51fc67297bSNamhyung Kim perf_ui_exit(wait_for_ok); 52fc67297bSNamhyung Kim 53fc67297bSNamhyung Kim out_close: 54fc67297bSNamhyung Kim dlclose(perf_gtk_handle); 55fc67297bSNamhyung Kim 56fc67297bSNamhyung Kim perf_gtk_handle = NULL; 57fc67297bSNamhyung Kim } 58fc67297bSNamhyung Kim #else 59fc67297bSNamhyung Kim static inline int setup_gtk_browser(void) { return -1; } 60fc67297bSNamhyung Kim static inline void exit_gtk_browser(bool wait_for_ok __maybe_unused) {} 61fc67297bSNamhyung Kim #endif 620985a948SNamhyung Kim 63*c09615f2SArnaldo Carvalho de Melo int stdio__config_color(const struct option *opt __maybe_unused, 64*c09615f2SArnaldo Carvalho de Melo const char *mode, int unset __maybe_unused) 65*c09615f2SArnaldo Carvalho de Melo { 66*c09615f2SArnaldo Carvalho de Melo perf_use_color_default = perf_config_colorbool("color.ui", mode, -1); 67*c09615f2SArnaldo Carvalho de Melo return 0; 68*c09615f2SArnaldo Carvalho de Melo } 69*c09615f2SArnaldo Carvalho de Melo 70aca7a94dSNamhyung Kim void setup_browser(bool fallback_to_pager) 71aca7a94dSNamhyung Kim { 722b676bf0SNamhyung Kim if (use_browser < 2 && (!isatty(1) || dump_trace)) 73aca7a94dSNamhyung Kim use_browser = 0; 74281ef544SNamhyung Kim 75281ef544SNamhyung Kim /* default to TUI */ 76281ef544SNamhyung Kim if (use_browser < 0) 77281ef544SNamhyung Kim use_browser = 1; 78281ef544SNamhyung Kim 79281ef544SNamhyung Kim switch (use_browser) { 80281ef544SNamhyung Kim case 2: 81fc67297bSNamhyung Kim if (setup_gtk_browser() == 0) 82281ef544SNamhyung Kim break; 83fc67297bSNamhyung Kim printf("GTK browser requested but could not find %s\n", 84fc67297bSNamhyung Kim PERF_GTK_DSO); 85fc67297bSNamhyung Kim sleep(1); 86dc41b9b8SNamhyung Kim /* fall through */ 87281ef544SNamhyung Kim case 1: 88dc41b9b8SNamhyung Kim use_browser = 1; 89dc41b9b8SNamhyung Kim if (ui__init() == 0) 90281ef544SNamhyung Kim break; 91dc41b9b8SNamhyung Kim /* fall through */ 92281ef544SNamhyung Kim default: 9321f0d423SNamhyung Kim use_browser = 0; 94aca7a94dSNamhyung Kim if (fallback_to_pager) 95aca7a94dSNamhyung Kim setup_pager(); 96281ef544SNamhyung Kim break; 97aca7a94dSNamhyung Kim } 98aca7a94dSNamhyung Kim } 99aca7a94dSNamhyung Kim 100aca7a94dSNamhyung Kim void exit_browser(bool wait_for_ok) 101aca7a94dSNamhyung Kim { 102281ef544SNamhyung Kim switch (use_browser) { 103281ef544SNamhyung Kim case 2: 104fc67297bSNamhyung Kim exit_gtk_browser(wait_for_ok); 105281ef544SNamhyung Kim break; 106281ef544SNamhyung Kim 107281ef544SNamhyung Kim case 1: 108281ef544SNamhyung Kim ui__exit(wait_for_ok); 109281ef544SNamhyung Kim break; 110281ef544SNamhyung Kim 111281ef544SNamhyung Kim default: 112281ef544SNamhyung Kim break; 113aca7a94dSNamhyung Kim } 114aca7a94dSNamhyung Kim } 115