Mercurial > pidgin.yaz
annotate src/gtkstock.c @ 11279:ed5302df41b0
[gaim-migrate @ 13474]
Patch by Sadrul Habib Chowdhury to fix tab dragging. Many thanks also to
Cae for helping to track down the exact behavior, and for helping to test
this patch so that Sadrul could provide a version that actually fixes the
bug. :-)
committer: Tailor Script <tailor@pidgin.im>
author | Luke Schierer <lschiere@pidgin.im> |
---|---|
date | Tue, 16 Aug 2005 18:54:40 +0000 |
parents | b33eccbc3a10 |
children | 2c3fb4a0f785 |
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" }, | |
41 { GAIM_STOCK_ALIAS, "buttons", "edit.png" }, | |
42 { GAIM_STOCK_BGCOLOR, "buttons", "change-bgcolor-small.png" }, | |
43 { GAIM_STOCK_BLOCK, NULL, GTK_STOCK_STOP }, | |
44 { GAIM_STOCK_CHAT, NULL, GTK_STOCK_JUMP_TO }, | |
11271
b33eccbc3a10
[gaim-migrate @ 13454]
Richard Laager <rlaager@wiktel.com>
parents:
10871
diff
changeset
|
45 { GAIM_STOCK_CLEAR, "buttons", "clear.png" }, |
10297 | 46 { GAIM_STOCK_DOWNLOAD, NULL, GTK_STOCK_GO_DOWN }, |
47 { GAIM_STOCK_DIALOG_AUTH, "dialogs", "gaim_auth.png" }, | |
48 { GAIM_STOCK_DIALOG_COOL, "dialogs", "gaim_cool.png" }, | |
49 { GAIM_STOCK_DIALOG_ERROR, "dialogs", "gaim_error.png" }, | |
50 { GAIM_STOCK_DIALOG_INFO, "dialogs", "gaim_info.png" }, | |
51 { GAIM_STOCK_DIALOG_QUESTION, "dialogs", "gaim_question.png" }, | |
52 { GAIM_STOCK_DIALOG_WARNING, "dialogs", "gaim_warning.png" }, | |
53 { GAIM_STOCK_FGCOLOR, "buttons", "change-fgcolor-small.png" }, | |
54 { GAIM_STOCK_EDIT, "buttons", "edit.png" }, | |
55 { GAIM_STOCK_FILE_CANCELED, NULL, GTK_STOCK_CANCEL }, | |
56 { GAIM_STOCK_FILE_DONE, NULL, GTK_STOCK_APPLY }, | |
57 { GAIM_STOCK_FILE_TRANSFER, NULL, GTK_STOCK_REVERT_TO_SAVED }, | |
58 { GAIM_STOCK_ICON_AWAY, "icons", "away.png" }, | |
59 { GAIM_STOCK_ICON_AWAY_MSG, "icons", "msgpend.png" }, | |
60 { GAIM_STOCK_ICON_CONNECT, "icons", "connect.png" }, | |
61 { GAIM_STOCK_ICON_OFFLINE, "icons", "offline.png" }, | |
62 { GAIM_STOCK_ICON_ONLINE, "icons", "online.png" }, | |
63 { GAIM_STOCK_ICON_ONLINE_MSG, "icons", "msgunread.png" }, | |
64 { GAIM_STOCK_IGNORE, NULL, GTK_STOCK_DIALOG_ERROR }, | |
11271
b33eccbc3a10
[gaim-migrate @ 13454]
Richard Laager <rlaager@wiktel.com>
parents:
10871
diff
changeset
|
65 { GAIM_STOCK_IM, "buttons", "send-im.png" }, |
10297 | 66 { GAIM_STOCK_IMAGE, "buttons", "insert-image-small.png" }, |
67 { GAIM_STOCK_INFO, "icons", "info.png", }, | |
68 { GAIM_STOCK_INVITE, NULL, GTK_STOCK_JUMP_TO }, | |
69 { GAIM_STOCK_LINK, "buttons", "insert-link-small.png" }, | |
70 { GAIM_STOCK_LOGO, "gaim", "logo.png" }, | |
71 { GAIM_STOCK_MODIFY, NULL, GTK_STOCK_PREFERENCES }, | |
72 { GAIM_STOCK_PAUSE, "buttons", "pause.png" }, | |
73 { GAIM_STOCK_OPEN_MAIL, NULL, GTK_STOCK_JUMP_TO }, | |
74 { GAIM_STOCK_SEND, "buttons", "send-im.png" }, | |
75 { GAIM_STOCK_SIGN_ON, NULL, GTK_STOCK_EXECUTE }, | |
76 { GAIM_STOCK_SIGN_OFF, NULL, GTK_STOCK_CLOSE }, | |
77 { GAIM_STOCK_SMILEY, "buttons", "insert-smiley-small.png" }, | |
78 { GAIM_STOCK_TEXT_BIGGER, "buttons", "text_bigger.png" }, | |
79 { GAIM_STOCK_TEXT_NORMAL, "buttons", "text_normal.png" }, | |
80 { GAIM_STOCK_TEXT_SMALLER, "buttons", "text_smaller.png" }, | |
81 { GAIM_STOCK_TYPED, "gaim", "typed.png" }, | |
82 { GAIM_STOCK_TYPING, "gaim", "typing.png" }, | |
10643 | 83 { GAIM_STOCK_STATUS_ONLINE, "gaim", "status-online.png" }, |
84 { GAIM_STOCK_STATUS_OFFLINE, "gaim", "status-offline.png" }, | |
85 { GAIM_STOCK_STATUS_AWAY, "gaim", "status-away.png" }, | |
86 { GAIM_STOCK_STATUS_INVISIBLE,"gaim", "status-invisible.png" }, | |
87 { GAIM_STOCK_STATUS_TYPING0, "gaim", "status-typing0.png" }, | |
88 { GAIM_STOCK_STATUS_TYPING1, "gaim", "status-typing1.png" }, | |
89 { GAIM_STOCK_STATUS_TYPING2, "gaim", "status-typing2.png" }, | |
90 { GAIM_STOCK_STATUS_TYPING3, "gaim", "status-typing3.png" }, | |
91 { GAIM_STOCK_STATUS_CONNECT0, "gaim", "status-connect0.png" }, | |
92 { GAIM_STOCK_STATUS_CONNECT1, "gaim", "status-connect1.png" }, | |
93 { GAIM_STOCK_STATUS_CONNECT2, "gaim", "status-connect2.png" }, | |
94 { GAIM_STOCK_STATUS_CONNECT3, "gaim", "status-connect3.png" }, | |
10297 | 95 { GAIM_STOCK_UPLOAD, NULL, GTK_STOCK_GO_UP }, |
96 { GAIM_STOCK_WARN, NULL, GTK_STOCK_DIALOG_WARNING } | |
97 }; | |
98 | |
10871 | 99 static const GtkStockItem stock_items[] = |
10297 | 100 { |
101 { GAIM_STOCK_ALIAS, N_("_Alias"), 0, 0, NULL }, | |
102 { GAIM_STOCK_CHAT, N_("_Join"), 0, 0, NULL }, | |
103 { GAIM_STOCK_INVITE, N_("_Invite"), 0, 0, NULL }, | |
104 { GAIM_STOCK_MODIFY, N_("_Modify"), 0, 0, NULL }, | |
105 { GAIM_STOCK_OPEN_MAIL, N_("_Open Mail"), 0, 0, NULL }, | |
106 { GAIM_STOCK_PAUSE, N_("_Pause"), 0, 0, NULL }, | |
107 { GAIM_STOCK_WARN, N_("_Warn"), 0, 0, NULL } | |
108 }; | |
109 | |
110 static gchar * | |
111 find_file(const char *dir, const char *base) | |
112 { | |
113 char *filename; | |
114 | |
115 if (base == NULL) | |
116 return NULL; | |
117 | |
118 if (!strcmp(dir, "gaim")) | |
119 filename = g_build_filename(DATADIR, "pixmaps", "gaim", base, NULL); | |
120 else | |
121 { | |
122 filename = g_build_filename(DATADIR, "pixmaps", "gaim", dir, | |
123 base, NULL); | |
124 } | |
125 | |
126 if (!g_file_test(filename, G_FILE_TEST_EXISTS)) | |
127 { | |
128 g_critical("Unable to load stock pixmap %s\n", base); | |
129 | |
130 g_free(filename); | |
131 | |
132 return NULL; | |
133 } | |
134 | |
135 return filename; | |
136 } | |
137 | |
138 static void | |
139 gaim_gtk_stock_versionize(GdkPixbuf **original, GtkWidget *widget) { | |
140 GdkPixmap *pixmap; | |
141 GtkStyle *style; | |
142 PangoContext *context; | |
143 PangoLayout *layout; | |
144 gchar *markup; | |
145 gint width, height; | |
146 gint lwidth = 0, lheight = 0; | |
147 | |
148 style = gtk_widget_get_style(widget); | |
149 | |
150 gdk_pixbuf_render_pixmap_and_mask(*original, &pixmap, NULL, 255); | |
151 width = gdk_pixbuf_get_width(*original); | |
152 height = gdk_pixbuf_get_height(*original); | |
153 g_object_unref(G_OBJECT(*original)); | |
154 | |
155 context = gtk_widget_get_pango_context(widget); | |
156 layout = pango_layout_new(context); | |
157 | |
158 markup = g_strdup_printf("<span foreground=\"#FFFFFF\" size=\"larger\">%s</span>", VERSION); | |
159 pango_layout_set_font_description(layout, style->font_desc); | |
160 pango_layout_set_markup(layout, markup, strlen(markup)); | |
161 g_free(markup); | |
162 | |
163 pango_layout_get_pixel_size(layout, &lwidth, &lheight); | |
164 gdk_draw_layout(GDK_DRAWABLE(pixmap), style->bg_gc[GTK_STATE_NORMAL], | |
165 width - (lwidth + 3), height - (lheight + 1), layout); | |
166 g_object_unref(G_OBJECT(layout)); | |
167 | |
168 *original = gdk_pixbuf_get_from_drawable(NULL, pixmap, NULL, | |
169 0, 0, 0, 0, | |
170 width, height); | |
171 g_object_unref(G_OBJECT(pixmap)); | |
172 } | |
173 | |
174 void | |
175 gaim_gtk_stock_init(void) | |
176 { | |
177 static gboolean stock_initted = FALSE; | |
178 GtkIconFactory *icon_factory; | |
179 int i; | |
180 GtkWidget *win; | |
181 | |
182 if (stock_initted) | |
183 return; | |
184 | |
185 stock_initted = TRUE; | |
186 | |
187 /* Setup the icon factory. */ | |
188 icon_factory = gtk_icon_factory_new(); | |
189 | |
190 gtk_icon_factory_add_default(icon_factory); | |
191 | |
192 /* Er, yeah, a hack, but it works. :) */ | |
193 win = gtk_window_new(GTK_WINDOW_TOPLEVEL); | |
194 gtk_widget_realize(win); | |
195 | |
196 for (i = 0; i < G_N_ELEMENTS(stock_icons); i++) | |
197 { | |
198 GdkPixbuf *pixbuf; | |
199 GtkIconSet *iconset; | |
200 gchar *filename; | |
201 | |
202 if (stock_icons[i].dir == NULL) | |
203 { | |
204 /* GTK+ Stock icon */ | |
205 iconset = gtk_style_lookup_icon_set(gtk_widget_get_style(win), | |
206 stock_icons[i].filename); | |
207 } | |
208 else | |
209 { | |
210 filename = find_file(stock_icons[i].dir, stock_icons[i].filename); | |
211 | |
212 if (filename == NULL) | |
213 continue; | |
214 | |
215 pixbuf = gdk_pixbuf_new_from_file(filename, NULL); | |
216 | |
217 g_free(filename); | |
218 | |
219 if (!strcmp(stock_icons[i].name, GAIM_STOCK_LOGO)) | |
220 gaim_gtk_stock_versionize(&pixbuf, win); | |
221 | |
222 iconset = gtk_icon_set_new_from_pixbuf(pixbuf); | |
223 | |
224 g_object_unref(G_OBJECT(pixbuf)); | |
225 } | |
226 | |
227 gtk_icon_factory_add(icon_factory, stock_icons[i].name, iconset); | |
228 | |
229 gtk_icon_set_unref(iconset); | |
230 } | |
231 | |
232 gtk_widget_destroy(win); | |
233 | |
234 /* register custom icon sizes */ | |
235 gtk_icon_size_register(GAIM_ICON_SIZE_LOGO, 330, 90); | |
236 gtk_icon_size_register(GAIM_ICON_SIZE_DIALOG_COOL, 40, 60); | |
10643 | 237 gtk_icon_size_register(GAIM_ICON_SIZE_STATUS, 30, 30); |
10297 | 238 |
239 g_object_unref(G_OBJECT(icon_factory)); | |
240 | |
241 /* Register the stock items. */ | |
242 gtk_stock_add_static(stock_items, G_N_ELEMENTS(stock_items)); | |
243 } |