UNIXworkcode

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 #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 UiImage* ui_icon_image(UiIcon *icon) { 161 GError *error = NULL; 162 GdkPixbuf *pixbuf = gtk_icon_info_load_icon(icon->info, &error); 163 if(pixbuf) { 164 UiImage *img = malloc(sizeof(UiImage)); 165 img->pixbuf = pixbuf; 166 return img; 167 } 168 return NULL; 169 } 170 */ 171 172 /* 173 UiImage* ui_image(const char *filename) { 174 return ui_named_image(filename, NULL); 175 } 176 177 UiImage* ui_named_image(const char *filename, const char *name) { 178 char *path = uic_get_image_path(filename); 179 if(!path) { 180 fprintf(stderr, "UiError: pixmaps directory not set\n"); 181 return NULL; 182 } 183 UiImage *img = ui_load_image_from_path(path, name); 184 free(path); 185 return img; 186 } 187 188 UiImage* ui_load_image_from_path(const char *path, const char *name) { 189 GError *error = NULL; 190 GdkPixbuf *pixbuf = gdk_pixbuf_new_from_file(path, &error); 191 if(!pixbuf) { 192 fprintf(stderr, "UiError: Cannot load image: %s\n", path); 193 return NULL; 194 } 195 196 UiImage *img = malloc(sizeof(UiImage)); 197 img->pixbuf = pixbuf; 198 if(name) { 199 cxMapPut(image_map, name, img); 200 } 201 return img; 202 } 203 */ 204 205 void ui_free_image(UiImage *img) { 206 g_object_unref(img->pixbuf); 207 free(img); 208 } 209