18c2ecf20Sopenharmony_ci// SPDX-License-Identifier: GPL-2.0 28c2ecf20Sopenharmony_ci#include "../util.h" 38c2ecf20Sopenharmony_ci#include "gtk.h" 48c2ecf20Sopenharmony_ci 58c2ecf20Sopenharmony_ci#include <stdlib.h> 68c2ecf20Sopenharmony_ci#include <string.h> 78c2ecf20Sopenharmony_ci#include <linux/zalloc.h> 88c2ecf20Sopenharmony_ci 98c2ecf20Sopenharmony_cistruct perf_gtk_context *pgctx; 108c2ecf20Sopenharmony_ci 118c2ecf20Sopenharmony_cistruct perf_gtk_context *perf_gtk__activate_context(GtkWidget *window) 128c2ecf20Sopenharmony_ci{ 138c2ecf20Sopenharmony_ci struct perf_gtk_context *ctx; 148c2ecf20Sopenharmony_ci 158c2ecf20Sopenharmony_ci ctx = malloc(sizeof(*pgctx)); 168c2ecf20Sopenharmony_ci if (ctx) 178c2ecf20Sopenharmony_ci ctx->main_window = window; 188c2ecf20Sopenharmony_ci 198c2ecf20Sopenharmony_ci return ctx; 208c2ecf20Sopenharmony_ci} 218c2ecf20Sopenharmony_ci 228c2ecf20Sopenharmony_ciint perf_gtk__deactivate_context(struct perf_gtk_context **ctx) 238c2ecf20Sopenharmony_ci{ 248c2ecf20Sopenharmony_ci if (!perf_gtk__is_active_context(*ctx)) 258c2ecf20Sopenharmony_ci return -1; 268c2ecf20Sopenharmony_ci 278c2ecf20Sopenharmony_ci zfree(ctx); 288c2ecf20Sopenharmony_ci return 0; 298c2ecf20Sopenharmony_ci} 308c2ecf20Sopenharmony_ci 318c2ecf20Sopenharmony_cistatic int perf_gtk__error(const char *format, va_list args) 328c2ecf20Sopenharmony_ci{ 338c2ecf20Sopenharmony_ci char *msg; 348c2ecf20Sopenharmony_ci GtkWidget *dialog; 358c2ecf20Sopenharmony_ci 368c2ecf20Sopenharmony_ci if (!perf_gtk__is_active_context(pgctx) || 378c2ecf20Sopenharmony_ci vasprintf(&msg, format, args) < 0) { 388c2ecf20Sopenharmony_ci fprintf(stderr, "Error:\n"); 398c2ecf20Sopenharmony_ci vfprintf(stderr, format, args); 408c2ecf20Sopenharmony_ci fprintf(stderr, "\n"); 418c2ecf20Sopenharmony_ci return -1; 428c2ecf20Sopenharmony_ci } 438c2ecf20Sopenharmony_ci 448c2ecf20Sopenharmony_ci dialog = gtk_message_dialog_new_with_markup(GTK_WINDOW(pgctx->main_window), 458c2ecf20Sopenharmony_ci GTK_DIALOG_DESTROY_WITH_PARENT, 468c2ecf20Sopenharmony_ci GTK_MESSAGE_ERROR, 478c2ecf20Sopenharmony_ci GTK_BUTTONS_CLOSE, 488c2ecf20Sopenharmony_ci "<b>Error</b>\n\n%s", msg); 498c2ecf20Sopenharmony_ci gtk_dialog_run(GTK_DIALOG(dialog)); 508c2ecf20Sopenharmony_ci 518c2ecf20Sopenharmony_ci gtk_widget_destroy(dialog); 528c2ecf20Sopenharmony_ci free(msg); 538c2ecf20Sopenharmony_ci return 0; 548c2ecf20Sopenharmony_ci} 558c2ecf20Sopenharmony_ci 568c2ecf20Sopenharmony_ci#ifdef HAVE_GTK_INFO_BAR_SUPPORT 578c2ecf20Sopenharmony_cistatic int perf_gtk__warning_info_bar(const char *format, va_list args) 588c2ecf20Sopenharmony_ci{ 598c2ecf20Sopenharmony_ci char *msg; 608c2ecf20Sopenharmony_ci 618c2ecf20Sopenharmony_ci if (!perf_gtk__is_active_context(pgctx) || 628c2ecf20Sopenharmony_ci vasprintf(&msg, format, args) < 0) { 638c2ecf20Sopenharmony_ci fprintf(stderr, "Warning:\n"); 648c2ecf20Sopenharmony_ci vfprintf(stderr, format, args); 658c2ecf20Sopenharmony_ci fprintf(stderr, "\n"); 668c2ecf20Sopenharmony_ci return -1; 678c2ecf20Sopenharmony_ci } 688c2ecf20Sopenharmony_ci 698c2ecf20Sopenharmony_ci gtk_label_set_text(GTK_LABEL(pgctx->message_label), msg); 708c2ecf20Sopenharmony_ci gtk_info_bar_set_message_type(GTK_INFO_BAR(pgctx->info_bar), 718c2ecf20Sopenharmony_ci GTK_MESSAGE_WARNING); 728c2ecf20Sopenharmony_ci gtk_widget_show(pgctx->info_bar); 738c2ecf20Sopenharmony_ci 748c2ecf20Sopenharmony_ci free(msg); 758c2ecf20Sopenharmony_ci return 0; 768c2ecf20Sopenharmony_ci} 778c2ecf20Sopenharmony_ci#else 788c2ecf20Sopenharmony_cistatic int perf_gtk__warning_statusbar(const char *format, va_list args) 798c2ecf20Sopenharmony_ci{ 808c2ecf20Sopenharmony_ci char *msg, *p; 818c2ecf20Sopenharmony_ci 828c2ecf20Sopenharmony_ci if (!perf_gtk__is_active_context(pgctx) || 838c2ecf20Sopenharmony_ci vasprintf(&msg, format, args) < 0) { 848c2ecf20Sopenharmony_ci fprintf(stderr, "Warning:\n"); 858c2ecf20Sopenharmony_ci vfprintf(stderr, format, args); 868c2ecf20Sopenharmony_ci fprintf(stderr, "\n"); 878c2ecf20Sopenharmony_ci return -1; 888c2ecf20Sopenharmony_ci } 898c2ecf20Sopenharmony_ci 908c2ecf20Sopenharmony_ci gtk_statusbar_pop(GTK_STATUSBAR(pgctx->statbar), 918c2ecf20Sopenharmony_ci pgctx->statbar_ctx_id); 928c2ecf20Sopenharmony_ci 938c2ecf20Sopenharmony_ci /* Only first line can be displayed */ 948c2ecf20Sopenharmony_ci p = strchr(msg, '\n'); 958c2ecf20Sopenharmony_ci if (p) 968c2ecf20Sopenharmony_ci *p = '\0'; 978c2ecf20Sopenharmony_ci 988c2ecf20Sopenharmony_ci gtk_statusbar_push(GTK_STATUSBAR(pgctx->statbar), 998c2ecf20Sopenharmony_ci pgctx->statbar_ctx_id, msg); 1008c2ecf20Sopenharmony_ci 1018c2ecf20Sopenharmony_ci free(msg); 1028c2ecf20Sopenharmony_ci return 0; 1038c2ecf20Sopenharmony_ci} 1048c2ecf20Sopenharmony_ci#endif 1058c2ecf20Sopenharmony_ci 1068c2ecf20Sopenharmony_cistruct perf_error_ops perf_gtk_eops = { 1078c2ecf20Sopenharmony_ci .error = perf_gtk__error, 1088c2ecf20Sopenharmony_ci#ifdef HAVE_GTK_INFO_BAR_SUPPORT 1098c2ecf20Sopenharmony_ci .warning = perf_gtk__warning_info_bar, 1108c2ecf20Sopenharmony_ci#else 1118c2ecf20Sopenharmony_ci .warning = perf_gtk__warning_statusbar, 1128c2ecf20Sopenharmony_ci#endif 1138c2ecf20Sopenharmony_ci}; 114