aboutsummaryrefslogtreecommitdiffstats
path: root/shell/e-icon-factory.c
blob: c0fceafc423e2aa14f2c568eca80edd079d4345c (plain) (blame)
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
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 8; tab-width: 8 -*- */
/* e-icon-factory.c - Icon factory for the Evolution shell.
 *
 * Copyright (C) 2002 Ximian, Inc.
 *
 * This program is free software; you can redistribute it and/or
 * modify it under the terms of version 2 of the GNU General Public
 * License as published by the Free Software Foundation.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 * General Public License for more details.
 *
 * You should have received a copy of the GNU General Public
 * License along with this program; if not, write to the
 * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
 * Boston, MA 02111-1307, USA.
 *
 * Author: Ettore Perazzoli <ettore@ximian.com>
 */

#ifdef HAVE_CONFIG_H
#include <config.h>
#endif

#include "e-icon-factory.h"

#include "e-shell-constants.h"


/* One icon.  Keep both a small (16x16) and a large (48x48) version around.  */
struct _Icon {
    char *name;
    GdkPixbuf *small_pixbuf;
    GdkPixbuf *large_pixbuf;
};
typedef struct _Icon Icon;

/* Hash of all the icons.  */
static GHashTable *name_to_icon = NULL;


/* Creating and destroying icons.  */

static Icon *
icon_new (const char *name,
      GdkPixbuf *small_pixbuf,
      GdkPixbuf *large_pixbuf)
{
    Icon *icon;

    icon = g_new (Icon, 1);
    icon->name         = g_strdup (name);
    icon->small_pixbuf = small_pixbuf;
    icon->large_pixbuf = large_pixbuf;

    if (small_pixbuf != NULL)
        g_object_ref (small_pixbuf);
    if (large_pixbuf != NULL)
        g_object_ref (large_pixbuf);

    return icon;
}

#if 0

/* (This is not currently used since we never prune icons out of the
   cache.)  */
static void
icon_free (Icon *icon)
{
    g_free (icon->name);

    if (icon->large_pixbuf != NULL)
        g_object_unref (icon->large_pixbuf);
    if (icon->small_pixbuf != NULL)
        g_object_unref (icon->small_pixbuf);

    g_free (icon);
}

#endif


/* Loading icons.  */

static Icon *
load_icon (const char *icon_name)
{
    GdkPixbuf *small_pixbuf;
    GdkPixbuf *large_pixbuf;
    Icon *icon;
    char *path;

    path = g_strconcat (EVOLUTION_IMAGES, "/", icon_name, "-mini.png", NULL);
    small_pixbuf = gdk_pixbuf_new_from_file (path, NULL);
    g_free (path);

    path = g_strconcat (EVOLUTION_IMAGES, "/", icon_name, ".png", NULL);
    large_pixbuf = gdk_pixbuf_new_from_file (path, NULL);
    g_free (path);

    if (large_pixbuf == NULL || small_pixbuf == NULL)
        return NULL;

    icon = icon_new (icon_name, small_pixbuf, large_pixbuf);

    g_object_unref (small_pixbuf);
    g_object_unref (large_pixbuf);

    return icon;
}


/* Public API.  */

void
e_icon_factory_init (void)
{
    if (name_to_icon != NULL) {
        /* Already initialized.  */
        return;
    }

    name_to_icon = g_hash_table_new (g_str_hash, g_str_equal);
}

GdkPixbuf *
e_icon_factory_get_icon (const char *icon_name,
             gboolean mini)
{
    Icon *icon;

    g_return_val_if_fail (icon_name != NULL, NULL);

    icon = g_hash_table_lookup (name_to_icon, icon_name);
    if (icon == NULL) {
        icon = load_icon (icon_name);
        if (icon == NULL) {
            g_warning ("Icon not found -- %s", icon_name);

            /* Create an empty icon so that we don't keep spitting
               out the same warning over and over, every time this
               icon is requested.  */

            icon = icon_new (icon_name, NULL, NULL);
            g_hash_table_insert (name_to_icon, icon->name, icon);
            return NULL;
        }

        g_hash_table_insert (name_to_icon, icon->name, icon);
    }

    if (mini) {
        g_object_ref (icon->small_pixbuf);
        return icon->small_pixbuf;
    } else {
        g_object_ref (icon->large_pixbuf);
        return icon->large_pixbuf;
    }
}