0001
0002 #include <pthread.h>
0003 #include <dlfcn.h>
0004 #include <unistd.h>
0005
0006 #include <subcmd/pager.h>
0007 #include "../util/debug.h"
0008 #include "../util/hist.h"
0009 #include "ui.h"
0010
0011 pthread_mutex_t ui__lock = PTHREAD_MUTEX_INITIALIZER;
0012 void *perf_gtk_handle;
0013 int use_browser = -1;
0014
0015 #define PERF_GTK_DSO "libperf-gtk.so"
0016
0017 #ifdef HAVE_GTK2_SUPPORT
0018
0019 static int setup_gtk_browser(void)
0020 {
0021 int (*perf_ui_init)(void);
0022
0023 if (perf_gtk_handle)
0024 return 0;
0025
0026 perf_gtk_handle = dlopen(PERF_GTK_DSO, RTLD_LAZY);
0027 if (perf_gtk_handle == NULL) {
0028 char buf[PATH_MAX];
0029 scnprintf(buf, sizeof(buf), "%s/%s", LIBDIR, PERF_GTK_DSO);
0030 perf_gtk_handle = dlopen(buf, RTLD_LAZY);
0031 }
0032 if (perf_gtk_handle == NULL)
0033 return -1;
0034
0035 perf_ui_init = dlsym(perf_gtk_handle, "perf_gtk__init");
0036 if (perf_ui_init == NULL)
0037 goto out_close;
0038
0039 if (perf_ui_init() == 0)
0040 return 0;
0041
0042 out_close:
0043 dlclose(perf_gtk_handle);
0044 return -1;
0045 }
0046
0047 static void exit_gtk_browser(bool wait_for_ok)
0048 {
0049 void (*perf_ui_exit)(bool);
0050
0051 if (perf_gtk_handle == NULL)
0052 return;
0053
0054 perf_ui_exit = dlsym(perf_gtk_handle, "perf_gtk__exit");
0055 if (perf_ui_exit == NULL)
0056 goto out_close;
0057
0058 perf_ui_exit(wait_for_ok);
0059
0060 out_close:
0061 dlclose(perf_gtk_handle);
0062
0063 perf_gtk_handle = NULL;
0064 }
0065 #else
0066 static inline int setup_gtk_browser(void) { return -1; }
0067 static inline void exit_gtk_browser(bool wait_for_ok __maybe_unused) {}
0068 #endif
0069
0070 int stdio__config_color(const struct option *opt __maybe_unused,
0071 const char *mode, int unset __maybe_unused)
0072 {
0073 perf_use_color_default = perf_config_colorbool("color.ui", mode, -1);
0074 return 0;
0075 }
0076
0077 void setup_browser(bool fallback_to_pager)
0078 {
0079 if (use_browser < 2 && (!isatty(1) || dump_trace))
0080 use_browser = 0;
0081
0082
0083 if (use_browser < 0)
0084 use_browser = 1;
0085
0086 switch (use_browser) {
0087 case 2:
0088 if (setup_gtk_browser() == 0)
0089 break;
0090 printf("GTK browser requested but could not find %s\n",
0091 PERF_GTK_DSO);
0092 sleep(1);
0093 use_browser = 1;
0094
0095 case 1:
0096 if (ui__init() == 0)
0097 break;
0098
0099 default:
0100 use_browser = 0;
0101 if (fallback_to_pager)
0102 setup_pager();
0103 break;
0104 }
0105 }
0106
0107 void exit_browser(bool wait_for_ok)
0108 {
0109 switch (use_browser) {
0110 case 2:
0111 exit_gtk_browser(wait_for_ok);
0112 break;
0113
0114 case 1:
0115 ui__exit(wait_for_ok);
0116 break;
0117
0118 default:
0119 break;
0120 }
0121 }