Mercurial > pidgin
annotate src/gtkstock.c @ 12125:3c1bac709234
[gaim-migrate @ 14425]
Change /core/savedstatus/current and /core/savedstatus/idleaway
to ints (they used to be strings, where the value was the title of a
GaimSavedStatus).
The value is now equal to the "creation" timestamp of a saved_status.
The creation timestamp is used as the unique key. The primary reason
for this is to allow for saved statuses to have NULL titles. NULL titles
are needed for transient statuses. I also added a "last_used" timestamp.
This all paves the way for keeping track of recently used statuses
committer: Tailor Script <tailor@pidgin.im>
author | Mark Doliner <mark@kingant.net> |
---|---|
date | Fri, 18 Nov 2005 07:23:29 +0000 |
parents | e75ef7aa913e |
children | f6f08fd1841a |
rev | line source |
---|---|
10297 | 1 /** |
2 * @file gtkstock.c GTK+ Stock resources | |
3 * @ingroup gtkui | |
4 * | |
5 * gaim | |
6 * | |
7 * Gaim is the legal property of its developers, whose names are too numerous | |
8 * to list here. Please refer to the COPYRIGHT file distributed with this | |
9 * source distribution. | |
10 * | |
11 * This program is free software; you can redistribute it and/or modify | |
12 * it under the terms of the GNU General Public License as published by | |
13 * the Free Software Foundation; either version 2 of the License, or | |
14 * (at your option) any later version. | |
15 * | |
16 * This program is distributed in the hope that it will be useful, | |
17 * but WITHOUT ANY WARRANTY; without even the implied warranty of | |
18 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |
19 * GNU General Public License for more details. | |
20 * | |
21 * You should have received a copy of the GNU General Public License | |
22 * along with this program; if not, write to the Free Software | |
23 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA | |
24 * | |
25 */ | |
26 #include "internal.h" | |
27 #include "gtkgaim.h" | |
28 | |
29 #include "gtkstock.h" | |
30 | |
31 static struct StockIcon | |
32 { | |
33 const char *name; | |
34 const char *dir; | |
35 const char *filename; | |
36 | |
37 } const stock_icons[] = | |
38 { | |
39 { GAIM_STOCK_ABOUT, "buttons", "about_menu.png" }, | |
40 { GAIM_STOCK_ACCOUNTS, "buttons", "accounts.png" }, | |
11370
2c3fb4a0f785
[gaim-migrate @ 13595]
Richard Laager <rlaager@wiktel.com>
parents:
11271
diff
changeset
|
41 #if GTK_CHECK_VERSION(2,6,0) |
2c3fb4a0f785
[gaim-migrate @ 13595]
Richard Laager <rlaager@wiktel.com>
parents:
11271
diff
changeset
|
42 { GAIM_STOCK_ALIAS, NULL, GTK_STOCK_EDIT }, |
2c3fb4a0f785
[gaim-migrate @ 13595]
Richard Laager <rlaager@wiktel.com>
parents:
11271
diff
changeset
|
43 #else |
10297 | 44 { GAIM_STOCK_ALIAS, "buttons", "edit.png" }, |
11370
2c3fb4a0f785
[gaim-migrate @ 13595]
Richard Laager <rlaager@wiktel.com>
parents:
11271
diff
changeset
|
45 #endif |
10297 | 46 { GAIM_STOCK_BGCOLOR, "buttons", "change-bgcolor-small.png" }, |
47 { GAIM_STOCK_BLOCK, NULL, GTK_STOCK_STOP }, | |
48 { GAIM_STOCK_CHAT, NULL, GTK_STOCK_JUMP_TO }, | |
11370
2c3fb4a0f785
[gaim-migrate @ 13595]
Richard Laager <rlaager@wiktel.com>
parents:
11271
diff
changeset
|
49 { GAIM_STOCK_CLEAR, NULL, GTK_STOCK_CLEAR }, |
10297 | 50 { GAIM_STOCK_DOWNLOAD, NULL, GTK_STOCK_GO_DOWN }, |
51 { GAIM_STOCK_DIALOG_AUTH, "dialogs", "gaim_auth.png" }, | |
52 { GAIM_STOCK_DIALOG_COOL, "dialogs", "gaim_cool.png" }, | |
53 { GAIM_STOCK_DIALOG_ERROR, "dialogs", "gaim_error.png" }, | |
54 { GAIM_STOCK_DIALOG_INFO, "dialogs", "gaim_info.png" }, | |
55 { GAIM_STOCK_DIALOG_QUESTION, "dialogs", "gaim_question.png" }, | |
56 { GAIM_STOCK_DIALOG_WARNING, "dialogs", "gaim_warning.png" }, | |
57 { GAIM_STOCK_FGCOLOR, "buttons", "change-fgcolor-small.png" }, | |
11370
2c3fb4a0f785
[gaim-migrate @ 13595]
Richard Laager <rlaager@wiktel.com>
parents:
11271
diff
changeset
|
58 #if GTK_CHECK_VERSION(2,6,0) |
2c3fb4a0f785
[gaim-migrate @ 13595]
Richard Laager <rlaager@wiktel.com>
parents:
11271
diff
changeset
|
59 { GAIM_STOCK_EDIT, NULL, GTK_STOCK_EDIT }, |
2c3fb4a0f785
[gaim-migrate @ 13595]
Richard Laager <rlaager@wiktel.com>
parents:
11271
diff
changeset
|
60 #else |
10297 | 61 { GAIM_STOCK_EDIT, "buttons", "edit.png" }, |
11370
2c3fb4a0f785
[gaim-migrate @ 13595]
Richard Laager <rlaager@wiktel.com>
parents:
11271
diff
changeset
|
62 #endif |
10297 | 63 { GAIM_STOCK_FILE_CANCELED, NULL, GTK_STOCK_CANCEL }, |
64 { GAIM_STOCK_FILE_DONE, NULL, GTK_STOCK_APPLY }, | |
65 { GAIM_STOCK_FILE_TRANSFER, NULL, GTK_STOCK_REVERT_TO_SAVED }, | |
66 { GAIM_STOCK_ICON_AWAY, "icons", "away.png" }, | |
67 { GAIM_STOCK_ICON_AWAY_MSG, "icons", "msgpend.png" }, | |
68 { GAIM_STOCK_ICON_CONNECT, "icons", "connect.png" }, | |
69 { GAIM_STOCK_ICON_OFFLINE, "icons", "offline.png" }, | |
70 { GAIM_STOCK_ICON_ONLINE, "icons", "online.png" }, | |
71 { GAIM_STOCK_ICON_ONLINE_MSG, "icons", "msgunread.png" }, | |
72 { GAIM_STOCK_IGNORE, NULL, GTK_STOCK_DIALOG_ERROR }, | |
11271
b33eccbc3a10
[gaim-migrate @ 13454]
Richard Laager <rlaager@wiktel.com>
parents:
10871
diff
changeset
|
73 { GAIM_STOCK_IM, "buttons", "send-im.png" }, |
10297 | 74 { GAIM_STOCK_IMAGE, "buttons", "insert-image-small.png" }, |
11370
2c3fb4a0f785
[gaim-migrate @ 13595]
Richard Laager <rlaager@wiktel.com>
parents:
11271
diff
changeset
|
75 #if GTK_CHECK_VERSION(2,8,0) |
2c3fb4a0f785
[gaim-migrate @ 13595]
Richard Laager <rlaager@wiktel.com>
parents:
11271
diff
changeset
|
76 { GAIM_STOCK_INFO, NULL, GTK_STOCK_INFO }, |
2c3fb4a0f785
[gaim-migrate @ 13595]
Richard Laager <rlaager@wiktel.com>
parents:
11271
diff
changeset
|
77 #else |
2c3fb4a0f785
[gaim-migrate @ 13595]
Richard Laager <rlaager@wiktel.com>
parents:
11271
diff
changeset
|
78 { GAIM_STOCK_INFO, "icons", "info.png" }, |
2c3fb4a0f785
[gaim-migrate @ 13595]
Richard Laager <rlaager@wiktel.com>
parents:
11271
diff
changeset
|
79 #endif |
10297 | 80 { GAIM_STOCK_INVITE, NULL, GTK_STOCK_JUMP_TO }, |
81 { GAIM_STOCK_LINK, "buttons", "insert-link-small.png" }, | |
82 { GAIM_STOCK_LOGO, "gaim", "logo.png" }, | |
83 { GAIM_STOCK_MODIFY, NULL, GTK_STOCK_PREFERENCES }, | |
11370
2c3fb4a0f785
[gaim-migrate @ 13595]
Richard Laager <rlaager@wiktel.com>
parents:
11271
diff
changeset
|
84 #if GTK_CHECK_VERSION(2,6,0) |
2c3fb4a0f785
[gaim-migrate @ 13595]
Richard Laager <rlaager@wiktel.com>
parents:
11271
diff
changeset
|
85 { GAIM_STOCK_PAUSE, NULL, GTK_STOCK_MEDIA_PAUSE }, |
2c3fb4a0f785
[gaim-migrate @ 13595]
Richard Laager <rlaager@wiktel.com>
parents:
11271
diff
changeset
|
86 #else |
10297 | 87 { GAIM_STOCK_PAUSE, "buttons", "pause.png" }, |
11370
2c3fb4a0f785
[gaim-migrate @ 13595]
Richard Laager <rlaager@wiktel.com>
parents:
11271
diff
changeset
|
88 #endif |
12116
e75ef7aa913e
[gaim-migrate @ 14416]
Luke Schierer <lschiere@pidgin.im>
parents:
12024
diff
changeset
|
89 { GAIM_STOCK_PENDING, "gaim", "envelope.png" }, |
10297 | 90 { GAIM_STOCK_OPEN_MAIL, NULL, GTK_STOCK_JUMP_TO }, |
91 { GAIM_STOCK_SEND, "buttons", "send-im.png" }, | |
92 { GAIM_STOCK_SIGN_ON, NULL, GTK_STOCK_EXECUTE }, | |
93 { GAIM_STOCK_SIGN_OFF, NULL, GTK_STOCK_CLOSE }, | |
94 { GAIM_STOCK_SMILEY, "buttons", "insert-smiley-small.png" }, | |
95 { GAIM_STOCK_TEXT_BIGGER, "buttons", "text_bigger.png" }, | |
96 { GAIM_STOCK_TEXT_NORMAL, "buttons", "text_normal.png" }, | |
97 { GAIM_STOCK_TEXT_SMALLER, "buttons", "text_smaller.png" }, | |
98 { GAIM_STOCK_TYPED, "gaim", "typed.png" }, | |
99 { GAIM_STOCK_TYPING, "gaim", "typing.png" }, | |
12024 | 100 { GAIM_STOCK_VOICE_CHAT, "gaim", "phone.png" }, |
10643 | 101 { GAIM_STOCK_STATUS_ONLINE, "gaim", "status-online.png" }, |
102 { GAIM_STOCK_STATUS_OFFLINE, "gaim", "status-offline.png" }, | |
103 { GAIM_STOCK_STATUS_AWAY, "gaim", "status-away.png" }, | |
104 { GAIM_STOCK_STATUS_INVISIBLE,"gaim", "status-invisible.png" }, | |
105 { GAIM_STOCK_STATUS_TYPING0, "gaim", "status-typing0.png" }, | |
106 { GAIM_STOCK_STATUS_TYPING1, "gaim", "status-typing1.png" }, | |
107 { GAIM_STOCK_STATUS_TYPING2, "gaim", "status-typing2.png" }, | |
108 { GAIM_STOCK_STATUS_TYPING3, "gaim", "status-typing3.png" }, | |
109 { GAIM_STOCK_STATUS_CONNECT0, "gaim", "status-connect0.png" }, | |
110 { GAIM_STOCK_STATUS_CONNECT1, "gaim", "status-connect1.png" }, | |
111 { GAIM_STOCK_STATUS_CONNECT2, "gaim", "status-connect2.png" }, | |
112 { GAIM_STOCK_STATUS_CONNECT3, "gaim", "status-connect3.png" }, | |
10297 | 113 { GAIM_STOCK_UPLOAD, NULL, GTK_STOCK_GO_UP }, |
114 { GAIM_STOCK_WARN, NULL, GTK_STOCK_DIALOG_WARNING } | |
115 }; | |
116 | |
10871 | 117 static const GtkStockItem stock_items[] = |
10297 | 118 { |
119 { GAIM_STOCK_ALIAS, N_("_Alias"), 0, 0, NULL }, | |
120 { GAIM_STOCK_CHAT, N_("_Join"), 0, 0, NULL }, | |
121 { GAIM_STOCK_INVITE, N_("_Invite"), 0, 0, NULL }, | |
122 { GAIM_STOCK_MODIFY, N_("_Modify"), 0, 0, NULL }, | |
123 { GAIM_STOCK_OPEN_MAIL, N_("_Open Mail"), 0, 0, NULL }, | |
124 { GAIM_STOCK_PAUSE, N_("_Pause"), 0, 0, NULL }, | |
125 { GAIM_STOCK_WARN, N_("_Warn"), 0, 0, NULL } | |
126 }; | |
127 | |
128 static gchar * | |
129 find_file(const char *dir, const char *base) | |
130 { | |
131 char *filename; | |
132 | |
133 if (base == NULL) | |
134 return NULL; | |
135 | |
136 if (!strcmp(dir, "gaim")) | |
137 filename = g_build_filename(DATADIR, "pixmaps", "gaim", base, NULL); | |
138 else | |
139 { | |
140 filename = g_build_filename(DATADIR, "pixmaps", "gaim", dir, | |
141 base, NULL); | |
142 } | |
143 | |
144 if (!g_file_test(filename, G_FILE_TEST_EXISTS)) | |
145 { | |
146 g_critical("Unable to load stock pixmap %s\n", base); | |
147 | |
148 g_free(filename); | |
149 | |
150 return NULL; | |
151 } | |
152 | |
153 return filename; | |
154 } | |
155 | |
156 static void | |
157 gaim_gtk_stock_versionize(GdkPixbuf **original, GtkWidget *widget) { | |
158 GdkPixmap *pixmap; | |
159 GtkStyle *style; | |
160 PangoContext *context; | |
161 PangoLayout *layout; | |
162 gchar *markup; | |
163 gint width, height; | |
164 gint lwidth = 0, lheight = 0; | |
165 | |
166 style = gtk_widget_get_style(widget); | |
167 | |
168 gdk_pixbuf_render_pixmap_and_mask(*original, &pixmap, NULL, 255); | |
169 width = gdk_pixbuf_get_width(*original); | |
170 height = gdk_pixbuf_get_height(*original); | |
171 g_object_unref(G_OBJECT(*original)); | |
172 | |
173 context = gtk_widget_get_pango_context(widget); | |
174 layout = pango_layout_new(context); | |
175 | |
176 markup = g_strdup_printf("<span foreground=\"#FFFFFF\" size=\"larger\">%s</span>", VERSION); | |
177 pango_layout_set_font_description(layout, style->font_desc); | |
178 pango_layout_set_markup(layout, markup, strlen(markup)); | |
179 g_free(markup); | |
180 | |
181 pango_layout_get_pixel_size(layout, &lwidth, &lheight); | |
182 gdk_draw_layout(GDK_DRAWABLE(pixmap), style->bg_gc[GTK_STATE_NORMAL], | |
183 width - (lwidth + 3), height - (lheight + 1), layout); | |
184 g_object_unref(G_OBJECT(layout)); | |
185 | |
186 *original = gdk_pixbuf_get_from_drawable(NULL, pixmap, NULL, | |
187 0, 0, 0, 0, | |
188 width, height); | |
189 g_object_unref(G_OBJECT(pixmap)); | |
190 } | |
191 | |
192 void | |
193 gaim_gtk_stock_init(void) | |
194 { | |
195 static gboolean stock_initted = FALSE; | |
196 GtkIconFactory *icon_factory; | |
197 int i; | |
198 GtkWidget *win; | |
199 | |
200 if (stock_initted) | |
201 return; | |
202 | |
203 stock_initted = TRUE; | |
204 | |
205 /* Setup the icon factory. */ | |
206 icon_factory = gtk_icon_factory_new(); | |
207 | |
208 gtk_icon_factory_add_default(icon_factory); | |
209 | |
210 /* Er, yeah, a hack, but it works. :) */ | |
211 win = gtk_window_new(GTK_WINDOW_TOPLEVEL); | |
212 gtk_widget_realize(win); | |
213 | |
214 for (i = 0; i < G_N_ELEMENTS(stock_icons); i++) | |
215 { | |
216 GdkPixbuf *pixbuf; | |
217 GtkIconSet *iconset; | |
218 gchar *filename; | |
219 | |
220 if (stock_icons[i].dir == NULL) | |
221 { | |
222 /* GTK+ Stock icon */ | |
223 iconset = gtk_style_lookup_icon_set(gtk_widget_get_style(win), | |
224 stock_icons[i].filename); | |
225 } | |
226 else | |
227 { | |
228 filename = find_file(stock_icons[i].dir, stock_icons[i].filename); | |
229 | |
230 if (filename == NULL) | |
231 continue; | |
232 | |
233 pixbuf = gdk_pixbuf_new_from_file(filename, NULL); | |
234 | |
235 g_free(filename); | |
236 | |
237 if (!strcmp(stock_icons[i].name, GAIM_STOCK_LOGO)) | |
238 gaim_gtk_stock_versionize(&pixbuf, win); | |
239 | |
240 iconset = gtk_icon_set_new_from_pixbuf(pixbuf); | |
241 | |
242 g_object_unref(G_OBJECT(pixbuf)); | |
243 } | |
244 | |
245 gtk_icon_factory_add(icon_factory, stock_icons[i].name, iconset); | |
246 | |
247 gtk_icon_set_unref(iconset); | |
248 } | |
249 | |
250 gtk_widget_destroy(win); | |
251 | |
252 /* register custom icon sizes */ | |
253 gtk_icon_size_register(GAIM_ICON_SIZE_LOGO, 330, 90); | |
254 gtk_icon_size_register(GAIM_ICON_SIZE_DIALOG_COOL, 40, 60); | |
10643 | 255 gtk_icon_size_register(GAIM_ICON_SIZE_STATUS, 30, 30); |
10297 | 256 |
257 g_object_unref(G_OBJECT(icon_factory)); | |
258 | |
259 /* Register the stock items. */ | |
260 gtk_stock_add_static(stock_items, G_N_ELEMENTS(stock_items)); | |
261 } |