Status: | Merged | ||||||||||||||||||||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
Approved by: | André Stösel | ||||||||||||||||||||||||||||||||||||
Approved revision: | 6472 | ||||||||||||||||||||||||||||||||||||
Merged at revision: | 6509 | ||||||||||||||||||||||||||||||||||||
Proposed branch: | lp:~midori/midori/deathnote | ||||||||||||||||||||||||||||||||||||
Merge into: | lp:midori | ||||||||||||||||||||||||||||||||||||
Diff against target: |
3403 lines (+709/-2133) 11 files modified
katze/katze-throbber.c (+0/-932) katze/katze-throbber.h (+0/-94) katze/katze.h (+0/-1) midori/midori-browser.c (+148/-567) midori/midori-notebook.vala (+526/-0) midori/midori-preferences.c (+0/-5) midori/midori-settings.vala (+1/-0) midori/midori-tab.vala (+14/-1) midori/midori-view.c (+19/-531) midori/midori.vapi (+0/-1) po/POTFILES.in (+1/-1) |
||||||||||||||||||||||||||||||||||||
To merge this branch: | bzr merge lp:~midori/midori/deathnote | ||||||||||||||||||||||||||||||||||||
Related bugs: |
|
Reviewer | Review Type | Date Requested | Status |
---|---|---|---|
André Stösel | Approve | ||
Paweł Forysiuk | Approve | ||
Review via email: mp+192262@code.launchpad.net |
Commit message
Introduce notebook class converging separate implementations
Description of the change
Rewritten notebook, one code path to rule them all.
destroy and remove-tab are equivalent.
Tabs are always visible.
Tabbar has a 'new tab' button.
Katze.Throbber is dropped, Gtk.Spinner is enough.
Switch tabs by scrolling (absent from GTK+3 Gtk.Notebook).
Support for clicks logically outside label but visually inside.
New tab by double click.
Tab.colors_changed signal
gue5t gue5t (gue5t) wrote : | # |
- 6464. By Cris Dywan
-
Revert to minimum tab size of one icon without close button
- 6465. By Cris Dywan
-
Ensure the spinner is the size of the icon
- 6466. By Cris Dywan
-
Don't bother setting "current" which is unused with Tabby anyway
- 6467. By Cris Dywan
-
Wrap the spinner in an event box to retain its size when hidden
- 6468. By Cris Dywan
-
Always update current index when reordering
- 6469. By Cris Dywan
-
Micro-optimization, no need to count pages when -1 means the same
- 6470. By Cris Dywan
-
Don't wrap tabs when scrolling with a mouse wheel
- 6471. By Cris Dywan
-
Don't handle scrolling when the event is in the tab
- 6472. By Cris Dywan
-
Drop incomplete tab strip scrolling support
Paweł Forysiuk (tuxator) wrote : | # |
I don't see any major issues at this point. Should be fine to merge.
Preview Diff
1 | === removed file 'katze/katze-throbber.c' | |||
2 | --- katze/katze-throbber.c 2013-06-20 21:15:42 +0000 | |||
3 | +++ katze/katze-throbber.c 1970-01-01 00:00:00 +0000 | |||
4 | @@ -1,932 +0,0 @@ | |||
5 | 1 | /* | ||
6 | 2 | Copyright (C) 2007-2010 Christian Dywan <christian@twotoasts.de> | ||
7 | 3 | |||
8 | 4 | This library is free software; you can redistribute it and/or | ||
9 | 5 | modify it under the terms of the GNU Lesser General Public | ||
10 | 6 | License as published by the Free Software Foundation; either | ||
11 | 7 | version 2.1 of the License, or (at your option) any later version. | ||
12 | 8 | |||
13 | 9 | See the file COPYING for the full license text. | ||
14 | 10 | */ | ||
15 | 11 | |||
16 | 12 | #include "katze-throbber.h" | ||
17 | 13 | |||
18 | 14 | #include "katze-utils.h" | ||
19 | 15 | |||
20 | 16 | #include <glib/gi18n.h> | ||
21 | 17 | #include <math.h> | ||
22 | 18 | |||
23 | 19 | struct _KatzeThrobber | ||
24 | 20 | { | ||
25 | 21 | GtkSpinner parent_instance; | ||
26 | 22 | GtkIconSize icon_size; | ||
27 | 23 | gchar* icon_name; | ||
28 | 24 | GdkPixbuf* pixbuf; | ||
29 | 25 | gchar* stock_id; | ||
30 | 26 | gboolean animated; | ||
31 | 27 | gchar* static_icon_name; | ||
32 | 28 | GdkPixbuf* static_pixbuf; | ||
33 | 29 | gchar* static_stock_id; | ||
34 | 30 | |||
35 | 31 | gint index; | ||
36 | 32 | gint timer_id; | ||
37 | 33 | gint width; | ||
38 | 34 | gint height; | ||
39 | 35 | }; | ||
40 | 36 | |||
41 | 37 | struct _KatzeThrobberClass | ||
42 | 38 | { | ||
43 | 39 | GtkSpinnerClass parent_class; | ||
44 | 40 | }; | ||
45 | 41 | |||
46 | 42 | G_DEFINE_TYPE (KatzeThrobber, katze_throbber, GTK_TYPE_SPINNER); | ||
47 | 43 | |||
48 | 44 | enum | ||
49 | 45 | { | ||
50 | 46 | PROP_0, | ||
51 | 47 | |||
52 | 48 | PROP_ICON_SIZE, | ||
53 | 49 | PROP_ICON_NAME, | ||
54 | 50 | PROP_PIXBUF, | ||
55 | 51 | PROP_ANIMATED, | ||
56 | 52 | PROP_STATIC_ICON_NAME, | ||
57 | 53 | PROP_STATIC_PIXBUF, | ||
58 | 54 | PROP_STATIC_STOCK_ID | ||
59 | 55 | }; | ||
60 | 56 | |||
61 | 57 | static void | ||
62 | 58 | katze_throbber_dispose (GObject* object); | ||
63 | 59 | |||
64 | 60 | static void | ||
65 | 61 | katze_throbber_set_property (GObject* object, | ||
66 | 62 | guint prop_id, | ||
67 | 63 | const GValue* value, | ||
68 | 64 | GParamSpec* pspec); | ||
69 | 65 | |||
70 | 66 | static void | ||
71 | 67 | katze_throbber_get_property (GObject* object, | ||
72 | 68 | guint prop_id, | ||
73 | 69 | GValue* value, | ||
74 | 70 | GParamSpec* pspec); | ||
75 | 71 | |||
76 | 72 | static void | ||
77 | 73 | #if GTK_CHECK_VERSION (3, 0, 0) | ||
78 | 74 | katze_throbber_destroy (GtkWidget* object); | ||
79 | 75 | #else | ||
80 | 76 | katze_throbber_destroy (GtkObject* object); | ||
81 | 77 | #endif | ||
82 | 78 | |||
83 | 79 | static void | ||
84 | 80 | katze_throbber_realize (GtkWidget* widget); | ||
85 | 81 | |||
86 | 82 | #if GTK_CHECK_VERSION (3, 0, 0) | ||
87 | 83 | static void | ||
88 | 84 | katze_throbber_get_preferred_height (GtkWidget *widget, | ||
89 | 85 | gint *minimal_height, | ||
90 | 86 | gint *natural_height); | ||
91 | 87 | static void | ||
92 | 88 | katze_throbber_get_preferred_width (GtkWidget *widget, | ||
93 | 89 | gint *minimal_width, | ||
94 | 90 | gint *natural_width); | ||
95 | 91 | #endif | ||
96 | 92 | static void | ||
97 | 93 | katze_throbber_unrealize (GtkWidget* widget); | ||
98 | 94 | |||
99 | 95 | static void | ||
100 | 96 | katze_throbber_map (GtkWidget* widget); | ||
101 | 97 | |||
102 | 98 | static void | ||
103 | 99 | katze_throbber_unmap (GtkWidget* widget); | ||
104 | 100 | |||
105 | 101 | static void | ||
106 | 102 | katze_throbber_style_set (GtkWidget* widget, | ||
107 | 103 | GtkStyle* style); | ||
108 | 104 | |||
109 | 105 | static void | ||
110 | 106 | katze_throbber_screen_changed (GtkWidget* widget, | ||
111 | 107 | GdkScreen* screen_prev); | ||
112 | 108 | |||
113 | 109 | static void | ||
114 | 110 | katze_throbber_size_request (GtkWidget* widget, | ||
115 | 111 | GtkRequisition* requisition); | ||
116 | 112 | |||
117 | 113 | static gboolean | ||
118 | 114 | katze_throbber_expose_event (GtkWidget* widget, | ||
119 | 115 | #if GTK_CHECK_VERSION (3, 0, 0) | ||
120 | 116 | cairo_t* cr); | ||
121 | 117 | #else | ||
122 | 118 | GdkEventExpose* event); | ||
123 | 119 | #endif | ||
124 | 120 | |||
125 | 121 | static void | ||
126 | 122 | icon_theme_changed (KatzeThrobber* throbber); | ||
127 | 123 | |||
128 | 124 | static void | ||
129 | 125 | katze_throbber_class_init (KatzeThrobberClass* class) | ||
130 | 126 | { | ||
131 | 127 | GObjectClass* gobject_class; | ||
132 | 128 | #if !GTK_CHECK_VERSION (3, 0, 0) | ||
133 | 129 | GtkObjectClass* object_class; | ||
134 | 130 | #endif | ||
135 | 131 | GtkWidgetClass* widget_class; | ||
136 | 132 | GParamFlags flags = G_PARAM_READWRITE | G_PARAM_CONSTRUCT; | ||
137 | 133 | |||
138 | 134 | gobject_class = G_OBJECT_CLASS (class); | ||
139 | 135 | gobject_class->dispose = katze_throbber_dispose; | ||
140 | 136 | gobject_class->set_property = katze_throbber_set_property; | ||
141 | 137 | gobject_class->get_property = katze_throbber_get_property; | ||
142 | 138 | |||
143 | 139 | widget_class = GTK_WIDGET_CLASS (class); | ||
144 | 140 | #if GTK_CHECK_VERSION (3, 0, 0) | ||
145 | 141 | widget_class->destroy = katze_throbber_destroy; | ||
146 | 142 | #else | ||
147 | 143 | object_class = GTK_OBJECT_CLASS (class); | ||
148 | 144 | object_class->destroy = katze_throbber_destroy; | ||
149 | 145 | #endif | ||
150 | 146 | widget_class->realize = katze_throbber_realize; | ||
151 | 147 | widget_class->unrealize = katze_throbber_unrealize; | ||
152 | 148 | widget_class->map = katze_throbber_map; | ||
153 | 149 | widget_class->unmap = katze_throbber_unmap; | ||
154 | 150 | widget_class->style_set = katze_throbber_style_set; | ||
155 | 151 | widget_class->screen_changed = katze_throbber_screen_changed; | ||
156 | 152 | #if GTK_CHECK_VERSION (3, 0, 0) | ||
157 | 153 | widget_class->get_preferred_width= katze_throbber_get_preferred_width; | ||
158 | 154 | widget_class->get_preferred_height= katze_throbber_get_preferred_height; | ||
159 | 155 | #else | ||
160 | 156 | widget_class->size_request = katze_throbber_size_request; | ||
161 | 157 | #endif | ||
162 | 158 | #if GTK_CHECK_VERSION (3, 0, 0) | ||
163 | 159 | widget_class->draw = katze_throbber_expose_event; | ||
164 | 160 | #else | ||
165 | 161 | widget_class->expose_event = katze_throbber_expose_event; | ||
166 | 162 | #endif | ||
167 | 163 | g_object_class_install_property (gobject_class, | ||
168 | 164 | PROP_ICON_SIZE, | ||
169 | 165 | g_param_spec_int ( | ||
170 | 166 | "icon-size", | ||
171 | 167 | "Icon size", | ||
172 | 168 | "Symbolic size to use for the animation", | ||
173 | 169 | 0, G_MAXINT, GTK_ICON_SIZE_MENU, | ||
174 | 170 | flags)); | ||
175 | 171 | |||
176 | 172 | g_object_class_install_property (gobject_class, | ||
177 | 173 | PROP_ICON_NAME, | ||
178 | 174 | g_param_spec_string ( | ||
179 | 175 | "icon-name", | ||
180 | 176 | "Icon Name", | ||
181 | 177 | "The name of an icon containing animation frames", | ||
182 | 178 | "process-working", | ||
183 | 179 | flags)); | ||
184 | 180 | |||
185 | 181 | g_object_class_install_property (gobject_class, | ||
186 | 182 | PROP_PIXBUF, | ||
187 | 183 | g_param_spec_object ( | ||
188 | 184 | "pixbuf", | ||
189 | 185 | "Pixbuf", | ||
190 | 186 | "A GdkPixbuf containing animation frames", | ||
191 | 187 | GDK_TYPE_PIXBUF, | ||
192 | 188 | G_PARAM_READWRITE)); | ||
193 | 189 | |||
194 | 190 | g_object_class_install_property (gobject_class, | ||
195 | 191 | PROP_ANIMATED, | ||
196 | 192 | g_param_spec_boolean ( | ||
197 | 193 | "animated", | ||
198 | 194 | "Animated", | ||
199 | 195 | "Whether the throbber should be animated", | ||
200 | 196 | FALSE, | ||
201 | 197 | flags)); | ||
202 | 198 | |||
203 | 199 | g_object_class_install_property (gobject_class, | ||
204 | 200 | PROP_STATIC_ICON_NAME, | ||
205 | 201 | g_param_spec_string ( | ||
206 | 202 | "static-icon-name", | ||
207 | 203 | "Static Icon Name", | ||
208 | 204 | "The name of an icon to be used as the static image", | ||
209 | 205 | NULL, | ||
210 | 206 | flags)); | ||
211 | 207 | |||
212 | 208 | g_object_class_install_property (gobject_class, | ||
213 | 209 | PROP_STATIC_PIXBUF, | ||
214 | 210 | g_param_spec_object ( | ||
215 | 211 | "static-pixbuf", | ||
216 | 212 | "Static Pixbuf", | ||
217 | 213 | "A GdkPixbuf to be used as the static image", | ||
218 | 214 | GDK_TYPE_PIXBUF, | ||
219 | 215 | G_PARAM_READWRITE)); | ||
220 | 216 | |||
221 | 217 | g_object_class_install_property (gobject_class, | ||
222 | 218 | PROP_STATIC_STOCK_ID, | ||
223 | 219 | g_param_spec_string ( | ||
224 | 220 | "static-stock-id", | ||
225 | 221 | "Static Stock ID", | ||
226 | 222 | "The stock ID of an icon to be used as the static image", | ||
227 | 223 | NULL, | ||
228 | 224 | flags)); | ||
229 | 225 | } | ||
230 | 226 | |||
231 | 227 | static void | ||
232 | 228 | katze_throbber_init (KatzeThrobber *throbber) | ||
233 | 229 | { | ||
234 | 230 | gtk_widget_set_has_window (GTK_WIDGET (throbber), FALSE); | ||
235 | 231 | |||
236 | 232 | throbber->timer_id = -1; | ||
237 | 233 | } | ||
238 | 234 | |||
239 | 235 | static void | ||
240 | 236 | katze_throbber_dispose (GObject* object) | ||
241 | 237 | { | ||
242 | 238 | KatzeThrobber* throbber = KATZE_THROBBER (object); | ||
243 | 239 | |||
244 | 240 | if (G_UNLIKELY (throbber->timer_id >= 0)) | ||
245 | 241 | g_source_remove (throbber->timer_id); | ||
246 | 242 | |||
247 | 243 | (*G_OBJECT_CLASS (katze_throbber_parent_class)->dispose) (object); | ||
248 | 244 | } | ||
249 | 245 | |||
250 | 246 | static void | ||
251 | 247 | #if GTK_CHECK_VERSION (3, 0, 0) | ||
252 | 248 | katze_throbber_destroy (GtkWidget* object) | ||
253 | 249 | #else | ||
254 | 250 | katze_throbber_destroy (GtkObject* object) | ||
255 | 251 | #endif | ||
256 | 252 | { | ||
257 | 253 | KatzeThrobber* throbber = KATZE_THROBBER (object); | ||
258 | 254 | |||
259 | 255 | katze_assign (throbber->icon_name, NULL); | ||
260 | 256 | katze_object_assign (throbber->pixbuf, NULL); | ||
261 | 257 | katze_assign (throbber->static_icon_name, NULL); | ||
262 | 258 | katze_object_assign (throbber->static_pixbuf, NULL); | ||
263 | 259 | katze_assign (throbber->static_stock_id, NULL); | ||
264 | 260 | #if GTK_CHECK_VERSION (3, 0, 0) | ||
265 | 261 | GTK_WIDGET_CLASS (katze_throbber_parent_class)->destroy (object); | ||
266 | 262 | #else | ||
267 | 263 | GTK_OBJECT_CLASS (katze_throbber_parent_class)->destroy (object); | ||
268 | 264 | #endif | ||
269 | 265 | } | ||
270 | 266 | |||
271 | 267 | static void | ||
272 | 268 | katze_throbber_set_property (GObject* object, | ||
273 | 269 | guint prop_id, | ||
274 | 270 | const GValue* value, | ||
275 | 271 | GParamSpec* pspec) | ||
276 | 272 | { | ||
277 | 273 | KatzeThrobber* throbber = KATZE_THROBBER (object); | ||
278 | 274 | |||
279 | 275 | switch (prop_id) | ||
280 | 276 | { | ||
281 | 277 | case PROP_ICON_SIZE: | ||
282 | 278 | katze_throbber_set_icon_size (throbber, g_value_get_int (value)); | ||
283 | 279 | break; | ||
284 | 280 | case PROP_ICON_NAME: | ||
285 | 281 | katze_throbber_set_icon_name (throbber, g_value_get_string (value)); | ||
286 | 282 | break; | ||
287 | 283 | case PROP_PIXBUF: | ||
288 | 284 | katze_throbber_set_pixbuf (throbber, g_value_get_object (value)); | ||
289 | 285 | break; | ||
290 | 286 | case PROP_ANIMATED: | ||
291 | 287 | katze_throbber_set_animated (throbber, g_value_get_boolean (value)); | ||
292 | 288 | break; | ||
293 | 289 | case PROP_STATIC_ICON_NAME: | ||
294 | 290 | katze_throbber_set_static_icon_name (throbber, g_value_get_string (value)); | ||
295 | 291 | break; | ||
296 | 292 | case PROP_STATIC_PIXBUF: | ||
297 | 293 | katze_throbber_set_static_pixbuf (throbber, g_value_get_object (value)); | ||
298 | 294 | break; | ||
299 | 295 | case PROP_STATIC_STOCK_ID: | ||
300 | 296 | katze_throbber_set_static_stock_id (throbber, g_value_get_string (value)); | ||
301 | 297 | break; | ||
302 | 298 | default: | ||
303 | 299 | G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); | ||
304 | 300 | break; | ||
305 | 301 | } | ||
306 | 302 | } | ||
307 | 303 | |||
308 | 304 | static void | ||
309 | 305 | katze_throbber_get_property (GObject* object, | ||
310 | 306 | guint prop_id, | ||
311 | 307 | GValue* value, | ||
312 | 308 | GParamSpec* pspec) | ||
313 | 309 | { | ||
314 | 310 | KatzeThrobber* throbber = KATZE_THROBBER (object); | ||
315 | 311 | |||
316 | 312 | switch (prop_id) | ||
317 | 313 | { | ||
318 | 314 | case PROP_ICON_SIZE: | ||
319 | 315 | g_value_set_int (value, katze_throbber_get_icon_size (throbber)); | ||
320 | 316 | break; | ||
321 | 317 | case PROP_ICON_NAME: | ||
322 | 318 | g_value_set_string (value, katze_throbber_get_icon_name (throbber)); | ||
323 | 319 | break; | ||
324 | 320 | case PROP_PIXBUF: | ||
325 | 321 | g_value_set_object (value, katze_throbber_get_pixbuf (throbber)); | ||
326 | 322 | break; | ||
327 | 323 | case PROP_ANIMATED: | ||
328 | 324 | g_value_set_boolean (value, katze_throbber_get_animated (throbber)); | ||
329 | 325 | break; | ||
330 | 326 | case PROP_STATIC_ICON_NAME: | ||
331 | 327 | g_value_set_string (value, katze_throbber_get_static_icon_name (throbber)); | ||
332 | 328 | break; | ||
333 | 329 | case PROP_STATIC_PIXBUF: | ||
334 | 330 | g_value_set_object (value, katze_throbber_get_static_pixbuf (throbber)); | ||
335 | 331 | break; | ||
336 | 332 | case PROP_STATIC_STOCK_ID: | ||
337 | 333 | g_value_set_string (value, katze_throbber_get_static_stock_id (throbber)); | ||
338 | 334 | break; | ||
339 | 335 | default: | ||
340 | 336 | G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); | ||
341 | 337 | break; | ||
342 | 338 | } | ||
343 | 339 | } | ||
344 | 340 | |||
345 | 341 | /** | ||
346 | 342 | * katze_throbber_new: | ||
347 | 343 | * | ||
348 | 344 | * Creates a new throbber widget. | ||
349 | 345 | * | ||
350 | 346 | * Return value: a new #KatzeThrobber | ||
351 | 347 | **/ | ||
352 | 348 | GtkWidget* | ||
353 | 349 | katze_throbber_new (void) | ||
354 | 350 | { | ||
355 | 351 | KatzeThrobber* throbber = g_object_new (KATZE_TYPE_THROBBER, | ||
356 | 352 | NULL); | ||
357 | 353 | |||
358 | 354 | return GTK_WIDGET (throbber); | ||
359 | 355 | } | ||
360 | 356 | |||
361 | 357 | /** | ||
362 | 358 | * katze_throbber_set_icon_size: | ||
363 | 359 | * @throbber: a #KatzeThrobber | ||
364 | 360 | * @icon_size: the new icon size | ||
365 | 361 | * | ||
366 | 362 | * Sets the desired size of the throbber image. The animation and static image | ||
367 | 363 | * will be displayed in this size. If a pixbuf is used for the animation every | ||
368 | 364 | * single frame is assumed to have this size. | ||
369 | 365 | **/ | ||
370 | 366 | void | ||
371 | 367 | katze_throbber_set_icon_size (KatzeThrobber* throbber, | ||
372 | 368 | GtkIconSize icon_size) | ||
373 | 369 | { | ||
374 | 370 | GtkSettings* gtk_settings; | ||
375 | 371 | |||
376 | 372 | g_return_if_fail (KATZE_IS_THROBBER (throbber)); | ||
377 | 373 | gtk_settings = gtk_widget_get_settings (GTK_WIDGET (throbber)); | ||
378 | 374 | g_return_if_fail (gtk_icon_size_lookup_for_settings (gtk_settings, | ||
379 | 375 | icon_size, | ||
380 | 376 | &throbber->width, | ||
381 | 377 | &throbber->height)); | ||
382 | 378 | |||
383 | 379 | throbber->icon_size = icon_size; | ||
384 | 380 | |||
385 | 381 | g_object_notify (G_OBJECT (throbber), "icon-size"); | ||
386 | 382 | |||
387 | 383 | gtk_widget_queue_draw (GTK_WIDGET (throbber)); | ||
388 | 384 | } | ||
389 | 385 | |||
390 | 386 | /** | ||
391 | 387 | * katze_throbber_set_icon_name: | ||
392 | 388 | * @throbber: a #KatzeThrobber | ||
393 | 389 | * @icon_name: an icon name or %NULL | ||
394 | 390 | * | ||
395 | 391 | * Sets the name of an icon that should provide the animation frames. | ||
396 | 392 | * | ||
397 | 393 | * The pixbuf is automatically invalidated. | ||
398 | 394 | **/ | ||
399 | 395 | void | ||
400 | 396 | katze_throbber_set_icon_name (KatzeThrobber* throbber, | ||
401 | 397 | const gchar* icon_name) | ||
402 | 398 | { | ||
403 | 399 | g_return_if_fail (KATZE_IS_THROBBER (throbber)); | ||
404 | 400 | |||
405 | 401 | katze_assign (throbber->icon_name, g_strdup (icon_name)); | ||
406 | 402 | |||
407 | 403 | if (icon_name) | ||
408 | 404 | icon_theme_changed (throbber); | ||
409 | 405 | |||
410 | 406 | g_object_notify (G_OBJECT (throbber), "icon-name"); | ||
411 | 407 | } | ||
412 | 408 | |||
413 | 409 | /** | ||
414 | 410 | * katze_throbber_set_pixbuf: | ||
415 | 411 | * @throbber: a #KatzeThrobber | ||
416 | 412 | * @pixbuf: a #GdkPixbuf or %NULL | ||
417 | 413 | * | ||
418 | 414 | * Sets the pixbuf that should provide the animation frames. Every frame | ||
419 | 415 | * is assumed to have the icon size of the throbber, which can be specified | ||
420 | 416 | * with katze_throbber_set_icon_size (). | ||
421 | 417 | * | ||
422 | 418 | * The icon name is automatically invalidated. | ||
423 | 419 | **/ | ||
424 | 420 | void | ||
425 | 421 | katze_throbber_set_pixbuf (KatzeThrobber* throbber, | ||
426 | 422 | GdkPixbuf* pixbuf) | ||
427 | 423 | { | ||
428 | 424 | g_return_if_fail (KATZE_IS_THROBBER (throbber)); | ||
429 | 425 | g_return_if_fail (!pixbuf || GDK_IS_PIXBUF (pixbuf)); | ||
430 | 426 | |||
431 | 427 | katze_object_assign (throbber->pixbuf, pixbuf); | ||
432 | 428 | |||
433 | 429 | g_object_freeze_notify (G_OBJECT (throbber)); | ||
434 | 430 | |||
435 | 431 | if (pixbuf) | ||
436 | 432 | { | ||
437 | 433 | g_object_ref (pixbuf); | ||
438 | 434 | |||
439 | 435 | katze_assign (throbber->icon_name, NULL); | ||
440 | 436 | g_object_notify (G_OBJECT (throbber), "icon-name"); | ||
441 | 437 | } | ||
442 | 438 | |||
443 | 439 | gtk_widget_queue_draw (GTK_WIDGET (throbber)); | ||
444 | 440 | |||
445 | 441 | g_object_notify (G_OBJECT (throbber), "pixbuf"); | ||
446 | 442 | g_object_thaw_notify (G_OBJECT (throbber)); | ||
447 | 443 | } | ||
448 | 444 | |||
449 | 445 | /** | ||
450 | 446 | * katze_throbber_set_animated: | ||
451 | 447 | * @throbber: a #KatzeThrobber | ||
452 | 448 | * @animated: %TRUE to animate the throbber | ||
453 | 449 | * | ||
454 | 450 | * Sets the animation state of the throbber. | ||
455 | 451 | **/ | ||
456 | 452 | void | ||
457 | 453 | katze_throbber_set_animated (KatzeThrobber* throbber, | ||
458 | 454 | gboolean animated) | ||
459 | 455 | { | ||
460 | 456 | g_return_if_fail (KATZE_IS_THROBBER (throbber)); | ||
461 | 457 | |||
462 | 458 | if (G_UNLIKELY (throbber->animated == animated)) | ||
463 | 459 | return; | ||
464 | 460 | |||
465 | 461 | throbber->animated = animated; | ||
466 | 462 | |||
467 | 463 | g_object_set (throbber, "active", animated, NULL); | ||
468 | 464 | gtk_widget_queue_draw (GTK_WIDGET (throbber)); | ||
469 | 465 | |||
470 | 466 | g_object_notify (G_OBJECT (throbber), "animated"); | ||
471 | 467 | } | ||
472 | 468 | |||
473 | 469 | /** | ||
474 | 470 | * katze_throbber_set_static_icon_name: | ||
475 | 471 | * @throbber: a #KatzeThrobber | ||
476 | 472 | * @icon_name: an icon name or %NULL | ||
477 | 473 | * | ||
478 | 474 | * Sets the name of an icon that should provide the static image. | ||
479 | 475 | * | ||
480 | 476 | * The static pixbuf and stock ID are automatically invalidated. | ||
481 | 477 | **/ | ||
482 | 478 | void | ||
483 | 479 | katze_throbber_set_static_icon_name (KatzeThrobber* throbber, | ||
484 | 480 | const gchar* icon_name) | ||
485 | 481 | { | ||
486 | 482 | g_return_if_fail (KATZE_IS_THROBBER (throbber)); | ||
487 | 483 | |||
488 | 484 | katze_assign (throbber->static_icon_name, g_strdup (icon_name)); | ||
489 | 485 | |||
490 | 486 | g_object_freeze_notify (G_OBJECT (throbber)); | ||
491 | 487 | |||
492 | 488 | if (icon_name) | ||
493 | 489 | { | ||
494 | 490 | katze_assign (throbber->static_stock_id, NULL); | ||
495 | 491 | |||
496 | 492 | icon_theme_changed (throbber); | ||
497 | 493 | |||
498 | 494 | g_object_notify (G_OBJECT (throbber), "static-pixbuf"); | ||
499 | 495 | g_object_notify (G_OBJECT (throbber), "static-stock-id"); | ||
500 | 496 | } | ||
501 | 497 | |||
502 | 498 | g_object_notify (G_OBJECT (throbber), "static-icon-name"); | ||
503 | 499 | g_object_thaw_notify (G_OBJECT (throbber)); | ||
504 | 500 | } | ||
505 | 501 | |||
506 | 502 | /** | ||
507 | 503 | * katze_throbber_set_static_pixbuf: | ||
508 | 504 | * @throbber: a #KatzeThrobber | ||
509 | 505 | * @pixbuf: a #GdkPixbuf or %NULL | ||
510 | 506 | * | ||
511 | 507 | * Sets the pixbuf that should provide the static image. The pixbuf is | ||
512 | 508 | * assumed to have the icon size of the throbber, which can be specified | ||
513 | 509 | * with katze_throbber_set_icon_size (). | ||
514 | 510 | * | ||
515 | 511 | * The static icon name and stock ID are automatically invalidated. | ||
516 | 512 | **/ | ||
517 | 513 | void | ||
518 | 514 | katze_throbber_set_static_pixbuf (KatzeThrobber* throbber, | ||
519 | 515 | GdkPixbuf* pixbuf) | ||
520 | 516 | { | ||
521 | 517 | g_return_if_fail (KATZE_IS_THROBBER (throbber)); | ||
522 | 518 | g_return_if_fail (pixbuf == NULL || GDK_IS_PIXBUF (pixbuf)); | ||
523 | 519 | |||
524 | 520 | katze_object_assign (throbber->static_pixbuf, pixbuf); | ||
525 | 521 | |||
526 | 522 | g_object_freeze_notify (G_OBJECT (throbber)); | ||
527 | 523 | |||
528 | 524 | if (pixbuf) | ||
529 | 525 | { | ||
530 | 526 | g_object_ref (pixbuf); | ||
531 | 527 | |||
532 | 528 | katze_assign (throbber->static_icon_name, NULL); | ||
533 | 529 | katze_assign (throbber->static_stock_id, NULL); | ||
534 | 530 | |||
535 | 531 | gtk_widget_queue_draw (GTK_WIDGET (throbber)); | ||
536 | 532 | |||
537 | 533 | g_object_notify (G_OBJECT (throbber), "static-icon-name"); | ||
538 | 534 | g_object_notify (G_OBJECT (throbber), "static-stock-id"); | ||
539 | 535 | } | ||
540 | 536 | |||
541 | 537 | g_object_notify (G_OBJECT (throbber), "static-pixbuf"); | ||
542 | 538 | g_object_thaw_notify (G_OBJECT (throbber)); | ||
543 | 539 | } | ||
544 | 540 | |||
545 | 541 | /** | ||
546 | 542 | * katze_throbber_set_static_stock_id: | ||
547 | 543 | * @throbber: a #KatzeThrobber | ||
548 | 544 | * @stock_id: a stock ID or %NULL | ||
549 | 545 | * | ||
550 | 546 | * Sets the stock ID of an icon that should provide the static image. | ||
551 | 547 | * | ||
552 | 548 | * The static icon name and pixbuf are automatically invalidated. | ||
553 | 549 | **/ | ||
554 | 550 | void | ||
555 | 551 | katze_throbber_set_static_stock_id (KatzeThrobber* throbber, | ||
556 | 552 | const gchar* stock_id) | ||
557 | 553 | { | ||
558 | 554 | g_return_if_fail (KATZE_IS_THROBBER (throbber)); | ||
559 | 555 | |||
560 | 556 | g_object_freeze_notify (G_OBJECT (throbber)); | ||
561 | 557 | |||
562 | 558 | if (stock_id) | ||
563 | 559 | { | ||
564 | 560 | GtkStockItem stock_item; | ||
565 | 561 | g_return_if_fail (gtk_stock_lookup (stock_id, &stock_item)); | ||
566 | 562 | |||
567 | 563 | g_object_notify (G_OBJECT (throbber), "static-icon-name"); | ||
568 | 564 | g_object_notify (G_OBJECT (throbber), "static-pixbuf"); | ||
569 | 565 | } | ||
570 | 566 | |||
571 | 567 | katze_assign (throbber->static_stock_id, g_strdup (stock_id)); | ||
572 | 568 | |||
573 | 569 | if (stock_id) | ||
574 | 570 | icon_theme_changed (throbber); | ||
575 | 571 | |||
576 | 572 | g_object_notify (G_OBJECT (throbber), "static-stock-id"); | ||
577 | 573 | g_object_thaw_notify (G_OBJECT (throbber)); | ||
578 | 574 | } | ||
579 | 575 | |||
580 | 576 | /** | ||
581 | 577 | * katze_throbber_get_icon_size: | ||
582 | 578 | * @throbber: a #KatzeThrobber | ||
583 | 579 | * | ||
584 | 580 | * Retrieves the size of the throbber. | ||
585 | 581 | * | ||
586 | 582 | * Return value: the size of the throbber | ||
587 | 583 | **/ | ||
588 | 584 | GtkIconSize | ||
589 | 585 | katze_throbber_get_icon_size (KatzeThrobber* throbber) | ||
590 | 586 | { | ||
591 | 587 | g_return_val_if_fail (KATZE_IS_THROBBER (throbber), GTK_ICON_SIZE_INVALID); | ||
592 | 588 | |||
593 | 589 | return throbber->icon_size; | ||
594 | 590 | } | ||
595 | 591 | |||
596 | 592 | /** | ||
597 | 593 | * katze_throbber_get_icon_name: | ||
598 | 594 | * @throbber: a #KatzeThrobber | ||
599 | 595 | * | ||
600 | 596 | * Retrieves the name of the icon providing the animation frames. | ||
601 | 597 | * | ||
602 | 598 | * Return value: the name of the icon providing the animation frames, or %NULL | ||
603 | 599 | **/ | ||
604 | 600 | const gchar* | ||
605 | 601 | katze_throbber_get_icon_name (KatzeThrobber* throbber) | ||
606 | 602 | { | ||
607 | 603 | g_return_val_if_fail (KATZE_IS_THROBBER (throbber), NULL); | ||
608 | 604 | |||
609 | 605 | return throbber->icon_name; | ||
610 | 606 | } | ||
611 | 607 | |||
612 | 608 | /** | ||
613 | 609 | * katze_throbber_get_pixbuf: | ||
614 | 610 | * @throbber: a #KatzeThrobber | ||
615 | 611 | * | ||
616 | 612 | * Retrieves the #GdkPixbuf providing the animation frames if an icon name | ||
617 | 613 | * or pixbuf is available. The caller of this function does not own a | ||
618 | 614 | * reference to the returned pixbuf. | ||
619 | 615 | * | ||
620 | 616 | * Return value: the pixbuf providing the animation frames, or %NULL | ||
621 | 617 | **/ | ||
622 | 618 | GdkPixbuf* | ||
623 | 619 | katze_throbber_get_pixbuf (KatzeThrobber* throbber) | ||
624 | 620 | { | ||
625 | 621 | g_return_val_if_fail (KATZE_IS_THROBBER (throbber), NULL); | ||
626 | 622 | |||
627 | 623 | return throbber->pixbuf; | ||
628 | 624 | } | ||
629 | 625 | |||
630 | 626 | /** | ||
631 | 627 | * katze_throbber_get_animated: | ||
632 | 628 | * @throbber: a #KatzeThrobber | ||
633 | 629 | * | ||
634 | 630 | * Retrieves the status of the animation, whcih can be animated or static. | ||
635 | 631 | * | ||
636 | 632 | * Return value: %TRUE if the throbber is animated | ||
637 | 633 | **/ | ||
638 | 634 | gboolean | ||
639 | 635 | katze_throbber_get_animated (KatzeThrobber* throbber) | ||
640 | 636 | { | ||
641 | 637 | g_return_val_if_fail (KATZE_IS_THROBBER (throbber), FALSE); | ||
642 | 638 | |||
643 | 639 | return throbber->animated; | ||
644 | 640 | } | ||
645 | 641 | |||
646 | 642 | /** | ||
647 | 643 | * katze_throbber_get_static_icon_name: | ||
648 | 644 | * @throbber: a #KatzeThrobber | ||
649 | 645 | * | ||
650 | 646 | * Retrieves the name of the icon providing the static image, if an icon name | ||
651 | 647 | * for the static image was specified. | ||
652 | 648 | * | ||
653 | 649 | * Return value: the name of the icon providing the static image, or %NULL | ||
654 | 650 | **/ | ||
655 | 651 | const gchar* | ||
656 | 652 | katze_throbber_get_static_icon_name (KatzeThrobber* throbber) | ||
657 | 653 | { | ||
658 | 654 | g_return_val_if_fail (KATZE_IS_THROBBER (throbber), NULL); | ||
659 | 655 | |||
660 | 656 | return throbber->static_icon_name; | ||
661 | 657 | } | ||
662 | 658 | |||
663 | 659 | /** | ||
664 | 660 | * katze_throbber_get_static pixbuf: | ||
665 | 661 | * @throbber: a #KatzeThrobber | ||
666 | 662 | * | ||
667 | 663 | * Retrieves the #GdkPixbuf providing the static image, if an icon name, a | ||
668 | 664 | * pixbuf or a stock ID for the static image was specified. The caller of this | ||
669 | 665 | * function does not own a reference to the returned pixbuf. | ||
670 | 666 | * | ||
671 | 667 | * Return value: the pixbuf providing the static image, or %NULL | ||
672 | 668 | **/ | ||
673 | 669 | GdkPixbuf* | ||
674 | 670 | katze_throbber_get_static_pixbuf (KatzeThrobber* throbber) | ||
675 | 671 | { | ||
676 | 672 | g_return_val_if_fail (KATZE_IS_THROBBER (throbber), NULL); | ||
677 | 673 | |||
678 | 674 | return throbber->static_pixbuf; | ||
679 | 675 | } | ||
680 | 676 | |||
681 | 677 | /** | ||
682 | 678 | * katze_throbber_get_static_stock_id: | ||
683 | 679 | * @throbber: a #KatzeThrobber | ||
684 | 680 | * | ||
685 | 681 | * Retrieves the stock ID of the icon providing the static image, if a | ||
686 | 682 | * stock ID for the static image was specified. | ||
687 | 683 | * | ||
688 | 684 | * Return value: the stock ID of the icon providing the static image, or %NULL | ||
689 | 685 | **/ | ||
690 | 686 | const gchar* | ||
691 | 687 | katze_throbber_get_static_stock_id (KatzeThrobber* throbber) | ||
692 | 688 | { | ||
693 | 689 | g_return_val_if_fail (KATZE_IS_THROBBER (throbber), NULL); | ||
694 | 690 | |||
695 | 691 | return throbber->static_stock_id; | ||
696 | 692 | } | ||
697 | 693 | |||
698 | 694 | static void | ||
699 | 695 | katze_throbber_realize (GtkWidget* widget) | ||
700 | 696 | { | ||
701 | 697 | (*GTK_WIDGET_CLASS (katze_throbber_parent_class)->realize) (widget); | ||
702 | 698 | |||
703 | 699 | icon_theme_changed (KATZE_THROBBER (widget)); | ||
704 | 700 | } | ||
705 | 701 | |||
706 | 702 | static void | ||
707 | 703 | katze_throbber_unrealize (GtkWidget* widget) | ||
708 | 704 | { | ||
709 | 705 | if (GTK_WIDGET_CLASS (katze_throbber_parent_class)->unrealize) | ||
710 | 706 | GTK_WIDGET_CLASS (katze_throbber_parent_class)->unrealize (widget); | ||
711 | 707 | } | ||
712 | 708 | |||
713 | 709 | static void | ||
714 | 710 | pixbuf_assign_icon (GdkPixbuf** pixbuf, | ||
715 | 711 | const gchar* icon_name, | ||
716 | 712 | KatzeThrobber* throbber) | ||
717 | 713 | { | ||
718 | 714 | GdkScreen* screen; | ||
719 | 715 | GtkIconTheme* icon_theme; | ||
720 | 716 | |||
721 | 717 | if (*pixbuf) | ||
722 | 718 | g_object_unref (*pixbuf); | ||
723 | 719 | |||
724 | 720 | screen = gtk_widget_get_screen (GTK_WIDGET (throbber)); | ||
725 | 721 | icon_theme = gtk_icon_theme_get_for_screen (screen); | ||
726 | 722 | *pixbuf = gtk_icon_theme_load_icon (icon_theme, | ||
727 | 723 | icon_name, | ||
728 | 724 | MAX (throbber->width, throbber->height), | ||
729 | 725 | (GtkIconLookupFlags) 0, | ||
730 | 726 | NULL); | ||
731 | 727 | } | ||
732 | 728 | |||
733 | 729 | static void | ||
734 | 730 | icon_theme_changed (KatzeThrobber* throbber) | ||
735 | 731 | { | ||
736 | 732 | if (throbber->icon_name) | ||
737 | 733 | pixbuf_assign_icon (&throbber->pixbuf, | ||
738 | 734 | throbber->icon_name, throbber); | ||
739 | 735 | |||
740 | 736 | if (throbber->static_icon_name) | ||
741 | 737 | pixbuf_assign_icon (&throbber->static_pixbuf, | ||
742 | 738 | throbber->static_icon_name, throbber); | ||
743 | 739 | else if (throbber->static_stock_id) | ||
744 | 740 | katze_object_assign (throbber->static_pixbuf, | ||
745 | 741 | gtk_widget_render_icon (GTK_WIDGET (throbber), | ||
746 | 742 | throbber->static_stock_id, | ||
747 | 743 | throbber->icon_size, | ||
748 | 744 | NULL)); | ||
749 | 745 | |||
750 | 746 | g_object_freeze_notify (G_OBJECT (throbber)); | ||
751 | 747 | g_object_notify (G_OBJECT (throbber), "pixbuf"); | ||
752 | 748 | g_object_notify (G_OBJECT (throbber), "static-pixbuf"); | ||
753 | 749 | g_object_thaw_notify (G_OBJECT (throbber)); | ||
754 | 750 | |||
755 | 751 | gtk_widget_queue_draw (GTK_WIDGET (throbber)); | ||
756 | 752 | } | ||
757 | 753 | |||
758 | 754 | static void | ||
759 | 755 | katze_throbber_map (GtkWidget* widget) | ||
760 | 756 | { | ||
761 | 757 | (*GTK_WIDGET_CLASS (katze_throbber_parent_class)->map) (widget); | ||
762 | 758 | } | ||
763 | 759 | |||
764 | 760 | static void | ||
765 | 761 | katze_throbber_unmap (GtkWidget* widget) | ||
766 | 762 | { | ||
767 | 763 | if (GTK_WIDGET_CLASS (katze_throbber_parent_class)->unmap) | ||
768 | 764 | GTK_WIDGET_CLASS (katze_throbber_parent_class)->unmap (widget); | ||
769 | 765 | } | ||
770 | 766 | |||
771 | 767 | static void | ||
772 | 768 | katze_throbber_style_set (GtkWidget* widget, | ||
773 | 769 | GtkStyle* prev_style) | ||
774 | 770 | { | ||
775 | 771 | if (GTK_WIDGET_CLASS (katze_throbber_parent_class)->style_set) | ||
776 | 772 | GTK_WIDGET_CLASS (katze_throbber_parent_class)->style_set (widget, | ||
777 | 773 | prev_style); | ||
778 | 774 | |||
779 | 775 | icon_theme_changed (KATZE_THROBBER (widget)); | ||
780 | 776 | } | ||
781 | 777 | |||
782 | 778 | static void | ||
783 | 779 | katze_throbber_screen_changed (GtkWidget* widget, | ||
784 | 780 | GdkScreen* prev_screen) | ||
785 | 781 | { | ||
786 | 782 | if (GTK_WIDGET_CLASS (katze_throbber_parent_class)->screen_changed) | ||
787 | 783 | GTK_WIDGET_CLASS (katze_throbber_parent_class)->screen_changed ( | ||
788 | 784 | widget, | ||
789 | 785 | prev_screen); | ||
790 | 786 | |||
791 | 787 | icon_theme_changed (KATZE_THROBBER (widget)); | ||
792 | 788 | } | ||
793 | 789 | |||
794 | 790 | static void | ||
795 | 791 | katze_throbber_size_request (GtkWidget* widget, | ||
796 | 792 | GtkRequisition* requisition) | ||
797 | 793 | { | ||
798 | 794 | KatzeThrobber* throbber = KATZE_THROBBER (widget); | ||
799 | 795 | |||
800 | 796 | requisition->width = throbber->width; | ||
801 | 797 | requisition->height = throbber->height; | ||
802 | 798 | #if !GTK_CHECK_VERSION (3, 0, 0) | ||
803 | 799 | GTK_WIDGET_CLASS (katze_throbber_parent_class)->size_request (widget, | ||
804 | 800 | requisition); | ||
805 | 801 | #endif | ||
806 | 802 | } | ||
807 | 803 | |||
808 | 804 | #if GTK_CHECK_VERSION (3, 0, 0) | ||
809 | 805 | static void | ||
810 | 806 | katze_throbber_get_preferred_height (GtkWidget *widget, | ||
811 | 807 | gint *minimal_height, | ||
812 | 808 | gint *natural_height) | ||
813 | 809 | { | ||
814 | 810 | GtkRequisition requisition; | ||
815 | 811 | |||
816 | 812 | katze_throbber_size_request (widget, &requisition); | ||
817 | 813 | |||
818 | 814 | *minimal_height = *natural_height = requisition.height; | ||
819 | 815 | } | ||
820 | 816 | |||
821 | 817 | static void | ||
822 | 818 | katze_throbber_get_preferred_width (GtkWidget *widget, | ||
823 | 819 | gint *minimal_width, | ||
824 | 820 | gint *natural_width) | ||
825 | 821 | { | ||
826 | 822 | GtkRequisition requisition; | ||
827 | 823 | |||
828 | 824 | katze_throbber_size_request (widget, &requisition); | ||
829 | 825 | |||
830 | 826 | *minimal_width = *natural_width = requisition.width; | ||
831 | 827 | } | ||
832 | 828 | #endif | ||
833 | 829 | |||
834 | 830 | static void | ||
835 | 831 | katze_throbber_aligned_coords (GtkWidget* widget, | ||
836 | 832 | gint* ax, | ||
837 | 833 | gint* ay) | ||
838 | 834 | { | ||
839 | 835 | gfloat xalign, yalign; | ||
840 | 836 | gint xpad, ypad; | ||
841 | 837 | GtkAllocation allocation; | ||
842 | 838 | GtkRequisition requisition; | ||
843 | 839 | |||
844 | 840 | xalign = 0.0; | ||
845 | 841 | yalign = 0.5; | ||
846 | 842 | xpad = ypad = 0.0; | ||
847 | 843 | |||
848 | 844 | #if GTK_CHECK_VERSION (3, 0, 0) | ||
849 | 845 | allocation.x = allocation.y = 0; | ||
850 | 846 | allocation.width = gtk_widget_get_allocated_width (widget); | ||
851 | 847 | allocation.height = gtk_widget_get_allocated_height (widget); | ||
852 | 848 | gtk_widget_get_preferred_size (widget, &requisition, NULL); | ||
853 | 849 | #else | ||
854 | 850 | gtk_widget_get_allocation (widget, &allocation); | ||
855 | 851 | gtk_widget_size_request (widget, &requisition); | ||
856 | 852 | #endif | ||
857 | 853 | *ax = floor (allocation.x + xpad | ||
858 | 854 | + ((allocation.width - requisition.width) * xalign)); | ||
859 | 855 | *ay = floor (allocation.y + ypad | ||
860 | 856 | + ((allocation.height - requisition.height) * yalign)); | ||
861 | 857 | } | ||
862 | 858 | |||
863 | 859 | static gboolean | ||
864 | 860 | katze_throbber_expose_event (GtkWidget* widget, | ||
865 | 861 | #if GTK_CHECK_VERSION (3, 0, 0) | ||
866 | 862 | cairo_t* cr) | ||
867 | 863 | #else | ||
868 | 864 | GdkEventExpose* event) | ||
869 | 865 | #endif | ||
870 | 866 | { | ||
871 | 867 | KatzeThrobber* throbber = KATZE_THROBBER (widget); | ||
872 | 868 | gint ax, ay; | ||
873 | 869 | |||
874 | 870 | if (G_UNLIKELY (!throbber->width || !throbber->height)) | ||
875 | 871 | return TRUE; | ||
876 | 872 | |||
877 | 873 | if (G_UNLIKELY (!throbber->pixbuf && !throbber->static_pixbuf)) | ||
878 | 874 | if (throbber->animated && !throbber->pixbuf && !throbber->icon_name) | ||
879 | 875 | return TRUE; | ||
880 | 876 | |||
881 | 877 | if (!throbber->animated && (throbber->static_pixbuf | ||
882 | 878 | || throbber->static_icon_name || throbber->static_stock_id)) | ||
883 | 879 | { | ||
884 | 880 | #if !GTK_CHECK_VERSION (3, 0, 0) | ||
885 | 881 | cairo_t* cr; | ||
886 | 882 | #endif | ||
887 | 883 | if (G_UNLIKELY (!throbber->static_pixbuf && throbber->static_icon_name)) | ||
888 | 884 | { | ||
889 | 885 | icon_theme_changed (KATZE_THROBBER (widget)); | ||
890 | 886 | |||
891 | 887 | if (!throbber->static_pixbuf) | ||
892 | 888 | { | ||
893 | 889 | g_warning (_("Named icon '%s' couldn't be loaded"), | ||
894 | 890 | throbber->static_icon_name); | ||
895 | 891 | katze_assign (throbber->static_icon_name, NULL); | ||
896 | 892 | g_object_notify (G_OBJECT (throbber), "static-icon-name"); | ||
897 | 893 | return TRUE; | ||
898 | 894 | } | ||
899 | 895 | } | ||
900 | 896 | else if (G_UNLIKELY (!throbber->static_pixbuf && throbber->static_stock_id)) | ||
901 | 897 | { | ||
902 | 898 | icon_theme_changed (KATZE_THROBBER (widget)); | ||
903 | 899 | |||
904 | 900 | if (!throbber->static_pixbuf) | ||
905 | 901 | { | ||
906 | 902 | g_warning (_("Stock icon '%s' couldn't be loaded"), | ||
907 | 903 | throbber->static_stock_id); | ||
908 | 904 | katze_assign (throbber->static_stock_id, NULL); | ||
909 | 905 | g_object_notify (G_OBJECT (throbber), "static-stock-id"); | ||
910 | 906 | return TRUE; | ||
911 | 907 | } | ||
912 | 908 | } | ||
913 | 909 | |||
914 | 910 | katze_throbber_aligned_coords (widget, &ax, &ay); | ||
915 | 911 | |||
916 | 912 | #if !GTK_CHECK_VERSION (3, 0, 0) | ||
917 | 913 | cr = gdk_cairo_create (gtk_widget_get_window (widget)); | ||
918 | 914 | #endif | ||
919 | 915 | gdk_cairo_set_source_pixbuf (cr, throbber->static_pixbuf, ax, ay); | ||
920 | 916 | cairo_paint (cr); | ||
921 | 917 | #if !GTK_CHECK_VERSION (3, 0, 0) | ||
922 | 918 | cairo_destroy (cr); | ||
923 | 919 | #endif | ||
924 | 920 | } | ||
925 | 921 | else | ||
926 | 922 | { | ||
927 | 923 | if (throbber->animated) | ||
928 | 924 | #if GTK_CHECK_VERSION (3, 0, 0) | ||
929 | 925 | return GTK_WIDGET_CLASS (katze_throbber_parent_class)->draw (widget, cr); | ||
930 | 926 | #else | ||
931 | 927 | return GTK_WIDGET_CLASS (katze_throbber_parent_class)->expose_event (widget, event); | ||
932 | 928 | #endif | ||
933 | 929 | } | ||
934 | 930 | |||
935 | 931 | return TRUE; | ||
936 | 932 | } | ||
937 | 933 | 0 | ||
938 | === removed file 'katze/katze-throbber.h' | |||
939 | --- katze/katze-throbber.h 2010-05-02 14:11:18 +0000 | |||
940 | +++ katze/katze-throbber.h 1970-01-01 00:00:00 +0000 | |||
941 | @@ -1,94 +0,0 @@ | |||
942 | 1 | /* | ||
943 | 2 | Copyright (C) 2007 Christian Dywan <christian@twotoasts.de> | ||
944 | 3 | |||
945 | 4 | This library is free software; you can redistribute it and/or | ||
946 | 5 | modify it under the terms of the GNU Lesser General Public | ||
947 | 6 | License as published by the Free Software Foundation; either | ||
948 | 7 | version 2.1 of the License, or (at your option) any later version. | ||
949 | 8 | |||
950 | 9 | See the file COPYING for the full license text. | ||
951 | 10 | */ | ||
952 | 11 | |||
953 | 12 | #ifndef __KATZE_THROBBER_H__ | ||
954 | 13 | #define __KATZE_THROBBER_H__ | ||
955 | 14 | |||
956 | 15 | #include <gtk/gtk.h> | ||
957 | 16 | |||
958 | 17 | G_BEGIN_DECLS | ||
959 | 18 | |||
960 | 19 | #define KATZE_TYPE_THROBBER \ | ||
961 | 20 | (katze_throbber_get_type ()) | ||
962 | 21 | #define KATZE_THROBBER(obj) \ | ||
963 | 22 | (G_TYPE_CHECK_INSTANCE_CAST ((obj), KATZE_TYPE_THROBBER, KatzeThrobber)) | ||
964 | 23 | #define KATZE_THROBBER_CLASS(klass) \ | ||
965 | 24 | (G_TYPE_CHECK_CLASS_CAST ((klass), KATZE_TYPE_THROBBER, KatzeThrobberClass)) | ||
966 | 25 | #define KATZE_IS_THROBBER(obj) \ | ||
967 | 26 | (G_TYPE_CHECK_INSTANCE_TYPE ((obj), KATZE_TYPE_THROBBER)) | ||
968 | 27 | #define KATZE_IS_THROBBER_CLASS(klass) \ | ||
969 | 28 | (G_TYPE_CHECK_CLASS_TYPE ((klass), KATZE_TYPE_THROBBER)) | ||
970 | 29 | #define KATZE_THROBBER_GET_CLASS(obj) \ | ||
971 | 30 | (G_TYPE_INSTANCE_GET_CLASS ((obj), KATZE_TYPE_THROBBER, KatzeThrobberClass)) | ||
972 | 31 | |||
973 | 32 | typedef struct _KatzeThrobber KatzeThrobber; | ||
974 | 33 | typedef struct _KatzeThrobberPrivate KatzeThrobberPrivate; | ||
975 | 34 | typedef struct _KatzeThrobberClass KatzeThrobberClass; | ||
976 | 35 | |||
977 | 36 | |||
978 | 37 | GType | ||
979 | 38 | katze_throbber_get_type (void) G_GNUC_CONST; | ||
980 | 39 | |||
981 | 40 | GtkWidget* | ||
982 | 41 | katze_throbber_new (void); | ||
983 | 42 | |||
984 | 43 | void | ||
985 | 44 | katze_throbber_set_icon_size (KatzeThrobber* throbber, | ||
986 | 45 | GtkIconSize icon_size); | ||
987 | 46 | |||
988 | 47 | void | ||
989 | 48 | katze_throbber_set_icon_name (KatzeThrobber* throbber, | ||
990 | 49 | const gchar* icon_size); | ||
991 | 50 | |||
992 | 51 | void | ||
993 | 52 | katze_throbber_set_pixbuf (KatzeThrobber* throbber, | ||
994 | 53 | GdkPixbuf* pixbuf); | ||
995 | 54 | |||
996 | 55 | void | ||
997 | 56 | katze_throbber_set_animated (KatzeThrobber* throbber, | ||
998 | 57 | gboolean animated); | ||
999 | 58 | |||
1000 | 59 | void | ||
1001 | 60 | katze_throbber_set_static_icon_name (KatzeThrobber* throbber, | ||
1002 | 61 | const gchar* icon_name); | ||
1003 | 62 | |||
1004 | 63 | void | ||
1005 | 64 | katze_throbber_set_static_pixbuf (KatzeThrobber* throbber, | ||
1006 | 65 | GdkPixbuf* pixbuf); | ||
1007 | 66 | |||
1008 | 67 | void | ||
1009 | 68 | katze_throbber_set_static_stock_id (KatzeThrobber* throbber, | ||
1010 | 69 | const gchar* stock_id); | ||
1011 | 70 | |||
1012 | 71 | GtkIconSize | ||
1013 | 72 | katze_throbber_get_icon_size (KatzeThrobber* throbber); | ||
1014 | 73 | |||
1015 | 74 | const gchar* | ||
1016 | 75 | katze_throbber_get_icon_name (KatzeThrobber* throbber); | ||
1017 | 76 | |||
1018 | 77 | GdkPixbuf* | ||
1019 | 78 | katze_throbber_get_pixbuf (KatzeThrobber* throbber); | ||
1020 | 79 | |||
1021 | 80 | gboolean | ||
1022 | 81 | katze_throbber_get_animated (KatzeThrobber* throbber); | ||
1023 | 82 | |||
1024 | 83 | const gchar* | ||
1025 | 84 | katze_throbber_get_static_icon_name (KatzeThrobber *throbber); | ||
1026 | 85 | |||
1027 | 86 | GdkPixbuf* | ||
1028 | 87 | katze_throbber_get_static_pixbuf (KatzeThrobber* throbber); | ||
1029 | 88 | |||
1030 | 89 | const gchar* | ||
1031 | 90 | katze_throbber_get_static_stock_id (KatzeThrobber* throbber); | ||
1032 | 91 | |||
1033 | 92 | G_END_DECLS | ||
1034 | 93 | |||
1035 | 94 | #endif /* __KATZE_THROBBER_H__ */ | ||
1036 | 95 | 0 | ||
1037 | === modified file 'katze/katze.h' | |||
1038 | --- katze/katze.h 2013-07-30 21:00:46 +0000 | |||
1039 | +++ katze/katze.h 2013-12-05 00:25:31 +0000 | |||
1040 | @@ -13,7 +13,6 @@ | |||
1041 | 13 | #define __KATZE_H__ | 13 | #define __KATZE_H__ |
1042 | 14 | 14 | ||
1043 | 15 | #include "katze-http-auth.h" | 15 | #include "katze-http-auth.h" |
1044 | 16 | #include "katze-throbber.h" | ||
1045 | 17 | #include "katze-utils.h" | 16 | #include "katze-utils.h" |
1046 | 18 | #include "katze-item.h" | 17 | #include "katze-item.h" |
1047 | 19 | #include "katze-array.h" | 18 | #include "katze-array.h" |
1048 | 20 | 19 | ||
1049 | === modified file 'midori/midori-browser.c' | |||
1050 | --- midori/midori-browser.c 2013-11-27 09:47:37 +0000 | |||
1051 | +++ midori/midori-browser.c 2013-12-05 00:25:31 +0000 | |||
1052 | @@ -82,7 +82,6 @@ | |||
1053 | 82 | 82 | ||
1054 | 83 | gint last_window_width, last_window_height; | 83 | gint last_window_width, last_window_height; |
1055 | 84 | guint alloc_timeout; | 84 | guint alloc_timeout; |
1056 | 85 | gint last_tab_size; | ||
1057 | 86 | guint panel_timeout; | 85 | guint panel_timeout; |
1058 | 87 | 86 | ||
1059 | 88 | MidoriWebSettings* settings; | 87 | MidoriWebSettings* settings; |
1060 | @@ -202,11 +201,6 @@ | |||
1061 | 202 | midori_browser_add_speed_dial (MidoriBrowser* browser); | 201 | midori_browser_add_speed_dial (MidoriBrowser* browser); |
1062 | 203 | 202 | ||
1063 | 204 | static void | 203 | static void |
1064 | 205 | midori_browser_notebook_size_allocate_cb (GtkWidget* notebook, | ||
1065 | 206 | GdkRectangle* allocation, | ||
1066 | 207 | MidoriBrowser* browser); | ||
1067 | 208 | |||
1068 | 209 | static void | ||
1069 | 210 | midori_browser_step_history (MidoriBrowser* browser, | 204 | midori_browser_step_history (MidoriBrowser* browser, |
1070 | 211 | MidoriView* view); | 205 | MidoriView* view); |
1071 | 212 | 206 | ||
1072 | @@ -220,6 +214,10 @@ | |||
1073 | 220 | gtk_toggle_action_set_active (GTK_TOGGLE_ACTION ( \ | 214 | gtk_toggle_action_set_active (GTK_TOGGLE_ACTION ( \ |
1074 | 221 | _action_by_name (brwsr, nme)), actv); | 215 | _action_by_name (brwsr, nme)), actv); |
1075 | 222 | 216 | ||
1076 | 217 | static void | ||
1077 | 218 | midori_browser_disconnect_tab (MidoriBrowser* browser, | ||
1078 | 219 | MidoriView* view); | ||
1079 | 220 | |||
1080 | 223 | static gboolean | 221 | static gboolean |
1081 | 224 | midori_browser_is_fullscreen (MidoriBrowser* browser) | 222 | midori_browser_is_fullscreen (MidoriBrowser* browser) |
1082 | 225 | { | 223 | { |
1083 | @@ -236,15 +234,7 @@ | |||
1084 | 236 | gboolean show_tabs = !midori_browser_is_fullscreen (browser) || ignore_fullscreen; | 234 | gboolean show_tabs = !midori_browser_is_fullscreen (browser) || ignore_fullscreen; |
1085 | 237 | if (!browser->show_tabs) | 235 | if (!browser->show_tabs) |
1086 | 238 | show_tabs = FALSE; | 236 | show_tabs = FALSE; |
1096 | 239 | #ifdef HAVE_GRANITE | 237 | midori_notebook_set_labels_visible (MIDORI_NOTEBOOK (browser->notebook), show_tabs); |
1088 | 240 | granite_widgets_dynamic_notebook_set_show_tabs ( | ||
1089 | 241 | GRANITE_WIDGETS_DYNAMIC_NOTEBOOK (browser->notebook), show_tabs); | ||
1090 | 242 | #else | ||
1091 | 243 | if (!(has_tabs || katze_object_get_boolean (browser->settings, "always-show-tabbar"))) | ||
1092 | 244 | show_tabs = FALSE; | ||
1093 | 245 | gtk_notebook_set_show_tabs (GTK_NOTEBOOK (browser->notebook), show_tabs); | ||
1094 | 246 | gtk_notebook_set_show_border (GTK_NOTEBOOK (browser->notebook), show_tabs); | ||
1095 | 247 | #endif | ||
1097 | 248 | return has_tabs; | 238 | return has_tabs; |
1098 | 249 | } | 239 | } |
1099 | 250 | 240 | ||
1100 | @@ -451,8 +441,7 @@ | |||
1101 | 451 | "tooltip", _("Stop loading the current page"), NULL); | 441 | "tooltip", _("Stop loading the current page"), NULL); |
1102 | 452 | } | 442 | } |
1103 | 453 | 443 | ||
1106 | 454 | gtk_widget_set_sensitive (browser->throbber, loading); | 444 | g_object_set (browser->throbber, "active", loading, "visible", loading, NULL); |
1105 | 455 | katze_throbber_set_animated (KATZE_THROBBER (browser->throbber), loading); | ||
1107 | 456 | } | 445 | } |
1108 | 457 | 446 | ||
1109 | 458 | /** | 447 | /** |
1110 | @@ -782,23 +771,6 @@ | |||
1111 | 782 | } | 771 | } |
1112 | 783 | 772 | ||
1113 | 784 | static void | 773 | static void |
1114 | 785 | midori_view_notify_minimized_cb (GtkWidget* widget, | ||
1115 | 786 | GParamSpec* pspec, | ||
1116 | 787 | MidoriBrowser* browser) | ||
1117 | 788 | { | ||
1118 | 789 | if (katze_object_get_boolean (widget, "minimized")) | ||
1119 | 790 | { | ||
1120 | 791 | #ifndef HAVE_GRANITE | ||
1121 | 792 | GtkNotebook* notebook = GTK_NOTEBOOK (browser->notebook); | ||
1122 | 793 | GtkWidget* label = gtk_notebook_get_tab_label (notebook, widget); | ||
1123 | 794 | gtk_widget_set_size_request (label, -1, -1); | ||
1124 | 795 | #endif | ||
1125 | 796 | } | ||
1126 | 797 | else | ||
1127 | 798 | midori_browser_notebook_size_allocate_cb (NULL, NULL, browser); | ||
1128 | 799 | } | ||
1129 | 800 | |||
1130 | 801 | static void | ||
1131 | 802 | midori_view_notify_zoom_level_cb (GtkWidget* view, | 774 | midori_view_notify_zoom_level_cb (GtkWidget* view, |
1132 | 803 | GParamSpec* pspec, | 775 | GParamSpec* pspec, |
1133 | 804 | MidoriBrowser* browser) | 776 | MidoriBrowser* browser) |
1134 | @@ -1401,6 +1373,25 @@ | |||
1135 | 1401 | } | 1373 | } |
1136 | 1402 | 1374 | ||
1137 | 1403 | static void | 1375 | static void |
1138 | 1376 | midori_view_destroy_cb (GtkWidget* view, | ||
1139 | 1377 | MidoriBrowser* browser) | ||
1140 | 1378 | { | ||
1141 | 1379 | if (browser->proxy_array) | ||
1142 | 1380 | { | ||
1143 | 1381 | KatzeItem* item = midori_view_get_proxy_item (MIDORI_VIEW (view)); | ||
1144 | 1382 | if (katze_array_get_item_index (browser->proxy_array, item) != -1 | ||
1145 | 1383 | && !midori_tab_is_blank (MIDORI_TAB (view))) | ||
1146 | 1384 | { | ||
1147 | 1385 | if (browser->trash) | ||
1148 | 1386 | katze_array_add_item (browser->trash, item); | ||
1149 | 1387 | midori_browser_update_history (item, "website", "leave"); | ||
1150 | 1388 | } | ||
1151 | 1389 | midori_browser_disconnect_tab (browser, MIDORI_VIEW (view)); | ||
1152 | 1390 | g_signal_emit (browser, signals[REMOVE_TAB], 0, view); | ||
1153 | 1391 | } | ||
1154 | 1392 | } | ||
1155 | 1393 | |||
1156 | 1394 | static void | ||
1157 | 1404 | midori_view_attach_inspector_cb (GtkWidget* view, | 1395 | midori_view_attach_inspector_cb (GtkWidget* view, |
1158 | 1405 | GtkWidget* inspector_view, | 1396 | GtkWidget* inspector_view, |
1159 | 1406 | MidoriBrowser* browser) | 1397 | MidoriBrowser* browser) |
1160 | @@ -1785,98 +1776,14 @@ | |||
1161 | 1785 | gint | 1776 | gint |
1162 | 1786 | midori_browser_get_n_pages (MidoriBrowser* browser) | 1777 | midori_browser_get_n_pages (MidoriBrowser* browser) |
1163 | 1787 | { | 1778 | { |
1182 | 1788 | #ifdef HAVE_GRANITE | 1779 | return midori_notebook_get_count (MIDORI_NOTEBOOK (browser->notebook)); |
1165 | 1789 | return granite_widgets_dynamic_notebook_get_n_tabs ( | ||
1166 | 1790 | GRANITE_WIDGETS_DYNAMIC_NOTEBOOK (browser->notebook)); | ||
1167 | 1791 | #else | ||
1168 | 1792 | return gtk_notebook_get_n_pages (GTK_NOTEBOOK (browser->notebook)); | ||
1169 | 1793 | #endif | ||
1170 | 1794 | } | ||
1171 | 1795 | |||
1172 | 1796 | static void | ||
1173 | 1797 | midori_browser_disconnect_tab (MidoriBrowser* browser, | ||
1174 | 1798 | MidoriView* view); | ||
1175 | 1799 | |||
1176 | 1800 | static gboolean | ||
1177 | 1801 | midori_browser_tab_connected (MidoriBrowser* browser, | ||
1178 | 1802 | MidoriView* view) | ||
1179 | 1803 | { | ||
1180 | 1804 | return browser->proxy_array && | ||
1181 | 1805 | (katze_array_get_item_index (browser->proxy_array, midori_view_get_proxy_item (view)) != -1); | ||
1183 | 1806 | } | 1780 | } |
1184 | 1807 | 1781 | ||
1185 | 1808 | static void | 1782 | static void |
1186 | 1809 | _midori_browser_remove_tab (MidoriBrowser* browser, | 1783 | _midori_browser_remove_tab (MidoriBrowser* browser, |
1187 | 1810 | GtkWidget* widget) | 1784 | GtkWidget* widget) |
1188 | 1811 | { | 1785 | { |
1189 | 1812 | MidoriView* view = MIDORI_VIEW (widget); | ||
1190 | 1813 | #ifdef HAVE_GRANITE | ||
1191 | 1814 | granite_widgets_dynamic_notebook_remove_tab ( | ||
1192 | 1815 | GRANITE_WIDGETS_DYNAMIC_NOTEBOOK (browser->notebook), midori_view_get_tab (view)); | ||
1193 | 1816 | #else | ||
1194 | 1817 | gtk_widget_destroy (widget); | 1786 | gtk_widget_destroy (widget); |
1195 | 1818 | #endif | ||
1196 | 1819 | if (midori_browser_tab_connected (browser, view)) | ||
1197 | 1820 | midori_browser_disconnect_tab (browser, view); | ||
1198 | 1821 | } | ||
1199 | 1822 | |||
1200 | 1823 | #ifndef HAVE_GRANITE | ||
1201 | 1824 | static void | ||
1202 | 1825 | midori_browser_notebook_resize (MidoriBrowser* browser, | ||
1203 | 1826 | GdkRectangle* allocation) | ||
1204 | 1827 | { | ||
1205 | 1828 | gint new_size = 0; | ||
1206 | 1829 | gint n = MAX (1, gtk_notebook_get_n_pages (GTK_NOTEBOOK (browser->notebook))); | ||
1207 | 1830 | const gint max_size = 150; | ||
1208 | 1831 | gint min_size; | ||
1209 | 1832 | gint icon_size = 16; | ||
1210 | 1833 | GtkAllocation notebook_size; | ||
1211 | 1834 | GList* children; | ||
1212 | 1835 | |||
1213 | 1836 | if (allocation != NULL) | ||
1214 | 1837 | notebook_size.width = allocation->width; | ||
1215 | 1838 | else | ||
1216 | 1839 | gtk_widget_get_allocation (browser->notebook, ¬ebook_size); | ||
1217 | 1840 | new_size = notebook_size.width / n; | ||
1218 | 1841 | |||
1219 | 1842 | gtk_icon_size_lookup_for_settings (gtk_widget_get_settings (browser->notebook), | ||
1220 | 1843 | GTK_ICON_SIZE_MENU, &icon_size, NULL); | ||
1221 | 1844 | min_size = icon_size; | ||
1222 | 1845 | if (katze_object_get_boolean (browser->settings, "close-buttons-on-tabs")) | ||
1223 | 1846 | min_size += icon_size; | ||
1224 | 1847 | if (new_size < min_size) new_size = min_size; | ||
1225 | 1848 | if (new_size > max_size) new_size = max_size; | ||
1226 | 1849 | |||
1227 | 1850 | if (new_size > browser->last_tab_size - 3 | ||
1228 | 1851 | && new_size < browser->last_tab_size + 3) | ||
1229 | 1852 | return; | ||
1230 | 1853 | browser->last_tab_size = new_size; | ||
1231 | 1854 | |||
1232 | 1855 | children = gtk_container_get_children (GTK_CONTAINER (browser->notebook)); | ||
1233 | 1856 | for (; children; children = g_list_next (children)) | ||
1234 | 1857 | { | ||
1235 | 1858 | GtkWidget* view = children->data; | ||
1236 | 1859 | GtkWidget* label; | ||
1237 | 1860 | label = gtk_notebook_get_tab_label (GTK_NOTEBOOK(browser->notebook), view); | ||
1238 | 1861 | /* Don't resize empty bin, which is used for thumbnail tabs */ | ||
1239 | 1862 | if (GTK_IS_BIN (label) && gtk_bin_get_child (GTK_BIN (label)) | ||
1240 | 1863 | && !katze_object_get_boolean (view, "minimized")) | ||
1241 | 1864 | gtk_widget_set_size_request (label, new_size, -1); | ||
1242 | 1865 | } | ||
1243 | 1866 | } | ||
1244 | 1867 | #endif | ||
1245 | 1868 | |||
1246 | 1869 | static void | ||
1247 | 1870 | midori_browser_notebook_size_allocate_cb (GtkWidget* widget, | ||
1248 | 1871 | GdkRectangle* allocation, | ||
1249 | 1872 | MidoriBrowser* browser) | ||
1250 | 1873 | { | ||
1251 | 1874 | #ifndef HAVE_GRANITE | ||
1252 | 1875 | if (!gtk_notebook_get_show_tabs (GTK_NOTEBOOK (browser->notebook))) | ||
1253 | 1876 | return; | ||
1254 | 1877 | |||
1255 | 1878 | midori_browser_notebook_resize (browser, allocation); | ||
1256 | 1879 | #endif | ||
1257 | 1880 | } | 1787 | } |
1258 | 1881 | 1788 | ||
1259 | 1882 | static void | 1789 | static void |
1260 | @@ -1886,7 +1793,6 @@ | |||
1261 | 1886 | KatzeItem* item = midori_view_get_proxy_item (MIDORI_VIEW (view)); | 1793 | KatzeItem* item = midori_view_get_proxy_item (MIDORI_VIEW (view)); |
1262 | 1887 | katze_array_add_item (browser->proxy_array, item); | 1794 | katze_array_add_item (browser->proxy_array, item); |
1263 | 1888 | 1795 | ||
1264 | 1889 | gtk_widget_set_can_focus (view, TRUE); | ||
1265 | 1890 | g_object_connect (view, | 1796 | g_object_connect (view, |
1266 | 1891 | "signal::notify::icon", | 1797 | "signal::notify::icon", |
1267 | 1892 | midori_view_notify_icon_cb, browser, | 1798 | midori_view_notify_icon_cb, browser, |
1268 | @@ -1898,8 +1804,6 @@ | |||
1269 | 1898 | midori_view_notify_uri_cb, browser, | 1804 | midori_view_notify_uri_cb, browser, |
1270 | 1899 | "signal::notify::title", | 1805 | "signal::notify::title", |
1271 | 1900 | midori_view_notify_title_cb, browser, | 1806 | midori_view_notify_title_cb, browser, |
1272 | 1901 | "signal::notify::minimized", | ||
1273 | 1902 | midori_view_notify_minimized_cb, browser, | ||
1274 | 1903 | "signal::notify::zoom-level", | 1807 | "signal::notify::zoom-level", |
1275 | 1904 | midori_view_notify_zoom_level_cb, browser, | 1808 | midori_view_notify_zoom_level_cb, browser, |
1276 | 1905 | "signal::notify::statusbar-text", | 1809 | "signal::notify::statusbar-text", |
1277 | @@ -1920,30 +1824,12 @@ | |||
1278 | 1920 | midori_view_search_text_cb, browser, | 1824 | midori_view_search_text_cb, browser, |
1279 | 1921 | "signal::leave-notify-event", | 1825 | "signal::leave-notify-event", |
1280 | 1922 | midori_browser_tab_leave_notify_event_cb, browser, | 1826 | midori_browser_tab_leave_notify_event_cb, browser, |
1281 | 1827 | "signal::destroy", | ||
1282 | 1828 | midori_view_destroy_cb, browser, | ||
1283 | 1923 | NULL); | 1829 | NULL); |
1284 | 1924 | } | 1830 | } |
1285 | 1925 | 1831 | ||
1286 | 1926 | static void | 1832 | static void |
1287 | 1927 | midori_browser_add_tab_to_trash (MidoriBrowser* browser, | ||
1288 | 1928 | MidoriView* view) | ||
1289 | 1929 | { | ||
1290 | 1930 | if (browser->proxy_array) | ||
1291 | 1931 | { | ||
1292 | 1932 | KatzeItem* item = midori_view_get_proxy_item (view); | ||
1293 | 1933 | if (katze_array_get_item_index (browser->proxy_array, item) != -1) | ||
1294 | 1934 | { | ||
1295 | 1935 | if (!midori_view_is_blank (view)) | ||
1296 | 1936 | { | ||
1297 | 1937 | if (browser->trash) | ||
1298 | 1938 | katze_array_add_item (browser->trash, item); | ||
1299 | 1939 | midori_browser_update_history (item, "website", "leave"); | ||
1300 | 1940 | } | ||
1301 | 1941 | } | ||
1302 | 1942 | } | ||
1303 | 1943 | } | ||
1304 | 1944 | |||
1305 | 1945 | |||
1306 | 1946 | static void | ||
1307 | 1947 | midori_browser_disconnect_tab (MidoriBrowser* browser, | 1833 | midori_browser_disconnect_tab (MidoriBrowser* browser, |
1308 | 1948 | MidoriView* view) | 1834 | MidoriView* view) |
1309 | 1949 | { | 1835 | { |
1310 | @@ -1974,8 +1860,6 @@ | |||
1311 | 1974 | "any_signal", | 1860 | "any_signal", |
1312 | 1975 | midori_view_notify_title_cb, browser, | 1861 | midori_view_notify_title_cb, browser, |
1313 | 1976 | "any_signal", | 1862 | "any_signal", |
1314 | 1977 | midori_view_notify_minimized_cb, browser, | ||
1315 | 1978 | "any_signal", | ||
1316 | 1979 | midori_view_notify_zoom_level_cb, browser, | 1863 | midori_view_notify_zoom_level_cb, browser, |
1317 | 1980 | "any_signal", | 1864 | "any_signal", |
1318 | 1981 | midori_view_notify_statusbar_text_cb, browser, | 1865 | midori_view_notify_statusbar_text_cb, browser, |
1319 | @@ -2002,11 +1886,7 @@ | |||
1320 | 2002 | _midori_browser_add_tab (MidoriBrowser* browser, | 1886 | _midori_browser_add_tab (MidoriBrowser* browser, |
1321 | 2003 | GtkWidget* view) | 1887 | GtkWidget* view) |
1322 | 2004 | { | 1888 | { |
1323 | 2005 | GtkWidget* notebook = browser->notebook; | ||
1324 | 2006 | KatzeItem* item = midori_view_get_proxy_item (MIDORI_VIEW (view)); | 1889 | KatzeItem* item = midori_view_get_proxy_item (MIDORI_VIEW (view)); |
1325 | 2007 | #ifndef HAVE_GRANITE | ||
1326 | 2008 | GtkWidget* tab_label; | ||
1327 | 2009 | #endif | ||
1328 | 2010 | guint n; | 1890 | guint n; |
1329 | 2011 | 1891 | ||
1330 | 2012 | midori_browser_connect_tab (browser, view); | 1892 | midori_browser_connect_tab (browser, view); |
1331 | @@ -2018,24 +1898,10 @@ | |||
1332 | 2018 | katze_array_move_item (browser->proxy_array, item, n); | 1898 | katze_array_move_item (browser->proxy_array, item, n); |
1333 | 2019 | } | 1899 | } |
1334 | 2020 | else | 1900 | else |
1336 | 2021 | n = midori_browser_get_n_pages (browser); | 1901 | n = -1; |
1337 | 2022 | katze_item_set_meta_integer (item, "append", -1); | 1902 | katze_item_set_meta_integer (item, "append", -1); |
1338 | 2023 | 1903 | ||
1354 | 2024 | #ifdef HAVE_GRANITE | 1904 | midori_notebook_insert (MIDORI_NOTEBOOK (browser->notebook), MIDORI_TAB (view), n); |
1340 | 2025 | granite_widgets_dynamic_notebook_insert_tab ( | ||
1341 | 2026 | GRANITE_WIDGETS_DYNAMIC_NOTEBOOK (notebook), | ||
1342 | 2027 | midori_view_get_tab (MIDORI_VIEW (view)), n); | ||
1343 | 2028 | #else | ||
1344 | 2029 | tab_label = midori_view_get_proxy_tab_label (MIDORI_VIEW (view)); | ||
1345 | 2030 | /* Don't resize empty bin, which is used for thumbnail tabs */ | ||
1346 | 2031 | if (GTK_IS_BIN (tab_label) && gtk_bin_get_child (GTK_BIN (tab_label)) | ||
1347 | 2032 | && !katze_object_get_boolean (view, "minimized")) | ||
1348 | 2033 | gtk_widget_set_size_request (tab_label, browser->last_tab_size, -1); | ||
1349 | 2034 | gtk_notebook_insert_page (GTK_NOTEBOOK (notebook), view, tab_label, n); | ||
1350 | 2035 | gtk_notebook_set_tab_reorderable (GTK_NOTEBOOK (notebook), view, TRUE); | ||
1351 | 2036 | gtk_notebook_set_tab_detachable (GTK_NOTEBOOK (notebook), view, TRUE); | ||
1352 | 2037 | midori_browser_notebook_size_allocate_cb (browser->notebook, NULL, browser); | ||
1353 | 2038 | #endif | ||
1355 | 2039 | 1905 | ||
1356 | 2040 | _midori_browser_update_actions (browser); | 1906 | _midori_browser_update_actions (browser); |
1357 | 2041 | } | 1907 | } |
1358 | @@ -3697,13 +3563,7 @@ | |||
1359 | 3697 | gtk_widget_hide (browser->bookmarkbar); | 3563 | gtk_widget_hide (browser->bookmarkbar); |
1360 | 3698 | gtk_widget_hide (browser->navigationbar); | 3564 | gtk_widget_hide (browser->navigationbar); |
1361 | 3699 | gtk_widget_hide (browser->statusbar); | 3565 | gtk_widget_hide (browser->statusbar); |
1369 | 3700 | #ifdef HAVE_GRANITE | 3566 | midori_notebook_set_labels_visible (MIDORI_NOTEBOOK (browser->notebook), FALSE); |
1363 | 3701 | granite_widgets_dynamic_notebook_set_show_tabs ( | ||
1364 | 3702 | GRANITE_WIDGETS_DYNAMIC_NOTEBOOK (browser->notebook), FALSE); | ||
1365 | 3703 | #else | ||
1366 | 3704 | gtk_notebook_set_show_tabs (GTK_NOTEBOOK (browser->notebook), FALSE); | ||
1367 | 3705 | gtk_notebook_set_show_border (GTK_NOTEBOOK (browser->notebook), FALSE); | ||
1368 | 3706 | #endif | ||
1370 | 3707 | 3567 | ||
1371 | 3708 | gtk_window_fullscreen (GTK_WINDOW (browser)); | 3568 | gtk_window_fullscreen (GTK_WINDOW (browser)); |
1372 | 3709 | } | 3569 | } |
1373 | @@ -4741,13 +4601,7 @@ | |||
1374 | 4741 | else | 4601 | else |
1375 | 4742 | g_assert_not_reached (); | 4602 | g_assert_not_reached (); |
1376 | 4743 | 4603 | ||
1384 | 4744 | #ifdef HAVE_GRANITE | 4604 | midori_notebook_move (MIDORI_NOTEBOOK (browser->notebook), MIDORI_TAB (widget), new_pos); |
1378 | 4745 | granite_widgets_dynamic_notebook_set_tab_position ( | ||
1379 | 4746 | GRANITE_WIDGETS_DYNAMIC_NOTEBOOK (browser->notebook), | ||
1380 | 4747 | midori_view_get_tab (MIDORI_VIEW (widget)), new_pos); | ||
1381 | 4748 | #else | ||
1382 | 4749 | gtk_notebook_reorder_child (GTK_NOTEBOOK (browser->notebook), widget, new_pos); | ||
1383 | 4750 | #endif | ||
1385 | 4751 | g_signal_emit (browser, signals[MOVE_TAB], 0, browser->notebook, cur_pos, new_pos); | 4605 | g_signal_emit (browser, signals[MOVE_TAB], 0, browser->notebook, cur_pos, new_pos); |
1386 | 4752 | } | 4606 | } |
1387 | 4753 | 4607 | ||
1388 | @@ -4798,7 +4652,9 @@ | |||
1389 | 4798 | _action_tab_duplicate_activate (GtkAction* action, | 4652 | _action_tab_duplicate_activate (GtkAction* action, |
1390 | 4799 | MidoriBrowser* browser) | 4653 | MidoriBrowser* browser) |
1391 | 4800 | { | 4654 | { |
1393 | 4801 | GtkWidget* view = midori_browser_get_current_tab (browser); | 4655 | GtkWidget* view = g_object_get_data (G_OBJECT (action), "tab"); |
1394 | 4656 | if (view == NULL) | ||
1395 | 4657 | view = midori_browser_get_current_tab (browser); | ||
1396 | 4802 | midori_view_duplicate (MIDORI_VIEW (view)); | 4658 | midori_view_duplicate (MIDORI_VIEW (view)); |
1397 | 4803 | } | 4659 | } |
1398 | 4804 | 4660 | ||
1399 | @@ -5034,10 +4890,10 @@ | |||
1400 | 5034 | } | 4890 | } |
1401 | 5035 | 4891 | ||
1402 | 5036 | static void | 4892 | static void |
1407 | 5037 | midori_browser_switched_tab (MidoriBrowser* browser, | 4893 | midori_browser_switched_tab_cb (MidoriNotebook* notebook, |
1408 | 5038 | GtkWidget* old_widget, | 4894 | GtkWidget* old_widget, |
1409 | 5039 | MidoriView* new_view, | 4895 | MidoriView* new_view, |
1410 | 5040 | gint new_page) | 4896 | MidoriBrowser* browser) |
1411 | 5041 | { | 4897 | { |
1412 | 5042 | GtkAction* action; | 4898 | GtkAction* action; |
1413 | 5043 | const gchar* text; | 4899 | const gchar* text; |
1414 | @@ -5051,13 +4907,8 @@ | |||
1415 | 5051 | g_strdup (text), g_free); | 4907 | g_strdup (text), g_free); |
1416 | 5052 | } | 4908 | } |
1417 | 5053 | 4909 | ||
1418 | 5054 | if (new_view == NULL) | ||
1419 | 5055 | { | ||
1420 | 5056 | g_signal_emit (browser, signals[SWITCH_TAB], 0, old_widget, new_view); | ||
1421 | 5057 | return; | ||
1422 | 5058 | } | ||
1423 | 5059 | |||
1424 | 5060 | g_return_if_fail (MIDORI_IS_VIEW (new_view)); | 4910 | g_return_if_fail (MIDORI_IS_VIEW (new_view)); |
1425 | 4911 | g_return_if_fail (new_view != MIDORI_VIEW (old_widget)); | ||
1426 | 5061 | 4912 | ||
1427 | 5062 | uri = g_object_get_data (G_OBJECT (new_view), "midori-browser-typed-text"); | 4913 | uri = g_object_get_data (G_OBJECT (new_view), "midori-browser-typed-text"); |
1428 | 5063 | if (!uri) | 4914 | if (!uri) |
1429 | @@ -5068,9 +4919,10 @@ | |||
1430 | 5068 | if (midori_paths_get_runtime_mode () == MIDORI_RUNTIME_MODE_APP) | 4919 | if (midori_paths_get_runtime_mode () == MIDORI_RUNTIME_MODE_APP) |
1431 | 5069 | gtk_window_set_icon (GTK_WINDOW (browser), midori_view_get_icon (new_view)); | 4920 | gtk_window_set_icon (GTK_WINDOW (browser), midori_view_get_icon (new_view)); |
1432 | 5070 | 4921 | ||
1435 | 5071 | if (browser->proxy_array) | 4922 | g_object_freeze_notify (G_OBJECT (browser)); |
1436 | 5072 | katze_item_set_meta_integer (KATZE_ITEM (browser->proxy_array), "current", new_page); | 4923 | g_object_notify (G_OBJECT (browser), "uri"); |
1437 | 5073 | g_object_notify (G_OBJECT (browser), "tab"); | 4924 | g_object_notify (G_OBJECT (browser), "tab"); |
1438 | 4925 | g_object_thaw_notify (G_OBJECT (browser)); | ||
1439 | 5074 | g_signal_emit (browser, signals[SWITCH_TAB], 0, old_widget, new_view); | 4926 | g_signal_emit (browser, signals[SWITCH_TAB], 0, old_widget, new_view); |
1440 | 5075 | 4927 | ||
1441 | 5076 | _midori_browser_set_statusbar_text (browser, new_view, NULL); | 4928 | _midori_browser_set_statusbar_text (browser, new_view, NULL); |
1442 | @@ -5079,17 +4931,17 @@ | |||
1443 | 5079 | } | 4931 | } |
1444 | 5080 | 4932 | ||
1445 | 5081 | static void | 4933 | static void |
1450 | 5082 | midori_browser_notebook_page_reordered_cb (GtkWidget* notebook, | 4934 | midori_browser_tab_moved_cb (GtkWidget* notebook, |
1451 | 5083 | MidoriView* view, | 4935 | MidoriView* view, |
1452 | 5084 | guint page_num, | 4936 | guint page_num, |
1453 | 5085 | MidoriBrowser* browser) | 4937 | MidoriBrowser* browser) |
1454 | 5086 | { | 4938 | { |
1455 | 5087 | KatzeItem* item = midori_view_get_proxy_item (view); | 4939 | KatzeItem* item = midori_view_get_proxy_item (view); |
1456 | 5088 | katze_array_move_item (browser->proxy_array, item, page_num); | 4940 | katze_array_move_item (browser->proxy_array, item, page_num); |
1457 | 5089 | g_object_notify (G_OBJECT (browser), "tab"); | 4941 | g_object_notify (G_OBJECT (browser), "tab"); |
1458 | 5090 | } | 4942 | } |
1459 | 5091 | 4943 | ||
1461 | 5092 | static GtkWidget* | 4944 | static void |
1462 | 5093 | midori_browser_notebook_create_window_cb (GtkWidget* notebook, | 4945 | midori_browser_notebook_create_window_cb (GtkWidget* notebook, |
1463 | 5094 | GtkWidget* view, | 4946 | GtkWidget* view, |
1464 | 5095 | gint x, | 4947 | gint x, |
1465 | @@ -5100,216 +4952,53 @@ | |||
1466 | 5100 | g_signal_emit (browser, signals[NEW_WINDOW], 0, NULL, &new_browser); | 4952 | g_signal_emit (browser, signals[NEW_WINDOW], 0, NULL, &new_browser); |
1467 | 5101 | if (new_browser) | 4953 | if (new_browser) |
1468 | 5102 | { | 4954 | { |
1469 | 5103 | GtkWidget* new_notebook = new_browser->notebook; | ||
1470 | 5104 | gtk_window_move (GTK_WINDOW (new_browser), x, y); | 4955 | gtk_window_move (GTK_WINDOW (new_browser), x, y); |
1679 | 5105 | return new_notebook; | 4956 | g_object_ref (view); |
1680 | 5106 | } | 4957 | midori_browser_disconnect_tab (browser, MIDORI_VIEW (view)); |
1681 | 5107 | else /* No MidoriApp, so this is app or private mode */ | 4958 | midori_notebook_remove (MIDORI_NOTEBOOK (browser->notebook), MIDORI_TAB (view)); |
1682 | 5108 | return NULL; | 4959 | midori_browser_add_tab (new_browser, view); |
1683 | 5109 | } | 4960 | g_object_unref (view); |
1684 | 5110 | 4961 | } | |
1685 | 5111 | #ifdef HAVE_GRANITE | 4962 | } |
1686 | 5112 | static void | 4963 | |
1687 | 5113 | midori_browser_notebook_tab_added_cb (GtkWidget* notebook, | 4964 | static void |
1688 | 5114 | GraniteWidgetsTab* tab, | 4965 | midori_browser_notebook_new_tab_cb (GtkWidget* notebook, |
1689 | 5115 | MidoriBrowser* browser) | 4966 | MidoriBrowser* browser) |
1690 | 5116 | { | 4967 | { |
1691 | 5117 | gint n = granite_widgets_dynamic_notebook_get_tab_position ( | 4968 | GtkWidget* view = midori_browser_add_uri (browser, "about:new"); |
1692 | 5118 | GRANITE_WIDGETS_DYNAMIC_NOTEBOOK (notebook), tab); | 4969 | midori_browser_set_current_tab (browser, view); |
1693 | 5119 | midori_browser_set_current_page (browser, n); | 4970 | } |
1694 | 5120 | GtkWidget* view = midori_view_new_with_item (NULL, browser->settings); | 4971 | |
1695 | 5121 | midori_view_set_tab (MIDORI_VIEW (view), tab); | 4972 | static void |
1696 | 5122 | midori_browser_connect_tab (browser, view); | 4973 | midori_browser_notebook_context_menu_cb (MidoriNotebook* notebook, |
1697 | 5123 | midori_view_set_uri (MIDORI_VIEW (view), "about:new"); | 4974 | MidoriContextAction* menu, |
1698 | 5124 | /* FIXME: signal add-tab */ | 4975 | MidoriBrowser* browser) |
1699 | 5125 | _midori_browser_update_actions (browser); | 4976 | { |
1700 | 5126 | midori_browser_notebook_page_reordered_cb (GTK_WIDGET (notebook), | 4977 | midori_context_action_add_action_group (menu, browser->action_group); |
1701 | 5127 | MIDORI_VIEW (view), n, browser); | 4978 | midori_context_action_add (menu, NULL); |
1702 | 5128 | } | 4979 | midori_context_action_add_by_name (menu, "TabNew"); |
1703 | 5129 | 4980 | midori_context_action_add_by_name (menu, "UndoTabClose"); | |
1704 | 5130 | static gboolean | 4981 | } |
1705 | 5131 | midori_browser_notebook_tab_removed_cb (GtkWidget* notebook, | 4982 | |
1706 | 5132 | GraniteWidgetsTab* tab, | 4983 | static void |
1707 | 5133 | MidoriBrowser* browser) | 4984 | midori_browser_notebook_tab_context_menu_cb (MidoriNotebook* notebook, |
1708 | 5134 | { | 4985 | MidoriTab* tab, |
1709 | 5135 | 4986 | MidoriContextAction* menu, | |
1710 | 5136 | MidoriView* view = MIDORI_VIEW (granite_widgets_tab_get_page (tab)); | 4987 | MidoriBrowser* browser) |
1711 | 5137 | if (midori_browser_tab_connected (browser, MIDORI_VIEW (view))) | 4988 | { |
1712 | 5138 | midori_browser_disconnect_tab (browser, MIDORI_VIEW (view)); | 4989 | midori_context_action_add_action_group (menu, browser->action_group); |
1713 | 5139 | 4990 | midori_context_action_add (menu, NULL); | |
1714 | 5140 | return TRUE; | 4991 | midori_context_action_add_by_name (menu, "TabNew"); |
1715 | 5141 | } | 4992 | midori_context_action_add_by_name (menu, "UndoTabClose"); |
1716 | 5142 | 4993 | if (MIDORI_IS_VIEW (tab)) | |
1717 | 5143 | static void | 4994 | { |
1718 | 5144 | midori_browser_move_tab_to_notebook (MidoriBrowser* browser, | 4995 | GtkAction* action = gtk_action_new ("TabDuplicate", _("_Duplicate Current Tab"), NULL, NULL); |
1719 | 5145 | GtkWidget* view, | 4996 | g_object_set_data (G_OBJECT (action), "tab", tab); |
1720 | 5146 | GraniteWidgetsTab* tab, | 4997 | g_signal_connect (action, "activate", |
1721 | 5147 | GtkWidget* new_notebook) | 4998 | G_CALLBACK (_action_tab_duplicate_activate), browser); |
1722 | 5148 | { | 4999 | midori_context_action_add (menu, action); |
1723 | 5149 | GraniteWidgetsTab* new_tab = granite_widgets_tab_new ("", NULL, NULL); | 5000 | } |
1724 | 5150 | g_object_ref (view); | 5001 | } |
1517 | 5151 | _midori_browser_remove_tab (browser, view); | ||
1518 | 5152 | granite_widgets_dynamic_notebook_insert_tab ( | ||
1519 | 5153 | GRANITE_WIDGETS_DYNAMIC_NOTEBOOK (new_notebook), new_tab, 0); | ||
1520 | 5154 | midori_view_set_tab (MIDORI_VIEW (view), new_tab); | ||
1521 | 5155 | _midori_browser_update_actions (browser); | ||
1522 | 5156 | midori_browser_connect_tab (midori_browser_get_for_widget (new_notebook), view); | ||
1523 | 5157 | g_object_unref (view); | ||
1524 | 5158 | } | ||
1525 | 5159 | |||
1526 | 5160 | static void | ||
1527 | 5161 | midori_browser_notebook_tab_switched_cb (GraniteWidgetsDynamicNotebook* notebook, | ||
1528 | 5162 | GraniteWidgetsTab* old_tab, | ||
1529 | 5163 | GraniteWidgetsTab* new_tab, | ||
1530 | 5164 | MidoriBrowser* browser) | ||
1531 | 5165 | { | ||
1532 | 5166 | gint new_pos = granite_widgets_dynamic_notebook_get_tab_position (notebook, new_tab); | ||
1533 | 5167 | |||
1534 | 5168 | midori_browser_switched_tab (browser, | ||
1535 | 5169 | old_tab ? granite_widgets_tab_get_page (old_tab) : NULL, | ||
1536 | 5170 | MIDORI_VIEW (granite_widgets_tab_get_page (new_tab)), new_pos); | ||
1537 | 5171 | } | ||
1538 | 5172 | |||
1539 | 5173 | static void | ||
1540 | 5174 | midori_browser_notebook_tab_moved_cb (GtkWidget* notebook, | ||
1541 | 5175 | GraniteWidgetsTab* tab, | ||
1542 | 5176 | gint old_pos, | ||
1543 | 5177 | gboolean new_window, | ||
1544 | 5178 | gint x, | ||
1545 | 5179 | gint y, | ||
1546 | 5180 | MidoriBrowser* browser) | ||
1547 | 5181 | { | ||
1548 | 5182 | GtkWidget* view = granite_widgets_tab_get_page (tab); | ||
1549 | 5183 | if (new_window) | ||
1550 | 5184 | { | ||
1551 | 5185 | GtkWidget* notebook = midori_browser_notebook_create_window_cb ( | ||
1552 | 5186 | browser->notebook, view, x, y, browser); | ||
1553 | 5187 | if (notebook != NULL) | ||
1554 | 5188 | midori_browser_move_tab_to_notebook (browser, view, tab, notebook); | ||
1555 | 5189 | } | ||
1556 | 5190 | else | ||
1557 | 5191 | { | ||
1558 | 5192 | gint new_pos = granite_widgets_dynamic_notebook_get_tab_position ( | ||
1559 | 5193 | GRANITE_WIDGETS_DYNAMIC_NOTEBOOK (notebook), tab); | ||
1560 | 5194 | midori_browser_notebook_page_reordered_cb (notebook, | ||
1561 | 5195 | MIDORI_VIEW (view), new_pos, browser); | ||
1562 | 5196 | } | ||
1563 | 5197 | } | ||
1564 | 5198 | |||
1565 | 5199 | static void | ||
1566 | 5200 | midori_browser_notebook_tab_duplicated_cb (GtkWidget* notebook, | ||
1567 | 5201 | GraniteWidgetsTab* tab, | ||
1568 | 5202 | MidoriBrowser* browser) | ||
1569 | 5203 | { | ||
1570 | 5204 | GtkWidget* view = granite_widgets_tab_get_page (tab); | ||
1571 | 5205 | midori_view_duplicate (MIDORI_VIEW (view)); | ||
1572 | 5206 | } | ||
1573 | 5207 | |||
1574 | 5208 | #else | ||
1575 | 5209 | static void | ||
1576 | 5210 | midori_browser_notebook_page_added_cb (GtkNotebook* notebook, | ||
1577 | 5211 | GtkWidget* child, | ||
1578 | 5212 | guint page_num, | ||
1579 | 5213 | MidoriBrowser* browser) | ||
1580 | 5214 | { | ||
1581 | 5215 | if (!midori_browser_tab_connected (browser, MIDORI_VIEW (child))) | ||
1582 | 5216 | midori_browser_connect_tab (browser, child); | ||
1583 | 5217 | midori_browser_notebook_page_reordered_cb (GTK_WIDGET (notebook), | ||
1584 | 5218 | MIDORI_VIEW (child), page_num, browser); | ||
1585 | 5219 | } | ||
1586 | 5220 | |||
1587 | 5221 | static void | ||
1588 | 5222 | midori_browser_notebook_switch_page_cb (GtkWidget* notebook, | ||
1589 | 5223 | gpointer page, | ||
1590 | 5224 | guint page_num, | ||
1591 | 5225 | MidoriBrowser* browser) | ||
1592 | 5226 | { | ||
1593 | 5227 | midori_browser_switched_tab (browser, | ||
1594 | 5228 | midori_browser_get_current_tab (browser), | ||
1595 | 5229 | MIDORI_VIEW (midori_browser_get_nth_tab (browser, page_num)), page_num); | ||
1596 | 5230 | } | ||
1597 | 5231 | |||
1598 | 5232 | static void | ||
1599 | 5233 | midori_browser_notebook_page_removed_cb (GtkWidget* notebook, | ||
1600 | 5234 | GtkWidget* view, | ||
1601 | 5235 | guint page_num, | ||
1602 | 5236 | MidoriBrowser* browser) | ||
1603 | 5237 | { | ||
1604 | 5238 | if (midori_browser_tab_connected (browser, MIDORI_VIEW (view))) | ||
1605 | 5239 | midori_browser_disconnect_tab (browser, MIDORI_VIEW (view)); | ||
1606 | 5240 | midori_browser_notebook_size_allocate_cb (browser->notebook, NULL, browser); | ||
1607 | 5241 | } | ||
1608 | 5242 | |||
1609 | 5243 | static gboolean | ||
1610 | 5244 | midori_browser_notebook_reorder_tab_cb (GtkNotebook* notebook, | ||
1611 | 5245 | GtkDirectionType arg1, | ||
1612 | 5246 | gboolean arg2, | ||
1613 | 5247 | gpointer user_data) | ||
1614 | 5248 | { | ||
1615 | 5249 | g_signal_stop_emission_by_name (notebook, "reorder-tab"); | ||
1616 | 5250 | return TRUE; | ||
1617 | 5251 | } | ||
1618 | 5252 | |||
1619 | 5253 | static void | ||
1620 | 5254 | midori_browser_menu_item_switch_tab_cb (GtkWidget* menuitem, | ||
1621 | 5255 | MidoriBrowser* browser) | ||
1622 | 5256 | { | ||
1623 | 5257 | gint page = GPOINTER_TO_INT (g_object_get_data (G_OBJECT (menuitem), "index")); | ||
1624 | 5258 | midori_browser_set_current_page (browser, page); | ||
1625 | 5259 | } | ||
1626 | 5260 | |||
1627 | 5261 | static gboolean | ||
1628 | 5262 | midori_browser_notebook_button_press_event_after_cb (GtkNotebook* notebook, | ||
1629 | 5263 | GdkEventButton* event, | ||
1630 | 5264 | MidoriBrowser* browser) | ||
1631 | 5265 | { | ||
1632 | 5266 | #if !GTK_CHECK_VERSION(3,0,0) /* TODO */ | ||
1633 | 5267 | if (event->window != notebook->event_window) | ||
1634 | 5268 | return FALSE; | ||
1635 | 5269 | #endif | ||
1636 | 5270 | |||
1637 | 5271 | /* FIXME: Handle double click only when it wasn't handled by GtkNotebook */ | ||
1638 | 5272 | |||
1639 | 5273 | /* Open a new tab on double click or middle mouse click */ | ||
1640 | 5274 | if (/*(event->type == GDK_2BUTTON_PRESS && event->button == 1) | ||
1641 | 5275 | || */(event->type == GDK_BUTTON_PRESS && MIDORI_EVENT_NEW_TAB (event))) | ||
1642 | 5276 | { | ||
1643 | 5277 | GtkWidget* view = midori_browser_add_uri (browser, "about:new"); | ||
1644 | 5278 | midori_browser_set_current_tab (browser, view); | ||
1645 | 5279 | |||
1646 | 5280 | return TRUE; | ||
1647 | 5281 | } | ||
1648 | 5282 | else if (event->type == GDK_BUTTON_PRESS && MIDORI_EVENT_CONTEXT_MENU (event)) | ||
1649 | 5283 | { | ||
1650 | 5284 | MidoriContextAction* menu = midori_context_action_new ("NotebookContextMenu", NULL, NULL, NULL); | ||
1651 | 5285 | midori_context_action_add_action_group (menu, browser->action_group); | ||
1652 | 5286 | GList* tabs = midori_browser_get_tabs (browser); | ||
1653 | 5287 | midori_context_action_add_by_name (menu, "TabNew"); | ||
1654 | 5288 | midori_context_action_add_by_name (menu, "UndoTabClose"); | ||
1655 | 5289 | midori_context_action_add (menu, NULL); | ||
1656 | 5290 | gint i = 0; | ||
1657 | 5291 | for (; tabs != NULL; tabs = g_list_next (tabs)) | ||
1658 | 5292 | { | ||
1659 | 5293 | const gchar* title = midori_view_get_display_title (tabs->data); | ||
1660 | 5294 | gchar* tab_option = g_strdup_printf ("Tab%u", i); | ||
1661 | 5295 | GtkAction* action = gtk_action_new (tab_option, title, NULL, NULL); | ||
1662 | 5296 | g_free (tab_option); | ||
1663 | 5297 | gtk_action_set_gicon (GTK_ACTION (action), G_ICON (midori_view_get_icon (tabs->data))); | ||
1664 | 5298 | g_object_set_data (G_OBJECT (action), "index", GINT_TO_POINTER (i)); | ||
1665 | 5299 | g_signal_connect (action, "activate", | ||
1666 | 5300 | G_CALLBACK (midori_browser_menu_item_switch_tab_cb), browser); | ||
1667 | 5301 | midori_context_action_add (menu, action); | ||
1668 | 5302 | i++; | ||
1669 | 5303 | } | ||
1670 | 5304 | g_list_free (tabs); | ||
1671 | 5305 | GtkMenu* context_menu = midori_context_action_create_menu (menu, NULL, FALSE); | ||
1672 | 5306 | katze_widget_popup (GTK_WIDGET (notebook), context_menu, NULL, | ||
1673 | 5307 | KATZE_MENU_POSITION_CURSOR); | ||
1674 | 5308 | } | ||
1675 | 5309 | |||
1676 | 5310 | return FALSE; | ||
1677 | 5311 | } | ||
1678 | 5312 | #endif | ||
1725 | 5313 | 5002 | ||
1726 | 5314 | static void | 5003 | static void |
1727 | 5315 | _action_undo_tab_close_activate (GtkAction* action, | 5004 | _action_undo_tab_close_activate (GtkAction* action, |
1728 | @@ -5760,14 +5449,6 @@ | |||
1729 | 5760 | 5449 | ||
1730 | 5761 | /* Destroy panel first, so panels don't need special care */ | 5450 | /* Destroy panel first, so panels don't need special care */ |
1731 | 5762 | gtk_widget_destroy (browser->panel); | 5451 | gtk_widget_destroy (browser->panel); |
1732 | 5763 | #ifndef HAVE_GRANITE | ||
1733 | 5764 | g_signal_handlers_disconnect_by_func (browser->notebook, | ||
1734 | 5765 | midori_browser_notebook_reorder_tab_cb, | ||
1735 | 5766 | NULL); | ||
1736 | 5767 | g_signal_handlers_disconnect_by_func (browser->notebook, | ||
1737 | 5768 | midori_browser_notebook_size_allocate_cb, | ||
1738 | 5769 | browser); | ||
1739 | 5770 | #endif | ||
1740 | 5771 | /* Destroy tabs second, so child widgets don't need special care */ | 5452 | /* Destroy tabs second, so child widgets don't need special care */ |
1741 | 5772 | gtk_container_foreach (GTK_CONTAINER (browser->notebook), | 5453 | gtk_container_foreach (GTK_CONTAINER (browser->notebook), |
1742 | 5773 | (GtkCallback) gtk_widget_destroy, NULL); | 5454 | (GtkCallback) gtk_widget_destroy, NULL); |
1743 | @@ -6288,10 +5969,17 @@ | |||
1744 | 6288 | 5969 | ||
1745 | 6289 | menuitem = gtk_menu_item_new (); | 5970 | menuitem = gtk_menu_item_new (); |
1746 | 6290 | gtk_widget_show (menuitem); | 5971 | gtk_widget_show (menuitem); |
1751 | 6291 | browser->throbber = katze_throbber_new (); | 5972 | browser->throbber = gtk_spinner_new (); |
1752 | 6292 | gtk_widget_show (browser->throbber); | 5973 | /* Wrap the spinner in an event box to retain its size when hidden */ |
1753 | 6293 | gtk_container_add (GTK_CONTAINER (menuitem), browser->throbber); | 5974 | GtkWidget* throbber_box = gtk_event_box_new (); |
1754 | 6294 | gtk_widget_set_sensitive (menuitem, FALSE); | 5975 | gtk_event_box_set_visible_window (GTK_EVENT_BOX (throbber_box), FALSE); |
1755 | 5976 | gint icon_size = 16; | ||
1756 | 5977 | gtk_icon_size_lookup_for_settings (gtk_widget_get_settings (GTK_WIDGET (browser)), | ||
1757 | 5978 | GTK_ICON_SIZE_MENU, &icon_size, NULL); | ||
1758 | 5979 | gtk_widget_set_size_request (throbber_box, icon_size, icon_size); | ||
1759 | 5980 | gtk_container_add (GTK_CONTAINER (throbber_box), browser->throbber); | ||
1760 | 5981 | gtk_widget_show (throbber_box); | ||
1761 | 5982 | gtk_container_add (GTK_CONTAINER (menuitem), throbber_box); | ||
1762 | 6295 | #if GTK_CHECK_VERSION (3, 2, 0) | 5983 | #if GTK_CHECK_VERSION (3, 2, 0) |
1763 | 6296 | /* FIXME: Doesn't work */ | 5984 | /* FIXME: Doesn't work */ |
1764 | 6297 | gtk_widget_set_hexpand (menuitem, TRUE); | 5985 | gtk_widget_set_hexpand (menuitem, TRUE); |
1765 | @@ -6390,78 +6078,24 @@ | |||
1766 | 6390 | vpaned = gtk_vpaned_new (); | 6078 | vpaned = gtk_vpaned_new (); |
1767 | 6391 | gtk_paned_pack2 (GTK_PANED (hpaned), vpaned, TRUE, FALSE); | 6079 | gtk_paned_pack2 (GTK_PANED (hpaned), vpaned, TRUE, FALSE); |
1768 | 6392 | gtk_widget_show (vpaned); | 6080 | gtk_widget_show (vpaned); |
1789 | 6393 | #ifdef HAVE_GRANITE | 6081 | browser->notebook = midori_notebook_new (); |
1770 | 6394 | /* FIXME: granite: should return GtkWidget* like GTK+ */ | ||
1771 | 6395 | browser->notebook = (GtkWidget*)granite_widgets_dynamic_notebook_new (); | ||
1772 | 6396 | granite_widgets_dynamic_notebook_set_allow_new_window ( | ||
1773 | 6397 | GRANITE_WIDGETS_DYNAMIC_NOTEBOOK (browser->notebook), TRUE); | ||
1774 | 6398 | granite_widgets_dynamic_notebook_set_allow_duplication ( | ||
1775 | 6399 | GRANITE_WIDGETS_DYNAMIC_NOTEBOOK (browser->notebook), TRUE); | ||
1776 | 6400 | /* FIXME: work-around a bug */ | ||
1777 | 6401 | gtk_widget_show_all (browser->notebook); | ||
1778 | 6402 | granite_widgets_dynamic_notebook_set_group_name ( | ||
1779 | 6403 | GRANITE_WIDGETS_DYNAMIC_NOTEBOOK (browser->notebook), PACKAGE_NAME); | ||
1780 | 6404 | #else | ||
1781 | 6405 | browser->notebook = gtk_notebook_new (); | ||
1782 | 6406 | gtk_notebook_set_scrollable (GTK_NOTEBOOK (browser->notebook), TRUE); | ||
1783 | 6407 | #if GTK_CHECK_VERSION (3, 0, 0) | ||
1784 | 6408 | gtk_notebook_set_group_name (GTK_NOTEBOOK (browser->notebook), PACKAGE_NAME); | ||
1785 | 6409 | #else | ||
1786 | 6410 | gtk_notebook_set_group_id (GTK_NOTEBOOK (browser->notebook), GPOINTER_TO_INT (PACKAGE_NAME)); | ||
1787 | 6411 | #endif | ||
1788 | 6412 | #endif | ||
1790 | 6413 | 6082 | ||
1791 | 6414 | #if !GTK_CHECK_VERSION (3, 0, 0) | ||
1792 | 6415 | { | ||
1793 | 6416 | /* Remove the inner border between scrollbars and the window border */ | ||
1794 | 6417 | GtkRcStyle* rcstyle = gtk_rc_style_new (); | ||
1795 | 6418 | rcstyle->xthickness = 0; | ||
1796 | 6419 | gtk_widget_modify_style (browser->notebook, rcstyle); | ||
1797 | 6420 | g_object_unref (rcstyle); | ||
1798 | 6421 | } | ||
1799 | 6422 | #endif | ||
1800 | 6423 | gtk_paned_pack1 (GTK_PANED (vpaned), browser->notebook, FALSE, FALSE); | 6083 | gtk_paned_pack1 (GTK_PANED (vpaned), browser->notebook, FALSE, FALSE); |
1801 | 6424 | #ifdef HAVE_GRANITE | ||
1802 | 6425 | /* FIXME menu items */ | ||
1803 | 6426 | g_signal_connect (browser->notebook, "tab-added", | ||
1804 | 6427 | G_CALLBACK (midori_browser_notebook_tab_added_cb), | ||
1805 | 6428 | browser); | ||
1806 | 6429 | g_signal_connect (browser->notebook, "tab-removed", | ||
1807 | 6430 | G_CALLBACK (midori_browser_notebook_tab_removed_cb), | ||
1808 | 6431 | browser); | ||
1809 | 6432 | g_signal_connect (browser->notebook, "tab-switched", | 6084 | g_signal_connect (browser->notebook, "tab-switched", |
1811 | 6433 | G_CALLBACK (midori_browser_notebook_tab_switched_cb), | 6085 | G_CALLBACK (midori_browser_switched_tab_cb), |
1812 | 6434 | browser); | 6086 | browser); |
1813 | 6435 | g_signal_connect (browser->notebook, "tab-moved", | 6087 | g_signal_connect (browser->notebook, "tab-moved", |
1841 | 6436 | G_CALLBACK (midori_browser_notebook_tab_moved_cb), | 6088 | G_CALLBACK (midori_browser_tab_moved_cb), |
1842 | 6437 | browser); | 6089 | browser); |
1843 | 6438 | g_signal_connect (browser->notebook, "tab-duplicated", | 6090 | g_signal_connect (browser->notebook, "context-menu", |
1844 | 6439 | G_CALLBACK (midori_browser_notebook_tab_duplicated_cb), | 6091 | G_CALLBACK (midori_browser_notebook_context_menu_cb), |
1845 | 6440 | browser); | 6092 | browser); |
1846 | 6441 | #else | 6093 | g_signal_connect (browser->notebook, "tab-context-menu", |
1847 | 6442 | g_signal_connect (browser->notebook, "switch-page", | 6094 | G_CALLBACK (midori_browser_notebook_tab_context_menu_cb), browser); |
1848 | 6443 | G_CALLBACK (midori_browser_notebook_switch_page_cb), | 6095 | g_signal_connect (browser->notebook, "tab-detached", |
1822 | 6444 | browser); | ||
1823 | 6445 | g_signal_connect (browser->notebook, "page-reordered", | ||
1824 | 6446 | G_CALLBACK (midori_browser_notebook_page_reordered_cb), | ||
1825 | 6447 | browser); | ||
1826 | 6448 | g_signal_connect (browser->notebook, "page-added", | ||
1827 | 6449 | G_CALLBACK (midori_browser_notebook_page_added_cb), | ||
1828 | 6450 | browser); | ||
1829 | 6451 | g_signal_connect (browser->notebook, "page-removed", | ||
1830 | 6452 | G_CALLBACK (midori_browser_notebook_page_removed_cb), | ||
1831 | 6453 | browser); | ||
1832 | 6454 | g_signal_connect (browser->notebook, "size-allocate", | ||
1833 | 6455 | G_CALLBACK (midori_browser_notebook_size_allocate_cb), | ||
1834 | 6456 | browser); | ||
1835 | 6457 | g_signal_connect_after (browser->notebook, "button-press-event", | ||
1836 | 6458 | G_CALLBACK (midori_browser_notebook_button_press_event_after_cb), | ||
1837 | 6459 | browser); | ||
1838 | 6460 | g_signal_connect (browser->notebook, "reorder-tab", | ||
1839 | 6461 | G_CALLBACK (midori_browser_notebook_reorder_tab_cb), NULL); | ||
1840 | 6462 | g_signal_connect (browser->notebook, "create-window", | ||
1849 | 6463 | G_CALLBACK (midori_browser_notebook_create_window_cb), browser); | 6096 | G_CALLBACK (midori_browser_notebook_create_window_cb), browser); |
1851 | 6464 | #endif | 6097 | g_signal_connect (browser->notebook, "new-tab", |
1852 | 6098 | G_CALLBACK (midori_browser_notebook_new_tab_cb), browser); | ||
1853 | 6465 | gtk_widget_show (browser->notebook); | 6099 | gtk_widget_show (browser->notebook); |
1854 | 6466 | 6100 | ||
1855 | 6467 | /* Inspector container */ | 6101 | /* Inspector container */ |
1856 | @@ -6768,11 +6402,9 @@ | |||
1857 | 6768 | } | 6402 | } |
1858 | 6769 | else if (token_current != token_dontcare && token_last == token_dontcare) | 6403 | else if (token_current != token_dontcare && token_last == token_dontcare) |
1859 | 6770 | continue; | 6404 | continue; |
1860 | 6771 | #ifdef HAVE_GRANITE | ||
1861 | 6772 | /* A "new tab" button is already part of the notebook */ | 6405 | /* A "new tab" button is already part of the notebook */ |
1862 | 6773 | else if (!strcmp (gtk_action_get_name (action), "TabNew")) | 6406 | else if (!strcmp (gtk_action_get_name (action), "TabNew")) |
1863 | 6774 | continue; | 6407 | continue; |
1864 | 6775 | #endif | ||
1865 | 6776 | else | 6408 | else |
1866 | 6777 | toolitem = gtk_action_create_tool_item (action); | 6409 | toolitem = gtk_action_create_tool_item (action); |
1867 | 6778 | 6410 | ||
1868 | @@ -6839,7 +6471,7 @@ | |||
1869 | 6839 | gboolean show_panel; | 6471 | gboolean show_panel; |
1870 | 6840 | MidoriToolbarStyle toolbar_style; | 6472 | MidoriToolbarStyle toolbar_style; |
1871 | 6841 | gchar* toolbar_items; | 6473 | gchar* toolbar_items; |
1873 | 6842 | gboolean close_buttons_on_tabs; | 6474 | gboolean close_buttons_left, close_buttons_on_tabs; |
1874 | 6843 | 6475 | ||
1875 | 6844 | g_object_get (browser->settings, | 6476 | g_object_get (browser->settings, |
1876 | 6845 | "remember-last-window-size", &remember_last_window_size, | 6477 | "remember-last-window-size", &remember_last_window_size, |
1877 | @@ -6859,19 +6491,19 @@ | |||
1878 | 6859 | "show-statusbar", &browser->show_statusbar, | 6491 | "show-statusbar", &browser->show_statusbar, |
1879 | 6860 | "toolbar-style", &toolbar_style, | 6492 | "toolbar-style", &toolbar_style, |
1880 | 6861 | "toolbar-items", &toolbar_items, | 6493 | "toolbar-items", &toolbar_items, |
1881 | 6494 | "close-buttons-left", &close_buttons_left, | ||
1882 | 6862 | "close-buttons-on-tabs", &close_buttons_on_tabs, | 6495 | "close-buttons-on-tabs", &close_buttons_on_tabs, |
1883 | 6863 | "maximum-history-age", &browser->maximum_history_age, | 6496 | "maximum-history-age", &browser->maximum_history_age, |
1884 | 6864 | NULL); | 6497 | NULL); |
1885 | 6865 | 6498 | ||
1890 | 6866 | #ifdef HAVE_GRANITE | 6499 | midori_notebook_set_close_buttons_visible ( |
1891 | 6867 | granite_widgets_dynamic_notebook_set_tabs_closable ( | 6500 | MIDORI_NOTEBOOK (browser->notebook), close_buttons_on_tabs); |
1892 | 6868 | GRANITE_WIDGETS_DYNAMIC_NOTEBOOK (browser->notebook), close_buttons_on_tabs); | 6501 | midori_notebook_set_close_buttons_left ( |
1893 | 6869 | #endif | 6502 | MIDORI_NOTEBOOK (browser->notebook), close_buttons_left); |
1894 | 6870 | midori_findbar_set_close_button_left (MIDORI_FINDBAR (browser->find), | 6503 | midori_findbar_set_close_button_left (MIDORI_FINDBAR (browser->find), |
1896 | 6871 | katze_object_get_boolean (browser->settings, "close-buttons-left")); | 6504 | close_buttons_left); |
1897 | 6872 | if (browser->dial != NULL) | 6505 | if (browser->dial != NULL) |
1900 | 6873 | midori_speed_dial_set_close_buttons_left (browser->dial, | 6506 | midori_speed_dial_set_close_buttons_left (browser->dial, close_buttons_left); |
1899 | 6874 | katze_object_get_boolean (browser->settings, "close-buttons-left")); | ||
1901 | 6875 | 6507 | ||
1902 | 6876 | midori_browser_set_inactivity_reset (browser, inactivity_reset); | 6508 | midori_browser_set_inactivity_reset (browser, inactivity_reset); |
1903 | 6877 | 6509 | ||
1904 | @@ -6992,17 +6624,17 @@ | |||
1905 | 6992 | } | 6624 | } |
1906 | 6993 | else if (name == g_intern_string ("maximum-history-age")) | 6625 | else if (name == g_intern_string ("maximum-history-age")) |
1907 | 6994 | browser->maximum_history_age = g_value_get_int (&value); | 6626 | browser->maximum_history_age = g_value_get_int (&value); |
1908 | 6995 | #ifdef HAVE_GRANITE | ||
1909 | 6996 | else if (name == g_intern_string ("close-buttons-on-tabs")) | 6627 | else if (name == g_intern_string ("close-buttons-on-tabs")) |
1913 | 6997 | granite_widgets_dynamic_notebook_set_tabs_closable ( | 6628 | midori_notebook_set_close_buttons_visible ( |
1914 | 6998 | GRANITE_WIDGETS_DYNAMIC_NOTEBOOK (browser->notebook), g_value_get_boolean (&value)); | 6629 | MIDORI_NOTEBOOK (browser->notebook), g_value_get_boolean (&value)); |
1912 | 6999 | #endif | ||
1915 | 7000 | else if (name == g_intern_string ("close-buttons-left")) | 6630 | else if (name == g_intern_string ("close-buttons-left")) |
1916 | 7001 | { | 6631 | { |
1917 | 7002 | midori_findbar_set_close_button_left (MIDORI_FINDBAR (browser->find), | 6632 | midori_findbar_set_close_button_left (MIDORI_FINDBAR (browser->find), |
1918 | 7003 | g_value_get_boolean (&value)); | 6633 | g_value_get_boolean (&value)); |
1919 | 7004 | midori_speed_dial_set_close_buttons_left (browser->dial, | 6634 | midori_speed_dial_set_close_buttons_left (browser->dial, |
1921 | 7005 | katze_object_get_boolean (browser->settings, "close-buttons-left")); | 6635 | g_value_get_boolean (&value)); |
1922 | 6636 | midori_notebook_set_close_buttons_left ( | ||
1923 | 6637 | MIDORI_NOTEBOOK (browser->notebook), g_value_get_boolean (&value)); | ||
1924 | 7006 | } | 6638 | } |
1925 | 7007 | else if (name == g_intern_string ("inactivity-reset")) | 6639 | else if (name == g_intern_string ("inactivity-reset")) |
1926 | 7008 | midori_browser_set_inactivity_reset (browser, g_value_get_uint (&value)); | 6640 | midori_browser_set_inactivity_reset (browser, g_value_get_uint (&value)); |
1927 | @@ -7325,7 +6957,7 @@ | |||
1928 | 7325 | g_value_set_object (value, browser->navigationbar); | 6957 | g_value_set_object (value, browser->navigationbar); |
1929 | 7326 | break; | 6958 | break; |
1930 | 7327 | case PROP_NOTEBOOK: | 6959 | case PROP_NOTEBOOK: |
1932 | 7328 | g_value_set_object (value, browser->notebook); | 6960 | g_value_set_object (value, MIDORI_NOTEBOOK (browser->notebook)->notebook); |
1933 | 7329 | break; | 6961 | break; |
1934 | 7330 | case PROP_PANEL: | 6962 | case PROP_PANEL: |
1935 | 7331 | g_value_set_object (value, browser->panel); | 6963 | g_value_set_object (value, browser->panel); |
1936 | @@ -7446,13 +7078,7 @@ | |||
1937 | 7446 | g_return_val_if_fail (MIDORI_IS_BROWSER (browser), -1); | 7078 | g_return_val_if_fail (MIDORI_IS_BROWSER (browser), -1); |
1938 | 7447 | g_return_val_if_fail (MIDORI_IS_VIEW (view), -1); | 7079 | g_return_val_if_fail (MIDORI_IS_VIEW (view), -1); |
1939 | 7448 | 7080 | ||
1947 | 7449 | #ifdef HAVE_GRANITE | 7081 | return midori_notebook_get_tab_index (MIDORI_NOTEBOOK (browser->notebook), MIDORI_TAB (view)); |
1941 | 7450 | return granite_widgets_dynamic_notebook_get_tab_position ( | ||
1942 | 7451 | GRANITE_WIDGETS_DYNAMIC_NOTEBOOK (browser->notebook), | ||
1943 | 7452 | midori_view_get_tab (MIDORI_VIEW (view))); | ||
1944 | 7453 | #else | ||
1945 | 7454 | return gtk_notebook_page_num (GTK_NOTEBOOK (browser->notebook), view); | ||
1946 | 7455 | #endif | ||
1948 | 7456 | } | 7082 | } |
1949 | 7457 | 7083 | ||
1950 | 7458 | 7084 | ||
1951 | @@ -7471,7 +7097,6 @@ | |||
1952 | 7471 | g_return_if_fail (MIDORI_IS_BROWSER (browser)); | 7097 | g_return_if_fail (MIDORI_IS_BROWSER (browser)); |
1953 | 7472 | g_return_if_fail (GTK_IS_WIDGET (view)); | 7098 | g_return_if_fail (GTK_IS_WIDGET (view)); |
1954 | 7473 | 7099 | ||
1955 | 7474 | midori_browser_add_tab_to_trash (browser, MIDORI_VIEW (view)); | ||
1956 | 7475 | g_signal_emit (browser, signals[REMOVE_TAB], 0, view); | 7100 | g_signal_emit (browser, signals[REMOVE_TAB], 0, view); |
1957 | 7476 | } | 7101 | } |
1958 | 7477 | 7102 | ||
1959 | @@ -7697,22 +7322,7 @@ | |||
1960 | 7697 | view = midori_browser_get_nth_tab (browser, n); | 7322 | view = midori_browser_get_nth_tab (browser, n); |
1961 | 7698 | g_return_if_fail (view != NULL); | 7323 | g_return_if_fail (view != NULL); |
1962 | 7699 | 7324 | ||
1979 | 7700 | #ifdef HAVE_GRANITE | 7325 | midori_browser_set_tab (browser, view); |
1964 | 7701 | granite_widgets_dynamic_notebook_set_current ( | ||
1965 | 7702 | GRANITE_WIDGETS_DYNAMIC_NOTEBOOK (browser->notebook), | ||
1966 | 7703 | midori_view_get_tab (MIDORI_VIEW (view))); | ||
1967 | 7704 | #else | ||
1968 | 7705 | gtk_notebook_set_current_page (GTK_NOTEBOOK (browser->notebook), n); | ||
1969 | 7706 | #endif | ||
1970 | 7707 | if (midori_view_is_blank (MIDORI_VIEW (view))) | ||
1971 | 7708 | midori_browser_activate_action (browser, "Location"); | ||
1972 | 7709 | else | ||
1973 | 7710 | gtk_widget_grab_focus (view); | ||
1974 | 7711 | |||
1975 | 7712 | g_object_freeze_notify (G_OBJECT (browser)); | ||
1976 | 7713 | g_object_notify (G_OBJECT (browser), "uri"); | ||
1977 | 7714 | g_object_notify (G_OBJECT (browser), "tab"); | ||
1978 | 7715 | g_object_thaw_notify (G_OBJECT (browser)); | ||
1980 | 7716 | } | 7326 | } |
1981 | 7717 | 7327 | ||
1982 | 7718 | /** | 7328 | /** |
1983 | @@ -7730,14 +7340,7 @@ | |||
1984 | 7730 | { | 7340 | { |
1985 | 7731 | g_return_val_if_fail (MIDORI_IS_BROWSER (browser), -1); | 7341 | g_return_val_if_fail (MIDORI_IS_BROWSER (browser), -1); |
1986 | 7732 | 7342 | ||
1995 | 7733 | #ifdef HAVE_GRANITE | 7343 | return midori_notebook_get_index (MIDORI_NOTEBOOK (browser->notebook)); |
1988 | 7734 | GraniteWidgetsTab* tab = granite_widgets_dynamic_notebook_get_current ( | ||
1989 | 7735 | GRANITE_WIDGETS_DYNAMIC_NOTEBOOK (browser->notebook)); | ||
1990 | 7736 | return tab ? granite_widgets_dynamic_notebook_get_tab_position ( | ||
1991 | 7737 | GRANITE_WIDGETS_DYNAMIC_NOTEBOOK (browser->notebook), tab) : -1; | ||
1992 | 7738 | #else | ||
1993 | 7739 | return gtk_notebook_get_current_page (GTK_NOTEBOOK (browser->notebook)); | ||
1994 | 7740 | #endif | ||
1996 | 7741 | } | 7344 | } |
1997 | 7742 | 7345 | ||
1998 | 7743 | /** | 7346 | /** |
1999 | @@ -7783,19 +7386,9 @@ | |||
2000 | 7783 | midori_browser_get_nth_tab (MidoriBrowser* browser, | 7386 | midori_browser_get_nth_tab (MidoriBrowser* browser, |
2001 | 7784 | gint page) | 7387 | gint page) |
2002 | 7785 | { | 7388 | { |
2016 | 7786 | #ifdef HAVE_GRANITE | 7389 | g_return_val_if_fail (MIDORI_IS_BROWSER (browser), NULL); |
2017 | 7787 | GraniteWidgetsTab* tab; | 7390 | |
2018 | 7788 | 7391 | return (GtkWidget*)midori_notebook_get_nth_tab (MIDORI_NOTEBOOK (browser->notebook), page); | |
2006 | 7789 | g_return_val_if_fail (MIDORI_IS_BROWSER (browser), NULL); | ||
2007 | 7790 | |||
2008 | 7791 | tab = granite_widgets_dynamic_notebook_get_tab_by_index ( | ||
2009 | 7792 | GRANITE_WIDGETS_DYNAMIC_NOTEBOOK (browser->notebook), page); | ||
2010 | 7793 | return tab != NULL ? granite_widgets_tab_get_page (tab) : NULL; | ||
2011 | 7794 | #else | ||
2012 | 7795 | g_return_val_if_fail (MIDORI_IS_BROWSER (browser), NULL); | ||
2013 | 7796 | |||
2014 | 7797 | return gtk_notebook_get_nth_page (GTK_NOTEBOOK (browser->notebook), page); | ||
2015 | 7798 | #endif | ||
2019 | 7799 | } | 7392 | } |
2020 | 7800 | 7393 | ||
2021 | 7801 | /** | 7394 | /** |
2022 | @@ -7813,13 +7406,19 @@ | |||
2023 | 7813 | midori_browser_set_current_tab (MidoriBrowser* browser, | 7406 | midori_browser_set_current_tab (MidoriBrowser* browser, |
2024 | 7814 | GtkWidget* view) | 7407 | GtkWidget* view) |
2025 | 7815 | { | 7408 | { |
2026 | 7816 | gint n; | ||
2027 | 7817 | |||
2028 | 7818 | g_return_if_fail (MIDORI_IS_BROWSER (browser)); | 7409 | g_return_if_fail (MIDORI_IS_BROWSER (browser)); |
2029 | 7819 | g_return_if_fail (GTK_IS_WIDGET (view)); | 7410 | g_return_if_fail (GTK_IS_WIDGET (view)); |
2030 | 7820 | 7411 | ||
2033 | 7821 | n = midori_browser_page_num (browser, view); | 7412 | midori_notebook_set_tab (MIDORI_NOTEBOOK (browser->notebook), MIDORI_TAB (view)); |
2034 | 7822 | midori_browser_set_current_page (browser, n); | 7413 | if (midori_tab_is_blank (MIDORI_TAB (view))) |
2035 | 7414 | midori_browser_activate_action (browser, "Location"); | ||
2036 | 7415 | else | ||
2037 | 7416 | gtk_widget_grab_focus (view); | ||
2038 | 7417 | |||
2039 | 7418 | g_object_freeze_notify (G_OBJECT (browser)); | ||
2040 | 7419 | g_object_notify (G_OBJECT (browser), "uri"); | ||
2041 | 7420 | g_object_notify (G_OBJECT (browser), "tab"); | ||
2042 | 7421 | g_object_thaw_notify (G_OBJECT (browser)); | ||
2043 | 7823 | } | 7422 | } |
2044 | 7824 | 7423 | ||
2045 | 7825 | /** | 7424 | /** |
2046 | @@ -7839,22 +7438,9 @@ | |||
2047 | 7839 | GtkWidget* | 7438 | GtkWidget* |
2048 | 7840 | midori_browser_get_current_tab (MidoriBrowser* browser) | 7439 | midori_browser_get_current_tab (MidoriBrowser* browser) |
2049 | 7841 | { | 7440 | { |
2050 | 7842 | #if 0 // def HAVE_GRANITE | ||
2051 | 7843 | GraniteWidgetsTab* tab; | ||
2052 | 7844 | #else | ||
2053 | 7845 | gint n; | ||
2054 | 7846 | #endif | ||
2055 | 7847 | |||
2056 | 7848 | g_return_val_if_fail (MIDORI_IS_BROWSER (browser), NULL); | 7441 | g_return_val_if_fail (MIDORI_IS_BROWSER (browser), NULL); |
2057 | 7849 | 7442 | ||
2066 | 7850 | #if 0 // FIXME: not reliable def HAVE_GRANITE | 7443 | return (GtkWidget*)midori_notebook_get_tab (MIDORI_NOTEBOOK (browser->notebook)); |
2059 | 7851 | tab = granite_widgets_dynamic_notebook_get_current ( | ||
2060 | 7852 | GRANITE_WIDGETS_DYNAMIC_NOTEBOOK (browser->notebook)); | ||
2061 | 7853 | return tab ? granite_widgets_tab_get_page (tab) : NULL; | ||
2062 | 7854 | #else | ||
2063 | 7855 | n = midori_browser_get_current_page (browser); | ||
2064 | 7856 | return (n >= 0) ? midori_browser_get_nth_tab (browser, n) : NULL; | ||
2065 | 7857 | #endif | ||
2067 | 7858 | } | 7444 | } |
2068 | 7859 | 7445 | ||
2069 | 7860 | /** | 7446 | /** |
2070 | @@ -7872,12 +7458,7 @@ | |||
2071 | 7872 | { | 7458 | { |
2072 | 7873 | g_return_val_if_fail (MIDORI_IS_BROWSER (browser), NULL); | 7459 | g_return_val_if_fail (MIDORI_IS_BROWSER (browser), NULL); |
2073 | 7874 | 7460 | ||
2074 | 7875 | #ifdef HAVE_GRANITE | ||
2075 | 7876 | /* FIXME: granite doesn't correctly implemented gtk.container */ | ||
2076 | 7877 | return granite_widgets_dynamic_notebook_get_children (GRANITE_WIDGETS_DYNAMIC_NOTEBOOK (browser->notebook)); | ||
2077 | 7878 | #else | ||
2078 | 7879 | return gtk_container_get_children (GTK_CONTAINER (browser->notebook)); | 7461 | return gtk_container_get_children (GTK_CONTAINER (browser->notebook)); |
2079 | 7880 | #endif | ||
2080 | 7881 | } | 7462 | } |
2081 | 7882 | 7463 | ||
2082 | 7883 | /** | 7464 | /** |
2083 | 7884 | 7465 | ||
2084 | === added file 'midori/midori-notebook.vala' | |||
2085 | --- midori/midori-notebook.vala 1970-01-01 00:00:00 +0000 | |||
2086 | +++ midori/midori-notebook.vala 2013-12-05 00:25:31 +0000 | |||
2087 | @@ -0,0 +1,526 @@ | |||
2088 | 1 | /* | ||
2089 | 2 | Copyright (C) 2013 Christian Dywan <christian@twotoasts.de> | ||
2090 | 3 | |||
2091 | 4 | This library is free software; you can redistribute it and/or | ||
2092 | 5 | modify it under the terms of the GNU Lesser General Public | ||
2093 | 6 | License as published by the Free Software Foundation; either | ||
2094 | 7 | version 2.1 of the License, or (at your option) any later version. | ||
2095 | 8 | |||
2096 | 9 | See the file COPYING for the full license text. | ||
2097 | 10 | */ | ||
2098 | 11 | |||
2099 | 12 | namespace Midori { | ||
2100 | 13 | protected class Tally : Gtk.EventBox { | ||
2101 | 14 | public Midori.Tab tab { get; set; } | ||
2102 | 15 | Gtk.Spinner spinner; | ||
2103 | 16 | public Gtk.Label label; | ||
2104 | 17 | Gtk.HBox box; | ||
2105 | 18 | public Gtk.Image icon; | ||
2106 | 19 | Gtk.Alignment align; | ||
2107 | 20 | Gtk.Button close; | ||
2108 | 21 | |||
2109 | 22 | public bool close_button_left { get; set; default = false; } | ||
2110 | 23 | public bool close_button_visible { get; set; default = false; } | ||
2111 | 24 | |||
2112 | 25 | protected Tally (Midori.Tab tab) { | ||
2113 | 26 | this.tab = tab; | ||
2114 | 27 | box = new Gtk.HBox (false, 1); | ||
2115 | 28 | add (box); | ||
2116 | 29 | |||
2117 | 30 | spinner = new Gtk.Spinner (); | ||
2118 | 31 | spinner.active = true; | ||
2119 | 32 | /* Ensure the spinner is the size of the icon */ | ||
2120 | 33 | int icon_size = 16; | ||
2121 | 34 | Gtk.icon_size_lookup_for_settings (get_settings (), | ||
2122 | 35 | Gtk.IconSize.MENU, out icon_size, null); | ||
2123 | 36 | spinner.set_size_request (icon_size, icon_size); | ||
2124 | 37 | box.pack_start (spinner, false, false, 0); | ||
2125 | 38 | label = new Gtk.Label (null); | ||
2126 | 39 | label.set_alignment (0.0f, 0.5f); | ||
2127 | 40 | label.set_padding (0, 0); | ||
2128 | 41 | box.pack_start (label, true, true, 0); | ||
2129 | 42 | close = new Gtk.Button (); | ||
2130 | 43 | close.relief = Gtk.ReliefStyle.NONE; | ||
2131 | 44 | close.focus_on_click = false; | ||
2132 | 45 | #if !HAVE_GTK3 | ||
2133 | 46 | close.name = "midori-close-button"; | ||
2134 | 47 | close.style_set.connect (close_style_set); | ||
2135 | 48 | #endif | ||
2136 | 49 | icon = new Gtk.Image.from_gicon (new ThemedIcon.with_default_fallbacks ("window-close-symbolic"), Gtk.IconSize.MENU); | ||
2137 | 50 | close.add (icon); | ||
2138 | 51 | align = new Gtk.Alignment (1.0f, 0.5f, 0.0f, 0.0f); | ||
2139 | 52 | align.add (close); | ||
2140 | 53 | box.pack_start (align, false, false, 0); | ||
2141 | 54 | close.clicked.connect (close_clicked); | ||
2142 | 55 | icon = new Gtk.Image.from_gicon (new ThemedIcon.with_default_fallbacks ("text-html-symbolic"), Gtk.IconSize.MENU); | ||
2143 | 56 | box.pack_start (icon, false, false, 0); | ||
2144 | 57 | box.show_all (); | ||
2145 | 58 | |||
2146 | 59 | tab.notify["uri"].connect (uri_changed); | ||
2147 | 60 | tab.notify["title"].connect (title_changed); | ||
2148 | 61 | tab.notify["icon"].connect (icon_changed); | ||
2149 | 62 | tab.notify["minimized"].connect (minimized_changed); | ||
2150 | 63 | tab.notify["progress"].connect (progress_changed); | ||
2151 | 64 | tab.colors_changed.connect (colors_changed); | ||
2152 | 65 | update_label (); | ||
2153 | 66 | label.visible = !tab.minimized; | ||
2154 | 67 | spinner.visible = tab.progress > 0.0; | ||
2155 | 68 | icon.visible = !spinner.visible; | ||
2156 | 69 | update_color (); | ||
2157 | 70 | |||
2158 | 71 | notify["close-button-left"].connect (close_button_left_changed); | ||
2159 | 72 | notify_property ("close-button-left"); | ||
2160 | 73 | notify["close-button-visible"].connect (close_button_visible_changed); | ||
2161 | 74 | notify_property ("close-button-visible"); | ||
2162 | 75 | |||
2163 | 76 | Gtk.drag_dest_set (this, Gtk.DestDefaults.ALL, (Gtk.TargetEntry[])null, Gdk.DragAction.COPY); | ||
2164 | 77 | Gtk.drag_dest_add_text_targets (this); | ||
2165 | 78 | Gtk.drag_dest_add_uri_targets (this); | ||
2166 | 79 | drag_data_received.connect (uri_dragged); | ||
2167 | 80 | } | ||
2168 | 81 | |||
2169 | 82 | #if !HAVE_GTK3 | ||
2170 | 83 | void close_style_set (Gtk.Style? previous_style) { | ||
2171 | 84 | Gtk.Requisition size; | ||
2172 | 85 | close.child.size_request (out size); | ||
2173 | 86 | close.set_size_request (size.width, size.height); | ||
2174 | 87 | } | ||
2175 | 88 | #endif | ||
2176 | 89 | |||
2177 | 90 | void close_clicked () { | ||
2178 | 91 | tab.destroy (); | ||
2179 | 92 | } | ||
2180 | 93 | |||
2181 | 94 | void uri_changed (GLib.ParamSpec pspec) { | ||
2182 | 95 | label.label = tab.uri; | ||
2183 | 96 | } | ||
2184 | 97 | |||
2185 | 98 | void title_changed (GLib.ParamSpec pspec) { | ||
2186 | 99 | update_label (); | ||
2187 | 100 | } | ||
2188 | 101 | |||
2189 | 102 | void update_label () { | ||
2190 | 103 | string? title; | ||
2191 | 104 | tab.get ("title", out title); | ||
2192 | 105 | label.label = Midori.Tab.get_display_title (title, tab.uri); | ||
2193 | 106 | /* Use computed label below! */ | ||
2194 | 107 | label.ellipsize = Midori.Tab.get_display_ellipsize (label.label, tab.uri); | ||
2195 | 108 | tooltip_text = label.label; | ||
2196 | 109 | } | ||
2197 | 110 | |||
2198 | 111 | void icon_changed (GLib.ParamSpec pspec) { | ||
2199 | 112 | Icon? icon; | ||
2200 | 113 | tab.get ("icon", out icon); | ||
2201 | 114 | this.icon.set_from_gicon (icon, Gtk.IconSize.MENU); | ||
2202 | 115 | } | ||
2203 | 116 | |||
2204 | 117 | void colors_changed () { | ||
2205 | 118 | update_color (); | ||
2206 | 119 | } | ||
2207 | 120 | |||
2208 | 121 | void update_color () { | ||
2209 | 122 | visible_window = tab.fg_color != null || tab.bg_color != null; | ||
2210 | 123 | label.modify_fg (Gtk.StateType.NORMAL, tab.fg_color); | ||
2211 | 124 | label.modify_fg (Gtk.StateType.ACTIVE, tab.fg_color); | ||
2212 | 125 | modify_bg (Gtk.StateType.NORMAL, tab.bg_color); | ||
2213 | 126 | modify_bg (Gtk.StateType.ACTIVE, tab.bg_color); | ||
2214 | 127 | } | ||
2215 | 128 | |||
2216 | 129 | void close_button_left_changed (GLib.ParamSpec pspec) { | ||
2217 | 130 | if (close_button_left) { | ||
2218 | 131 | box.reorder_child (align, 0); | ||
2219 | 132 | box.reorder_child (label, 1); | ||
2220 | 133 | box.reorder_child (icon, 2); | ||
2221 | 134 | box.reorder_child (spinner, 3); | ||
2222 | 135 | } else { | ||
2223 | 136 | box.reorder_child (spinner, 0); | ||
2224 | 137 | box.reorder_child (icon, 1); | ||
2225 | 138 | box.reorder_child (label, 2); | ||
2226 | 139 | box.reorder_child (align, 3); | ||
2227 | 140 | } | ||
2228 | 141 | } | ||
2229 | 142 | |||
2230 | 143 | void close_button_visible_changed (GLib.ParamSpec pspec) { | ||
2231 | 144 | align.visible = !tab.minimized && close_button_visible; | ||
2232 | 145 | } | ||
2233 | 146 | |||
2234 | 147 | void minimized_changed (GLib.ParamSpec pspec) { | ||
2235 | 148 | label.visible = !tab.minimized; | ||
2236 | 149 | notify_property ("close-button-visible"); | ||
2237 | 150 | } | ||
2238 | 151 | |||
2239 | 152 | void progress_changed (GLib.ParamSpec pspec) { | ||
2240 | 153 | spinner.visible = tab.progress > 0.0; | ||
2241 | 154 | icon.visible = !spinner.visible; | ||
2242 | 155 | } | ||
2243 | 156 | |||
2244 | 157 | void uri_dragged (Gdk.DragContext context, int x, int y, Gtk.SelectionData data, uint ttype, uint timestamp) { | ||
2245 | 158 | /* FIXME: Navigate to the URI | ||
2246 | 159 | string[] uri = data.get_uris (); | ||
2247 | 160 | if (uri != null) | ||
2248 | 161 | tab.uri = uri[0]; | ||
2249 | 162 | else | ||
2250 | 163 | tab.uri = data.get_text (); | ||
2251 | 164 | */ | ||
2252 | 165 | } | ||
2253 | 166 | } | ||
2254 | 167 | |||
2255 | 168 | public class Notebook : Gtk.EventBox { | ||
2256 | 169 | public Gtk.Notebook notebook; | ||
2257 | 170 | int last_tab_size = 0; | ||
2258 | 171 | |||
2259 | 172 | #if !HAVE_GTK3 | ||
2260 | 173 | static const string style_fixup = """ | ||
2261 | 174 | style "midori-close-button-style" | ||
2262 | 175 | { | ||
2263 | 176 | GtkWidget::focus-padding = 0 | ||
2264 | 177 | GtkWidget::focus-line-width = 0 | ||
2265 | 178 | xthickness = 0 | ||
2266 | 179 | ythickness = 0 | ||
2267 | 180 | } | ||
2268 | 181 | widget "*.midori-close-button" style "midori-close-button-style" | ||
2269 | 182 | """; | ||
2270 | 183 | #endif | ||
2271 | 184 | |||
2272 | 185 | /* Since: 0.5.7 */ | ||
2273 | 186 | public uint count { get; private set; default = 0; } | ||
2274 | 187 | /* Since: 0.5.7 */ | ||
2275 | 188 | public int index { get; set; default = -1; } | ||
2276 | 189 | /* Since: 0.5.7 */ | ||
2277 | 190 | public Midori.Tab? tab { get; set; default = null; } | ||
2278 | 191 | /* Since: 0.5.7 */ | ||
2279 | 192 | private Midori.Tab? previous { get; set; default = null; } | ||
2280 | 193 | |||
2281 | 194 | /* Since: 0.5.7 */ | ||
2282 | 195 | public bool close_buttons_left { get; set; default = true; } | ||
2283 | 196 | /* Since: 0.5.7 */ | ||
2284 | 197 | public bool close_buttons_visible { get; set; default = true; } | ||
2285 | 198 | /* Since: 0.5.7 */ | ||
2286 | 199 | public bool labels_visible { get; set; default = true; } | ||
2287 | 200 | |||
2288 | 201 | /* Since: 0.5.7 */ | ||
2289 | 202 | public signal void tab_context_menu (Midori.Tab tab, ContextAction menu); | ||
2290 | 203 | /* Since: 0.5.7 */ | ||
2291 | 204 | public signal void context_menu (ContextAction menu); | ||
2292 | 205 | /* The current tab is about to switch, but the old tab still has focus. | ||
2293 | 206 | Since: 0.5.7 */ | ||
2294 | 207 | public signal void tab_switched (Midori.Tab? old, Midori.Tab @new); | ||
2295 | 208 | /* A tab is about to move to a new position. | ||
2296 | 209 | Since: 0.5.7 */ | ||
2297 | 210 | public signal void tab_moved (Midori.Tab tab, uint new_index); | ||
2298 | 211 | /* A tab is being dragging out of the window. | ||
2299 | 212 | Since: 0.5.7 */ | ||
2300 | 213 | public signal void tab_detached (Midori.Tab tab, int x, int y); | ||
2301 | 214 | /* Since: 0.5.7 */ | ||
2302 | 215 | public signal void new_tab (); | ||
2303 | 216 | |||
2304 | 217 | [CCode (type = "GtkWidget*")] | ||
2305 | 218 | public Notebook () { | ||
2306 | 219 | visible_window = false; | ||
2307 | 220 | notebook = new Gtk.Notebook (); | ||
2308 | 221 | notebook.visible = notebook.scrollable = true; | ||
2309 | 222 | notebook.show_border = false; | ||
2310 | 223 | notebook.set ("group-name", PACKAGE_NAME); | ||
2311 | 224 | add (notebook); | ||
2312 | 225 | |||
2313 | 226 | #if !HAVE_GTK3 | ||
2314 | 227 | /* Remove the inner border between scrollbars and window border */ | ||
2315 | 228 | Gtk.RcStyle rcstyle = new Gtk.RcStyle (); | ||
2316 | 229 | rcstyle.xthickness = 0; | ||
2317 | 230 | notebook.modify_style (rcstyle); | ||
2318 | 231 | Gtk.rc_parse_string (style_fixup); | ||
2319 | 232 | #endif | ||
2320 | 233 | notify["index"].connect (index_changed); | ||
2321 | 234 | notify["tab"].connect (tab_changed); | ||
2322 | 235 | notify["labels-visible"].connect (labels_visible_changed); | ||
2323 | 236 | notify["close-buttons-visible"].connect (close_buttons_visible_changed); | ||
2324 | 237 | notify["close-buttons-left"].connect (close_buttons_left_changed); | ||
2325 | 238 | |||
2326 | 239 | notebook.size_allocate.connect (size_allocated); | ||
2327 | 240 | notebook.switch_page.connect (page_switched); | ||
2328 | 241 | notebook.page_reordered.connect (page_moved); | ||
2329 | 242 | notebook.create_window.connect (window_created); | ||
2330 | 243 | |||
2331 | 244 | var add = new Gtk.Button (); | ||
2332 | 245 | add.relief = Gtk.ReliefStyle.NONE; | ||
2333 | 246 | add.add (new Gtk.Image.from_gicon (new ThemedIcon.with_default_fallbacks ("tab-new-symbolic"), Gtk.IconSize.MENU)); | ||
2334 | 247 | add.show_all (); | ||
2335 | 248 | notebook.set_action_widget (add, Gtk.PackType.START); | ||
2336 | 249 | add.clicked.connect (()=>{ | ||
2337 | 250 | new_tab (); | ||
2338 | 251 | }); | ||
2339 | 252 | |||
2340 | 253 | button_press_event.connect (button_pressed); | ||
2341 | 254 | } | ||
2342 | 255 | |||
2343 | 256 | ~Notebook () { | ||
2344 | 257 | notebook.size_allocate.disconnect (size_allocated); | ||
2345 | 258 | notebook.switch_page.disconnect (page_switched); | ||
2346 | 259 | notebook.page_reordered.disconnect (page_moved); | ||
2347 | 260 | notebook.create_window.disconnect (window_created); | ||
2348 | 261 | } | ||
2349 | 262 | |||
2350 | 263 | bool button_pressed (Gdk.EventButton event) { | ||
2351 | 264 | /* Propagate events in logical label area */ | ||
2352 | 265 | foreach (var child in notebook.get_children ()) { | ||
2353 | 266 | var tally = notebook.get_tab_label (tab) as Tally; | ||
2354 | 267 | Gtk.Allocation size; | ||
2355 | 268 | tally.get_allocation (out size); | ||
2356 | 269 | if (tally.get_mapped () | ||
2357 | 270 | && event.x_root >= size.x | ||
2358 | 271 | && event.x_root <= (size.x + size.width)) { | ||
2359 | 272 | tally.button_press_event (event); | ||
2360 | 273 | return true; | ||
2361 | 274 | } | ||
2362 | 275 | } | ||
2363 | 276 | |||
2364 | 277 | if (event.type == Gdk.EventType.2BUTTON_PRESS && event.button == 1 | ||
2365 | 278 | || event.button == 2) { | ||
2366 | 279 | new_tab (); | ||
2367 | 280 | return true; | ||
2368 | 281 | } | ||
2369 | 282 | else if (event.button == 3) { | ||
2370 | 283 | var menu = new Midori.ContextAction ("NotebookContextMenu", null, null, null); | ||
2371 | 284 | uint counter = 0; | ||
2372 | 285 | foreach (var child in notebook.get_children ()) { | ||
2373 | 286 | var tab = child as Midori.Tab; | ||
2374 | 287 | var tally = notebook.get_tab_label (tab) as Tally; | ||
2375 | 288 | var action = new Gtk.Action ("Tab%u".printf (counter), tally.label.label, null, null); | ||
2376 | 289 | action.gicon = tally.icon.gicon; | ||
2377 | 290 | action.activate.connect (()=>{ | ||
2378 | 291 | notebook.set_current_page (notebook.page_num (tab)); | ||
2379 | 292 | }); | ||
2380 | 293 | menu.add (action); | ||
2381 | 294 | counter++; | ||
2382 | 295 | } | ||
2383 | 296 | context_menu (menu); | ||
2384 | 297 | var popup = menu.create_menu (null, false); | ||
2385 | 298 | popup.show (); | ||
2386 | 299 | popup.attach_to_widget (this, null); | ||
2387 | 300 | popup.popup (null, null, null, event.button, event.time); | ||
2388 | 301 | return true; | ||
2389 | 302 | } | ||
2390 | 303 | return false; | ||
2391 | 304 | } | ||
2392 | 305 | |||
2393 | 306 | public void insert (Midori.Tab tab, int index) { | ||
2394 | 307 | var tally = new Tally (tab); | ||
2395 | 308 | tally.close_button_left = close_buttons_left; | ||
2396 | 309 | tally.close_button_visible = close_buttons_visible; | ||
2397 | 310 | tally.button_press_event.connect (tab_button_pressed); | ||
2398 | 311 | tally.show (); | ||
2399 | 312 | tally.set_size_request (tab.minimized ? -1 : last_tab_size, -1); | ||
2400 | 313 | |||
2401 | 314 | /* Minimum requirements for any tab */ | ||
2402 | 315 | tab.can_focus = tab.visible = true; | ||
2403 | 316 | notebook.insert_page (tab, tally, index); | ||
2404 | 317 | notebook.set_tab_reorderable (tab, true); | ||
2405 | 318 | notebook.set_tab_detachable (tab, true); | ||
2406 | 319 | tab.destroy.connect (tab_removed); | ||
2407 | 320 | tab.notify["minimized"].connect (tab_minimized); | ||
2408 | 321 | count++; | ||
2409 | 322 | tab.ref (); | ||
2410 | 323 | relayout (); | ||
2411 | 324 | } | ||
2412 | 325 | |||
2413 | 326 | void tab_removed () { | ||
2414 | 327 | count--; | ||
2415 | 328 | if (count > 0) | ||
2416 | 329 | relayout (); | ||
2417 | 330 | } | ||
2418 | 331 | |||
2419 | 332 | void relayout () { | ||
2420 | 333 | Gtk.Allocation size; | ||
2421 | 334 | notebook.get_allocation (out size); | ||
2422 | 335 | resize (size.width); | ||
2423 | 336 | } | ||
2424 | 337 | |||
2425 | 338 | bool tab_button_pressed (Gtk.Widget label, Gdk.EventButton event) { | ||
2426 | 339 | Tally tally = label as Tally; | ||
2427 | 340 | if (event.button == 1) { | ||
2428 | 341 | /* Leave switching and dragging up to the notebook */ | ||
2429 | 342 | return false; | ||
2430 | 343 | } else if (event.button == 2) | ||
2431 | 344 | tally.tab.destroy (); | ||
2432 | 345 | else if (event.button == 3) { | ||
2433 | 346 | var menu = new Midori.ContextAction ("TabContextMenu", null, null, null); | ||
2434 | 347 | tab_context_menu (tally.tab, menu); | ||
2435 | 348 | var action_window = new Midori.ContextAction ("TabWindowNew", _("Open in New _Window"), null, "window-new"); | ||
2436 | 349 | action_window.activate.connect (()=>{ | ||
2437 | 350 | tab_detached (tally.tab, 128, 128); | ||
2438 | 351 | }); | ||
2439 | 352 | menu.add (action_window); | ||
2440 | 353 | var action_minimize = new Midori.ContextAction ("TabMinimize", tally.tab.minimized ? _("Show Tab _Label") : _("Show Tab _Icon Only"), null, null); | ||
2441 | 354 | action_minimize.activate.connect (()=>{ | ||
2442 | 355 | tally.tab.minimized = !tally.tab.minimized; | ||
2443 | 356 | }); | ||
2444 | 357 | menu.add (action_minimize); | ||
2445 | 358 | var action_right = new Midori.ContextAction ("TabCloseRight", ngettext ("Close Tab to the R_ight", "Close Tabs to the R_ight", count - 1), null, null); | ||
2446 | 359 | action_right.sensitive = count > 1; | ||
2447 | 360 | action_right.activate.connect (()=>{ | ||
2448 | 361 | bool found_tab = false; | ||
2449 | 362 | foreach (var child in notebook.get_children ()) { | ||
2450 | 363 | if (found_tab) | ||
2451 | 364 | child.destroy (); | ||
2452 | 365 | else | ||
2453 | 366 | found_tab = child == tally.tab; | ||
2454 | 367 | } | ||
2455 | 368 | }); | ||
2456 | 369 | menu.add (action_right); | ||
2457 | 370 | var action_other = new Midori.ContextAction ("TabCloseOther", ngettext ("Close Ot_her Tab", "Close Ot_her Tabs", count - 1), null, null); | ||
2458 | 371 | action_other.sensitive = count > 1; | ||
2459 | 372 | action_other.activate.connect (()=>{ | ||
2460 | 373 | foreach (var child in notebook.get_children ()) | ||
2461 | 374 | if (child != tally.tab) | ||
2462 | 375 | child.destroy (); | ||
2463 | 376 | }); | ||
2464 | 377 | menu.add (action_other); | ||
2465 | 378 | var action_close = new Midori.ContextAction ("TabClose", null, null, Gtk.STOCK_CLOSE); | ||
2466 | 379 | action_close.activate.connect (()=>{ | ||
2467 | 380 | tally.tab.destroy (); | ||
2468 | 381 | }); | ||
2469 | 382 | menu.add (action_close); | ||
2470 | 383 | var popup = menu.create_menu (null, false); | ||
2471 | 384 | popup.show (); | ||
2472 | 385 | popup.attach_to_widget (this, null); | ||
2473 | 386 | popup.popup (null, null, null, event.button, event.time); | ||
2474 | 387 | } | ||
2475 | 388 | return true; | ||
2476 | 389 | } | ||
2477 | 390 | |||
2478 | 391 | public void move (Midori.Tab tab, int index) { | ||
2479 | 392 | notebook.reorder_child (tab, index); | ||
2480 | 393 | } | ||
2481 | 394 | |||
2482 | 395 | /* Chain up drawing manually to circumvent parent checks */ | ||
2483 | 396 | #if HAVE_GTK3 | ||
2484 | 397 | public override bool draw (Cairo.Context cr) { | ||
2485 | 398 | notebook.draw (cr); | ||
2486 | 399 | return true; | ||
2487 | 400 | } | ||
2488 | 401 | #else | ||
2489 | 402 | public override bool expose_event (Gdk.EventExpose event) { | ||
2490 | 403 | notebook.expose_event (event); | ||
2491 | 404 | return true; | ||
2492 | 405 | } | ||
2493 | 406 | #endif | ||
2494 | 407 | |||
2495 | 408 | public override void forall_internal (bool include_internal, Gtk.Callback callback) { | ||
2496 | 409 | if (include_internal) | ||
2497 | 410 | callback (notebook); | ||
2498 | 411 | foreach (var child in notebook.get_children ()) | ||
2499 | 412 | callback (child); | ||
2500 | 413 | } | ||
2501 | 414 | |||
2502 | 415 | /* Can't override Gtk.Container.remove because it checks the parent */ | ||
2503 | 416 | public new void remove (Midori.Tab tab) { | ||
2504 | 417 | return_if_fail (notebook.get_children ().find (tab) != null); | ||
2505 | 418 | |||
2506 | 419 | notebook.remove (tab); | ||
2507 | 420 | tab.destroy.disconnect (tab_removed); | ||
2508 | 421 | tab.notify["minimized"].disconnect (tab_minimized); | ||
2509 | 422 | tab_removed (); | ||
2510 | 423 | tab.unref (); | ||
2511 | 424 | } | ||
2512 | 425 | |||
2513 | 426 | void tab_minimized (GLib.ParamSpec pspec) { | ||
2514 | 427 | var tally = notebook.get_tab_label (tab) as Tally; | ||
2515 | 428 | tally.set_size_request (tab.minimized ? -1 : last_tab_size, -1); | ||
2516 | 429 | } | ||
2517 | 430 | |||
2518 | 431 | public Midori.Tab get_nth_tab (int index) { | ||
2519 | 432 | return notebook.get_nth_page (index) as Midori.Tab; | ||
2520 | 433 | } | ||
2521 | 434 | |||
2522 | 435 | public int get_tab_index (Midori.Tab tab) { | ||
2523 | 436 | return notebook.page_num (tab); | ||
2524 | 437 | } | ||
2525 | 438 | |||
2526 | 439 | void index_changed (GLib.ParamSpec pspec) { | ||
2527 | 440 | notebook.set_current_page (index); | ||
2528 | 441 | } | ||
2529 | 442 | |||
2530 | 443 | void tab_changed (GLib.ParamSpec pspec) { | ||
2531 | 444 | notebook.set_current_page (notebook.page_num (tab)); | ||
2532 | 445 | } | ||
2533 | 446 | |||
2534 | 447 | void labels_visible_changed (GLib.ParamSpec pspec) { | ||
2535 | 448 | notebook.show_tabs = labels_visible; | ||
2536 | 449 | } | ||
2537 | 450 | |||
2538 | 451 | void close_buttons_visible_changed (GLib.ParamSpec pspec) { | ||
2539 | 452 | foreach (var child in notebook.get_children ()) { | ||
2540 | 453 | var tally = notebook.get_tab_label (child) as Tally; | ||
2541 | 454 | tally.close_button_visible = close_buttons_visible; | ||
2542 | 455 | } | ||
2543 | 456 | } | ||
2544 | 457 | |||
2545 | 458 | void close_buttons_left_changed (GLib.ParamSpec pspec) { | ||
2546 | 459 | foreach (var child in notebook.get_children ()) { | ||
2547 | 460 | var tally = notebook.get_tab_label (child) as Tally; | ||
2548 | 461 | tally.close_button_left = close_buttons_left; | ||
2549 | 462 | } | ||
2550 | 463 | } | ||
2551 | 464 | |||
2552 | 465 | #if HAVE_GTK3 | ||
2553 | 466 | void size_allocated (Gtk.Allocation allocation) { | ||
2554 | 467 | #else | ||
2555 | 468 | void size_allocated (Gdk.Rectangle allocation) { | ||
2556 | 469 | #endif | ||
2557 | 470 | if (labels_visible && count > 0) | ||
2558 | 471 | resize (allocation.width); | ||
2559 | 472 | } | ||
2560 | 473 | |||
2561 | 474 | #if HAVE_GTK3 | ||
2562 | 475 | void page_switched (Gtk.Widget new_tab, uint new_index) { | ||
2563 | 476 | #else | ||
2564 | 477 | void page_switched (Gtk.NotebookPage new_tab, uint new_index) { | ||
2565 | 478 | #endif | ||
2566 | 479 | tab_switched (previous, new_tab as Tab); | ||
2567 | 480 | previous = (Midori.Tab)new_tab; | ||
2568 | 481 | |||
2569 | 482 | notify["index"].disconnect (index_changed); | ||
2570 | 483 | notify["tab"].disconnect (tab_changed); | ||
2571 | 484 | index = (int)new_index; | ||
2572 | 485 | tab = (Midori.Tab)new_tab; | ||
2573 | 486 | notify["index"].connect (index_changed); | ||
2574 | 487 | notify["tab"].connect (tab_changed); | ||
2575 | 488 | } | ||
2576 | 489 | |||
2577 | 490 | void page_moved (Gtk.Widget moving_tab, uint new_index) { | ||
2578 | 491 | tab_moved (moving_tab as Midori.Tab, new_index); | ||
2579 | 492 | /* Indices change, current tab is not in the same position */ | ||
2580 | 493 | notify["index"].disconnect (index_changed); | ||
2581 | 494 | index = (int)get_tab_index (tab); | ||
2582 | 495 | notify["index"].connect (index_changed); | ||
2583 | 496 | } | ||
2584 | 497 | |||
2585 | 498 | unowned Gtk.Notebook window_created (Gtk.Widget tab, int x, int y) { | ||
2586 | 499 | tab_detached (tab as Tab, x, y); | ||
2587 | 500 | /* The API allows now, the cast is due to bindings not having ? */ | ||
2588 | 501 | return (Gtk.Notebook)null; | ||
2589 | 502 | } | ||
2590 | 503 | |||
2591 | 504 | void resize (int new_size) { | ||
2592 | 505 | int n = int.max (1, (int)count); | ||
2593 | 506 | new_size /= n; | ||
2594 | 507 | int icon_size = 16; | ||
2595 | 508 | Gtk.icon_size_lookup_for_settings (get_settings (), | ||
2596 | 509 | Gtk.IconSize.MENU, out icon_size, null); | ||
2597 | 510 | int max_size = 150; | ||
2598 | 511 | int min_size = icon_size; | ||
2599 | 512 | if (close_buttons_visible) | ||
2600 | 513 | min_size += icon_size; | ||
2601 | 514 | new_size = new_size.clamp (min_size, max_size); | ||
2602 | 515 | if ((new_size - last_tab_size).abs () < 3) | ||
2603 | 516 | return; | ||
2604 | 517 | |||
2605 | 518 | last_tab_size = new_size; | ||
2606 | 519 | foreach (var child in notebook.get_children ()) { | ||
2607 | 520 | var tab = child as Midori.Tab; | ||
2608 | 521 | var tally = notebook.get_tab_label (child) as Tally; | ||
2609 | 522 | tally.set_size_request (tab.minimized ? -1 : last_tab_size, -1); | ||
2610 | 523 | } | ||
2611 | 524 | } | ||
2612 | 525 | } | ||
2613 | 526 | } | ||
2614 | 0 | 527 | ||
2615 | === modified file 'midori/midori-preferences.c' | |||
2616 | --- midori/midori-preferences.c 2013-11-25 23:12:58 +0000 | |||
2617 | +++ midori/midori-preferences.c 2013-12-05 00:25:31 +0000 | |||
2618 | @@ -482,11 +482,6 @@ | |||
2619 | 482 | button = katze_property_proxy (settings, "close-buttons-on-tabs", NULL); | 482 | button = katze_property_proxy (settings, "close-buttons-on-tabs", NULL); |
2620 | 483 | gtk_button_set_label (GTK_BUTTON (button), _("Close Buttons on Tabs")); | 483 | gtk_button_set_label (GTK_BUTTON (button), _("Close Buttons on Tabs")); |
2621 | 484 | INDENTED_ADD (button); | 484 | INDENTED_ADD (button); |
2622 | 485 | #ifndef HAVE_GRANITE | ||
2623 | 486 | button = katze_property_proxy (settings, "always-show-tabbar", NULL); | ||
2624 | 487 | gtk_button_set_label (GTK_BUTTON (button), _("Always Show Tabbar")); | ||
2625 | 488 | SPANNED_ADD (button); | ||
2626 | 489 | #endif | ||
2627 | 490 | button = katze_property_proxy (settings, "open-tabs-next-to-current", NULL); | 485 | button = katze_property_proxy (settings, "open-tabs-next-to-current", NULL); |
2628 | 491 | gtk_button_set_label (GTK_BUTTON (button), _("Open Tabs next to Current")); | 486 | gtk_button_set_label (GTK_BUTTON (button), _("Open Tabs next to Current")); |
2629 | 492 | gtk_widget_set_tooltip_text (button, _("Whether to open new tabs next to the current tab or after the last one")); | 487 | gtk_widget_set_tooltip_text (button, _("Whether to open new tabs next to the current tab or after the last one")); |
2630 | 493 | 488 | ||
2631 | === modified file 'midori/midori-settings.vala' | |||
2632 | --- midori/midori-settings.vala 2013-08-04 14:27:34 +0000 | |||
2633 | +++ midori/midori-settings.vala 2013-12-05 00:25:31 +0000 | |||
2634 | @@ -153,6 +153,7 @@ | |||
2635 | 153 | public bool close_buttons_on_tabs { get; set; default = true; } | 153 | public bool close_buttons_on_tabs { get; set; default = true; } |
2636 | 154 | public bool open_tabs_in_the_background { get; set; default = true; } | 154 | public bool open_tabs_in_the_background { get; set; default = true; } |
2637 | 155 | public bool open_tabs_next_to_current { get; set; default = true; } | 155 | public bool open_tabs_next_to_current { get; set; default = true; } |
2638 | 156 | // [Deprecated (since = "0.5.7")] | ||
2639 | 156 | public bool always_show_tabbar { get; set; default = true; } | 157 | public bool always_show_tabbar { get; set; default = true; } |
2640 | 157 | 158 | ||
2641 | 158 | public string homepage { get; set; default = "about:search"; } | 159 | public string homepage { get; set; default = "about:search"; } |
2642 | 159 | 160 | ||
2643 | === modified file 'midori/midori-tab.vala' | |||
2644 | --- midori/midori-tab.vala 2013-10-08 20:13:36 +0000 | |||
2645 | +++ midori/midori-tab.vala 2013-12-05 00:25:31 +0000 | |||
2646 | @@ -51,6 +51,9 @@ | |||
2647 | 51 | 51 | ||
2648 | 52 | /* Special is an error, blank or delayed page */ | 52 | /* Special is an error, blank or delayed page */ |
2649 | 53 | public bool special { get; protected set; default = false; } | 53 | public bool special { get; protected set; default = false; } |
2650 | 54 | /* Minimizing a tab indicates that only the icon should be shown. | ||
2651 | 55 | Since: 0.1.8 */ | ||
2652 | 56 | public bool minimized { get; set; default = false; } | ||
2653 | 54 | /* Since: 0.4.8 */ | 57 | /* Since: 0.4.8 */ |
2654 | 55 | public string mime_type { get; protected set; default = "text/plain"; } | 58 | public string mime_type { get; protected set; default = "text/plain"; } |
2655 | 56 | /* Since: 0.1.2 */ | 59 | /* Since: 0.1.2 */ |
2656 | @@ -58,8 +61,18 @@ | |||
2657 | 58 | public LoadStatus load_status { get; protected set; default = LoadStatus.FINISHED; } | 61 | public LoadStatus load_status { get; protected set; default = LoadStatus.FINISHED; } |
2658 | 59 | public string? statusbar_text { get; protected set; default = null; } | 62 | public string? statusbar_text { get; protected set; default = null; } |
2659 | 60 | /* Since: 0.5.0 */ | 63 | /* Since: 0.5.0 */ |
2660 | 64 | |||
2661 | 61 | public Gdk.Color? fg_color { get; protected set; default = null; } | 65 | public Gdk.Color? fg_color { get; protected set; default = null; } |
2663 | 62 | public Gdk.Color? bg_color { get; protected set; default = null; } | 66 | private Gdk.Color? bg_color_ = null; |
2664 | 67 | public Gdk.Color? bg_color { get { | ||
2665 | 68 | return bg_color_; | ||
2666 | 69 | } protected set { | ||
2667 | 70 | bg_color_ = value; | ||
2668 | 71 | colors_changed (); | ||
2669 | 72 | } } | ||
2670 | 73 | /* After fg_color and bg_color have changed. | ||
2671 | 74 | Since: 0.5.7 */ | ||
2672 | 75 | public signal void colors_changed (); | ||
2673 | 63 | 76 | ||
2674 | 64 | /* Special pages don't convey progress */ | 77 | /* Special pages don't convey progress */ |
2675 | 65 | private double current_progress = 0.0; | 78 | private double current_progress = 0.0; |
2676 | 66 | 79 | ||
2677 | === modified file 'midori/midori-view.c' | |||
2678 | --- midori/midori-view.c 2013-11-22 18:03:14 +0000 | |||
2679 | +++ midori/midori-view.c 2013-12-05 00:25:31 +0000 | |||
2680 | @@ -109,21 +109,13 @@ | |||
2681 | 109 | KatzeArray* news_feeds; | 109 | KatzeArray* news_feeds; |
2682 | 110 | 110 | ||
2683 | 111 | gboolean open_tabs_in_the_background; | 111 | gboolean open_tabs_in_the_background; |
2684 | 112 | gboolean close_buttons_on_tabs; | ||
2685 | 113 | MidoriNewPage open_new_pages_in; | 112 | MidoriNewPage open_new_pages_in; |
2686 | 114 | gint find_links; | 113 | gint find_links; |
2687 | 115 | gint alerts; | 114 | gint alerts; |
2688 | 116 | 115 | ||
2689 | 116 | GtkWidget* tab_label; | ||
2690 | 117 | GtkWidget* menu_item; | 117 | GtkWidget* menu_item; |
2691 | 118 | PangoEllipsizeMode ellipsize; | 118 | PangoEllipsizeMode ellipsize; |
2692 | 119 | #ifdef HAVE_GRANITE | ||
2693 | 120 | GraniteWidgetsTab* tab; | ||
2694 | 121 | #else | ||
2695 | 122 | GtkWidget* tab_label; | ||
2696 | 123 | GtkWidget* tab_icon; | ||
2697 | 124 | GtkWidget* tab_title; | ||
2698 | 125 | GtkWidget* tab_close; | ||
2699 | 126 | #endif | ||
2700 | 127 | KatzeItem* item; | 119 | KatzeItem* item; |
2701 | 128 | gint scrollh, scrollv; | 120 | gint scrollh, scrollv; |
2702 | 129 | GtkWidget* scrolled_window; | 121 | GtkWidget* scrolled_window; |
2703 | @@ -355,26 +347,6 @@ | |||
2704 | 355 | GDK_TYPE_PIXBUF, | 347 | GDK_TYPE_PIXBUF, |
2705 | 356 | G_PARAM_READABLE | G_PARAM_STATIC_STRINGS)); | 348 | G_PARAM_READABLE | G_PARAM_STATIC_STRINGS)); |
2706 | 357 | 349 | ||
2707 | 358 | /** | ||
2708 | 359 | * MidoriView:minimized: | ||
2709 | 360 | * | ||
2710 | 361 | * Whether the view is minimized or in normal state. | ||
2711 | 362 | * | ||
2712 | 363 | * Minimizing a view indicates that only the icon should | ||
2713 | 364 | * be advertised rather than the full blown tab label and | ||
2714 | 365 | * it might otherwise be presented specially. | ||
2715 | 366 | * | ||
2716 | 367 | * Since: 0.1.8 | ||
2717 | 368 | */ | ||
2718 | 369 | g_object_class_install_property (gobject_class, | ||
2719 | 370 | PROP_MINIMIZED, | ||
2720 | 371 | g_param_spec_boolean ( | ||
2721 | 372 | "minimized", | ||
2722 | 373 | "Minimized", | ||
2723 | 374 | "Whether the view is minimized or in normal state", | ||
2724 | 375 | FALSE, | ||
2725 | 376 | G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); | ||
2726 | 377 | |||
2727 | 378 | g_object_class_install_property (gobject_class, | 350 | g_object_class_install_property (gobject_class, |
2728 | 379 | PROP_ZOOM_LEVEL, | 351 | PROP_ZOOM_LEVEL, |
2729 | 380 | g_param_spec_float ( | 352 | g_param_spec_float ( |
2730 | @@ -428,21 +400,6 @@ | |||
2731 | 428 | const gchar* uri = midori_tab_get_uri (MIDORI_TAB (view)); | 400 | const gchar* uri = midori_tab_get_uri (MIDORI_TAB (view)); |
2732 | 429 | katze_assign (view->title, g_strdup (midori_tab_get_display_title (title, uri))); | 401 | katze_assign (view->title, g_strdup (midori_tab_get_display_title (title, uri))); |
2733 | 430 | view->ellipsize = midori_tab_get_display_ellipsize (view->title, uri); | 402 | view->ellipsize = midori_tab_get_display_ellipsize (view->title, uri); |
2734 | 431 | |||
2735 | 432 | #ifdef HAVE_GRANITE | ||
2736 | 433 | if (view->tab) | ||
2737 | 434 | g_object_set (view->tab, | ||
2738 | 435 | "label", view->title, "ellipsize-mode", view->ellipsize, NULL); | ||
2739 | 436 | #else | ||
2740 | 437 | if (view->tab_label) | ||
2741 | 438 | { | ||
2742 | 439 | gtk_label_set_text (GTK_LABEL (view->tab_title), view->title); | ||
2743 | 440 | gtk_widget_set_tooltip_text (view->tab_icon, view->title); | ||
2744 | 441 | gtk_widget_set_tooltip_text (view->tab_title, view->title); | ||
2745 | 442 | if (gtk_label_get_angle (GTK_LABEL (view->tab_title)) == 0.0) | ||
2746 | 443 | gtk_label_set_ellipsize (GTK_LABEL (view->tab_title), view->ellipsize); | ||
2747 | 444 | } | ||
2748 | 445 | #endif | ||
2749 | 446 | if (view->menu_item) | 403 | if (view->menu_item) |
2750 | 447 | gtk_label_set_text (GTK_LABEL (gtk_bin_get_child (GTK_BIN ( | 404 | gtk_label_set_text (GTK_LABEL (gtk_bin_get_child (GTK_BIN ( |
2751 | 448 | view->menu_item))), view->title); | 405 | view->menu_item))), view->title); |
2752 | @@ -463,20 +420,6 @@ | |||
2753 | 463 | katze_object_assign (view->icon, icon); | 420 | katze_object_assign (view->icon, icon); |
2754 | 464 | g_object_notify (G_OBJECT (view), "icon"); | 421 | g_object_notify (G_OBJECT (view), "icon"); |
2755 | 465 | 422 | ||
2756 | 466 | #ifdef HAVE_GRANITE | ||
2757 | 467 | if (view->tab) | ||
2758 | 468 | g_object_set (view->tab, "icon", icon, NULL); | ||
2759 | 469 | #else | ||
2760 | 470 | if (view->tab_icon) | ||
2761 | 471 | { | ||
2762 | 472 | if (icon_name && !strchr (icon_name, '/')) | ||
2763 | 473 | katze_throbber_set_static_icon_name (KATZE_THROBBER (view->tab_icon), | ||
2764 | 474 | icon_name); | ||
2765 | 475 | else | ||
2766 | 476 | katze_throbber_set_static_pixbuf (KATZE_THROBBER (view->tab_icon), | ||
2767 | 477 | view->icon); | ||
2768 | 478 | } | ||
2769 | 479 | #endif | ||
2770 | 480 | if (view->menu_item) | 423 | if (view->menu_item) |
2771 | 481 | { | 424 | { |
2772 | 482 | GtkWidget* image = katze_item_get_image (view->item, view->web_view); | 425 | GtkWidget* image = katze_item_get_image (view->item, view->web_view); |
2773 | @@ -543,19 +486,6 @@ | |||
2774 | 543 | { | 486 | { |
2775 | 544 | if (midori_tab_get_load_status (MIDORI_TAB (view)) != load_status) | 487 | if (midori_tab_get_load_status (MIDORI_TAB (view)) != load_status) |
2776 | 545 | midori_tab_set_load_status (MIDORI_TAB (view), load_status); | 488 | midori_tab_set_load_status (MIDORI_TAB (view), load_status); |
2777 | 546 | |||
2778 | 547 | #ifdef HAVE_GRANITE | ||
2779 | 548 | if (view->tab) | ||
2780 | 549 | { | ||
2781 | 550 | g_object_set (view->tab, "working", | ||
2782 | 551 | midori_view_get_progress (view) > 0.0, NULL); | ||
2783 | 552 | g_object_set (view->tab, "menu", midori_view_get_tab_menu (view), NULL); | ||
2784 | 553 | } | ||
2785 | 554 | #else | ||
2786 | 555 | if (view->tab_icon) | ||
2787 | 556 | katze_throbber_set_animated (KATZE_THROBBER (view->tab_icon), | ||
2788 | 557 | midori_view_get_progress (view) > 0.0); | ||
2789 | 558 | #endif | ||
2790 | 559 | } | 489 | } |
2791 | 560 | 490 | ||
2792 | 561 | #if defined (HAVE_LIBSOUP_2_29_91) | 491 | #if defined (HAVE_LIBSOUP_2_29_91) |
2793 | @@ -3056,7 +2986,6 @@ | |||
2794 | 3056 | view->title = NULL; | 2986 | view->title = NULL; |
2795 | 3057 | view->icon = NULL; | 2987 | view->icon = NULL; |
2796 | 3058 | view->icon_uri = NULL; | 2988 | view->icon_uri = NULL; |
2797 | 3059 | view->minimized = FALSE; | ||
2798 | 3060 | view->hit_test = NULL; | 2989 | view->hit_test = NULL; |
2799 | 3061 | view->link_uri = NULL; | 2990 | view->link_uri = NULL; |
2800 | 3062 | view->selected_text = NULL; | 2991 | view->selected_text = NULL; |
2801 | @@ -3129,16 +3058,6 @@ | |||
2802 | 3129 | view->minimized ? 1 : -1); | 3058 | view->minimized ? 1 : -1); |
2803 | 3130 | g_signal_handlers_unblock_by_func (view->item, | 3059 | g_signal_handlers_unblock_by_func (view->item, |
2804 | 3131 | midori_view_item_meta_data_changed, view); | 3060 | midori_view_item_meta_data_changed, view); |
2805 | 3132 | #ifdef HAVE_GRANITE | ||
2806 | 3133 | if (view->tab) | ||
2807 | 3134 | g_object_set (view->tab, | ||
2808 | 3135 | "fixed", view->minimized, | ||
2809 | 3136 | "label", midori_view_get_display_title (view), | ||
2810 | 3137 | NULL); | ||
2811 | 3138 | #else | ||
2812 | 3139 | if (view->tab_label) | ||
2813 | 3140 | sokoke_widget_set_visible (view->tab_title, !view->minimized); | ||
2814 | 3141 | #endif | ||
2815 | 3142 | break; | 3061 | break; |
2816 | 3143 | case PROP_ZOOM_LEVEL: | 3062 | case PROP_ZOOM_LEVEL: |
2817 | 3144 | midori_view_set_zoom_level (view, g_value_get_float (value)); | 3063 | midori_view_set_zoom_level (view, g_value_get_float (value)); |
2818 | @@ -3168,9 +3087,6 @@ | |||
2819 | 3168 | case PROP_ICON: | 3087 | case PROP_ICON: |
2820 | 3169 | g_value_set_object (value, view->icon); | 3088 | g_value_set_object (value, view->icon); |
2821 | 3170 | break; | 3089 | break; |
2822 | 3171 | case PROP_MINIMIZED: | ||
2823 | 3172 | g_value_set_boolean (value, view->minimized); | ||
2824 | 3173 | break; | ||
2825 | 3174 | case PROP_ZOOM_LEVEL: | 3090 | case PROP_ZOOM_LEVEL: |
2826 | 3175 | g_value_set_float (value, midori_view_get_zoom_level (view)); | 3091 | g_value_set_float (value, midori_view_get_zoom_level (view)); |
2827 | 3176 | break; | 3092 | break; |
2828 | @@ -3217,7 +3133,6 @@ | |||
2829 | 3217 | g_object_get (view->settings, | 3133 | g_object_get (view->settings, |
2830 | 3218 | "zoom-level", &zoom_level, | 3134 | "zoom-level", &zoom_level, |
2831 | 3219 | "zoom-text-and-images", &zoom_text_and_images, | 3135 | "zoom-text-and-images", &zoom_text_and_images, |
2832 | 3220 | "close-buttons-on-tabs", &view->close_buttons_on_tabs, | ||
2833 | 3221 | "open-new-pages-in", &view->open_new_pages_in, | 3136 | "open-new-pages-in", &view->open_new_pages_in, |
2834 | 3222 | "open-tabs-in-the-background", &view->open_tabs_in_the_background, | 3137 | "open-tabs-in-the-background", &view->open_tabs_in_the_background, |
2835 | 3223 | NULL); | 3138 | NULL); |
2836 | @@ -3279,8 +3194,8 @@ | |||
2837 | 3279 | if (item) | 3194 | if (item) |
2838 | 3280 | { | 3195 | { |
2839 | 3281 | katze_object_assign (view->item, katze_item_copy (item)); | 3196 | katze_object_assign (view->item, katze_item_copy (item)); |
2842 | 3282 | view->minimized = katze_item_get_meta_string ( | 3197 | midori_tab_set_minimized (MIDORI_TAB (view), |
2843 | 3283 | view->item, "minimized") != NULL; | 3198 | katze_item_get_meta_string (view->item, "minimized") != NULL); |
2844 | 3284 | } | 3199 | } |
2845 | 3285 | gtk_widget_show ((GtkWidget*)view); | 3200 | gtk_widget_show ((GtkWidget*)view); |
2846 | 3286 | return (GtkWidget*)view; | 3201 | return (GtkWidget*)view; |
2847 | @@ -3308,14 +3223,6 @@ | |||
2848 | 3308 | g_value_get_boolean (&value)); | 3223 | g_value_get_boolean (&value)); |
2849 | 3309 | } | 3224 | } |
2850 | 3310 | #endif | 3225 | #endif |
2851 | 3311 | else if (name == g_intern_string ("close-buttons-on-tabs")) | ||
2852 | 3312 | { | ||
2853 | 3313 | view->close_buttons_on_tabs = g_value_get_boolean (&value); | ||
2854 | 3314 | #ifndef HAVE_GRANITE | ||
2855 | 3315 | sokoke_widget_set_visible (view->tab_close, | ||
2856 | 3316 | view->close_buttons_on_tabs); | ||
2857 | 3317 | #endif | ||
2858 | 3318 | } | ||
2859 | 3319 | else if (name == g_intern_string ("open-tabs-in-the-background")) | 3226 | else if (name == g_intern_string ("open-tabs-in-the-background")) |
2860 | 3320 | view->open_tabs_in_the_background = g_value_get_boolean (&value); | 3227 | view->open_tabs_in_the_background = g_value_get_boolean (&value); |
2861 | 3321 | else if (name == g_intern_string ("enable-javascript")) | 3228 | else if (name == g_intern_string ("enable-javascript")) |
2862 | @@ -4395,14 +4302,6 @@ | |||
2863 | 4395 | return view->menu_item; | 4302 | return view->menu_item; |
2864 | 4396 | } | 4303 | } |
2865 | 4397 | 4304 | ||
2866 | 4398 | static void | ||
2867 | 4399 | midori_view_tab_label_menu_duplicate_tab_cb (GtkAction* action, | ||
2868 | 4400 | gpointer user_data) | ||
2869 | 4401 | { | ||
2870 | 4402 | MidoriView* view = user_data; | ||
2871 | 4403 | midori_view_duplicate (view); | ||
2872 | 4404 | } | ||
2873 | 4405 | |||
2874 | 4406 | GtkWidget* | 4305 | GtkWidget* |
2875 | 4407 | midori_view_duplicate (MidoriView* view) | 4306 | midori_view_duplicate (MidoriView* view) |
2876 | 4408 | { | 4307 | { |
2877 | @@ -4415,58 +4314,6 @@ | |||
2878 | 4415 | return new_view; | 4314 | return new_view; |
2879 | 4416 | } | 4315 | } |
2880 | 4417 | 4316 | ||
2881 | 4418 | static void | ||
2882 | 4419 | midori_view_tab_label_menu_close_tabs_right_cb (GtkAction* action, | ||
2883 | 4420 | gpointer user_data) | ||
2884 | 4421 | { | ||
2885 | 4422 | GtkWidget* view = user_data; | ||
2886 | 4423 | MidoriBrowser* browser = midori_browser_get_for_widget (view); | ||
2887 | 4424 | GList* tabs = midori_browser_get_tabs (browser); | ||
2888 | 4425 | gboolean found_tab = FALSE; | ||
2889 | 4426 | for (; tabs; tabs = g_list_next (tabs)) | ||
2890 | 4427 | { | ||
2891 | 4428 | if (tabs->data == view) | ||
2892 | 4429 | { | ||
2893 | 4430 | found_tab = TRUE; | ||
2894 | 4431 | continue; | ||
2895 | 4432 | } | ||
2896 | 4433 | if (found_tab) | ||
2897 | 4434 | midori_browser_close_tab (browser, tabs->data); | ||
2898 | 4435 | } | ||
2899 | 4436 | g_list_free (tabs); | ||
2900 | 4437 | } | ||
2901 | 4438 | |||
2902 | 4439 | static void | ||
2903 | 4440 | midori_view_tab_label_menu_close_other_tabs_cb (GtkAction* action, | ||
2904 | 4441 | gpointer user_data) | ||
2905 | 4442 | { | ||
2906 | 4443 | GtkWidget* view = user_data; | ||
2907 | 4444 | MidoriBrowser* browser = midori_browser_get_for_widget (view); | ||
2908 | 4445 | GList* tabs = midori_browser_get_tabs (browser); | ||
2909 | 4446 | for (; tabs; tabs = g_list_next (tabs)) | ||
2910 | 4447 | { | ||
2911 | 4448 | if (tabs->data != view) | ||
2912 | 4449 | midori_browser_close_tab (browser, tabs->data); | ||
2913 | 4450 | } | ||
2914 | 4451 | g_list_free (tabs); | ||
2915 | 4452 | } | ||
2916 | 4453 | |||
2917 | 4454 | static void | ||
2918 | 4455 | midori_view_tab_label_menu_minimize_tab_cb (GtkAction* action, | ||
2919 | 4456 | gpointer user_data) | ||
2920 | 4457 | { | ||
2921 | 4458 | MidoriView* view = user_data; | ||
2922 | 4459 | g_object_set (view, "minimized", !view->minimized, NULL); | ||
2923 | 4460 | } | ||
2924 | 4461 | |||
2925 | 4462 | static void | ||
2926 | 4463 | midori_view_tab_label_menu_close_cb (GtkAction* action, | ||
2927 | 4464 | gpointer user_data) | ||
2928 | 4465 | { | ||
2929 | 4466 | GtkWidget* view = user_data; | ||
2930 | 4467 | midori_browser_close_tab (midori_browser_get_for_widget (view), view); | ||
2931 | 4468 | } | ||
2932 | 4469 | |||
2933 | 4470 | /** | 4317 | /** |
2934 | 4471 | * midori_view_get_tab_menu: | 4318 | * midori_view_get_tab_menu: |
2935 | 4472 | * @view: a #MidoriView | 4319 | * @view: a #MidoriView |
2936 | @@ -4477,242 +4324,14 @@ | |||
2937 | 4477 | * Return value: a #GtkMenu | 4324 | * Return value: a #GtkMenu |
2938 | 4478 | * | 4325 | * |
2939 | 4479 | * Since: 0.1.8 | 4326 | * Since: 0.1.8 |
2940 | 4327 | * Deprecated: 0.5.7: Use MidoriNotebook API instead. | ||
2941 | 4480 | **/ | 4328 | **/ |
2942 | 4481 | GtkWidget* | 4329 | GtkWidget* |
2943 | 4482 | midori_view_get_tab_menu (MidoriView* view) | 4330 | midori_view_get_tab_menu (MidoriView* view) |
2944 | 4483 | { | 4331 | { |
2945 | 4484 | g_return_val_if_fail (MIDORI_IS_VIEW (view), NULL); | 4332 | g_return_val_if_fail (MIDORI_IS_VIEW (view), NULL); |
2946 | 4485 | 4333 | ||
3177 | 4486 | MidoriBrowser* browser = midori_browser_get_for_widget (GTK_WIDGET (view)); | 4334 | return gtk_menu_new (); |
2948 | 4487 | g_return_val_if_fail (browser != NULL, NULL); | ||
2949 | 4488 | |||
2950 | 4489 | GtkActionGroup* actions = midori_browser_get_action_group (browser); | ||
2951 | 4490 | MidoriContextAction* menu = midori_context_action_new ("TabContextMenu", NULL, NULL, NULL); | ||
2952 | 4491 | midori_context_action_add_action_group (menu, actions); | ||
2953 | 4492 | gint pages = midori_browser_get_n_pages (browser); | ||
2954 | 4493 | |||
2955 | 4494 | midori_context_action_add_by_name (menu, "TabNew"); | ||
2956 | 4495 | midori_context_action_add_by_name (menu, "UndoTabClose"); | ||
2957 | 4496 | midori_context_action_add (menu, NULL); | ||
2958 | 4497 | midori_context_action_add_simple (menu, "TabWindowNew", _("Open in New _Window"), NULL, STOCK_WINDOW_NEW, | ||
2959 | 4498 | midori_view_tab_label_menu_window_new_cb, view); | ||
2960 | 4499 | midori_context_action_add_simple (menu, "TabDuplicate", _("_Duplicate Tab"), NULL, NULL, | ||
2961 | 4500 | midori_view_tab_label_menu_duplicate_tab_cb, view); | ||
2962 | 4501 | midori_context_action_add_simple (menu, "TabMinimize", | ||
2963 | 4502 | view->minimized ? _("Show Tab _Label") : _("Show Tab _Icon Only"), NULL, NULL, | ||
2964 | 4503 | midori_view_tab_label_menu_minimize_tab_cb, view); | ||
2965 | 4504 | midori_context_action_add (menu, NULL); | ||
2966 | 4505 | midori_context_action_add_simple (menu, "TabCloseRight", _("Close Tabs to the R_ight"), NULL, NULL, | ||
2967 | 4506 | midori_view_tab_label_menu_close_tabs_right_cb, view); | ||
2968 | 4507 | GtkAction* action = gtk_action_new ("TabCloseOther", g_dngettext (NULL, "Close Ot_her Tab", "Close Ot_her Tabs", pages - 1), NULL, NULL); | ||
2969 | 4508 | g_signal_connect (action, "activate", G_CALLBACK (midori_view_tab_label_menu_close_other_tabs_cb), view); | ||
2970 | 4509 | gtk_action_set_sensitive (action, pages > 1); | ||
2971 | 4510 | midori_context_action_add (menu, action); | ||
2972 | 4511 | midori_context_action_add_simple (menu, "TabClose", NULL, NULL, GTK_STOCK_CLOSE, | ||
2973 | 4512 | midori_view_tab_label_menu_close_cb, view); | ||
2974 | 4513 | |||
2975 | 4514 | return GTK_WIDGET (midori_context_action_create_menu (menu, NULL, FALSE)); | ||
2976 | 4515 | } | ||
2977 | 4516 | |||
2978 | 4517 | #ifdef HAVE_GRANITE | ||
2979 | 4518 | GraniteWidgetsTab* | ||
2980 | 4519 | midori_view_get_tab (MidoriView* view) | ||
2981 | 4520 | { | ||
2982 | 4521 | if (view->tab == NULL) | ||
2983 | 4522 | { | ||
2984 | 4523 | view->tab = granite_widgets_tab_new ( | ||
2985 | 4524 | midori_view_get_display_title (view), G_ICON (view->icon), GTK_WIDGET (view)); | ||
2986 | 4525 | g_object_set (view->tab, "fixed", view->minimized, NULL); | ||
2987 | 4526 | } | ||
2988 | 4527 | return view->tab; | ||
2989 | 4528 | } | ||
2990 | 4529 | |||
2991 | 4530 | void | ||
2992 | 4531 | midori_view_set_tab (MidoriView* view, | ||
2993 | 4532 | GraniteWidgetsTab* tab) | ||
2994 | 4533 | { | ||
2995 | 4534 | g_return_if_fail (MIDORI_IS_VIEW (view)); | ||
2996 | 4535 | |||
2997 | 4536 | view->tab = tab; | ||
2998 | 4537 | g_object_set (tab, | ||
2999 | 4538 | "label", midori_view_get_display_title (view), | ||
3000 | 4539 | "icon", G_ICON (view->icon), | ||
3001 | 4540 | "page", GTK_WIDGET (view), | ||
3002 | 4541 | "fixed", view->minimized, | ||
3003 | 4542 | NULL); | ||
3004 | 4543 | } | ||
3005 | 4544 | |||
3006 | 4545 | GtkWidget* | ||
3007 | 4546 | midori_view_get_proxy_tab_label (MidoriView* view) | ||
3008 | 4547 | { | ||
3009 | 4548 | g_return_val_if_fail (MIDORI_IS_VIEW (view), NULL); | ||
3010 | 4549 | |||
3011 | 4550 | GtkWidget* tab = GTK_WIDGET (midori_view_get_tab (view)); | ||
3012 | 4551 | return tab; | ||
3013 | 4552 | } | ||
3014 | 4553 | |||
3015 | 4554 | #else | ||
3016 | 4555 | static gboolean | ||
3017 | 4556 | midori_view_tab_label_button_press_event (GtkWidget* tab_label, | ||
3018 | 4557 | GdkEventButton* event, | ||
3019 | 4558 | GtkWidget* widget) | ||
3020 | 4559 | { | ||
3021 | 4560 | if (event->button == 2) | ||
3022 | 4561 | { | ||
3023 | 4562 | /* Close the widget on middle click */ | ||
3024 | 4563 | midori_browser_close_tab (midori_browser_get_for_widget (widget), widget); | ||
3025 | 4564 | return TRUE; | ||
3026 | 4565 | } | ||
3027 | 4566 | else if (MIDORI_EVENT_CONTEXT_MENU (event)) | ||
3028 | 4567 | { | ||
3029 | 4568 | /* Show a context menu on right click */ | ||
3030 | 4569 | GtkWidget* menu = midori_view_get_tab_menu (MIDORI_VIEW (widget)); | ||
3031 | 4570 | |||
3032 | 4571 | katze_widget_popup (widget, GTK_MENU (menu), | ||
3033 | 4572 | event, KATZE_MENU_POSITION_CURSOR); | ||
3034 | 4573 | return TRUE; | ||
3035 | 4574 | } | ||
3036 | 4575 | |||
3037 | 4576 | return FALSE; | ||
3038 | 4577 | } | ||
3039 | 4578 | |||
3040 | 4579 | static void | ||
3041 | 4580 | midori_view_tab_close_clicked (GtkWidget* tab_close, | ||
3042 | 4581 | GtkWidget* widget) | ||
3043 | 4582 | { | ||
3044 | 4583 | midori_browser_close_tab (midori_browser_get_for_widget (widget), widget); | ||
3045 | 4584 | } | ||
3046 | 4585 | |||
3047 | 4586 | #if !GTK_CHECK_VERSION (3, 0, 0) | ||
3048 | 4587 | static void | ||
3049 | 4588 | midori_view_tab_icon_style_set_cb (GtkWidget* tab_close, | ||
3050 | 4589 | GtkStyle* previous_style) | ||
3051 | 4590 | { | ||
3052 | 4591 | GtkRequisition size; | ||
3053 | 4592 | gtk_widget_size_request (gtk_bin_get_child (GTK_BIN (tab_close)), &size); | ||
3054 | 4593 | gtk_widget_set_size_request (tab_close, size.width, size.height); | ||
3055 | 4594 | } | ||
3056 | 4595 | #endif | ||
3057 | 4596 | |||
3058 | 4597 | static void | ||
3059 | 4598 | midori_view_update_tab_title (MidoriView* view, | ||
3060 | 4599 | gdouble angle) | ||
3061 | 4600 | { | ||
3062 | 4601 | if (angle == 0.0) | ||
3063 | 4602 | gtk_label_set_ellipsize (GTK_LABEL (view->tab_title), view->ellipsize); | ||
3064 | 4603 | else | ||
3065 | 4604 | gtk_label_set_ellipsize (GTK_LABEL (view->tab_title), PANGO_ELLIPSIZE_NONE); | ||
3066 | 4605 | gtk_label_set_angle (GTK_LABEL (view->tab_title), angle); | ||
3067 | 4606 | } | ||
3068 | 4607 | |||
3069 | 4608 | static void | ||
3070 | 4609 | gtk_box_repack (GtkBox* box, | ||
3071 | 4610 | GtkWidget* child) | ||
3072 | 4611 | { | ||
3073 | 4612 | GtkWidget* old_box; | ||
3074 | 4613 | gboolean expand, fill; | ||
3075 | 4614 | guint padding; | ||
3076 | 4615 | GtkPackType pack_type; | ||
3077 | 4616 | |||
3078 | 4617 | old_box = gtk_widget_get_parent (child); | ||
3079 | 4618 | g_return_if_fail (GTK_IS_BOX (old_box)); | ||
3080 | 4619 | |||
3081 | 4620 | gtk_box_query_child_packing (GTK_BOX (old_box), child, | ||
3082 | 4621 | &expand, &fill, &padding, &pack_type); | ||
3083 | 4622 | |||
3084 | 4623 | g_object_ref (child); | ||
3085 | 4624 | gtk_container_remove (GTK_CONTAINER (old_box), child); | ||
3086 | 4625 | if (pack_type == GTK_PACK_START) | ||
3087 | 4626 | gtk_box_pack_start (box, child, expand, fill, padding); | ||
3088 | 4627 | else | ||
3089 | 4628 | gtk_box_pack_end (box, child, expand, fill, padding); | ||
3090 | 4629 | g_object_unref (child); | ||
3091 | 4630 | } | ||
3092 | 4631 | |||
3093 | 4632 | static void | ||
3094 | 4633 | midori_view_tab_label_parent_set (GtkWidget* tab_label, | ||
3095 | 4634 | #if GTK_CHECK_VERSION(3,0,0) | ||
3096 | 4635 | GObject* old_parent, | ||
3097 | 4636 | #else | ||
3098 | 4637 | GtkObject* old_parent, | ||
3099 | 4638 | #endif | ||
3100 | 4639 | MidoriView* view) | ||
3101 | 4640 | { | ||
3102 | 4641 | GtkWidget* parent; | ||
3103 | 4642 | |||
3104 | 4643 | /* FIXME: Disconnect orientation notification | ||
3105 | 4644 | if (old_parent) | ||
3106 | 4645 | ; */ | ||
3107 | 4646 | |||
3108 | 4647 | if (!(parent = gtk_widget_get_parent (tab_label))) | ||
3109 | 4648 | return; | ||
3110 | 4649 | |||
3111 | 4650 | if (GTK_IS_NOTEBOOK (parent)) | ||
3112 | 4651 | { | ||
3113 | 4652 | GtkPositionType pos; | ||
3114 | 4653 | gdouble old_angle, angle; | ||
3115 | 4654 | GtkWidget* box; | ||
3116 | 4655 | |||
3117 | 4656 | pos = gtk_notebook_get_tab_pos (GTK_NOTEBOOK (parent)); | ||
3118 | 4657 | old_angle = gtk_label_get_angle (GTK_LABEL (view->tab_title)); | ||
3119 | 4658 | switch (pos) | ||
3120 | 4659 | { | ||
3121 | 4660 | case GTK_POS_LEFT: | ||
3122 | 4661 | angle = 90.0; | ||
3123 | 4662 | break; | ||
3124 | 4663 | case GTK_POS_RIGHT: | ||
3125 | 4664 | angle = 270.0; | ||
3126 | 4665 | break; | ||
3127 | 4666 | default: | ||
3128 | 4667 | angle = 0.0; | ||
3129 | 4668 | } | ||
3130 | 4669 | |||
3131 | 4670 | if (old_angle != angle) | ||
3132 | 4671 | { | ||
3133 | 4672 | GtkWidget* align; | ||
3134 | 4673 | |||
3135 | 4674 | if (angle == 0.0) | ||
3136 | 4675 | box = gtk_hbox_new (FALSE, 1); | ||
3137 | 4676 | else | ||
3138 | 4677 | box = gtk_vbox_new (FALSE, 1); | ||
3139 | 4678 | gtk_box_repack (GTK_BOX (box), view->tab_icon); | ||
3140 | 4679 | gtk_box_repack (GTK_BOX (box), view->tab_title); | ||
3141 | 4680 | align = gtk_widget_get_parent (view->tab_close); | ||
3142 | 4681 | gtk_box_repack (GTK_BOX (box), align); | ||
3143 | 4682 | |||
3144 | 4683 | gtk_container_remove (GTK_CONTAINER (tab_label), | ||
3145 | 4684 | gtk_bin_get_child (GTK_BIN (tab_label))); | ||
3146 | 4685 | gtk_container_add (GTK_CONTAINER (tab_label), GTK_WIDGET (box)); | ||
3147 | 4686 | gtk_widget_show (box); | ||
3148 | 4687 | } | ||
3149 | 4688 | |||
3150 | 4689 | midori_view_update_tab_title (view, angle); | ||
3151 | 4690 | |||
3152 | 4691 | /* FIXME: Connect orientation notification */ | ||
3153 | 4692 | } | ||
3154 | 4693 | } | ||
3155 | 4694 | |||
3156 | 4695 | static void midori_view_tab_label_data_received (GtkWidget* widget, | ||
3157 | 4696 | GdkDragContext* context, | ||
3158 | 4697 | gint x, | ||
3159 | 4698 | gint y, | ||
3160 | 4699 | GtkSelectionData* data, | ||
3161 | 4700 | guint ttype, | ||
3162 | 4701 | guint timestamp, | ||
3163 | 4702 | MidoriView* view) | ||
3164 | 4703 | { | ||
3165 | 4704 | gchar** uri = gtk_selection_data_get_uris (data); | ||
3166 | 4705 | if (uri != NULL) | ||
3167 | 4706 | { | ||
3168 | 4707 | midori_view_set_uri (view, uri[0]); | ||
3169 | 4708 | g_strfreev (uri); | ||
3170 | 4709 | } | ||
3171 | 4710 | else | ||
3172 | 4711 | { | ||
3173 | 4712 | gchar* text = (gchar*) gtk_selection_data_get_text (data); | ||
3174 | 4713 | midori_view_set_uri (view, text); | ||
3175 | 4714 | g_free (text); | ||
3176 | 4715 | } | ||
3178 | 4716 | } | 4335 | } |
3179 | 4717 | 4336 | ||
3180 | 4718 | /** | 4337 | /** |
3181 | @@ -4722,115 +4341,22 @@ | |||
3182 | 4722 | * Retrieves a proxy tab label that is typically used when | 4341 | * Retrieves a proxy tab label that is typically used when |
3183 | 4723 | * adding the view to a notebook. | 4342 | * adding the view to a notebook. |
3184 | 4724 | * | 4343 | * |
3185 | 4725 | * Note that the label actually adjusts its orientation | ||
3186 | 4726 | * to the according tab position when used in a notebook. | ||
3187 | 4727 | * | ||
3188 | 4728 | * The label is created on the first call and will be updated to reflect | ||
3189 | 4729 | * changes of the loading progress and title. | ||
3190 | 4730 | * | ||
3191 | 4731 | * The label is valid until it is removed from its container. | ||
3192 | 4732 | * | ||
3193 | 4733 | * Return value: the proxy #GtkEventBox | 4344 | * Return value: the proxy #GtkEventBox |
3194 | 4345 | * | ||
3195 | 4346 | * Deprecated: 0.5.7: Don't use this label. | ||
3196 | 4734 | **/ | 4347 | **/ |
3197 | 4735 | GtkWidget* | 4348 | GtkWidget* |
3198 | 4736 | midori_view_get_proxy_tab_label (MidoriView* view) | 4349 | midori_view_get_proxy_tab_label (MidoriView* view) |
3199 | 4737 | { | 4350 | { |
3200 | 4738 | GtkWidget* event_box; | ||
3201 | 4739 | GtkWidget* hbox; | ||
3202 | 4740 | #if !GTK_CHECK_VERSION (3, 0, 0) | ||
3203 | 4741 | static const gchar style_fixup[] = | ||
3204 | 4742 | "style \"midori-close-button-style\"\n" | ||
3205 | 4743 | "{\n" | ||
3206 | 4744 | "GtkWidget::focus-padding = 0\n" | ||
3207 | 4745 | "GtkWidget::focus-line-width = 0\n" | ||
3208 | 4746 | "xthickness = 0\n" | ||
3209 | 4747 | "ythickness = 0\n" | ||
3210 | 4748 | "}\n" | ||
3211 | 4749 | "widget \"*.midori-close-button\" style \"midori-close-button-style\""; | ||
3212 | 4750 | #endif | ||
3213 | 4751 | GtkWidget* image; | ||
3214 | 4752 | GtkWidget* align; | ||
3215 | 4753 | |||
3216 | 4754 | g_return_val_if_fail (MIDORI_IS_VIEW (view), NULL); | 4351 | g_return_val_if_fail (MIDORI_IS_VIEW (view), NULL); |
3217 | 4755 | 4352 | ||
3218 | 4756 | if (!view->tab_label) | 4353 | if (!view->tab_label) |
3219 | 4757 | { | 4354 | { |
3292 | 4758 | view->tab_icon = katze_throbber_new (); | 4355 | view->tab_label = gtk_label_new ("dummy"); |
3293 | 4759 | katze_throbber_set_static_pixbuf (KATZE_THROBBER (view->tab_icon), | 4356 | gtk_widget_show (view->tab_label); |
3222 | 4760 | midori_view_get_icon (view)); | ||
3223 | 4761 | |||
3224 | 4762 | view->tab_title = gtk_label_new (midori_view_get_display_title (view)); | ||
3225 | 4763 | gtk_misc_set_alignment (GTK_MISC (view->tab_title), 0.0, 0.5); | ||
3226 | 4764 | gtk_misc_set_padding (GTK_MISC (view->tab_title), 0, 0); | ||
3227 | 4765 | |||
3228 | 4766 | event_box = gtk_event_box_new (); | ||
3229 | 4767 | gtk_event_box_set_visible_window (GTK_EVENT_BOX (event_box), FALSE); | ||
3230 | 4768 | hbox = gtk_hbox_new (FALSE, 1); | ||
3231 | 4769 | gtk_container_add (GTK_CONTAINER (event_box), GTK_WIDGET (hbox)); | ||
3232 | 4770 | midori_view_update_tab_title (view, 0.0); | ||
3233 | 4771 | |||
3234 | 4772 | view->tab_close = gtk_button_new (); | ||
3235 | 4773 | gtk_button_set_relief (GTK_BUTTON (view->tab_close), GTK_RELIEF_NONE); | ||
3236 | 4774 | gtk_button_set_focus_on_click (GTK_BUTTON (view->tab_close), FALSE); | ||
3237 | 4775 | #if !GTK_CHECK_VERSION (3, 0, 0) | ||
3238 | 4776 | gtk_rc_parse_string (style_fixup); | ||
3239 | 4777 | gtk_widget_set_name (view->tab_close, "midori-close-button"); | ||
3240 | 4778 | g_signal_connect (view->tab_close, "style-set", | ||
3241 | 4779 | G_CALLBACK (midori_view_tab_icon_style_set_cb), NULL); | ||
3242 | 4780 | #endif | ||
3243 | 4781 | image = gtk_image_new_from_stock (GTK_STOCK_CLOSE, GTK_ICON_SIZE_MENU); | ||
3244 | 4782 | gtk_container_add (GTK_CONTAINER (view->tab_close), image); | ||
3245 | 4783 | align = gtk_alignment_new (1.0, 0.5, 0.0, 0.0); | ||
3246 | 4784 | gtk_container_add (GTK_CONTAINER (align), view->tab_close); | ||
3247 | 4785 | |||
3248 | 4786 | if (katze_object_get_boolean (view->settings, "close-buttons-left")) | ||
3249 | 4787 | { | ||
3250 | 4788 | gtk_box_pack_end (GTK_BOX (hbox), view->tab_icon, FALSE, FALSE, 0); | ||
3251 | 4789 | gtk_box_pack_end (GTK_BOX (hbox), view->tab_title, TRUE, TRUE, 0); | ||
3252 | 4790 | gtk_box_pack_start (GTK_BOX (hbox), align, FALSE, FALSE, 0); | ||
3253 | 4791 | } | ||
3254 | 4792 | else | ||
3255 | 4793 | { | ||
3256 | 4794 | gtk_box_pack_start (GTK_BOX (hbox), view->tab_icon, FALSE, FALSE, 0); | ||
3257 | 4795 | gtk_box_pack_start (GTK_BOX (hbox), view->tab_title, TRUE, TRUE, 0); | ||
3258 | 4796 | gtk_box_pack_end (GTK_BOX (hbox), align, FALSE, FALSE, 0); | ||
3259 | 4797 | } | ||
3260 | 4798 | gtk_widget_show_all (GTK_WIDGET (event_box)); | ||
3261 | 4799 | |||
3262 | 4800 | if (view->minimized) | ||
3263 | 4801 | gtk_widget_hide (view->tab_title); | ||
3264 | 4802 | if (!view->close_buttons_on_tabs) | ||
3265 | 4803 | gtk_widget_hide (view->tab_close); | ||
3266 | 4804 | |||
3267 | 4805 | g_signal_connect (event_box, "button-press-event", | ||
3268 | 4806 | G_CALLBACK (midori_view_tab_label_button_press_event), view); | ||
3269 | 4807 | g_signal_connect (view->tab_close, "button-press-event", | ||
3270 | 4808 | G_CALLBACK (midori_view_tab_label_button_press_event), view); | ||
3271 | 4809 | g_signal_connect (view->tab_close, "clicked", | ||
3272 | 4810 | G_CALLBACK (midori_view_tab_close_clicked), view); | ||
3273 | 4811 | |||
3274 | 4812 | view->tab_label = event_box; | ||
3275 | 4813 | g_signal_connect (view->tab_icon, "destroy", | ||
3276 | 4814 | G_CALLBACK (gtk_widget_destroyed), | ||
3277 | 4815 | &view->tab_icon); | ||
3278 | 4816 | g_signal_connect (view->tab_label, "destroy", | ||
3279 | 4817 | G_CALLBACK (gtk_widget_destroyed), | ||
3280 | 4818 | &view->tab_label); | ||
3281 | 4819 | |||
3282 | 4820 | g_signal_connect (view->tab_label, "parent-set", | ||
3283 | 4821 | G_CALLBACK (midori_view_tab_label_parent_set), | ||
3284 | 4822 | view); | ||
3285 | 4823 | gtk_drag_dest_set (view->tab_label, GTK_DEST_DEFAULT_ALL, NULL, | ||
3286 | 4824 | 0, GDK_ACTION_COPY); | ||
3287 | 4825 | gtk_drag_dest_add_text_targets (view->tab_label); | ||
3288 | 4826 | gtk_drag_dest_add_uri_targets (view->tab_label); | ||
3289 | 4827 | g_signal_connect (view->tab_label, "drag-data-received", | ||
3290 | 4828 | G_CALLBACK (midori_view_tab_label_data_received), | ||
3291 | 4829 | view); | ||
3294 | 4830 | } | 4357 | } |
3295 | 4831 | return view->tab_label; | 4358 | return view->tab_label; |
3296 | 4832 | } | 4359 | } |
3297 | 4833 | #endif | ||
3298 | 4834 | 4360 | ||
3299 | 4835 | /** | 4361 | /** |
3300 | 4836 | * midori_view_get_label_ellipsize: | 4362 | * midori_view_get_label_ellipsize: |
3301 | @@ -5450,60 +4976,22 @@ | |||
3302 | 5450 | #endif | 4976 | #endif |
3303 | 5451 | return MIDORI_VIEW (view); | 4977 | return MIDORI_VIEW (view); |
3304 | 5452 | } | 4978 | } |
3306 | 5453 | 4979 | /** | |
3307 | 4980 | * midori_view_set_colors: | ||
3308 | 4981 | * @view: a #MidoriView | ||
3309 | 4982 | * @fg_color: a #GdkColor, or %NULL | ||
3310 | 4983 | * @bg_color: a #GdkColor, or %NULL | ||
3311 | 4984 | * | ||
3312 | 4985 | * Sets colors on the label. | ||
3313 | 4986 | * | ||
3314 | 4987 | * Deprecated: 0.5.7: Use fg_color/ bg_color on Midori.Tab. | ||
3315 | 4988 | **/ | ||
3316 | 5454 | void | 4989 | void |
3317 | 5455 | midori_view_set_colors (MidoriView* view, | 4990 | midori_view_set_colors (MidoriView* view, |
3318 | 5456 | GdkColor* fg_color, | 4991 | GdkColor* fg_color, |
3319 | 5457 | GdkColor* bg_color) | 4992 | GdkColor* bg_color) |
3320 | 5458 | { | 4993 | { |
3321 | 5459 | /* | ||
3322 | 5460 | The proxy tab label is what's put in the notebook, | ||
3323 | 5461 | in all known cases a GtkEventBox | ||
3324 | 5462 | Contained can be a GtkLabel or a GtkBox including a GtkLabel | ||
3325 | 5463 | Granite as of this writing uses a GtkLabel (which may change) | ||
3326 | 5464 | */ | ||
3327 | 5465 | GtkWidget* box = midori_view_get_proxy_tab_label (view); | ||
3328 | 5466 | GtkWidget* event_box = box; | ||
3329 | 5467 | if (GTK_IS_BOX (box)) | ||
3330 | 5468 | { | ||
3331 | 5469 | GList* children = gtk_container_get_children (GTK_CONTAINER (box)); | ||
3332 | 5470 | for (; children != NULL; children = g_list_next (children)) | ||
3333 | 5471 | if (GTK_IS_EVENT_BOX (children->data)) | ||
3334 | 5472 | { | ||
3335 | 5473 | event_box = children->data; | ||
3336 | 5474 | break; | ||
3337 | 5475 | } | ||
3338 | 5476 | g_list_free (children); | ||
3339 | 5477 | } | ||
3340 | 5478 | |||
3341 | 5479 | GtkWidget* label = gtk_bin_get_child (GTK_BIN (event_box)); | ||
3342 | 5480 | if (GTK_IS_BOX (label)) | ||
3343 | 5481 | { | ||
3344 | 5482 | GList* children = gtk_container_get_children (GTK_CONTAINER (label)); | ||
3345 | 5483 | for (; children != NULL; children = g_list_next (children)) | ||
3346 | 5484 | if (GTK_IS_LABEL (children->data)) | ||
3347 | 5485 | { | ||
3348 | 5486 | label = children->data; | ||
3349 | 5487 | break; | ||
3350 | 5488 | } | ||
3351 | 5489 | g_list_free (children); | ||
3352 | 5490 | } | ||
3353 | 5491 | |||
3354 | 5492 | midori_tab_set_fg_color (MIDORI_TAB (view), fg_color); | 4994 | midori_tab_set_fg_color (MIDORI_TAB (view), fg_color); |
3355 | 5493 | midori_tab_set_bg_color (MIDORI_TAB (view), bg_color); | 4995 | midori_tab_set_bg_color (MIDORI_TAB (view), bg_color); |
3356 | 5494 | |||
3357 | 5495 | gtk_event_box_set_visible_window (GTK_EVENT_BOX (event_box), | ||
3358 | 5496 | fg_color != NULL || bg_color != NULL); | ||
3359 | 5497 | |||
3360 | 5498 | gtk_widget_modify_fg (label, GTK_STATE_NORMAL, fg_color); | ||
3361 | 5499 | gtk_widget_modify_fg (label, GTK_STATE_ACTIVE, fg_color); | ||
3362 | 5500 | |||
3363 | 5501 | #if GTK_CHECK_VERSION (3, 0, 0) | ||
3364 | 5502 | gtk_widget_modify_bg (event_box, GTK_STATE_NORMAL, bg_color); | ||
3365 | 5503 | gtk_widget_modify_bg (event_box, GTK_STATE_ACTIVE, bg_color); | ||
3366 | 5504 | #else | ||
3367 | 5505 | gtk_widget_modify_bg (box, GTK_STATE_NORMAL, bg_color); | ||
3368 | 5506 | gtk_widget_modify_bg (box, GTK_STATE_ACTIVE, bg_color); | ||
3369 | 5507 | #endif | ||
3370 | 5508 | } | 4996 | } |
3371 | 5509 | 4997 | ||
3372 | 5510 | 4998 | ||
3373 | === modified file 'midori/midori.vapi' | |||
3374 | --- midori/midori.vapi 2013-11-19 19:30:54 +0000 | |||
3375 | +++ midori/midori.vapi 2013-12-05 00:25:31 +0000 | |||
3376 | @@ -197,7 +197,6 @@ | |||
3377 | 197 | 197 | ||
3378 | 198 | public string title { get; } | 198 | public string title { get; } |
3379 | 199 | public Gdk.Pixbuf icon { get; } | 199 | public Gdk.Pixbuf icon { get; } |
3380 | 200 | public bool minimized { get; } | ||
3381 | 201 | public float zoom_level { get; } | 200 | public float zoom_level { get; } |
3382 | 202 | public Katze.Array news_feeds { get; } | 201 | public Katze.Array news_feeds { get; } |
3383 | 203 | [NoAccessorMethod] | 202 | [NoAccessorMethod] |
3384 | 204 | 203 | ||
3385 | === modified file 'po/POTFILES.in' | |||
3386 | --- po/POTFILES.in 2013-10-09 09:15:33 +0000 | |||
3387 | +++ po/POTFILES.in 2013-12-05 00:25:31 +0000 | |||
3388 | @@ -14,6 +14,7 @@ | |||
3389 | 14 | midori/midori-settings.vala | 14 | midori/midori-settings.vala |
3390 | 15 | midori/midori-websettings.c | 15 | midori/midori-websettings.c |
3391 | 16 | midori/midori-tab.vala | 16 | midori/midori-tab.vala |
3392 | 17 | midori/midori-notebook.vala | ||
3393 | 17 | midori/midori-view.c | 18 | midori/midori-view.c |
3394 | 18 | midori/midori-download.vala | 19 | midori/midori-download.vala |
3395 | 19 | midori/midori-speeddial.vala | 20 | midori/midori-speeddial.vala |
3396 | @@ -28,7 +29,6 @@ | |||
3397 | 28 | panels/midori-extensions.c | 29 | panels/midori-extensions.c |
3398 | 29 | panels/midori-history.c | 30 | panels/midori-history.c |
3399 | 30 | katze/katze-http-auth.c | 31 | katze/katze-http-auth.c |
3400 | 31 | katze/katze-throbber.c | ||
3401 | 32 | katze/katze-utils.c | 32 | katze/katze-utils.c |
3402 | 33 | katze/katze-item.c | 33 | katze/katze-item.c |
3403 | 34 | katze/katze-array.c | 34 | katze/katze-array.c |
Other bug: scrolling the web-view area while adding a tab with ^T acts like a scroll on the tab-bar.