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