|
1 /* |
|
2 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER. |
|
3 * |
|
4 * Copyright 2017 Olaf Wintermann. All rights reserved. |
|
5 * |
|
6 * Redistribution and use in source and binary forms, with or without |
|
7 * modification, are permitted provided that the following conditions are met: |
|
8 * |
|
9 * 1. Redistributions of source code must retain the above copyright |
|
10 * notice, this list of conditions and the following disclaimer. |
|
11 * |
|
12 * 2. Redistributions in binary form must reproduce the above copyright |
|
13 * notice, this list of conditions and the following disclaimer in the |
|
14 * documentation and/or other materials provided with the distribution. |
|
15 * |
|
16 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" |
|
17 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE |
|
18 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE |
|
19 * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE |
|
20 * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR |
|
21 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF |
|
22 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS |
|
23 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN |
|
24 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) |
|
25 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE |
|
26 * POSSIBILITY OF SUCH DAMAGE. |
|
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 // **** deprecated functions **** |
|
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 //ui_add_image(name, name); |
|
62 //return ucx_map_cstr_get(image_map, name); |
|
63 // TODO |
|
64 return NULL; |
|
65 } |
|
66 } |
|
67 |
|
68 // **** deprecated2**** |
|
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 #endif |
|
128 return icon; |
|
129 } |
|
130 |
|
131 UiIcon* ui_icon_unscaled(const char *name, int size) { |
|
132 return get_icon(name, size, 1); |
|
133 } |
|
134 |
|
135 #if GTK_MAJOR_VERSION >= 4 |
|
136 GdkPixbuf* ui_icon_pixbuf(UiIcon *icon) { |
|
137 if(!icon->pixbuf) { |
|
138 GFile *file = gtk_icon_paintable_get_file(icon->info); |
|
139 GError *error = NULL; |
|
140 char *path = g_file_get_path(file); |
|
141 icon->pixbuf = gdk_pixbuf_new_from_file(path, &error); |
|
142 } |
|
143 return icon->pixbuf; |
|
144 } |
|
145 #else |
|
146 GdkPixbuf* ui_icon_pixbuf(UiIcon *icon) { |
|
147 if(!icon->pixbuf) { |
|
148 GError *error = NULL; |
|
149 icon->pixbuf = gtk_icon_info_load_icon(icon->info, &error); |
|
150 } |
|
151 return icon->pixbuf; |
|
152 } |
|
153 #endif |
|
154 |
|
155 /* |
|
156 UiImage* ui_icon_image(UiIcon *icon) { |
|
157 GError *error = NULL; |
|
158 GdkPixbuf *pixbuf = gtk_icon_info_load_icon(icon->info, &error); |
|
159 if(pixbuf) { |
|
160 UiImage *img = malloc(sizeof(UiImage)); |
|
161 img->pixbuf = pixbuf; |
|
162 return img; |
|
163 } |
|
164 return NULL; |
|
165 } |
|
166 */ |
|
167 |
|
168 /* |
|
169 UiImage* ui_image(const char *filename) { |
|
170 return ui_named_image(filename, NULL); |
|
171 } |
|
172 |
|
173 UiImage* ui_named_image(const char *filename, const char *name) { |
|
174 char *path = uic_get_image_path(filename); |
|
175 if(!path) { |
|
176 fprintf(stderr, "UiError: pixmaps directory not set\n"); |
|
177 return NULL; |
|
178 } |
|
179 UiImage *img = ui_load_image_from_path(path, name); |
|
180 free(path); |
|
181 return img; |
|
182 } |
|
183 |
|
184 UiImage* ui_load_image_from_path(const char *path, const char *name) { |
|
185 GError *error = NULL; |
|
186 GdkPixbuf *pixbuf = gdk_pixbuf_new_from_file(path, &error); |
|
187 if(!pixbuf) { |
|
188 fprintf(stderr, "UiError: Cannot load image: %s\n", path); |
|
189 return NULL; |
|
190 } |
|
191 |
|
192 UiImage *img = malloc(sizeof(UiImage)); |
|
193 img->pixbuf = pixbuf; |
|
194 if(name) { |
|
195 cxMapPut(image_map, name, img); |
|
196 } |
|
197 return img; |
|
198 } |
|
199 */ |
|
200 |
|
201 void ui_free_image(UiImage *img) { |
|
202 g_object_unref(img->pixbuf); |
|
203 free(img); |
|
204 } |