Back to home page

OSCL-LXR

 
 

    


0001 // SPDX-License-Identifier: GPL-2.0
0002 #include "../util.h"
0003 #include "gtk.h"
0004 
0005 #include <stdlib.h>
0006 #include <string.h>
0007 #include <linux/zalloc.h>
0008 
0009 struct perf_gtk_context *pgctx;
0010 
0011 struct perf_gtk_context *perf_gtk__activate_context(GtkWidget *window)
0012 {
0013     struct perf_gtk_context *ctx;
0014 
0015     ctx = malloc(sizeof(*pgctx));
0016     if (ctx)
0017         ctx->main_window = window;
0018 
0019     return ctx;
0020 }
0021 
0022 int perf_gtk__deactivate_context(struct perf_gtk_context **ctx)
0023 {
0024     if (!perf_gtk__is_active_context(*ctx))
0025         return -1;
0026 
0027     zfree(ctx);
0028     return 0;
0029 }
0030 
0031 static int perf_gtk__error(const char *format, va_list args)
0032 {
0033     char *msg;
0034     GtkWidget *dialog;
0035 
0036     if (!perf_gtk__is_active_context(pgctx) ||
0037         vasprintf(&msg, format, args) < 0) {
0038         fprintf(stderr, "Error:\n");
0039         vfprintf(stderr, format, args);
0040         fprintf(stderr, "\n");
0041         return -1;
0042     }
0043 
0044     dialog = gtk_message_dialog_new_with_markup(GTK_WINDOW(pgctx->main_window),
0045                     GTK_DIALOG_DESTROY_WITH_PARENT,
0046                     GTK_MESSAGE_ERROR,
0047                     GTK_BUTTONS_CLOSE,
0048                     "<b>Error</b>\n\n%s", msg);
0049     gtk_dialog_run(GTK_DIALOG(dialog));
0050 
0051     gtk_widget_destroy(dialog);
0052     free(msg);
0053     return 0;
0054 }
0055 
0056 #ifdef HAVE_GTK_INFO_BAR_SUPPORT
0057 static int perf_gtk__warning_info_bar(const char *format, va_list args)
0058 {
0059     char *msg;
0060 
0061     if (!perf_gtk__is_active_context(pgctx) ||
0062         vasprintf(&msg, format, args) < 0) {
0063         fprintf(stderr, "Warning:\n");
0064         vfprintf(stderr, format, args);
0065         fprintf(stderr, "\n");
0066         return -1;
0067     }
0068 
0069     gtk_label_set_text(GTK_LABEL(pgctx->message_label), msg);
0070     gtk_info_bar_set_message_type(GTK_INFO_BAR(pgctx->info_bar),
0071                       GTK_MESSAGE_WARNING);
0072     gtk_widget_show(pgctx->info_bar);
0073 
0074     free(msg);
0075     return 0;
0076 }
0077 #else
0078 static int perf_gtk__warning_statusbar(const char *format, va_list args)
0079 {
0080     char *msg, *p;
0081 
0082     if (!perf_gtk__is_active_context(pgctx) ||
0083         vasprintf(&msg, format, args) < 0) {
0084         fprintf(stderr, "Warning:\n");
0085         vfprintf(stderr, format, args);
0086         fprintf(stderr, "\n");
0087         return -1;
0088     }
0089 
0090     gtk_statusbar_pop(GTK_STATUSBAR(pgctx->statbar),
0091               pgctx->statbar_ctx_id);
0092 
0093     /* Only first line can be displayed */
0094     p = strchr(msg, '\n');
0095     if (p)
0096         *p = '\0';
0097 
0098     gtk_statusbar_push(GTK_STATUSBAR(pgctx->statbar),
0099                pgctx->statbar_ctx_id, msg);
0100 
0101     free(msg);
0102     return 0;
0103 }
0104 #endif
0105 
0106 struct perf_error_ops perf_gtk_eops = {
0107     .error      = perf_gtk__error,
0108 #ifdef HAVE_GTK_INFO_BAR_SUPPORT
0109     .warning    = perf_gtk__warning_info_bar,
0110 #else
0111     .warning    = perf_gtk__warning_statusbar,
0112 #endif
0113 };