^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1) // SPDX-License-Identifier: GPL-2.0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2) #include "../util.h"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3) #include "gtk.h"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5) #include <stdlib.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6) #include <string.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7) #include <linux/zalloc.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9) struct perf_gtk_context *pgctx;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11) struct perf_gtk_context *perf_gtk__activate_context(GtkWidget *window)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 12) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 13) struct perf_gtk_context *ctx;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 14)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 15) ctx = malloc(sizeof(*pgctx));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 16) if (ctx)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 17) ctx->main_window = window;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 18)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 19) return ctx;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 20) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 21)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 22) int perf_gtk__deactivate_context(struct perf_gtk_context **ctx)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 23) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 24) if (!perf_gtk__is_active_context(*ctx))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 25) return -1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 26)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 27) zfree(ctx);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 28) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 29) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 30)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 31) static int perf_gtk__error(const char *format, va_list args)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 32) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 33) char *msg;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 34) GtkWidget *dialog;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 35)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 36) if (!perf_gtk__is_active_context(pgctx) ||
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 37) vasprintf(&msg, format, args) < 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 38) fprintf(stderr, "Error:\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 39) vfprintf(stderr, format, args);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 40) fprintf(stderr, "\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 41) return -1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 42) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 43)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 44) dialog = gtk_message_dialog_new_with_markup(GTK_WINDOW(pgctx->main_window),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 45) GTK_DIALOG_DESTROY_WITH_PARENT,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 46) GTK_MESSAGE_ERROR,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 47) GTK_BUTTONS_CLOSE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 48) "<b>Error</b>\n\n%s", msg);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 49) gtk_dialog_run(GTK_DIALOG(dialog));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 50)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 51) gtk_widget_destroy(dialog);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 52) free(msg);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 53) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 54) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 55)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 56) #ifdef HAVE_GTK_INFO_BAR_SUPPORT
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 57) static int perf_gtk__warning_info_bar(const char *format, va_list args)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 58) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 59) char *msg;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 60)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 61) if (!perf_gtk__is_active_context(pgctx) ||
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 62) vasprintf(&msg, format, args) < 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 63) fprintf(stderr, "Warning:\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 64) vfprintf(stderr, format, args);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 65) fprintf(stderr, "\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 66) return -1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 67) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 68)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 69) gtk_label_set_text(GTK_LABEL(pgctx->message_label), msg);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 70) gtk_info_bar_set_message_type(GTK_INFO_BAR(pgctx->info_bar),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 71) GTK_MESSAGE_WARNING);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 72) gtk_widget_show(pgctx->info_bar);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 73)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 74) free(msg);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 75) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 76) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 77) #else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 78) static int perf_gtk__warning_statusbar(const char *format, va_list args)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 79) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 80) char *msg, *p;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 81)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 82) if (!perf_gtk__is_active_context(pgctx) ||
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 83) vasprintf(&msg, format, args) < 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 84) fprintf(stderr, "Warning:\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 85) vfprintf(stderr, format, args);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 86) fprintf(stderr, "\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 87) return -1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 88) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 89)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 90) gtk_statusbar_pop(GTK_STATUSBAR(pgctx->statbar),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 91) pgctx->statbar_ctx_id);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 92)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 93) /* Only first line can be displayed */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 94) p = strchr(msg, '\n');
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 95) if (p)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 96) *p = '\0';
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 97)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 98) gtk_statusbar_push(GTK_STATUSBAR(pgctx->statbar),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 99) pgctx->statbar_ctx_id, msg);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 100)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 101) free(msg);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 102) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 103) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 104) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 105)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 106) struct perf_error_ops perf_gtk_eops = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 107) .error = perf_gtk__error,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 108) #ifdef HAVE_GTK_INFO_BAR_SUPPORT
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 109) .warning = perf_gtk__warning_info_bar,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 110) #else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 111) .warning = perf_gtk__warning_statusbar,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 112) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 113) };