]> glassweightruler.freedombox.rocks Git - Ventoy.git/blob - LinuxGUI/Ventoy2Disk/main_gtk.c
update
[Ventoy.git] / LinuxGUI / Ventoy2Disk / main_gtk.c
1
2 #include <gtk/gtk.h>
3 #include <stdio.h>
4 #include <stdlib.h>
5 #include <stdint.h>
6 #include <string.h>
7 #include <stdarg.h>
8 #include <errno.h>
9 #include <time.h>
10 #include <unistd.h>
11 #include <sys/types.h>
12 #include <sys/stat.h>
13 #include <linux/limits.h>
14 #include <ventoy_define.h>
15 #include <ventoy_util.h>
16 #include "ventoy_gtk.h"
17
18 static int g_kiosk_mode = 0;
19 char g_log_file[PATH_MAX];
20 char g_ini_file[PATH_MAX];
21
22 static int set_image_from_pixbuf(GtkBuilder *pBuilder, const char *id, const void *pData, int len)
23 {
24 GtkImage *pImage = NULL;
25 GdkPixbuf *pPixbuf = NULL;
26 GInputStream *pStream = NULL;
27
28 pImage = (GtkImage *)gtk_builder_get_object(pBuilder, id);
29 pStream = g_memory_input_stream_new_from_data(pData, len, NULL);
30 pPixbuf = gdk_pixbuf_new_from_stream(pStream, NULL, NULL);
31 gtk_image_set_from_pixbuf(pImage, pPixbuf);
32
33 return 0;
34 }
35
36 static int set_window_icon_from_pixbuf(GtkWindow *window, const void *pData, int len)
37 {
38 GdkPixbuf *pPixbuf = NULL;
39 GInputStream *pStream = NULL;
40
41 pStream = g_memory_input_stream_new_from_data(pData, len, NULL);
42 pPixbuf = gdk_pixbuf_new_from_stream(pStream, NULL, NULL);
43
44 gtk_window_set_icon(window, pPixbuf);
45 return 0;
46 }
47
48 int early_msgbox(GtkMessageType type, GtkButtonsType buttons, const char *str)
49 {
50 int ret;
51 GtkWidget *pMsgBox = NULL;
52
53 pMsgBox= gtk_message_dialog_new(NULL, GTK_DIALOG_MODAL, type, buttons, str);
54
55 ret = gtk_dialog_run(GTK_DIALOG(pMsgBox));
56 gtk_widget_destroy(pMsgBox);
57
58 return ret;
59 }
60
61 static int adjust_cur_dir(char *argv0)
62 {
63 int ret = 2;
64 char c;
65 char *pos = NULL;
66 char *end = NULL;
67
68 if (argv0[0] == '.')
69 {
70 return 1;
71 }
72
73 for (pos = argv0; pos && *pos; pos++)
74 {
75 if (*pos == '/')
76 {
77 end = pos;
78 }
79 }
80
81 if (end)
82 {
83 c = *end;
84 *end = 0;
85
86 pos = strstr(argv0, "/tool/");
87 if (pos)
88 {
89 *pos = 0;
90 }
91
92 ret = chdir(argv0);
93
94 *end = c;
95 if (pos)
96 {
97 *pos = '/';
98 }
99 }
100
101 return ret;
102 }
103
104 int main(int argc, char *argv[])
105 {
106 int i;
107 int len;
108 const void *pData = NULL;
109 GtkWidget *pWidget = NULL;
110 GtkBuilder *pBuilder = NULL;
111 GError *error = NULL;
112 struct stat logstat;
113
114 gtk_init(&argc, &argv);
115
116 if (geteuid() != 0)
117 {
118 early_msgbox(GTK_MESSAGE_ERROR, GTK_BUTTONS_CLOSE,
119 "Ventoy2Disk permission denied!\r\nPlease run with root privileges.");
120 return EACCES;
121 }
122
123 if (access("./boot/boot.img", F_OK) == -1)
124 {
125 adjust_cur_dir(argv[0]);
126 }
127
128 if (access("./boot/boot.img", F_OK) == -1)
129 {
130 early_msgbox(GTK_MESSAGE_ERROR, GTK_BUTTONS_CLOSE, "Please run under the correct directory.");
131 return 1;
132 }
133
134 for (i = 0; i < argc; i++)
135 {
136 if (argv[i] && strcmp(argv[i], "--kiosk") == 0)
137 {
138 g_kiosk_mode = 1;
139 break;
140 }
141 }
142
143 snprintf(g_log_file, sizeof(g_log_file), "log.txt");
144 snprintf(g_ini_file, sizeof(g_ini_file), "./Ventoy2Disk.ini");
145 for (i = 0; i < argc; i++)
146 {
147 if (argv[i] && argv[i + 1] && strcmp(argv[i], "-l") == 0)
148 {
149 snprintf(g_log_file, sizeof(g_log_file), "%s", argv[i + 1]);
150 }
151 else if (argv[i] && argv[i + 1] && strcmp(argv[i], "-i") == 0)
152 {
153 snprintf(g_ini_file, sizeof(g_ini_file), "%s", argv[i + 1]);
154 }
155 }
156
157 memset(&logstat, 0, sizeof(logstat));
158 if (0 == stat(g_log_file, &logstat))
159 {
160 if (logstat.st_size >= 4 * SIZE_1MB)
161 {
162 remove(g_log_file);
163 }
164 }
165
166 ventoy_log_init();
167
168 vlog("================================================\n");
169 vlog("===== Ventoy2Disk %s powered by GTK%d.x =====\n", ventoy_get_local_version(), GTK_MAJOR_VERSION);
170 vlog("================================================\n");
171 vlog("log file is <%s> lastsize:%lld\n", g_log_file, (long long)logstat.st_size);
172 vlog("ini file is <%s>\n", g_ini_file);
173
174 ventoy_disk_init();
175
176 ventoy_http_init();
177
178 pBuilder = gtk_builder_new();
179 if (!pBuilder)
180 {
181 vlog("failed to create builder\n");
182 return 1;
183 }
184
185 if (!gtk_builder_add_from_file(pBuilder, "./tool/VentoyGTK.glade", &error))
186 {
187 vlog("gtk_builder_add_from_file failed:%s\n", error->message);
188 g_clear_error(&error);
189 return 1;
190 }
191
192 if (g_kiosk_mode)
193 {
194 gtk_image_set_from_file((GtkImage *)gtk_builder_get_object(pBuilder, "image_refresh"), "/ventoy/refresh.png");
195 gtk_image_set_from_file((GtkImage *)gtk_builder_get_object(pBuilder, "image_secure_local"), "/ventoy/secure.png");
196 gtk_image_set_from_file((GtkImage *)gtk_builder_get_object(pBuilder, "image_secure_dev"), "/ventoy/secure.png");
197 }
198 else
199 {
200 pData = get_refresh_icon_raw_data(&len);
201 set_image_from_pixbuf(pBuilder, "image_refresh", pData, len);
202 pData = get_secure_icon_raw_data(&len);
203 set_image_from_pixbuf(pBuilder, "image_secure_local", pData, len);
204 set_image_from_pixbuf(pBuilder, "image_secure_dev", pData, len);
205 }
206
207 pWidget = GTK_WIDGET(gtk_builder_get_object(pBuilder, "window"));
208 gtk_widget_show_all(pWidget);
209
210 pData = get_window_icon_raw_data(&len);
211 set_window_icon_from_pixbuf(GTK_WINDOW(pWidget), pData, len);
212
213 on_init_window(pBuilder);
214 g_signal_connect(G_OBJECT(pWidget), "delete_event", G_CALLBACK(on_exit_window), NULL);
215 g_signal_connect(G_OBJECT(pWidget), "destroy", G_CALLBACK(gtk_main_quit), NULL);
216
217 gtk_main();
218
219 ventoy_disk_exit();
220 ventoy_http_exit();
221
222 g_object_unref (G_OBJECT(pBuilder));
223
224 vlog("######## Ventoy2Disk GTK %s exit ########\n", ventoy_get_local_version());
225
226 /* log exit must at the end */
227 ventoy_log_exit();
228 return 0;
229 }
230