0001
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
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 };