linux/tools/perf/ui/setup.c
<<
>>
Prefs
   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}
 122