Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
alexbevi
GitHub Repository: alexbevi/BizHawk
Path: blob/master/yabause/src/gtk/yuiviewer.c
2 views
1
/* Copyright 2006-2007 Guillaume Duhamel
2
Copyright 2005-2006 Fabien Coulon
3
4
This file is part of Yabause.
5
6
Yabause is free software; you can redistribute it and/or modify
7
it under the terms of the GNU General Public License as published by
8
the Free Software Foundation; either version 2 of the License, or
9
(at your option) any later version.
10
11
Yabause is distributed in the hope that it will be useful,
12
but WITHOUT ANY WARRANTY; without even the implied warranty of
13
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14
GNU General Public License for more details.
15
16
You should have received a copy of the GNU General Public License
17
along with Yabause; if not, write to the Free Software
18
Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
19
*/
20
21
#include "yuiviewer.h"
22
#include "gtkglwidget.h"
23
#include "../core.h"
24
25
static void yui_viewer_class_init (YuiViewerClass * klass);
26
static void yui_viewer_init (YuiViewer * yfe);
27
static void yui_viewer_expose (GtkWidget * widget, GdkEventExpose *event, gpointer data);
28
29
GType yui_viewer_get_type (void) {
30
static GType yfe_type = 0;
31
32
if (!yfe_type)
33
{
34
static const GTypeInfo yfe_info =
35
{
36
sizeof (YuiViewerClass),
37
NULL, /* base_init */
38
NULL, /* base_finalize */
39
(GClassInitFunc) yui_viewer_class_init,
40
NULL, /* class_finalize */
41
NULL, /* class_data */
42
sizeof (YuiViewer),
43
0,
44
(GInstanceInitFunc) yui_viewer_init,
45
NULL,
46
};
47
48
yfe_type = g_type_register_static(GTK_TYPE_DRAWING_AREA, "YuiViewer", &yfe_info, 0);
49
}
50
51
return yfe_type;
52
}
53
54
static void yui_viewer_class_init (UNUSED YuiViewerClass * klass) {
55
}
56
57
static gint
58
my_popup_handler (GtkWidget *widget, GdkEvent *event)
59
{
60
GtkMenu *menu;
61
GdkEventButton *event_button;
62
63
g_return_val_if_fail (widget != NULL, FALSE);
64
g_return_val_if_fail (GTK_IS_MENU (widget), FALSE);
65
g_return_val_if_fail (event != NULL, FALSE);
66
67
/* The "widget" is the menu that was supplied when
68
* * g_signal_connect_swapped() was called.
69
* */
70
menu = GTK_MENU (widget);
71
72
if (event->type == GDK_BUTTON_PRESS)
73
{
74
event_button = (GdkEventButton *) event;
75
if (event_button->button == 3)
76
{
77
gtk_menu_popup (menu, NULL, NULL, NULL, NULL,
78
event_button->button, event_button->time);
79
return TRUE;
80
}
81
}
82
83
return FALSE;
84
}
85
86
static void yui_viewer_init (YuiViewer * yv) {
87
GtkWidget * menu;
88
GtkWidget * item;
89
90
gtk_widget_set_events(GTK_WIDGET(yv), GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK);
91
92
menu = gtk_menu_new();
93
item = gtk_image_menu_item_new_from_stock(GTK_STOCK_SAVE, NULL);
94
95
gtk_menu_shell_append(GTK_MENU_SHELL(menu), item);
96
97
gtk_widget_show_all(menu);
98
99
g_signal_connect_swapped(yv, "button-press-event", G_CALLBACK(my_popup_handler), menu);
100
g_signal_connect(yv, "expose-event", G_CALLBACK(yui_viewer_expose), NULL);
101
g_signal_connect_swapped(item, "activate", G_CALLBACK(yui_viewer_save), yv);
102
103
yv->pixbuf = NULL;
104
}
105
106
GtkWidget * yui_viewer_new(void) {
107
GtkWidget * dialog;
108
109
dialog = GTK_WIDGET(g_object_new(yui_viewer_get_type(), NULL));
110
111
return dialog;
112
}
113
114
static void yui_viewer_expose(GtkWidget * widget, GdkEventExpose *event, gpointer data) {
115
YuiViewer * yv = YUI_VIEWER(widget);
116
117
if (yv->pixbuf != NULL) {
118
gdk_draw_pixbuf(widget->window, NULL, yv->pixbuf, 0, 0, 0, 0, yv->w, yv->h, GDK_RGB_DITHER_NONE, 0, 0);
119
}
120
}
121
122
void yui_viewer_save(YuiViewer * yv) {
123
GtkWidget * file_selector;
124
gint result;
125
char * filename;
126
int rowstride;
127
128
file_selector = gtk_file_chooser_dialog_new ("Please choose a file", NULL, GTK_FILE_CHOOSER_ACTION_SAVE,
129
GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL, GTK_STOCK_SAVE, GTK_RESPONSE_ACCEPT, NULL);
130
131
gtk_widget_show(file_selector);
132
133
result = gtk_dialog_run(GTK_DIALOG(file_selector));
134
135
switch(result) {
136
case GTK_RESPONSE_ACCEPT:
137
rowstride = yv->w * 4;
138
rowstride += (rowstride % 4)? (4 - (rowstride % 4)): 0;
139
filename = gtk_file_chooser_get_filename(GTK_FILE_CHOOSER(file_selector));
140
141
gdk_pixbuf_save(yv->pixbuf, filename, "png", NULL, NULL);
142
143
break;
144
case GTK_RESPONSE_CANCEL:
145
break;
146
}
147
148
gtk_widget_destroy(file_selector);
149
}
150
151
void yui_viewer_draw_pixbuf(YuiViewer * yv, GdkPixbuf * pixbuf, int w, int h) {
152
if (yv->pixbuf) {
153
g_object_unref(yv->pixbuf);
154
}
155
yv->pixbuf = g_object_ref(pixbuf);
156
yv->w = w;
157
yv->h = h;
158
gdk_window_clear(GTK_WIDGET(yv)->window);
159
gtk_widget_queue_draw_area(GTK_WIDGET(yv), 0, 0, w, h);
160
}
161
162
void yui_viewer_clear(YuiViewer * yv) {
163
if (GTK_WIDGET(yv)->window != NULL) {
164
gdk_window_clear(GTK_WIDGET(yv)->window);
165
}
166
}
167
168