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