1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29 #include <stdio.h>
30 #include <stdlib.h>
31 #include <string.h>
32 #include <cx/map.h>
33
34 #include "toolkit.h"
35 #include "icon.h"
36 #include "../common/properties.h"
37
38 static CxMap *image_map;
39
40 static GtkIconTheme *icon_theme;
41
42 #if GTK_MAJOR_VERSION >=
4
43 #define ICONTHEME_GET_DEFAULT() gtk_icon_theme_get_for_display(gdk_display_get_default())
44 #else
45 #define ICONTHEME_GET_DEFAULT() gtk_icon_theme_get_default()
46 #endif
47
48 void ui_image_init(
void) {
49 image_map = cxHashMapCreateSimple(
CX_STORE_POINTERS);
50
51 icon_theme =
ICONTHEME_GET_DEFAULT();
52 }
53
54
55
56 GdkPixbuf* ui_get_image(
const char *name) {
57 UiImage *img = cxMapGet(image_map, name);
58 if(img) {
59 return img->pixbuf;
60 }
else {
61
62
63
64 return NULL;
65 }
66 }
67
68
69
70 static UiIcon* get_icon(
const char *name,
int size,
int scale) {
71 #if GTK_MAJOR_VERSION >=
4
72 GtkIconPaintable *info = gtk_icon_theme_lookup_icon(icon_theme, name,
NULL, size, scale,
GTK_TEXT_DIR_LTR,
GTK_ICON_LOOKUP_FORCE_REGULAR);
73 #elif defined(
UI_SUPPORTS_SCALE)
74 GtkIconInfo *info = gtk_icon_theme_lookup_icon_for_scale(icon_theme, name, size, scale,
0);
75 #else
76 GtkIconInfo *info = gtk_icon_theme_lookup_icon(icon_theme, name, size,
0);
77 #endif
78 if(info) {
79 UiIcon *icon = malloc(
sizeof(UiIcon));
80 icon->info = info;
81 icon->pixbuf =
NULL;
82 return icon;
83 }
84 return NULL;
85 }
86
87 UiIcon* ui_icon(
const char* name,
size_t size) {
88 return get_icon(name, size, ui_get_scalefactor());
89 }
90
91 UiIcon* ui_imageicon(
const char* file) {
92 GError *error =
NULL;
93 GdkPixbuf *pixbuf = gdk_pixbuf_new_from_file(file, &error);
94 if(!pixbuf) {
95 fprintf(stderr,
"UiError: Cannot load image: %s\n", file);
96 return NULL;
97 }
98
99 UiIcon *icon = malloc(
sizeof(UiIcon));
100 icon->info =
NULL;
101 icon->pixbuf = pixbuf;
102 return icon;
103 }
104
105 void ui_icon_free(UiIcon* icon) {
106 if(icon->info) {
107 g_object_unref(icon->info);
108 }
109 if(icon->pixbuf) {
110 g_object_unref(icon->pixbuf);
111 }
112 free(icon);
113 }
114
115 UiIcon* ui_foldericon(
size_t size) {
116 return ui_icon(
"folder", size);
117 }
118
119 UiIcon* ui_fileicon(
size_t size) {
120 UiIcon *icon = ui_icon(
"file", size);
121 #if GTK_MAJOR_VERSION >=
4
122 GFile *file = gtk_icon_paintable_get_file(icon->info);
123 char *path = g_file_get_path(file);
124 if(!path) {
125 icon = ui_icon(
"application-x-generic", size);
126 }
127 #else
128 if(!icon) {
129 icon = ui_icon(
"application-x-generic", size);
130 }
131 #endif
132 return icon;
133 }
134
135 UiIcon* ui_icon_unscaled(
const char *name,
int size) {
136 return get_icon(name, size,
1);
137 }
138
139 #if GTK_MAJOR_VERSION >=
4
140 GdkPixbuf* ui_icon_pixbuf(UiIcon *icon) {
141 if(!icon->pixbuf) {
142 GFile *file = gtk_icon_paintable_get_file(icon->info);
143 GError *error =
NULL;
144 char *path = g_file_get_path(file);
145 icon->pixbuf = gdk_pixbuf_new_from_file(path, &error);
146 }
147 return icon->pixbuf;
148 }
149 #else
150 GdkPixbuf* ui_icon_pixbuf(UiIcon *icon) {
151 if(!icon->pixbuf) {
152 GError *error =
NULL;
153 icon->pixbuf = gtk_icon_info_load_icon(icon->info, &error);
154 }
155 return icon->pixbuf;
156 }
157 #endif
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205 void ui_free_image(UiImage *img) {
206 g_object_unref(img->pixbuf);
207 free(img);
208 }
209