1 #include <pthread.h> 2 #include <dlfcn.h> 3 4 #include "../util/cache.h" 5 #include "../util/debug.h" 6 #include "../util/hist.h" 7 8 pthread_mutex_t ui__lock = PTHREAD_MUTEX_INITIALIZER; 9 void *perf_gtk_handle; 10 int use_browser = -1; 11 12 #ifdef HAVE_GTK2_SUPPORT 13 static int setup_gtk_browser(void) 14 { 15 int (*perf_ui_init)(void); 16 17 if (perf_gtk_handle) 18 return 0; 19 20 perf_gtk_handle = dlopen(PERF_GTK_DSO, RTLD_LAZY); 21 if (perf_gtk_handle == NULL) { 22 char buf[PATH_MAX]; 23 scnprintf(buf, sizeof(buf), "%s/%s", LIBDIR, PERF_GTK_DSO); 24 perf_gtk_handle = dlopen(buf, RTLD_LAZY); 25 } 26 if (perf_gtk_handle == NULL) 27 return -1; 28 29 perf_ui_init = dlsym(perf_gtk_handle, "perf_gtk__init"); 30 if (perf_ui_init == NULL) 31 goto out_close; 32 33 if (perf_ui_init() == 0) 34 return 0; 35 36 out_close: 37 dlclose(perf_gtk_handle); 38 return -1; 39 } 40 41 static void exit_gtk_browser(bool wait_for_ok) 42 { 43 void (*perf_ui_exit)(bool); 44 45 if (perf_gtk_handle == NULL) 46 return; 47 48 perf_ui_exit = dlsym(perf_gtk_handle, "perf_gtk__exit"); 49 if (perf_ui_exit == NULL) 50 goto out_close; 51 52 perf_ui_exit(wait_for_ok); 53 54 out_close: 55 dlclose(perf_gtk_handle); 56 57 perf_gtk_handle = NULL; 58 } 59 #else 60 static inline int setup_gtk_browser(void) { return -1; } 61 static inline void exit_gtk_browser(bool wait_for_ok __maybe_unused) {} 62 #endif 63 64 int stdio__config_color(const struct option *opt __maybe_unused, 65 const char *mode, int unset __maybe_unused) 66 { 67 perf_use_color_default = perf_config_colorbool("color.ui", mode, -1); 68 return 0; 69 } 70 71 void setup_browser(bool fallback_to_pager) 72 { 73 if (use_browser < 2 && (!isatty(1) || dump_trace)) 74 use_browser = 0; 75 76 /* default to TUI */ 77 if (use_browser < 0) 78 use_browser = 1; 79 80 switch (use_browser) { 81 case 2: 82 if (setup_gtk_browser() == 0) 83 break; 84 printf("GTK browser requested but could not find %s\n", 85 PERF_GTK_DSO); 86 sleep(1); 87 /* fall through */ 88 case 1: 89 use_browser = 1; 90 if (ui__init() == 0) 91 break; 92 /* fall through */ 93 default: 94 use_browser = 0; 95 if (fallback_to_pager) 96 setup_pager(); 97 break; 98 } 99 } 100 101 void exit_browser(bool wait_for_ok) 102 { 103 switch (use_browser) { 104 case 2: 105 exit_gtk_browser(wait_for_ok); 106 break; 107 108 case 1: 109 ui__exit(wait_for_ok); 110 break; 111 112 default: 113 break; 114 } 115 } 116