Merge lp:~midori/midori/deathnote into lp:midori

Proposed by Cris Dywan
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
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

To post a comment you must log in.
Revision history for this message
gue5t gue5t (gue5t) wrote :

Other bug: scrolling the web-view area while adding a tab with ^T acts like a scroll on the tab-bar.

lp:~midori/midori/deathnote updated
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

Revision history for this message
Paweł Forysiuk (tuxator) wrote :

I don't see any major issues at this point. Should be fine to merge.

review: Approve
Revision history for this message
André Stösel (ivaldi) wrote :

Nice :)

review: Approve

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
=== removed file 'katze/katze-throbber.c'
--- katze/katze-throbber.c 2013-06-20 21:15:42 +0000
+++ katze/katze-throbber.c 1970-01-01 00:00:00 +0000
@@ -1,932 +0,0 @@
1/*
2 Copyright (C) 2007-2010 Christian Dywan <christian@twotoasts.de>
3
4 This library is free software; you can redistribute it and/or
5 modify it under the terms of the GNU Lesser General Public
6 License as published by the Free Software Foundation; either
7 version 2.1 of the License, or (at your option) any later version.
8
9 See the file COPYING for the full license text.
10*/
11
12#include "katze-throbber.h"
13
14#include "katze-utils.h"
15
16#include <glib/gi18n.h>
17#include <math.h>
18
19struct _KatzeThrobber
20{
21 GtkSpinner parent_instance;
22 GtkIconSize icon_size;
23 gchar* icon_name;
24 GdkPixbuf* pixbuf;
25 gchar* stock_id;
26 gboolean animated;
27 gchar* static_icon_name;
28 GdkPixbuf* static_pixbuf;
29 gchar* static_stock_id;
30
31 gint index;
32 gint timer_id;
33 gint width;
34 gint height;
35};
36
37struct _KatzeThrobberClass
38{
39 GtkSpinnerClass parent_class;
40};
41
42G_DEFINE_TYPE (KatzeThrobber, katze_throbber, GTK_TYPE_SPINNER);
43
44enum
45{
46 PROP_0,
47
48 PROP_ICON_SIZE,
49 PROP_ICON_NAME,
50 PROP_PIXBUF,
51 PROP_ANIMATED,
52 PROP_STATIC_ICON_NAME,
53 PROP_STATIC_PIXBUF,
54 PROP_STATIC_STOCK_ID
55};
56
57static void
58katze_throbber_dispose (GObject* object);
59
60static void
61katze_throbber_set_property (GObject* object,
62 guint prop_id,
63 const GValue* value,
64 GParamSpec* pspec);
65
66static void
67katze_throbber_get_property (GObject* object,
68 guint prop_id,
69 GValue* value,
70 GParamSpec* pspec);
71
72static void
73#if GTK_CHECK_VERSION (3, 0, 0)
74katze_throbber_destroy (GtkWidget* object);
75#else
76katze_throbber_destroy (GtkObject* object);
77#endif
78
79static void
80katze_throbber_realize (GtkWidget* widget);
81
82#if GTK_CHECK_VERSION (3, 0, 0)
83static void
84katze_throbber_get_preferred_height (GtkWidget *widget,
85 gint *minimal_height,
86 gint *natural_height);
87static void
88katze_throbber_get_preferred_width (GtkWidget *widget,
89 gint *minimal_width,
90 gint *natural_width);
91#endif
92static void
93katze_throbber_unrealize (GtkWidget* widget);
94
95static void
96katze_throbber_map (GtkWidget* widget);
97
98static void
99katze_throbber_unmap (GtkWidget* widget);
100
101static void
102katze_throbber_style_set (GtkWidget* widget,
103 GtkStyle* style);
104
105static void
106katze_throbber_screen_changed (GtkWidget* widget,
107 GdkScreen* screen_prev);
108
109static void
110katze_throbber_size_request (GtkWidget* widget,
111 GtkRequisition* requisition);
112
113static gboolean
114katze_throbber_expose_event (GtkWidget* widget,
115#if GTK_CHECK_VERSION (3, 0, 0)
116 cairo_t* cr);
117#else
118 GdkEventExpose* event);
119#endif
120
121static void
122icon_theme_changed (KatzeThrobber* throbber);
123
124static void
125katze_throbber_class_init (KatzeThrobberClass* class)
126{
127 GObjectClass* gobject_class;
128#if !GTK_CHECK_VERSION (3, 0, 0)
129 GtkObjectClass* object_class;
130#endif
131 GtkWidgetClass* widget_class;
132 GParamFlags flags = G_PARAM_READWRITE | G_PARAM_CONSTRUCT;
133
134 gobject_class = G_OBJECT_CLASS (class);
135 gobject_class->dispose = katze_throbber_dispose;
136 gobject_class->set_property = katze_throbber_set_property;
137 gobject_class->get_property = katze_throbber_get_property;
138
139 widget_class = GTK_WIDGET_CLASS (class);
140#if GTK_CHECK_VERSION (3, 0, 0)
141 widget_class->destroy = katze_throbber_destroy;
142#else
143 object_class = GTK_OBJECT_CLASS (class);
144 object_class->destroy = katze_throbber_destroy;
145#endif
146 widget_class->realize = katze_throbber_realize;
147 widget_class->unrealize = katze_throbber_unrealize;
148 widget_class->map = katze_throbber_map;
149 widget_class->unmap = katze_throbber_unmap;
150 widget_class->style_set = katze_throbber_style_set;
151 widget_class->screen_changed = katze_throbber_screen_changed;
152#if GTK_CHECK_VERSION (3, 0, 0)
153 widget_class->get_preferred_width= katze_throbber_get_preferred_width;
154 widget_class->get_preferred_height= katze_throbber_get_preferred_height;
155#else
156 widget_class->size_request = katze_throbber_size_request;
157#endif
158#if GTK_CHECK_VERSION (3, 0, 0)
159 widget_class->draw = katze_throbber_expose_event;
160#else
161 widget_class->expose_event = katze_throbber_expose_event;
162#endif
163 g_object_class_install_property (gobject_class,
164 PROP_ICON_SIZE,
165 g_param_spec_int (
166 "icon-size",
167 "Icon size",
168 "Symbolic size to use for the animation",
169 0, G_MAXINT, GTK_ICON_SIZE_MENU,
170 flags));
171
172 g_object_class_install_property (gobject_class,
173 PROP_ICON_NAME,
174 g_param_spec_string (
175 "icon-name",
176 "Icon Name",
177 "The name of an icon containing animation frames",
178 "process-working",
179 flags));
180
181 g_object_class_install_property (gobject_class,
182 PROP_PIXBUF,
183 g_param_spec_object (
184 "pixbuf",
185 "Pixbuf",
186 "A GdkPixbuf containing animation frames",
187 GDK_TYPE_PIXBUF,
188 G_PARAM_READWRITE));
189
190 g_object_class_install_property (gobject_class,
191 PROP_ANIMATED,
192 g_param_spec_boolean (
193 "animated",
194 "Animated",
195 "Whether the throbber should be animated",
196 FALSE,
197 flags));
198
199 g_object_class_install_property (gobject_class,
200 PROP_STATIC_ICON_NAME,
201 g_param_spec_string (
202 "static-icon-name",
203 "Static Icon Name",
204 "The name of an icon to be used as the static image",
205 NULL,
206 flags));
207
208 g_object_class_install_property (gobject_class,
209 PROP_STATIC_PIXBUF,
210 g_param_spec_object (
211 "static-pixbuf",
212 "Static Pixbuf",
213 "A GdkPixbuf to be used as the static image",
214 GDK_TYPE_PIXBUF,
215 G_PARAM_READWRITE));
216
217 g_object_class_install_property (gobject_class,
218 PROP_STATIC_STOCK_ID,
219 g_param_spec_string (
220 "static-stock-id",
221 "Static Stock ID",
222 "The stock ID of an icon to be used as the static image",
223 NULL,
224 flags));
225}
226
227static void
228katze_throbber_init (KatzeThrobber *throbber)
229{
230 gtk_widget_set_has_window (GTK_WIDGET (throbber), FALSE);
231
232 throbber->timer_id = -1;
233}
234
235static void
236katze_throbber_dispose (GObject* object)
237{
238 KatzeThrobber* throbber = KATZE_THROBBER (object);
239
240 if (G_UNLIKELY (throbber->timer_id >= 0))
241 g_source_remove (throbber->timer_id);
242
243 (*G_OBJECT_CLASS (katze_throbber_parent_class)->dispose) (object);
244}
245
246static void
247#if GTK_CHECK_VERSION (3, 0, 0)
248katze_throbber_destroy (GtkWidget* object)
249#else
250katze_throbber_destroy (GtkObject* object)
251#endif
252{
253 KatzeThrobber* throbber = KATZE_THROBBER (object);
254
255 katze_assign (throbber->icon_name, NULL);
256 katze_object_assign (throbber->pixbuf, NULL);
257 katze_assign (throbber->static_icon_name, NULL);
258 katze_object_assign (throbber->static_pixbuf, NULL);
259 katze_assign (throbber->static_stock_id, NULL);
260#if GTK_CHECK_VERSION (3, 0, 0)
261 GTK_WIDGET_CLASS (katze_throbber_parent_class)->destroy (object);
262#else
263 GTK_OBJECT_CLASS (katze_throbber_parent_class)->destroy (object);
264#endif
265}
266
267static void
268katze_throbber_set_property (GObject* object,
269 guint prop_id,
270 const GValue* value,
271 GParamSpec* pspec)
272{
273 KatzeThrobber* throbber = KATZE_THROBBER (object);
274
275 switch (prop_id)
276 {
277 case PROP_ICON_SIZE:
278 katze_throbber_set_icon_size (throbber, g_value_get_int (value));
279 break;
280 case PROP_ICON_NAME:
281 katze_throbber_set_icon_name (throbber, g_value_get_string (value));
282 break;
283 case PROP_PIXBUF:
284 katze_throbber_set_pixbuf (throbber, g_value_get_object (value));
285 break;
286 case PROP_ANIMATED:
287 katze_throbber_set_animated (throbber, g_value_get_boolean (value));
288 break;
289 case PROP_STATIC_ICON_NAME:
290 katze_throbber_set_static_icon_name (throbber, g_value_get_string (value));
291 break;
292 case PROP_STATIC_PIXBUF:
293 katze_throbber_set_static_pixbuf (throbber, g_value_get_object (value));
294 break;
295 case PROP_STATIC_STOCK_ID:
296 katze_throbber_set_static_stock_id (throbber, g_value_get_string (value));
297 break;
298 default:
299 G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
300 break;
301 }
302}
303
304static void
305katze_throbber_get_property (GObject* object,
306 guint prop_id,
307 GValue* value,
308 GParamSpec* pspec)
309{
310 KatzeThrobber* throbber = KATZE_THROBBER (object);
311
312 switch (prop_id)
313 {
314 case PROP_ICON_SIZE:
315 g_value_set_int (value, katze_throbber_get_icon_size (throbber));
316 break;
317 case PROP_ICON_NAME:
318 g_value_set_string (value, katze_throbber_get_icon_name (throbber));
319 break;
320 case PROP_PIXBUF:
321 g_value_set_object (value, katze_throbber_get_pixbuf (throbber));
322 break;
323 case PROP_ANIMATED:
324 g_value_set_boolean (value, katze_throbber_get_animated (throbber));
325 break;
326 case PROP_STATIC_ICON_NAME:
327 g_value_set_string (value, katze_throbber_get_static_icon_name (throbber));
328 break;
329 case PROP_STATIC_PIXBUF:
330 g_value_set_object (value, katze_throbber_get_static_pixbuf (throbber));
331 break;
332 case PROP_STATIC_STOCK_ID:
333 g_value_set_string (value, katze_throbber_get_static_stock_id (throbber));
334 break;
335 default:
336 G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
337 break;
338 }
339}
340
341/**
342 * katze_throbber_new:
343 *
344 * Creates a new throbber widget.
345 *
346 * Return value: a new #KatzeThrobber
347 **/
348GtkWidget*
349katze_throbber_new (void)
350{
351 KatzeThrobber* throbber = g_object_new (KATZE_TYPE_THROBBER,
352 NULL);
353
354 return GTK_WIDGET (throbber);
355}
356
357/**
358 * katze_throbber_set_icon_size:
359 * @throbber: a #KatzeThrobber
360 * @icon_size: the new icon size
361 *
362 * Sets the desired size of the throbber image. The animation and static image
363 * will be displayed in this size. If a pixbuf is used for the animation every
364 * single frame is assumed to have this size.
365 **/
366void
367katze_throbber_set_icon_size (KatzeThrobber* throbber,
368 GtkIconSize icon_size)
369{
370 GtkSettings* gtk_settings;
371
372 g_return_if_fail (KATZE_IS_THROBBER (throbber));
373 gtk_settings = gtk_widget_get_settings (GTK_WIDGET (throbber));
374 g_return_if_fail (gtk_icon_size_lookup_for_settings (gtk_settings,
375 icon_size,
376 &throbber->width,
377 &throbber->height));
378
379 throbber->icon_size = icon_size;
380
381 g_object_notify (G_OBJECT (throbber), "icon-size");
382
383 gtk_widget_queue_draw (GTK_WIDGET (throbber));
384}
385
386/**
387 * katze_throbber_set_icon_name:
388 * @throbber: a #KatzeThrobber
389 * @icon_name: an icon name or %NULL
390 *
391 * Sets the name of an icon that should provide the animation frames.
392 *
393 * The pixbuf is automatically invalidated.
394 **/
395void
396katze_throbber_set_icon_name (KatzeThrobber* throbber,
397 const gchar* icon_name)
398{
399 g_return_if_fail (KATZE_IS_THROBBER (throbber));
400
401 katze_assign (throbber->icon_name, g_strdup (icon_name));
402
403 if (icon_name)
404 icon_theme_changed (throbber);
405
406 g_object_notify (G_OBJECT (throbber), "icon-name");
407}
408
409/**
410 * katze_throbber_set_pixbuf:
411 * @throbber: a #KatzeThrobber
412 * @pixbuf: a #GdkPixbuf or %NULL
413 *
414 * Sets the pixbuf that should provide the animation frames. Every frame
415 * is assumed to have the icon size of the throbber, which can be specified
416 * with katze_throbber_set_icon_size ().
417 *
418 * The icon name is automatically invalidated.
419 **/
420void
421katze_throbber_set_pixbuf (KatzeThrobber* throbber,
422 GdkPixbuf* pixbuf)
423{
424 g_return_if_fail (KATZE_IS_THROBBER (throbber));
425 g_return_if_fail (!pixbuf || GDK_IS_PIXBUF (pixbuf));
426
427 katze_object_assign (throbber->pixbuf, pixbuf);
428
429 g_object_freeze_notify (G_OBJECT (throbber));
430
431 if (pixbuf)
432 {
433 g_object_ref (pixbuf);
434
435 katze_assign (throbber->icon_name, NULL);
436 g_object_notify (G_OBJECT (throbber), "icon-name");
437 }
438
439 gtk_widget_queue_draw (GTK_WIDGET (throbber));
440
441 g_object_notify (G_OBJECT (throbber), "pixbuf");
442 g_object_thaw_notify (G_OBJECT (throbber));
443}
444
445/**
446 * katze_throbber_set_animated:
447 * @throbber: a #KatzeThrobber
448 * @animated: %TRUE to animate the throbber
449 *
450 * Sets the animation state of the throbber.
451 **/
452void
453katze_throbber_set_animated (KatzeThrobber* throbber,
454 gboolean animated)
455{
456 g_return_if_fail (KATZE_IS_THROBBER (throbber));
457
458 if (G_UNLIKELY (throbber->animated == animated))
459 return;
460
461 throbber->animated = animated;
462
463 g_object_set (throbber, "active", animated, NULL);
464 gtk_widget_queue_draw (GTK_WIDGET (throbber));
465
466 g_object_notify (G_OBJECT (throbber), "animated");
467}
468
469/**
470 * katze_throbber_set_static_icon_name:
471 * @throbber: a #KatzeThrobber
472 * @icon_name: an icon name or %NULL
473 *
474 * Sets the name of an icon that should provide the static image.
475 *
476 * The static pixbuf and stock ID are automatically invalidated.
477 **/
478void
479katze_throbber_set_static_icon_name (KatzeThrobber* throbber,
480 const gchar* icon_name)
481{
482 g_return_if_fail (KATZE_IS_THROBBER (throbber));
483
484 katze_assign (throbber->static_icon_name, g_strdup (icon_name));
485
486 g_object_freeze_notify (G_OBJECT (throbber));
487
488 if (icon_name)
489 {
490 katze_assign (throbber->static_stock_id, NULL);
491
492 icon_theme_changed (throbber);
493
494 g_object_notify (G_OBJECT (throbber), "static-pixbuf");
495 g_object_notify (G_OBJECT (throbber), "static-stock-id");
496 }
497
498 g_object_notify (G_OBJECT (throbber), "static-icon-name");
499 g_object_thaw_notify (G_OBJECT (throbber));
500}
501
502/**
503 * katze_throbber_set_static_pixbuf:
504 * @throbber: a #KatzeThrobber
505 * @pixbuf: a #GdkPixbuf or %NULL
506 *
507 * Sets the pixbuf that should provide the static image. The pixbuf is
508 * assumed to have the icon size of the throbber, which can be specified
509 * with katze_throbber_set_icon_size ().
510 *
511 * The static icon name and stock ID are automatically invalidated.
512 **/
513void
514katze_throbber_set_static_pixbuf (KatzeThrobber* throbber,
515 GdkPixbuf* pixbuf)
516{
517 g_return_if_fail (KATZE_IS_THROBBER (throbber));
518 g_return_if_fail (pixbuf == NULL || GDK_IS_PIXBUF (pixbuf));
519
520 katze_object_assign (throbber->static_pixbuf, pixbuf);
521
522 g_object_freeze_notify (G_OBJECT (throbber));
523
524 if (pixbuf)
525 {
526 g_object_ref (pixbuf);
527
528 katze_assign (throbber->static_icon_name, NULL);
529 katze_assign (throbber->static_stock_id, NULL);
530
531 gtk_widget_queue_draw (GTK_WIDGET (throbber));
532
533 g_object_notify (G_OBJECT (throbber), "static-icon-name");
534 g_object_notify (G_OBJECT (throbber), "static-stock-id");
535 }
536
537 g_object_notify (G_OBJECT (throbber), "static-pixbuf");
538 g_object_thaw_notify (G_OBJECT (throbber));
539}
540
541/**
542 * katze_throbber_set_static_stock_id:
543 * @throbber: a #KatzeThrobber
544 * @stock_id: a stock ID or %NULL
545 *
546 * Sets the stock ID of an icon that should provide the static image.
547 *
548 * The static icon name and pixbuf are automatically invalidated.
549 **/
550void
551katze_throbber_set_static_stock_id (KatzeThrobber* throbber,
552 const gchar* stock_id)
553{
554 g_return_if_fail (KATZE_IS_THROBBER (throbber));
555
556 g_object_freeze_notify (G_OBJECT (throbber));
557
558 if (stock_id)
559 {
560 GtkStockItem stock_item;
561 g_return_if_fail (gtk_stock_lookup (stock_id, &stock_item));
562
563 g_object_notify (G_OBJECT (throbber), "static-icon-name");
564 g_object_notify (G_OBJECT (throbber), "static-pixbuf");
565 }
566
567 katze_assign (throbber->static_stock_id, g_strdup (stock_id));
568
569 if (stock_id)
570 icon_theme_changed (throbber);
571
572 g_object_notify (G_OBJECT (throbber), "static-stock-id");
573 g_object_thaw_notify (G_OBJECT (throbber));
574}
575
576/**
577 * katze_throbber_get_icon_size:
578 * @throbber: a #KatzeThrobber
579 *
580 * Retrieves the size of the throbber.
581 *
582 * Return value: the size of the throbber
583 **/
584GtkIconSize
585katze_throbber_get_icon_size (KatzeThrobber* throbber)
586{
587 g_return_val_if_fail (KATZE_IS_THROBBER (throbber), GTK_ICON_SIZE_INVALID);
588
589 return throbber->icon_size;
590}
591
592/**
593 * katze_throbber_get_icon_name:
594 * @throbber: a #KatzeThrobber
595 *
596 * Retrieves the name of the icon providing the animation frames.
597 *
598 * Return value: the name of the icon providing the animation frames, or %NULL
599 **/
600const gchar*
601katze_throbber_get_icon_name (KatzeThrobber* throbber)
602{
603 g_return_val_if_fail (KATZE_IS_THROBBER (throbber), NULL);
604
605 return throbber->icon_name;
606}
607
608/**
609 * katze_throbber_get_pixbuf:
610 * @throbber: a #KatzeThrobber
611 *
612 * Retrieves the #GdkPixbuf providing the animation frames if an icon name
613 * or pixbuf is available. The caller of this function does not own a
614 * reference to the returned pixbuf.
615 *
616 * Return value: the pixbuf providing the animation frames, or %NULL
617 **/
618GdkPixbuf*
619katze_throbber_get_pixbuf (KatzeThrobber* throbber)
620{
621 g_return_val_if_fail (KATZE_IS_THROBBER (throbber), NULL);
622
623 return throbber->pixbuf;
624}
625
626/**
627 * katze_throbber_get_animated:
628 * @throbber: a #KatzeThrobber
629 *
630 * Retrieves the status of the animation, whcih can be animated or static.
631 *
632 * Return value: %TRUE if the throbber is animated
633 **/
634gboolean
635katze_throbber_get_animated (KatzeThrobber* throbber)
636{
637 g_return_val_if_fail (KATZE_IS_THROBBER (throbber), FALSE);
638
639 return throbber->animated;
640}
641
642/**
643 * katze_throbber_get_static_icon_name:
644 * @throbber: a #KatzeThrobber
645 *
646 * Retrieves the name of the icon providing the static image, if an icon name
647 * for the static image was specified.
648 *
649 * Return value: the name of the icon providing the static image, or %NULL
650 **/
651const gchar*
652katze_throbber_get_static_icon_name (KatzeThrobber* throbber)
653{
654 g_return_val_if_fail (KATZE_IS_THROBBER (throbber), NULL);
655
656 return throbber->static_icon_name;
657}
658
659/**
660 * katze_throbber_get_static pixbuf:
661 * @throbber: a #KatzeThrobber
662 *
663 * Retrieves the #GdkPixbuf providing the static image, if an icon name, a
664 * pixbuf or a stock ID for the static image was specified. The caller of this
665 * function does not own a reference to the returned pixbuf.
666 *
667 * Return value: the pixbuf providing the static image, or %NULL
668 **/
669GdkPixbuf*
670katze_throbber_get_static_pixbuf (KatzeThrobber* throbber)
671{
672 g_return_val_if_fail (KATZE_IS_THROBBER (throbber), NULL);
673
674 return throbber->static_pixbuf;
675}
676
677/**
678 * katze_throbber_get_static_stock_id:
679 * @throbber: a #KatzeThrobber
680 *
681 * Retrieves the stock ID of the icon providing the static image, if a
682 * stock ID for the static image was specified.
683 *
684 * Return value: the stock ID of the icon providing the static image, or %NULL
685 **/
686const gchar*
687katze_throbber_get_static_stock_id (KatzeThrobber* throbber)
688{
689 g_return_val_if_fail (KATZE_IS_THROBBER (throbber), NULL);
690
691 return throbber->static_stock_id;
692}
693
694static void
695katze_throbber_realize (GtkWidget* widget)
696{
697 (*GTK_WIDGET_CLASS (katze_throbber_parent_class)->realize) (widget);
698
699 icon_theme_changed (KATZE_THROBBER (widget));
700}
701
702static void
703katze_throbber_unrealize (GtkWidget* widget)
704{
705 if (GTK_WIDGET_CLASS (katze_throbber_parent_class)->unrealize)
706 GTK_WIDGET_CLASS (katze_throbber_parent_class)->unrealize (widget);
707}
708
709static void
710pixbuf_assign_icon (GdkPixbuf** pixbuf,
711 const gchar* icon_name,
712 KatzeThrobber* throbber)
713{
714 GdkScreen* screen;
715 GtkIconTheme* icon_theme;
716
717 if (*pixbuf)
718 g_object_unref (*pixbuf);
719
720 screen = gtk_widget_get_screen (GTK_WIDGET (throbber));
721 icon_theme = gtk_icon_theme_get_for_screen (screen);
722 *pixbuf = gtk_icon_theme_load_icon (icon_theme,
723 icon_name,
724 MAX (throbber->width, throbber->height),
725 (GtkIconLookupFlags) 0,
726 NULL);
727}
728
729static void
730icon_theme_changed (KatzeThrobber* throbber)
731{
732 if (throbber->icon_name)
733 pixbuf_assign_icon (&throbber->pixbuf,
734 throbber->icon_name, throbber);
735
736 if (throbber->static_icon_name)
737 pixbuf_assign_icon (&throbber->static_pixbuf,
738 throbber->static_icon_name, throbber);
739 else if (throbber->static_stock_id)
740 katze_object_assign (throbber->static_pixbuf,
741 gtk_widget_render_icon (GTK_WIDGET (throbber),
742 throbber->static_stock_id,
743 throbber->icon_size,
744 NULL));
745
746 g_object_freeze_notify (G_OBJECT (throbber));
747 g_object_notify (G_OBJECT (throbber), "pixbuf");
748 g_object_notify (G_OBJECT (throbber), "static-pixbuf");
749 g_object_thaw_notify (G_OBJECT (throbber));
750
751 gtk_widget_queue_draw (GTK_WIDGET (throbber));
752}
753
754static void
755katze_throbber_map (GtkWidget* widget)
756{
757 (*GTK_WIDGET_CLASS (katze_throbber_parent_class)->map) (widget);
758}
759
760static void
761katze_throbber_unmap (GtkWidget* widget)
762{
763 if (GTK_WIDGET_CLASS (katze_throbber_parent_class)->unmap)
764 GTK_WIDGET_CLASS (katze_throbber_parent_class)->unmap (widget);
765}
766
767static void
768katze_throbber_style_set (GtkWidget* widget,
769 GtkStyle* prev_style)
770{
771 if (GTK_WIDGET_CLASS (katze_throbber_parent_class)->style_set)
772 GTK_WIDGET_CLASS (katze_throbber_parent_class)->style_set (widget,
773 prev_style);
774
775 icon_theme_changed (KATZE_THROBBER (widget));
776}
777
778static void
779katze_throbber_screen_changed (GtkWidget* widget,
780 GdkScreen* prev_screen)
781{
782 if (GTK_WIDGET_CLASS (katze_throbber_parent_class)->screen_changed)
783 GTK_WIDGET_CLASS (katze_throbber_parent_class)->screen_changed (
784 widget,
785 prev_screen);
786
787 icon_theme_changed (KATZE_THROBBER (widget));
788}
789
790static void
791katze_throbber_size_request (GtkWidget* widget,
792 GtkRequisition* requisition)
793{
794 KatzeThrobber* throbber = KATZE_THROBBER (widget);
795
796 requisition->width = throbber->width;
797 requisition->height = throbber->height;
798#if !GTK_CHECK_VERSION (3, 0, 0)
799 GTK_WIDGET_CLASS (katze_throbber_parent_class)->size_request (widget,
800 requisition);
801#endif
802}
803
804#if GTK_CHECK_VERSION (3, 0, 0)
805static void
806katze_throbber_get_preferred_height (GtkWidget *widget,
807 gint *minimal_height,
808 gint *natural_height)
809{
810 GtkRequisition requisition;
811
812 katze_throbber_size_request (widget, &requisition);
813
814 *minimal_height = *natural_height = requisition.height;
815}
816
817static void
818katze_throbber_get_preferred_width (GtkWidget *widget,
819 gint *minimal_width,
820 gint *natural_width)
821{
822 GtkRequisition requisition;
823
824 katze_throbber_size_request (widget, &requisition);
825
826 *minimal_width = *natural_width = requisition.width;
827}
828#endif
829
830static void
831katze_throbber_aligned_coords (GtkWidget* widget,
832 gint* ax,
833 gint* ay)
834{
835 gfloat xalign, yalign;
836 gint xpad, ypad;
837 GtkAllocation allocation;
838 GtkRequisition requisition;
839
840 xalign = 0.0;
841 yalign = 0.5;
842 xpad = ypad = 0.0;
843
844 #if GTK_CHECK_VERSION (3, 0, 0)
845 allocation.x = allocation.y = 0;
846 allocation.width = gtk_widget_get_allocated_width (widget);
847 allocation.height = gtk_widget_get_allocated_height (widget);
848 gtk_widget_get_preferred_size (widget, &requisition, NULL);
849 #else
850 gtk_widget_get_allocation (widget, &allocation);
851 gtk_widget_size_request (widget, &requisition);
852 #endif
853 *ax = floor (allocation.x + xpad
854 + ((allocation.width - requisition.width) * xalign));
855 *ay = floor (allocation.y + ypad
856 + ((allocation.height - requisition.height) * yalign));
857}
858
859static gboolean
860katze_throbber_expose_event (GtkWidget* widget,
861#if GTK_CHECK_VERSION (3, 0, 0)
862 cairo_t* cr)
863#else
864 GdkEventExpose* event)
865#endif
866{
867 KatzeThrobber* throbber = KATZE_THROBBER (widget);
868 gint ax, ay;
869
870 if (G_UNLIKELY (!throbber->width || !throbber->height))
871 return TRUE;
872
873 if (G_UNLIKELY (!throbber->pixbuf && !throbber->static_pixbuf))
874 if (throbber->animated && !throbber->pixbuf && !throbber->icon_name)
875 return TRUE;
876
877 if (!throbber->animated && (throbber->static_pixbuf
878 || throbber->static_icon_name || throbber->static_stock_id))
879 {
880#if !GTK_CHECK_VERSION (3, 0, 0)
881 cairo_t* cr;
882#endif
883 if (G_UNLIKELY (!throbber->static_pixbuf && throbber->static_icon_name))
884 {
885 icon_theme_changed (KATZE_THROBBER (widget));
886
887 if (!throbber->static_pixbuf)
888 {
889 g_warning (_("Named icon '%s' couldn't be loaded"),
890 throbber->static_icon_name);
891 katze_assign (throbber->static_icon_name, NULL);
892 g_object_notify (G_OBJECT (throbber), "static-icon-name");
893 return TRUE;
894 }
895 }
896 else if (G_UNLIKELY (!throbber->static_pixbuf && throbber->static_stock_id))
897 {
898 icon_theme_changed (KATZE_THROBBER (widget));
899
900 if (!throbber->static_pixbuf)
901 {
902 g_warning (_("Stock icon '%s' couldn't be loaded"),
903 throbber->static_stock_id);
904 katze_assign (throbber->static_stock_id, NULL);
905 g_object_notify (G_OBJECT (throbber), "static-stock-id");
906 return TRUE;
907 }
908 }
909
910 katze_throbber_aligned_coords (widget, &ax, &ay);
911
912#if !GTK_CHECK_VERSION (3, 0, 0)
913 cr = gdk_cairo_create (gtk_widget_get_window (widget));
914#endif
915 gdk_cairo_set_source_pixbuf (cr, throbber->static_pixbuf, ax, ay);
916 cairo_paint (cr);
917#if !GTK_CHECK_VERSION (3, 0, 0)
918 cairo_destroy (cr);
919#endif
920 }
921 else
922 {
923 if (throbber->animated)
924#if GTK_CHECK_VERSION (3, 0, 0)
925 return GTK_WIDGET_CLASS (katze_throbber_parent_class)->draw (widget, cr);
926#else
927 return GTK_WIDGET_CLASS (katze_throbber_parent_class)->expose_event (widget, event);
928#endif
929 }
930
931 return TRUE;
932}
9330
=== removed file 'katze/katze-throbber.h'
--- katze/katze-throbber.h 2010-05-02 14:11:18 +0000
+++ katze/katze-throbber.h 1970-01-01 00:00:00 +0000
@@ -1,94 +0,0 @@
1/*
2 Copyright (C) 2007 Christian Dywan <christian@twotoasts.de>
3
4 This library is free software; you can redistribute it and/or
5 modify it under the terms of the GNU Lesser General Public
6 License as published by the Free Software Foundation; either
7 version 2.1 of the License, or (at your option) any later version.
8
9 See the file COPYING for the full license text.
10*/
11
12#ifndef __KATZE_THROBBER_H__
13#define __KATZE_THROBBER_H__
14
15#include <gtk/gtk.h>
16
17G_BEGIN_DECLS
18
19#define KATZE_TYPE_THROBBER \
20 (katze_throbber_get_type ())
21#define KATZE_THROBBER(obj) \
22 (G_TYPE_CHECK_INSTANCE_CAST ((obj), KATZE_TYPE_THROBBER, KatzeThrobber))
23#define KATZE_THROBBER_CLASS(klass) \
24 (G_TYPE_CHECK_CLASS_CAST ((klass), KATZE_TYPE_THROBBER, KatzeThrobberClass))
25#define KATZE_IS_THROBBER(obj) \
26 (G_TYPE_CHECK_INSTANCE_TYPE ((obj), KATZE_TYPE_THROBBER))
27#define KATZE_IS_THROBBER_CLASS(klass) \
28 (G_TYPE_CHECK_CLASS_TYPE ((klass), KATZE_TYPE_THROBBER))
29#define KATZE_THROBBER_GET_CLASS(obj) \
30 (G_TYPE_INSTANCE_GET_CLASS ((obj), KATZE_TYPE_THROBBER, KatzeThrobberClass))
31
32typedef struct _KatzeThrobber KatzeThrobber;
33typedef struct _KatzeThrobberPrivate KatzeThrobberPrivate;
34typedef struct _KatzeThrobberClass KatzeThrobberClass;
35
36
37GType
38katze_throbber_get_type (void) G_GNUC_CONST;
39
40GtkWidget*
41katze_throbber_new (void);
42
43void
44katze_throbber_set_icon_size (KatzeThrobber* throbber,
45 GtkIconSize icon_size);
46
47void
48katze_throbber_set_icon_name (KatzeThrobber* throbber,
49 const gchar* icon_size);
50
51void
52katze_throbber_set_pixbuf (KatzeThrobber* throbber,
53 GdkPixbuf* pixbuf);
54
55void
56katze_throbber_set_animated (KatzeThrobber* throbber,
57 gboolean animated);
58
59void
60katze_throbber_set_static_icon_name (KatzeThrobber* throbber,
61 const gchar* icon_name);
62
63void
64katze_throbber_set_static_pixbuf (KatzeThrobber* throbber,
65 GdkPixbuf* pixbuf);
66
67void
68katze_throbber_set_static_stock_id (KatzeThrobber* throbber,
69 const gchar* stock_id);
70
71GtkIconSize
72katze_throbber_get_icon_size (KatzeThrobber* throbber);
73
74const gchar*
75katze_throbber_get_icon_name (KatzeThrobber* throbber);
76
77GdkPixbuf*
78katze_throbber_get_pixbuf (KatzeThrobber* throbber);
79
80gboolean
81katze_throbber_get_animated (KatzeThrobber* throbber);
82
83const gchar*
84katze_throbber_get_static_icon_name (KatzeThrobber *throbber);
85
86GdkPixbuf*
87katze_throbber_get_static_pixbuf (KatzeThrobber* throbber);
88
89const gchar*
90katze_throbber_get_static_stock_id (KatzeThrobber* throbber);
91
92G_END_DECLS
93
94#endif /* __KATZE_THROBBER_H__ */
950
=== modified file 'katze/katze.h'
--- katze/katze.h 2013-07-30 21:00:46 +0000
+++ katze/katze.h 2013-12-05 00:25:31 +0000
@@ -13,7 +13,6 @@
13#define __KATZE_H__13#define __KATZE_H__
1414
15#include "katze-http-auth.h"15#include "katze-http-auth.h"
16#include "katze-throbber.h"
17#include "katze-utils.h"16#include "katze-utils.h"
18#include "katze-item.h"17#include "katze-item.h"
19#include "katze-array.h"18#include "katze-array.h"
2019
=== modified file 'midori/midori-browser.c'
--- midori/midori-browser.c 2013-11-27 09:47:37 +0000
+++ midori/midori-browser.c 2013-12-05 00:25:31 +0000
@@ -82,7 +82,6 @@
8282
83 gint last_window_width, last_window_height;83 gint last_window_width, last_window_height;
84 guint alloc_timeout;84 guint alloc_timeout;
85 gint last_tab_size;
86 guint panel_timeout;85 guint panel_timeout;
8786
88 MidoriWebSettings* settings;87 MidoriWebSettings* settings;
@@ -202,11 +201,6 @@
202midori_browser_add_speed_dial (MidoriBrowser* browser);201midori_browser_add_speed_dial (MidoriBrowser* browser);
203202
204static void203static void
205midori_browser_notebook_size_allocate_cb (GtkWidget* notebook,
206 GdkRectangle* allocation,
207 MidoriBrowser* browser);
208
209static void
210midori_browser_step_history (MidoriBrowser* browser,204midori_browser_step_history (MidoriBrowser* browser,
211 MidoriView* view);205 MidoriView* view);
212206
@@ -220,6 +214,10 @@
220 gtk_toggle_action_set_active (GTK_TOGGLE_ACTION ( \214 gtk_toggle_action_set_active (GTK_TOGGLE_ACTION ( \
221 _action_by_name (brwsr, nme)), actv);215 _action_by_name (brwsr, nme)), actv);
222216
217static void
218midori_browser_disconnect_tab (MidoriBrowser* browser,
219 MidoriView* view);
220
223static gboolean221static gboolean
224midori_browser_is_fullscreen (MidoriBrowser* browser)222midori_browser_is_fullscreen (MidoriBrowser* browser)
225{223{
@@ -236,15 +234,7 @@
236 gboolean show_tabs = !midori_browser_is_fullscreen (browser) || ignore_fullscreen;234 gboolean show_tabs = !midori_browser_is_fullscreen (browser) || ignore_fullscreen;
237 if (!browser->show_tabs)235 if (!browser->show_tabs)
238 show_tabs = FALSE;236 show_tabs = FALSE;
239#ifdef HAVE_GRANITE237 midori_notebook_set_labels_visible (MIDORI_NOTEBOOK (browser->notebook), show_tabs);
240 granite_widgets_dynamic_notebook_set_show_tabs (
241 GRANITE_WIDGETS_DYNAMIC_NOTEBOOK (browser->notebook), show_tabs);
242#else
243 if (!(has_tabs || katze_object_get_boolean (browser->settings, "always-show-tabbar")))
244 show_tabs = FALSE;
245 gtk_notebook_set_show_tabs (GTK_NOTEBOOK (browser->notebook), show_tabs);
246 gtk_notebook_set_show_border (GTK_NOTEBOOK (browser->notebook), show_tabs);
247#endif
248 return has_tabs;238 return has_tabs;
249}239}
250240
@@ -451,8 +441,7 @@
451 "tooltip", _("Stop loading the current page"), NULL);441 "tooltip", _("Stop loading the current page"), NULL);
452 }442 }
453443
454 gtk_widget_set_sensitive (browser->throbber, loading);444 g_object_set (browser->throbber, "active", loading, "visible", loading, NULL);
455 katze_throbber_set_animated (KATZE_THROBBER (browser->throbber), loading);
456}445}
457446
458/**447/**
@@ -782,23 +771,6 @@
782}771}
783772
784static void773static void
785midori_view_notify_minimized_cb (GtkWidget* widget,
786 GParamSpec* pspec,
787 MidoriBrowser* browser)
788{
789 if (katze_object_get_boolean (widget, "minimized"))
790 {
791 #ifndef HAVE_GRANITE
792 GtkNotebook* notebook = GTK_NOTEBOOK (browser->notebook);
793 GtkWidget* label = gtk_notebook_get_tab_label (notebook, widget);
794 gtk_widget_set_size_request (label, -1, -1);
795 #endif
796 }
797 else
798 midori_browser_notebook_size_allocate_cb (NULL, NULL, browser);
799}
800
801static void
802midori_view_notify_zoom_level_cb (GtkWidget* view,774midori_view_notify_zoom_level_cb (GtkWidget* view,
803 GParamSpec* pspec,775 GParamSpec* pspec,
804 MidoriBrowser* browser)776 MidoriBrowser* browser)
@@ -1401,6 +1373,25 @@
1401}1373}
14021374
1403static void1375static void
1376midori_view_destroy_cb (GtkWidget* view,
1377 MidoriBrowser* browser)
1378{
1379 if (browser->proxy_array)
1380 {
1381 KatzeItem* item = midori_view_get_proxy_item (MIDORI_VIEW (view));
1382 if (katze_array_get_item_index (browser->proxy_array, item) != -1
1383 && !midori_tab_is_blank (MIDORI_TAB (view)))
1384 {
1385 if (browser->trash)
1386 katze_array_add_item (browser->trash, item);
1387 midori_browser_update_history (item, "website", "leave");
1388 }
1389 midori_browser_disconnect_tab (browser, MIDORI_VIEW (view));
1390 g_signal_emit (browser, signals[REMOVE_TAB], 0, view);
1391 }
1392}
1393
1394static void
1404midori_view_attach_inspector_cb (GtkWidget* view,1395midori_view_attach_inspector_cb (GtkWidget* view,
1405 GtkWidget* inspector_view,1396 GtkWidget* inspector_view,
1406 MidoriBrowser* browser)1397 MidoriBrowser* browser)
@@ -1785,98 +1776,14 @@
1785gint1776gint
1786midori_browser_get_n_pages (MidoriBrowser* browser)1777midori_browser_get_n_pages (MidoriBrowser* browser)
1787{1778{
1788 #ifdef HAVE_GRANITE1779 return midori_notebook_get_count (MIDORI_NOTEBOOK (browser->notebook));
1789 return granite_widgets_dynamic_notebook_get_n_tabs (
1790 GRANITE_WIDGETS_DYNAMIC_NOTEBOOK (browser->notebook));
1791 #else
1792 return gtk_notebook_get_n_pages (GTK_NOTEBOOK (browser->notebook));
1793 #endif
1794}
1795
1796static void
1797midori_browser_disconnect_tab (MidoriBrowser* browser,
1798 MidoriView* view);
1799
1800static gboolean
1801midori_browser_tab_connected (MidoriBrowser* browser,
1802 MidoriView* view)
1803{
1804 return browser->proxy_array &&
1805 (katze_array_get_item_index (browser->proxy_array, midori_view_get_proxy_item (view)) != -1);
1806}1780}
18071781
1808static void1782static void
1809_midori_browser_remove_tab (MidoriBrowser* browser,1783_midori_browser_remove_tab (MidoriBrowser* browser,
1810 GtkWidget* widget)1784 GtkWidget* widget)
1811{1785{
1812 MidoriView* view = MIDORI_VIEW (widget);
1813#ifdef HAVE_GRANITE
1814 granite_widgets_dynamic_notebook_remove_tab (
1815 GRANITE_WIDGETS_DYNAMIC_NOTEBOOK (browser->notebook), midori_view_get_tab (view));
1816#else
1817 gtk_widget_destroy (widget);1786 gtk_widget_destroy (widget);
1818#endif
1819 if (midori_browser_tab_connected (browser, view))
1820 midori_browser_disconnect_tab (browser, view);
1821}
1822
1823#ifndef HAVE_GRANITE
1824static void
1825midori_browser_notebook_resize (MidoriBrowser* browser,
1826 GdkRectangle* allocation)
1827{
1828 gint new_size = 0;
1829 gint n = MAX (1, gtk_notebook_get_n_pages (GTK_NOTEBOOK (browser->notebook)));
1830 const gint max_size = 150;
1831 gint min_size;
1832 gint icon_size = 16;
1833 GtkAllocation notebook_size;
1834 GList* children;
1835
1836 if (allocation != NULL)
1837 notebook_size.width = allocation->width;
1838 else
1839 gtk_widget_get_allocation (browser->notebook, &notebook_size);
1840 new_size = notebook_size.width / n;
1841
1842 gtk_icon_size_lookup_for_settings (gtk_widget_get_settings (browser->notebook),
1843 GTK_ICON_SIZE_MENU, &icon_size, NULL);
1844 min_size = icon_size;
1845 if (katze_object_get_boolean (browser->settings, "close-buttons-on-tabs"))
1846 min_size += icon_size;
1847 if (new_size < min_size) new_size = min_size;
1848 if (new_size > max_size) new_size = max_size;
1849
1850 if (new_size > browser->last_tab_size - 3
1851 && new_size < browser->last_tab_size + 3)
1852 return;
1853 browser->last_tab_size = new_size;
1854
1855 children = gtk_container_get_children (GTK_CONTAINER (browser->notebook));
1856 for (; children; children = g_list_next (children))
1857 {
1858 GtkWidget* view = children->data;
1859 GtkWidget* label;
1860 label = gtk_notebook_get_tab_label (GTK_NOTEBOOK(browser->notebook), view);
1861 /* Don't resize empty bin, which is used for thumbnail tabs */
1862 if (GTK_IS_BIN (label) && gtk_bin_get_child (GTK_BIN (label))
1863 && !katze_object_get_boolean (view, "minimized"))
1864 gtk_widget_set_size_request (label, new_size, -1);
1865 }
1866}
1867#endif
1868
1869static void
1870midori_browser_notebook_size_allocate_cb (GtkWidget* widget,
1871 GdkRectangle* allocation,
1872 MidoriBrowser* browser)
1873{
1874 #ifndef HAVE_GRANITE
1875 if (!gtk_notebook_get_show_tabs (GTK_NOTEBOOK (browser->notebook)))
1876 return;
1877
1878 midori_browser_notebook_resize (browser, allocation);
1879 #endif
1880}1787}
18811788
1882static void1789static void
@@ -1886,7 +1793,6 @@
1886 KatzeItem* item = midori_view_get_proxy_item (MIDORI_VIEW (view));1793 KatzeItem* item = midori_view_get_proxy_item (MIDORI_VIEW (view));
1887 katze_array_add_item (browser->proxy_array, item);1794 katze_array_add_item (browser->proxy_array, item);
18881795
1889 gtk_widget_set_can_focus (view, TRUE);
1890 g_object_connect (view,1796 g_object_connect (view,
1891 "signal::notify::icon",1797 "signal::notify::icon",
1892 midori_view_notify_icon_cb, browser,1798 midori_view_notify_icon_cb, browser,
@@ -1898,8 +1804,6 @@
1898 midori_view_notify_uri_cb, browser,1804 midori_view_notify_uri_cb, browser,
1899 "signal::notify::title",1805 "signal::notify::title",
1900 midori_view_notify_title_cb, browser,1806 midori_view_notify_title_cb, browser,
1901 "signal::notify::minimized",
1902 midori_view_notify_minimized_cb, browser,
1903 "signal::notify::zoom-level",1807 "signal::notify::zoom-level",
1904 midori_view_notify_zoom_level_cb, browser,1808 midori_view_notify_zoom_level_cb, browser,
1905 "signal::notify::statusbar-text",1809 "signal::notify::statusbar-text",
@@ -1920,30 +1824,12 @@
1920 midori_view_search_text_cb, browser,1824 midori_view_search_text_cb, browser,
1921 "signal::leave-notify-event",1825 "signal::leave-notify-event",
1922 midori_browser_tab_leave_notify_event_cb, browser,1826 midori_browser_tab_leave_notify_event_cb, browser,
1827 "signal::destroy",
1828 midori_view_destroy_cb, browser,
1923 NULL);1829 NULL);
1924}1830}
19251831
1926static void1832static void
1927midori_browser_add_tab_to_trash (MidoriBrowser* browser,
1928 MidoriView* view)
1929{
1930 if (browser->proxy_array)
1931 {
1932 KatzeItem* item = midori_view_get_proxy_item (view);
1933 if (katze_array_get_item_index (browser->proxy_array, item) != -1)
1934 {
1935 if (!midori_view_is_blank (view))
1936 {
1937 if (browser->trash)
1938 katze_array_add_item (browser->trash, item);
1939 midori_browser_update_history (item, "website", "leave");
1940 }
1941 }
1942 }
1943}
1944
1945
1946static void
1947midori_browser_disconnect_tab (MidoriBrowser* browser,1833midori_browser_disconnect_tab (MidoriBrowser* browser,
1948 MidoriView* view)1834 MidoriView* view)
1949{1835{
@@ -1974,8 +1860,6 @@
1974 "any_signal",1860 "any_signal",
1975 midori_view_notify_title_cb, browser,1861 midori_view_notify_title_cb, browser,
1976 "any_signal",1862 "any_signal",
1977 midori_view_notify_minimized_cb, browser,
1978 "any_signal",
1979 midori_view_notify_zoom_level_cb, browser,1863 midori_view_notify_zoom_level_cb, browser,
1980 "any_signal",1864 "any_signal",
1981 midori_view_notify_statusbar_text_cb, browser,1865 midori_view_notify_statusbar_text_cb, browser,
@@ -2002,11 +1886,7 @@
2002_midori_browser_add_tab (MidoriBrowser* browser,1886_midori_browser_add_tab (MidoriBrowser* browser,
2003 GtkWidget* view)1887 GtkWidget* view)
2004{1888{
2005 GtkWidget* notebook = browser->notebook;
2006 KatzeItem* item = midori_view_get_proxy_item (MIDORI_VIEW (view));1889 KatzeItem* item = midori_view_get_proxy_item (MIDORI_VIEW (view));
2007 #ifndef HAVE_GRANITE
2008 GtkWidget* tab_label;
2009 #endif
2010 guint n;1890 guint n;
20111891
2012 midori_browser_connect_tab (browser, view);1892 midori_browser_connect_tab (browser, view);
@@ -2018,24 +1898,10 @@
2018 katze_array_move_item (browser->proxy_array, item, n);1898 katze_array_move_item (browser->proxy_array, item, n);
2019 }1899 }
2020 else1900 else
2021 n = midori_browser_get_n_pages (browser);1901 n = -1;
2022 katze_item_set_meta_integer (item, "append", -1);1902 katze_item_set_meta_integer (item, "append", -1);
20231903
2024#ifdef HAVE_GRANITE1904 midori_notebook_insert (MIDORI_NOTEBOOK (browser->notebook), MIDORI_TAB (view), n);
2025 granite_widgets_dynamic_notebook_insert_tab (
2026 GRANITE_WIDGETS_DYNAMIC_NOTEBOOK (notebook),
2027 midori_view_get_tab (MIDORI_VIEW (view)), n);
2028#else
2029 tab_label = midori_view_get_proxy_tab_label (MIDORI_VIEW (view));
2030 /* Don't resize empty bin, which is used for thumbnail tabs */
2031 if (GTK_IS_BIN (tab_label) && gtk_bin_get_child (GTK_BIN (tab_label))
2032 && !katze_object_get_boolean (view, "minimized"))
2033 gtk_widget_set_size_request (tab_label, browser->last_tab_size, -1);
2034 gtk_notebook_insert_page (GTK_NOTEBOOK (notebook), view, tab_label, n);
2035 gtk_notebook_set_tab_reorderable (GTK_NOTEBOOK (notebook), view, TRUE);
2036 gtk_notebook_set_tab_detachable (GTK_NOTEBOOK (notebook), view, TRUE);
2037 midori_browser_notebook_size_allocate_cb (browser->notebook, NULL, browser);
2038#endif
20391905
2040 _midori_browser_update_actions (browser);1906 _midori_browser_update_actions (browser);
2041}1907}
@@ -3697,13 +3563,7 @@
3697 gtk_widget_hide (browser->bookmarkbar);3563 gtk_widget_hide (browser->bookmarkbar);
3698 gtk_widget_hide (browser->navigationbar);3564 gtk_widget_hide (browser->navigationbar);
3699 gtk_widget_hide (browser->statusbar);3565 gtk_widget_hide (browser->statusbar);
3700 #ifdef HAVE_GRANITE3566 midori_notebook_set_labels_visible (MIDORI_NOTEBOOK (browser->notebook), FALSE);
3701 granite_widgets_dynamic_notebook_set_show_tabs (
3702 GRANITE_WIDGETS_DYNAMIC_NOTEBOOK (browser->notebook), FALSE);
3703 #else
3704 gtk_notebook_set_show_tabs (GTK_NOTEBOOK (browser->notebook), FALSE);
3705 gtk_notebook_set_show_border (GTK_NOTEBOOK (browser->notebook), FALSE);
3706 #endif
37073567
3708 gtk_window_fullscreen (GTK_WINDOW (browser));3568 gtk_window_fullscreen (GTK_WINDOW (browser));
3709 }3569 }
@@ -4741,13 +4601,7 @@
4741 else4601 else
4742 g_assert_not_reached ();4602 g_assert_not_reached ();
47434603
4744 #ifdef HAVE_GRANITE4604 midori_notebook_move (MIDORI_NOTEBOOK (browser->notebook), MIDORI_TAB (widget), new_pos);
4745 granite_widgets_dynamic_notebook_set_tab_position (
4746 GRANITE_WIDGETS_DYNAMIC_NOTEBOOK (browser->notebook),
4747 midori_view_get_tab (MIDORI_VIEW (widget)), new_pos);
4748 #else
4749 gtk_notebook_reorder_child (GTK_NOTEBOOK (browser->notebook), widget, new_pos);
4750 #endif
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);
4752}4606}
47534607
@@ -4798,7 +4652,9 @@
4798_action_tab_duplicate_activate (GtkAction* action,4652_action_tab_duplicate_activate (GtkAction* action,
4799 MidoriBrowser* browser)4653 MidoriBrowser* browser)
4800{4654{
4801 GtkWidget* view = midori_browser_get_current_tab (browser);4655 GtkWidget* view = g_object_get_data (G_OBJECT (action), "tab");
4656 if (view == NULL)
4657 view = midori_browser_get_current_tab (browser);
4802 midori_view_duplicate (MIDORI_VIEW (view));4658 midori_view_duplicate (MIDORI_VIEW (view));
4803}4659}
48044660
@@ -5034,10 +4890,10 @@
5034}4890}
50354891
5036static void4892static void
5037midori_browser_switched_tab (MidoriBrowser* browser,4893midori_browser_switched_tab_cb (MidoriNotebook* notebook,
5038 GtkWidget* old_widget,4894 GtkWidget* old_widget,
5039 MidoriView* new_view,4895 MidoriView* new_view,
5040 gint new_page)4896 MidoriBrowser* browser)
5041{4897{
5042 GtkAction* action;4898 GtkAction* action;
5043 const gchar* text;4899 const gchar* text;
@@ -5051,13 +4907,8 @@
5051 g_strdup (text), g_free);4907 g_strdup (text), g_free);
5052 }4908 }
50534909
5054 if (new_view == NULL)
5055 {
5056 g_signal_emit (browser, signals[SWITCH_TAB], 0, old_widget, new_view);
5057 return;
5058 }
5059
5060 g_return_if_fail (MIDORI_IS_VIEW (new_view));4910 g_return_if_fail (MIDORI_IS_VIEW (new_view));
4911 g_return_if_fail (new_view != MIDORI_VIEW (old_widget));
50614912
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");
5063 if (!uri)4914 if (!uri)
@@ -5068,9 +4919,10 @@
5068 if (midori_paths_get_runtime_mode () == MIDORI_RUNTIME_MODE_APP)4919 if (midori_paths_get_runtime_mode () == MIDORI_RUNTIME_MODE_APP)
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));
50704921
5071 if (browser->proxy_array)4922 g_object_freeze_notify (G_OBJECT (browser));
5072 katze_item_set_meta_integer (KATZE_ITEM (browser->proxy_array), "current", new_page);4923 g_object_notify (G_OBJECT (browser), "uri");
5073 g_object_notify (G_OBJECT (browser), "tab");4924 g_object_notify (G_OBJECT (browser), "tab");
4925 g_object_thaw_notify (G_OBJECT (browser));
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);
50754927
5076 _midori_browser_set_statusbar_text (browser, new_view, NULL);4928 _midori_browser_set_statusbar_text (browser, new_view, NULL);
@@ -5079,17 +4931,17 @@
5079}4931}
50804932
5081static void4933static void
5082midori_browser_notebook_page_reordered_cb (GtkWidget* notebook,4934midori_browser_tab_moved_cb (GtkWidget* notebook,
5083 MidoriView* view,4935 MidoriView* view,
5084 guint page_num,4936 guint page_num,
5085 MidoriBrowser* browser)4937 MidoriBrowser* browser)
5086{4938{
5087 KatzeItem* item = midori_view_get_proxy_item (view);4939 KatzeItem* item = midori_view_get_proxy_item (view);
5088 katze_array_move_item (browser->proxy_array, item, page_num);4940 katze_array_move_item (browser->proxy_array, item, page_num);
5089 g_object_notify (G_OBJECT (browser), "tab");4941 g_object_notify (G_OBJECT (browser), "tab");
5090}4942}
50914943
5092static GtkWidget*4944static void
5093midori_browser_notebook_create_window_cb (GtkWidget* notebook,4945midori_browser_notebook_create_window_cb (GtkWidget* notebook,
5094 GtkWidget* view,4946 GtkWidget* view,
5095 gint x,4947 gint x,
@@ -5100,216 +4952,53 @@
5100 g_signal_emit (browser, signals[NEW_WINDOW], 0, NULL, &new_browser);4952 g_signal_emit (browser, signals[NEW_WINDOW], 0, NULL, &new_browser);
5101 if (new_browser)4953 if (new_browser)
5102 {4954 {
5103 GtkWidget* new_notebook = new_browser->notebook;
5104 gtk_window_move (GTK_WINDOW (new_browser), x, y);4955 gtk_window_move (GTK_WINDOW (new_browser), x, y);
5105 return new_notebook;4956 g_object_ref (view);
5106 }4957 midori_browser_disconnect_tab (browser, MIDORI_VIEW (view));
5107 else /* No MidoriApp, so this is app or private mode */4958 midori_notebook_remove (MIDORI_NOTEBOOK (browser->notebook), MIDORI_TAB (view));
5108 return NULL;4959 midori_browser_add_tab (new_browser, view);
5109}4960 g_object_unref (view);
51104961 }
5111#ifdef HAVE_GRANITE4962}
5112static void4963
5113midori_browser_notebook_tab_added_cb (GtkWidget* notebook,4964static void
5114 GraniteWidgetsTab* tab,4965midori_browser_notebook_new_tab_cb (GtkWidget* notebook,
5115 MidoriBrowser* browser)4966 MidoriBrowser* browser)
5116{4967{
5117 gint n = granite_widgets_dynamic_notebook_get_tab_position (4968 GtkWidget* view = midori_browser_add_uri (browser, "about:new");
5118 GRANITE_WIDGETS_DYNAMIC_NOTEBOOK (notebook), tab);4969 midori_browser_set_current_tab (browser, view);
5119 midori_browser_set_current_page (browser, n);4970}
5120 GtkWidget* view = midori_view_new_with_item (NULL, browser->settings);4971
5121 midori_view_set_tab (MIDORI_VIEW (view), tab);4972static void
5122 midori_browser_connect_tab (browser, view);4973midori_browser_notebook_context_menu_cb (MidoriNotebook* notebook,
5123 midori_view_set_uri (MIDORI_VIEW (view), "about:new");4974 MidoriContextAction* menu,
5124 /* FIXME: signal add-tab */4975 MidoriBrowser* browser)
5125 _midori_browser_update_actions (browser);4976{
5126 midori_browser_notebook_page_reordered_cb (GTK_WIDGET (notebook),4977 midori_context_action_add_action_group (menu, browser->action_group);
5127 MIDORI_VIEW (view), n, browser);4978 midori_context_action_add (menu, NULL);
5128}4979 midori_context_action_add_by_name (menu, "TabNew");
51294980 midori_context_action_add_by_name (menu, "UndoTabClose");
5130static gboolean4981}
5131midori_browser_notebook_tab_removed_cb (GtkWidget* notebook,4982
5132 GraniteWidgetsTab* tab,4983static void
5133 MidoriBrowser* browser)4984midori_browser_notebook_tab_context_menu_cb (MidoriNotebook* notebook,
5134{4985 MidoriTab* tab,
51354986 MidoriContextAction* menu,
5136 MidoriView* view = MIDORI_VIEW (granite_widgets_tab_get_page (tab));4987 MidoriBrowser* browser)
5137 if (midori_browser_tab_connected (browser, MIDORI_VIEW (view)))4988{
5138 midori_browser_disconnect_tab (browser, MIDORI_VIEW (view));4989 midori_context_action_add_action_group (menu, browser->action_group);
51394990 midori_context_action_add (menu, NULL);
5140 return TRUE;4991 midori_context_action_add_by_name (menu, "TabNew");
5141}4992 midori_context_action_add_by_name (menu, "UndoTabClose");
51424993 if (MIDORI_IS_VIEW (tab))
5143static void4994 {
5144midori_browser_move_tab_to_notebook (MidoriBrowser* browser,4995 GtkAction* action = gtk_action_new ("TabDuplicate", _("_Duplicate Current Tab"), NULL, NULL);
5145 GtkWidget* view,4996 g_object_set_data (G_OBJECT (action), "tab", tab);
5146 GraniteWidgetsTab* tab,4997 g_signal_connect (action, "activate",
5147 GtkWidget* new_notebook)4998 G_CALLBACK (_action_tab_duplicate_activate), browser);
5148{4999 midori_context_action_add (menu, action);
5149 GraniteWidgetsTab* new_tab = granite_widgets_tab_new ("", NULL, NULL);5000 }
5150 g_object_ref (view);5001}
5151 _midori_browser_remove_tab (browser, view);
5152 granite_widgets_dynamic_notebook_insert_tab (
5153 GRANITE_WIDGETS_DYNAMIC_NOTEBOOK (new_notebook), new_tab, 0);
5154 midori_view_set_tab (MIDORI_VIEW (view), new_tab);
5155 _midori_browser_update_actions (browser);
5156 midori_browser_connect_tab (midori_browser_get_for_widget (new_notebook), view);
5157 g_object_unref (view);
5158}
5159
5160static void
5161midori_browser_notebook_tab_switched_cb (GraniteWidgetsDynamicNotebook* notebook,
5162 GraniteWidgetsTab* old_tab,
5163 GraniteWidgetsTab* new_tab,
5164 MidoriBrowser* browser)
5165{
5166 gint new_pos = granite_widgets_dynamic_notebook_get_tab_position (notebook, new_tab);
5167
5168 midori_browser_switched_tab (browser,
5169 old_tab ? granite_widgets_tab_get_page (old_tab) : NULL,
5170 MIDORI_VIEW (granite_widgets_tab_get_page (new_tab)), new_pos);
5171}
5172
5173static void
5174midori_browser_notebook_tab_moved_cb (GtkWidget* notebook,
5175 GraniteWidgetsTab* tab,
5176 gint old_pos,
5177 gboolean new_window,
5178 gint x,
5179 gint y,
5180 MidoriBrowser* browser)
5181{
5182 GtkWidget* view = granite_widgets_tab_get_page (tab);
5183 if (new_window)
5184 {
5185 GtkWidget* notebook = midori_browser_notebook_create_window_cb (
5186 browser->notebook, view, x, y, browser);
5187 if (notebook != NULL)
5188 midori_browser_move_tab_to_notebook (browser, view, tab, notebook);
5189 }
5190 else
5191 {
5192 gint new_pos = granite_widgets_dynamic_notebook_get_tab_position (
5193 GRANITE_WIDGETS_DYNAMIC_NOTEBOOK (notebook), tab);
5194 midori_browser_notebook_page_reordered_cb (notebook,
5195 MIDORI_VIEW (view), new_pos, browser);
5196 }
5197}
5198
5199static void
5200midori_browser_notebook_tab_duplicated_cb (GtkWidget* notebook,
5201 GraniteWidgetsTab* tab,
5202 MidoriBrowser* browser)
5203{
5204 GtkWidget* view = granite_widgets_tab_get_page (tab);
5205 midori_view_duplicate (MIDORI_VIEW (view));
5206}
5207
5208#else
5209static void
5210midori_browser_notebook_page_added_cb (GtkNotebook* notebook,
5211 GtkWidget* child,
5212 guint page_num,
5213 MidoriBrowser* browser)
5214{
5215 if (!midori_browser_tab_connected (browser, MIDORI_VIEW (child)))
5216 midori_browser_connect_tab (browser, child);
5217 midori_browser_notebook_page_reordered_cb (GTK_WIDGET (notebook),
5218 MIDORI_VIEW (child), page_num, browser);
5219}
5220
5221static void
5222midori_browser_notebook_switch_page_cb (GtkWidget* notebook,
5223 gpointer page,
5224 guint page_num,
5225 MidoriBrowser* browser)
5226{
5227 midori_browser_switched_tab (browser,
5228 midori_browser_get_current_tab (browser),
5229 MIDORI_VIEW (midori_browser_get_nth_tab (browser, page_num)), page_num);
5230}
5231
5232static void
5233midori_browser_notebook_page_removed_cb (GtkWidget* notebook,
5234 GtkWidget* view,
5235 guint page_num,
5236 MidoriBrowser* browser)
5237{
5238 if (midori_browser_tab_connected (browser, MIDORI_VIEW (view)))
5239 midori_browser_disconnect_tab (browser, MIDORI_VIEW (view));
5240 midori_browser_notebook_size_allocate_cb (browser->notebook, NULL, browser);
5241}
5242
5243static gboolean
5244midori_browser_notebook_reorder_tab_cb (GtkNotebook* notebook,
5245 GtkDirectionType arg1,
5246 gboolean arg2,
5247 gpointer user_data)
5248{
5249 g_signal_stop_emission_by_name (notebook, "reorder-tab");
5250 return TRUE;
5251}
5252
5253static void
5254midori_browser_menu_item_switch_tab_cb (GtkWidget* menuitem,
5255 MidoriBrowser* browser)
5256{
5257 gint page = GPOINTER_TO_INT (g_object_get_data (G_OBJECT (menuitem), "index"));
5258 midori_browser_set_current_page (browser, page);
5259}
5260
5261static gboolean
5262midori_browser_notebook_button_press_event_after_cb (GtkNotebook* notebook,
5263 GdkEventButton* event,
5264 MidoriBrowser* browser)
5265{
5266#if !GTK_CHECK_VERSION(3,0,0) /* TODO */
5267 if (event->window != notebook->event_window)
5268 return FALSE;
5269#endif
5270
5271 /* FIXME: Handle double click only when it wasn't handled by GtkNotebook */
5272
5273 /* Open a new tab on double click or middle mouse click */
5274 if (/*(event->type == GDK_2BUTTON_PRESS && event->button == 1)
5275 || */(event->type == GDK_BUTTON_PRESS && MIDORI_EVENT_NEW_TAB (event)))
5276 {
5277 GtkWidget* view = midori_browser_add_uri (browser, "about:new");
5278 midori_browser_set_current_tab (browser, view);
5279
5280 return TRUE;
5281 }
5282 else if (event->type == GDK_BUTTON_PRESS && MIDORI_EVENT_CONTEXT_MENU (event))
5283 {
5284 MidoriContextAction* menu = midori_context_action_new ("NotebookContextMenu", NULL, NULL, NULL);
5285 midori_context_action_add_action_group (menu, browser->action_group);
5286 GList* tabs = midori_browser_get_tabs (browser);
5287 midori_context_action_add_by_name (menu, "TabNew");
5288 midori_context_action_add_by_name (menu, "UndoTabClose");
5289 midori_context_action_add (menu, NULL);
5290 gint i = 0;
5291 for (; tabs != NULL; tabs = g_list_next (tabs))
5292 {
5293 const gchar* title = midori_view_get_display_title (tabs->data);
5294 gchar* tab_option = g_strdup_printf ("Tab%u", i);
5295 GtkAction* action = gtk_action_new (tab_option, title, NULL, NULL);
5296 g_free (tab_option);
5297 gtk_action_set_gicon (GTK_ACTION (action), G_ICON (midori_view_get_icon (tabs->data)));
5298 g_object_set_data (G_OBJECT (action), "index", GINT_TO_POINTER (i));
5299 g_signal_connect (action, "activate",
5300 G_CALLBACK (midori_browser_menu_item_switch_tab_cb), browser);
5301 midori_context_action_add (menu, action);
5302 i++;
5303 }
5304 g_list_free (tabs);
5305 GtkMenu* context_menu = midori_context_action_create_menu (menu, NULL, FALSE);
5306 katze_widget_popup (GTK_WIDGET (notebook), context_menu, NULL,
5307 KATZE_MENU_POSITION_CURSOR);
5308 }
5309
5310 return FALSE;
5311}
5312#endif
53135002
5314static void5003static void
5315_action_undo_tab_close_activate (GtkAction* action,5004_action_undo_tab_close_activate (GtkAction* action,
@@ -5760,14 +5449,6 @@
57605449
5761 /* Destroy panel first, so panels don't need special care */5450 /* Destroy panel first, so panels don't need special care */
5762 gtk_widget_destroy (browser->panel);5451 gtk_widget_destroy (browser->panel);
5763 #ifndef HAVE_GRANITE
5764 g_signal_handlers_disconnect_by_func (browser->notebook,
5765 midori_browser_notebook_reorder_tab_cb,
5766 NULL);
5767 g_signal_handlers_disconnect_by_func (browser->notebook,
5768 midori_browser_notebook_size_allocate_cb,
5769 browser);
5770 #endif
5771 /* Destroy tabs second, so child widgets don't need special care */5452 /* Destroy tabs second, so child widgets don't need special care */
5772 gtk_container_foreach (GTK_CONTAINER (browser->notebook),5453 gtk_container_foreach (GTK_CONTAINER (browser->notebook),
5773 (GtkCallback) gtk_widget_destroy, NULL);5454 (GtkCallback) gtk_widget_destroy, NULL);
@@ -6288,10 +5969,17 @@
62885969
6289 menuitem = gtk_menu_item_new ();5970 menuitem = gtk_menu_item_new ();
6290 gtk_widget_show (menuitem);5971 gtk_widget_show (menuitem);
6291 browser->throbber = katze_throbber_new ();5972 browser->throbber = gtk_spinner_new ();
6292 gtk_widget_show (browser->throbber);5973 /* Wrap the spinner in an event box to retain its size when hidden */
6293 gtk_container_add (GTK_CONTAINER (menuitem), browser->throbber);5974 GtkWidget* throbber_box = gtk_event_box_new ();
6294 gtk_widget_set_sensitive (menuitem, FALSE);5975 gtk_event_box_set_visible_window (GTK_EVENT_BOX (throbber_box), FALSE);
5976 gint icon_size = 16;
5977 gtk_icon_size_lookup_for_settings (gtk_widget_get_settings (GTK_WIDGET (browser)),
5978 GTK_ICON_SIZE_MENU, &icon_size, NULL);
5979 gtk_widget_set_size_request (throbber_box, icon_size, icon_size);
5980 gtk_container_add (GTK_CONTAINER (throbber_box), browser->throbber);
5981 gtk_widget_show (throbber_box);
5982 gtk_container_add (GTK_CONTAINER (menuitem), throbber_box);
6295 #if GTK_CHECK_VERSION (3, 2, 0)5983 #if GTK_CHECK_VERSION (3, 2, 0)
6296 /* FIXME: Doesn't work */5984 /* FIXME: Doesn't work */
6297 gtk_widget_set_hexpand (menuitem, TRUE);5985 gtk_widget_set_hexpand (menuitem, TRUE);
@@ -6390,78 +6078,24 @@
6390 vpaned = gtk_vpaned_new ();6078 vpaned = gtk_vpaned_new ();
6391 gtk_paned_pack2 (GTK_PANED (hpaned), vpaned, TRUE, FALSE);6079 gtk_paned_pack2 (GTK_PANED (hpaned), vpaned, TRUE, FALSE);
6392 gtk_widget_show (vpaned);6080 gtk_widget_show (vpaned);
6393 #ifdef HAVE_GRANITE6081 browser->notebook = midori_notebook_new ();
6394 /* FIXME: granite: should return GtkWidget* like GTK+ */
6395 browser->notebook = (GtkWidget*)granite_widgets_dynamic_notebook_new ();
6396 granite_widgets_dynamic_notebook_set_allow_new_window (
6397 GRANITE_WIDGETS_DYNAMIC_NOTEBOOK (browser->notebook), TRUE);
6398 granite_widgets_dynamic_notebook_set_allow_duplication (
6399 GRANITE_WIDGETS_DYNAMIC_NOTEBOOK (browser->notebook), TRUE);
6400 /* FIXME: work-around a bug */
6401 gtk_widget_show_all (browser->notebook);
6402 granite_widgets_dynamic_notebook_set_group_name (
6403 GRANITE_WIDGETS_DYNAMIC_NOTEBOOK (browser->notebook), PACKAGE_NAME);
6404 #else
6405 browser->notebook = gtk_notebook_new ();
6406 gtk_notebook_set_scrollable (GTK_NOTEBOOK (browser->notebook), TRUE);
6407 #if GTK_CHECK_VERSION (3, 0, 0)
6408 gtk_notebook_set_group_name (GTK_NOTEBOOK (browser->notebook), PACKAGE_NAME);
6409 #else
6410 gtk_notebook_set_group_id (GTK_NOTEBOOK (browser->notebook), GPOINTER_TO_INT (PACKAGE_NAME));
6411 #endif
6412 #endif
64136082
6414 #if !GTK_CHECK_VERSION (3, 0, 0)
6415 {
6416 /* Remove the inner border between scrollbars and the window border */
6417 GtkRcStyle* rcstyle = gtk_rc_style_new ();
6418 rcstyle->xthickness = 0;
6419 gtk_widget_modify_style (browser->notebook, rcstyle);
6420 g_object_unref (rcstyle);
6421 }
6422 #endif
6423 gtk_paned_pack1 (GTK_PANED (vpaned), browser->notebook, FALSE, FALSE);6083 gtk_paned_pack1 (GTK_PANED (vpaned), browser->notebook, FALSE, FALSE);
6424 #ifdef HAVE_GRANITE
6425 /* FIXME menu items */
6426 g_signal_connect (browser->notebook, "tab-added",
6427 G_CALLBACK (midori_browser_notebook_tab_added_cb),
6428 browser);
6429 g_signal_connect (browser->notebook, "tab-removed",
6430 G_CALLBACK (midori_browser_notebook_tab_removed_cb),
6431 browser);
6432 g_signal_connect (browser->notebook, "tab-switched",6084 g_signal_connect (browser->notebook, "tab-switched",
6433 G_CALLBACK (midori_browser_notebook_tab_switched_cb),6085 G_CALLBACK (midori_browser_switched_tab_cb),
6434 browser);6086 browser);
6435 g_signal_connect (browser->notebook, "tab-moved",6087 g_signal_connect (browser->notebook, "tab-moved",
6436 G_CALLBACK (midori_browser_notebook_tab_moved_cb),6088 G_CALLBACK (midori_browser_tab_moved_cb),
6437 browser);6089 browser);
6438 g_signal_connect (browser->notebook, "tab-duplicated",6090 g_signal_connect (browser->notebook, "context-menu",
6439 G_CALLBACK (midori_browser_notebook_tab_duplicated_cb),6091 G_CALLBACK (midori_browser_notebook_context_menu_cb),
6440 browser);6092 browser);
6441 #else6093 g_signal_connect (browser->notebook, "tab-context-menu",
6442 g_signal_connect (browser->notebook, "switch-page",6094 G_CALLBACK (midori_browser_notebook_tab_context_menu_cb), browser);
6443 G_CALLBACK (midori_browser_notebook_switch_page_cb),6095 g_signal_connect (browser->notebook, "tab-detached",
6444 browser);
6445 g_signal_connect (browser->notebook, "page-reordered",
6446 G_CALLBACK (midori_browser_notebook_page_reordered_cb),
6447 browser);
6448 g_signal_connect (browser->notebook, "page-added",
6449 G_CALLBACK (midori_browser_notebook_page_added_cb),
6450 browser);
6451 g_signal_connect (browser->notebook, "page-removed",
6452 G_CALLBACK (midori_browser_notebook_page_removed_cb),
6453 browser);
6454 g_signal_connect (browser->notebook, "size-allocate",
6455 G_CALLBACK (midori_browser_notebook_size_allocate_cb),
6456 browser);
6457 g_signal_connect_after (browser->notebook, "button-press-event",
6458 G_CALLBACK (midori_browser_notebook_button_press_event_after_cb),
6459 browser);
6460 g_signal_connect (browser->notebook, "reorder-tab",
6461 G_CALLBACK (midori_browser_notebook_reorder_tab_cb), NULL);
6462 g_signal_connect (browser->notebook, "create-window",
6463 G_CALLBACK (midori_browser_notebook_create_window_cb), browser);6096 G_CALLBACK (midori_browser_notebook_create_window_cb), browser);
6464 #endif6097 g_signal_connect (browser->notebook, "new-tab",
6098 G_CALLBACK (midori_browser_notebook_new_tab_cb), browser);
6465 gtk_widget_show (browser->notebook);6099 gtk_widget_show (browser->notebook);
64666100
6467 /* Inspector container */6101 /* Inspector container */
@@ -6768,11 +6402,9 @@
6768 }6402 }
6769 else if (token_current != token_dontcare && token_last == token_dontcare)6403 else if (token_current != token_dontcare && token_last == token_dontcare)
6770 continue;6404 continue;
6771 #ifdef HAVE_GRANITE
6772 /* A "new tab" button is already part of the notebook */6405 /* A "new tab" button is already part of the notebook */
6773 else if (!strcmp (gtk_action_get_name (action), "TabNew"))6406 else if (!strcmp (gtk_action_get_name (action), "TabNew"))
6774 continue;6407 continue;
6775 #endif
6776 else6408 else
6777 toolitem = gtk_action_create_tool_item (action);6409 toolitem = gtk_action_create_tool_item (action);
67786410
@@ -6839,7 +6471,7 @@
6839 gboolean show_panel;6471 gboolean show_panel;
6840 MidoriToolbarStyle toolbar_style;6472 MidoriToolbarStyle toolbar_style;
6841 gchar* toolbar_items;6473 gchar* toolbar_items;
6842 gboolean close_buttons_on_tabs;6474 gboolean close_buttons_left, close_buttons_on_tabs;
68436475
6844 g_object_get (browser->settings,6476 g_object_get (browser->settings,
6845 "remember-last-window-size", &remember_last_window_size,6477 "remember-last-window-size", &remember_last_window_size,
@@ -6859,19 +6491,19 @@
6859 "show-statusbar", &browser->show_statusbar,6491 "show-statusbar", &browser->show_statusbar,
6860 "toolbar-style", &toolbar_style,6492 "toolbar-style", &toolbar_style,
6861 "toolbar-items", &toolbar_items,6493 "toolbar-items", &toolbar_items,
6494 "close-buttons-left", &close_buttons_left,
6862 "close-buttons-on-tabs", &close_buttons_on_tabs,6495 "close-buttons-on-tabs", &close_buttons_on_tabs,
6863 "maximum-history-age", &browser->maximum_history_age,6496 "maximum-history-age", &browser->maximum_history_age,
6864 NULL);6497 NULL);
68656498
6866 #ifdef HAVE_GRANITE6499 midori_notebook_set_close_buttons_visible (
6867 granite_widgets_dynamic_notebook_set_tabs_closable (6500 MIDORI_NOTEBOOK (browser->notebook), close_buttons_on_tabs);
6868 GRANITE_WIDGETS_DYNAMIC_NOTEBOOK (browser->notebook), close_buttons_on_tabs);6501 midori_notebook_set_close_buttons_left (
6869 #endif6502 MIDORI_NOTEBOOK (browser->notebook), close_buttons_left);
6870 midori_findbar_set_close_button_left (MIDORI_FINDBAR (browser->find),6503 midori_findbar_set_close_button_left (MIDORI_FINDBAR (browser->find),
6871 katze_object_get_boolean (browser->settings, "close-buttons-left"));6504 close_buttons_left);
6872 if (browser->dial != NULL)6505 if (browser->dial != NULL)
6873 midori_speed_dial_set_close_buttons_left (browser->dial,6506 midori_speed_dial_set_close_buttons_left (browser->dial, close_buttons_left);
6874 katze_object_get_boolean (browser->settings, "close-buttons-left"));
68756507
6876 midori_browser_set_inactivity_reset (browser, inactivity_reset);6508 midori_browser_set_inactivity_reset (browser, inactivity_reset);
68776509
@@ -6992,17 +6624,17 @@
6992 }6624 }
6993 else if (name == g_intern_string ("maximum-history-age"))6625 else if (name == g_intern_string ("maximum-history-age"))
6994 browser->maximum_history_age = g_value_get_int (&value);6626 browser->maximum_history_age = g_value_get_int (&value);
6995 #ifdef HAVE_GRANITE
6996 else if (name == g_intern_string ("close-buttons-on-tabs"))6627 else if (name == g_intern_string ("close-buttons-on-tabs"))
6997 granite_widgets_dynamic_notebook_set_tabs_closable (6628 midori_notebook_set_close_buttons_visible (
6998 GRANITE_WIDGETS_DYNAMIC_NOTEBOOK (browser->notebook), g_value_get_boolean (&value));6629 MIDORI_NOTEBOOK (browser->notebook), g_value_get_boolean (&value));
6999 #endif
7000 else if (name == g_intern_string ("close-buttons-left"))6630 else if (name == g_intern_string ("close-buttons-left"))
7001 {6631 {
7002 midori_findbar_set_close_button_left (MIDORI_FINDBAR (browser->find),6632 midori_findbar_set_close_button_left (MIDORI_FINDBAR (browser->find),
7003 g_value_get_boolean (&value));6633 g_value_get_boolean (&value));
7004 midori_speed_dial_set_close_buttons_left (browser->dial,6634 midori_speed_dial_set_close_buttons_left (browser->dial,
7005 katze_object_get_boolean (browser->settings, "close-buttons-left"));6635 g_value_get_boolean (&value));
6636 midori_notebook_set_close_buttons_left (
6637 MIDORI_NOTEBOOK (browser->notebook), g_value_get_boolean (&value));
7006 }6638 }
7007 else if (name == g_intern_string ("inactivity-reset"))6639 else if (name == g_intern_string ("inactivity-reset"))
7008 midori_browser_set_inactivity_reset (browser, g_value_get_uint (&value));6640 midori_browser_set_inactivity_reset (browser, g_value_get_uint (&value));
@@ -7325,7 +6957,7 @@
7325 g_value_set_object (value, browser->navigationbar);6957 g_value_set_object (value, browser->navigationbar);
7326 break;6958 break;
7327 case PROP_NOTEBOOK:6959 case PROP_NOTEBOOK:
7328 g_value_set_object (value, browser->notebook);6960 g_value_set_object (value, MIDORI_NOTEBOOK (browser->notebook)->notebook);
7329 break;6961 break;
7330 case PROP_PANEL:6962 case PROP_PANEL:
7331 g_value_set_object (value, browser->panel);6963 g_value_set_object (value, browser->panel);
@@ -7446,13 +7078,7 @@
7446 g_return_val_if_fail (MIDORI_IS_BROWSER (browser), -1);7078 g_return_val_if_fail (MIDORI_IS_BROWSER (browser), -1);
7447 g_return_val_if_fail (MIDORI_IS_VIEW (view), -1);7079 g_return_val_if_fail (MIDORI_IS_VIEW (view), -1);
74487080
7449#ifdef HAVE_GRANITE7081 return midori_notebook_get_tab_index (MIDORI_NOTEBOOK (browser->notebook), MIDORI_TAB (view));
7450 return granite_widgets_dynamic_notebook_get_tab_position (
7451 GRANITE_WIDGETS_DYNAMIC_NOTEBOOK (browser->notebook),
7452 midori_view_get_tab (MIDORI_VIEW (view)));
7453#else
7454 return gtk_notebook_page_num (GTK_NOTEBOOK (browser->notebook), view);
7455#endif
7456}7082}
74577083
74587084
@@ -7471,7 +7097,6 @@
7471 g_return_if_fail (MIDORI_IS_BROWSER (browser));7097 g_return_if_fail (MIDORI_IS_BROWSER (browser));
7472 g_return_if_fail (GTK_IS_WIDGET (view));7098 g_return_if_fail (GTK_IS_WIDGET (view));
74737099
7474 midori_browser_add_tab_to_trash (browser, MIDORI_VIEW (view));
7475 g_signal_emit (browser, signals[REMOVE_TAB], 0, view);7100 g_signal_emit (browser, signals[REMOVE_TAB], 0, view);
7476}7101}
74777102
@@ -7697,22 +7322,7 @@
7697 view = midori_browser_get_nth_tab (browser, n);7322 view = midori_browser_get_nth_tab (browser, n);
7698 g_return_if_fail (view != NULL);7323 g_return_if_fail (view != NULL);
76997324
7700 #ifdef HAVE_GRANITE7325 midori_browser_set_tab (browser, view);
7701 granite_widgets_dynamic_notebook_set_current (
7702 GRANITE_WIDGETS_DYNAMIC_NOTEBOOK (browser->notebook),
7703 midori_view_get_tab (MIDORI_VIEW (view)));
7704 #else
7705 gtk_notebook_set_current_page (GTK_NOTEBOOK (browser->notebook), n);
7706 #endif
7707 if (midori_view_is_blank (MIDORI_VIEW (view)))
7708 midori_browser_activate_action (browser, "Location");
7709 else
7710 gtk_widget_grab_focus (view);
7711
7712 g_object_freeze_notify (G_OBJECT (browser));
7713 g_object_notify (G_OBJECT (browser), "uri");
7714 g_object_notify (G_OBJECT (browser), "tab");
7715 g_object_thaw_notify (G_OBJECT (browser));
7716}7326}
77177327
7718/**7328/**
@@ -7730,14 +7340,7 @@
7730{7340{
7731 g_return_val_if_fail (MIDORI_IS_BROWSER (browser), -1);7341 g_return_val_if_fail (MIDORI_IS_BROWSER (browser), -1);
77327342
7733 #ifdef HAVE_GRANITE7343 return midori_notebook_get_index (MIDORI_NOTEBOOK (browser->notebook));
7734 GraniteWidgetsTab* tab = granite_widgets_dynamic_notebook_get_current (
7735 GRANITE_WIDGETS_DYNAMIC_NOTEBOOK (browser->notebook));
7736 return tab ? granite_widgets_dynamic_notebook_get_tab_position (
7737 GRANITE_WIDGETS_DYNAMIC_NOTEBOOK (browser->notebook), tab) : -1;
7738 #else
7739 return gtk_notebook_get_current_page (GTK_NOTEBOOK (browser->notebook));
7740 #endif
7741}7344}
77427345
7743/**7346/**
@@ -7783,19 +7386,9 @@
7783midori_browser_get_nth_tab (MidoriBrowser* browser,7386midori_browser_get_nth_tab (MidoriBrowser* browser,
7784 gint page)7387 gint page)
7785{7388{
7786#ifdef HAVE_GRANITE7389 g_return_val_if_fail (MIDORI_IS_BROWSER (browser), NULL);
7787 GraniteWidgetsTab* tab;7390
77887391 return (GtkWidget*)midori_notebook_get_nth_tab (MIDORI_NOTEBOOK (browser->notebook), page);
7789 g_return_val_if_fail (MIDORI_IS_BROWSER (browser), NULL);
7790
7791 tab = granite_widgets_dynamic_notebook_get_tab_by_index (
7792 GRANITE_WIDGETS_DYNAMIC_NOTEBOOK (browser->notebook), page);
7793 return tab != NULL ? granite_widgets_tab_get_page (tab) : NULL;
7794#else
7795 g_return_val_if_fail (MIDORI_IS_BROWSER (browser), NULL);
7796
7797 return gtk_notebook_get_nth_page (GTK_NOTEBOOK (browser->notebook), page);
7798#endif
7799}7392}
78007393
7801/**7394/**
@@ -7813,13 +7406,19 @@
7813midori_browser_set_current_tab (MidoriBrowser* browser,7406midori_browser_set_current_tab (MidoriBrowser* browser,
7814 GtkWidget* view)7407 GtkWidget* view)
7815{7408{
7816 gint n;
7817
7818 g_return_if_fail (MIDORI_IS_BROWSER (browser));7409 g_return_if_fail (MIDORI_IS_BROWSER (browser));
7819 g_return_if_fail (GTK_IS_WIDGET (view));7410 g_return_if_fail (GTK_IS_WIDGET (view));
78207411
7821 n = midori_browser_page_num (browser, view);7412 midori_notebook_set_tab (MIDORI_NOTEBOOK (browser->notebook), MIDORI_TAB (view));
7822 midori_browser_set_current_page (browser, n);7413 if (midori_tab_is_blank (MIDORI_TAB (view)))
7414 midori_browser_activate_action (browser, "Location");
7415 else
7416 gtk_widget_grab_focus (view);
7417
7418 g_object_freeze_notify (G_OBJECT (browser));
7419 g_object_notify (G_OBJECT (browser), "uri");
7420 g_object_notify (G_OBJECT (browser), "tab");
7421 g_object_thaw_notify (G_OBJECT (browser));
7823}7422}
78247423
7825/**7424/**
@@ -7839,22 +7438,9 @@
7839GtkWidget*7438GtkWidget*
7840midori_browser_get_current_tab (MidoriBrowser* browser)7439midori_browser_get_current_tab (MidoriBrowser* browser)
7841{7440{
7842 #if 0 // def HAVE_GRANITE
7843 GraniteWidgetsTab* tab;
7844 #else
7845 gint n;
7846 #endif
7847
7848 g_return_val_if_fail (MIDORI_IS_BROWSER (browser), NULL);7441 g_return_val_if_fail (MIDORI_IS_BROWSER (browser), NULL);
78497442
7850 #if 0 // FIXME: not reliable def HAVE_GRANITE7443 return (GtkWidget*)midori_notebook_get_tab (MIDORI_NOTEBOOK (browser->notebook));
7851 tab = granite_widgets_dynamic_notebook_get_current (
7852 GRANITE_WIDGETS_DYNAMIC_NOTEBOOK (browser->notebook));
7853 return tab ? granite_widgets_tab_get_page (tab) : NULL;
7854 #else
7855 n = midori_browser_get_current_page (browser);
7856 return (n >= 0) ? midori_browser_get_nth_tab (browser, n) : NULL;
7857 #endif
7858}7444}
78597445
7860/**7446/**
@@ -7872,12 +7458,7 @@
7872{7458{
7873 g_return_val_if_fail (MIDORI_IS_BROWSER (browser), NULL);7459 g_return_val_if_fail (MIDORI_IS_BROWSER (browser), NULL);
78747460
7875 #ifdef HAVE_GRANITE
7876 /* FIXME: granite doesn't correctly implemented gtk.container */
7877 return granite_widgets_dynamic_notebook_get_children (GRANITE_WIDGETS_DYNAMIC_NOTEBOOK (browser->notebook));
7878 #else
7879 return gtk_container_get_children (GTK_CONTAINER (browser->notebook));7461 return gtk_container_get_children (GTK_CONTAINER (browser->notebook));
7880 #endif
7881}7462}
78827463
7883/**7464/**
78847465
=== added file 'midori/midori-notebook.vala'
--- midori/midori-notebook.vala 1970-01-01 00:00:00 +0000
+++ midori/midori-notebook.vala 2013-12-05 00:25:31 +0000
@@ -0,0 +1,526 @@
1/*
2 Copyright (C) 2013 Christian Dywan <christian@twotoasts.de>
3
4 This library is free software; you can redistribute it and/or
5 modify it under the terms of the GNU Lesser General Public
6 License as published by the Free Software Foundation; either
7 version 2.1 of the License, or (at your option) any later version.
8
9 See the file COPYING for the full license text.
10*/
11
12namespace Midori {
13 protected class Tally : Gtk.EventBox {
14 public Midori.Tab tab { get; set; }
15 Gtk.Spinner spinner;
16 public Gtk.Label label;
17 Gtk.HBox box;
18 public Gtk.Image icon;
19 Gtk.Alignment align;
20 Gtk.Button close;
21
22 public bool close_button_left { get; set; default = false; }
23 public bool close_button_visible { get; set; default = false; }
24
25 protected Tally (Midori.Tab tab) {
26 this.tab = tab;
27 box = new Gtk.HBox (false, 1);
28 add (box);
29
30 spinner = new Gtk.Spinner ();
31 spinner.active = true;
32 /* Ensure the spinner is the size of the icon */
33 int icon_size = 16;
34 Gtk.icon_size_lookup_for_settings (get_settings (),
35 Gtk.IconSize.MENU, out icon_size, null);
36 spinner.set_size_request (icon_size, icon_size);
37 box.pack_start (spinner, false, false, 0);
38 label = new Gtk.Label (null);
39 label.set_alignment (0.0f, 0.5f);
40 label.set_padding (0, 0);
41 box.pack_start (label, true, true, 0);
42 close = new Gtk.Button ();
43 close.relief = Gtk.ReliefStyle.NONE;
44 close.focus_on_click = false;
45#if !HAVE_GTK3
46 close.name = "midori-close-button";
47 close.style_set.connect (close_style_set);
48#endif
49 icon = new Gtk.Image.from_gicon (new ThemedIcon.with_default_fallbacks ("window-close-symbolic"), Gtk.IconSize.MENU);
50 close.add (icon);
51 align = new Gtk.Alignment (1.0f, 0.5f, 0.0f, 0.0f);
52 align.add (close);
53 box.pack_start (align, false, false, 0);
54 close.clicked.connect (close_clicked);
55 icon = new Gtk.Image.from_gicon (new ThemedIcon.with_default_fallbacks ("text-html-symbolic"), Gtk.IconSize.MENU);
56 box.pack_start (icon, false, false, 0);
57 box.show_all ();
58
59 tab.notify["uri"].connect (uri_changed);
60 tab.notify["title"].connect (title_changed);
61 tab.notify["icon"].connect (icon_changed);
62 tab.notify["minimized"].connect (minimized_changed);
63 tab.notify["progress"].connect (progress_changed);
64 tab.colors_changed.connect (colors_changed);
65 update_label ();
66 label.visible = !tab.minimized;
67 spinner.visible = tab.progress > 0.0;
68 icon.visible = !spinner.visible;
69 update_color ();
70
71 notify["close-button-left"].connect (close_button_left_changed);
72 notify_property ("close-button-left");
73 notify["close-button-visible"].connect (close_button_visible_changed);
74 notify_property ("close-button-visible");
75
76 Gtk.drag_dest_set (this, Gtk.DestDefaults.ALL, (Gtk.TargetEntry[])null, Gdk.DragAction.COPY);
77 Gtk.drag_dest_add_text_targets (this);
78 Gtk.drag_dest_add_uri_targets (this);
79 drag_data_received.connect (uri_dragged);
80 }
81
82#if !HAVE_GTK3
83 void close_style_set (Gtk.Style? previous_style) {
84 Gtk.Requisition size;
85 close.child.size_request (out size);
86 close.set_size_request (size.width, size.height);
87 }
88#endif
89
90 void close_clicked () {
91 tab.destroy ();
92 }
93
94 void uri_changed (GLib.ParamSpec pspec) {
95 label.label = tab.uri;
96 }
97
98 void title_changed (GLib.ParamSpec pspec) {
99 update_label ();
100 }
101
102 void update_label () {
103 string? title;
104 tab.get ("title", out title);
105 label.label = Midori.Tab.get_display_title (title, tab.uri);
106 /* Use computed label below! */
107 label.ellipsize = Midori.Tab.get_display_ellipsize (label.label, tab.uri);
108 tooltip_text = label.label;
109 }
110
111 void icon_changed (GLib.ParamSpec pspec) {
112 Icon? icon;
113 tab.get ("icon", out icon);
114 this.icon.set_from_gicon (icon, Gtk.IconSize.MENU);
115 }
116
117 void colors_changed () {
118 update_color ();
119 }
120
121 void update_color () {
122 visible_window = tab.fg_color != null || tab.bg_color != null;
123 label.modify_fg (Gtk.StateType.NORMAL, tab.fg_color);
124 label.modify_fg (Gtk.StateType.ACTIVE, tab.fg_color);
125 modify_bg (Gtk.StateType.NORMAL, tab.bg_color);
126 modify_bg (Gtk.StateType.ACTIVE, tab.bg_color);
127 }
128
129 void close_button_left_changed (GLib.ParamSpec pspec) {
130 if (close_button_left) {
131 box.reorder_child (align, 0);
132 box.reorder_child (label, 1);
133 box.reorder_child (icon, 2);
134 box.reorder_child (spinner, 3);
135 } else {
136 box.reorder_child (spinner, 0);
137 box.reorder_child (icon, 1);
138 box.reorder_child (label, 2);
139 box.reorder_child (align, 3);
140 }
141 }
142
143 void close_button_visible_changed (GLib.ParamSpec pspec) {
144 align.visible = !tab.minimized && close_button_visible;
145 }
146
147 void minimized_changed (GLib.ParamSpec pspec) {
148 label.visible = !tab.minimized;
149 notify_property ("close-button-visible");
150 }
151
152 void progress_changed (GLib.ParamSpec pspec) {
153 spinner.visible = tab.progress > 0.0;
154 icon.visible = !spinner.visible;
155 }
156
157 void uri_dragged (Gdk.DragContext context, int x, int y, Gtk.SelectionData data, uint ttype, uint timestamp) {
158 /* FIXME: Navigate to the URI
159 string[] uri = data.get_uris ();
160 if (uri != null)
161 tab.uri = uri[0];
162 else
163 tab.uri = data.get_text ();
164 */
165 }
166 }
167
168 public class Notebook : Gtk.EventBox {
169 public Gtk.Notebook notebook;
170 int last_tab_size = 0;
171
172#if !HAVE_GTK3
173 static const string style_fixup = """
174 style "midori-close-button-style"
175 {
176 GtkWidget::focus-padding = 0
177 GtkWidget::focus-line-width = 0
178 xthickness = 0
179 ythickness = 0
180 }
181 widget "*.midori-close-button" style "midori-close-button-style"
182 """;
183#endif
184
185 /* Since: 0.5.7 */
186 public uint count { get; private set; default = 0; }
187 /* Since: 0.5.7 */
188 public int index { get; set; default = -1; }
189 /* Since: 0.5.7 */
190 public Midori.Tab? tab { get; set; default = null; }
191 /* Since: 0.5.7 */
192 private Midori.Tab? previous { get; set; default = null; }
193
194 /* Since: 0.5.7 */
195 public bool close_buttons_left { get; set; default = true; }
196 /* Since: 0.5.7 */
197 public bool close_buttons_visible { get; set; default = true; }
198 /* Since: 0.5.7 */
199 public bool labels_visible { get; set; default = true; }
200
201 /* Since: 0.5.7 */
202 public signal void tab_context_menu (Midori.Tab tab, ContextAction menu);
203 /* Since: 0.5.7 */
204 public signal void context_menu (ContextAction menu);
205 /* The current tab is about to switch, but the old tab still has focus.
206 Since: 0.5.7 */
207 public signal void tab_switched (Midori.Tab? old, Midori.Tab @new);
208 /* A tab is about to move to a new position.
209 Since: 0.5.7 */
210 public signal void tab_moved (Midori.Tab tab, uint new_index);
211 /* A tab is being dragging out of the window.
212 Since: 0.5.7 */
213 public signal void tab_detached (Midori.Tab tab, int x, int y);
214 /* Since: 0.5.7 */
215 public signal void new_tab ();
216
217 [CCode (type = "GtkWidget*")]
218 public Notebook () {
219 visible_window = false;
220 notebook = new Gtk.Notebook ();
221 notebook.visible = notebook.scrollable = true;
222 notebook.show_border = false;
223 notebook.set ("group-name", PACKAGE_NAME);
224 add (notebook);
225
226#if !HAVE_GTK3
227 /* Remove the inner border between scrollbars and window border */
228 Gtk.RcStyle rcstyle = new Gtk.RcStyle ();
229 rcstyle.xthickness = 0;
230 notebook.modify_style (rcstyle);
231 Gtk.rc_parse_string (style_fixup);
232#endif
233 notify["index"].connect (index_changed);
234 notify["tab"].connect (tab_changed);
235 notify["labels-visible"].connect (labels_visible_changed);
236 notify["close-buttons-visible"].connect (close_buttons_visible_changed);
237 notify["close-buttons-left"].connect (close_buttons_left_changed);
238
239 notebook.size_allocate.connect (size_allocated);
240 notebook.switch_page.connect (page_switched);
241 notebook.page_reordered.connect (page_moved);
242 notebook.create_window.connect (window_created);
243
244 var add = new Gtk.Button ();
245 add.relief = Gtk.ReliefStyle.NONE;
246 add.add (new Gtk.Image.from_gicon (new ThemedIcon.with_default_fallbacks ("tab-new-symbolic"), Gtk.IconSize.MENU));
247 add.show_all ();
248 notebook.set_action_widget (add, Gtk.PackType.START);
249 add.clicked.connect (()=>{
250 new_tab ();
251 });
252
253 button_press_event.connect (button_pressed);
254 }
255
256 ~Notebook () {
257 notebook.size_allocate.disconnect (size_allocated);
258 notebook.switch_page.disconnect (page_switched);
259 notebook.page_reordered.disconnect (page_moved);
260 notebook.create_window.disconnect (window_created);
261 }
262
263 bool button_pressed (Gdk.EventButton event) {
264 /* Propagate events in logical label area */
265 foreach (var child in notebook.get_children ()) {
266 var tally = notebook.get_tab_label (tab) as Tally;
267 Gtk.Allocation size;
268 tally.get_allocation (out size);
269 if (tally.get_mapped ()
270 && event.x_root >= size.x
271 && event.x_root <= (size.x + size.width)) {
272 tally.button_press_event (event);
273 return true;
274 }
275 }
276
277 if (event.type == Gdk.EventType.2BUTTON_PRESS && event.button == 1
278 || event.button == 2) {
279 new_tab ();
280 return true;
281 }
282 else if (event.button == 3) {
283 var menu = new Midori.ContextAction ("NotebookContextMenu", null, null, null);
284 uint counter = 0;
285 foreach (var child in notebook.get_children ()) {
286 var tab = child as Midori.Tab;
287 var tally = notebook.get_tab_label (tab) as Tally;
288 var action = new Gtk.Action ("Tab%u".printf (counter), tally.label.label, null, null);
289 action.gicon = tally.icon.gicon;
290 action.activate.connect (()=>{
291 notebook.set_current_page (notebook.page_num (tab));
292 });
293 menu.add (action);
294 counter++;
295 }
296 context_menu (menu);
297 var popup = menu.create_menu (null, false);
298 popup.show ();
299 popup.attach_to_widget (this, null);
300 popup.popup (null, null, null, event.button, event.time);
301 return true;
302 }
303 return false;
304 }
305
306 public void insert (Midori.Tab tab, int index) {
307 var tally = new Tally (tab);
308 tally.close_button_left = close_buttons_left;
309 tally.close_button_visible = close_buttons_visible;
310 tally.button_press_event.connect (tab_button_pressed);
311 tally.show ();
312 tally.set_size_request (tab.minimized ? -1 : last_tab_size, -1);
313
314 /* Minimum requirements for any tab */
315 tab.can_focus = tab.visible = true;
316 notebook.insert_page (tab, tally, index);
317 notebook.set_tab_reorderable (tab, true);
318 notebook.set_tab_detachable (tab, true);
319 tab.destroy.connect (tab_removed);
320 tab.notify["minimized"].connect (tab_minimized);
321 count++;
322 tab.ref ();
323 relayout ();
324 }
325
326 void tab_removed () {
327 count--;
328 if (count > 0)
329 relayout ();
330 }
331
332 void relayout () {
333 Gtk.Allocation size;
334 notebook.get_allocation (out size);
335 resize (size.width);
336 }
337
338 bool tab_button_pressed (Gtk.Widget label, Gdk.EventButton event) {
339 Tally tally = label as Tally;
340 if (event.button == 1) {
341 /* Leave switching and dragging up to the notebook */
342 return false;
343 } else if (event.button == 2)
344 tally.tab.destroy ();
345 else if (event.button == 3) {
346 var menu = new Midori.ContextAction ("TabContextMenu", null, null, null);
347 tab_context_menu (tally.tab, menu);
348 var action_window = new Midori.ContextAction ("TabWindowNew", _("Open in New _Window"), null, "window-new");
349 action_window.activate.connect (()=>{
350 tab_detached (tally.tab, 128, 128);
351 });
352 menu.add (action_window);
353 var action_minimize = new Midori.ContextAction ("TabMinimize", tally.tab.minimized ? _("Show Tab _Label") : _("Show Tab _Icon Only"), null, null);
354 action_minimize.activate.connect (()=>{
355 tally.tab.minimized = !tally.tab.minimized;
356 });
357 menu.add (action_minimize);
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);
359 action_right.sensitive = count > 1;
360 action_right.activate.connect (()=>{
361 bool found_tab = false;
362 foreach (var child in notebook.get_children ()) {
363 if (found_tab)
364 child.destroy ();
365 else
366 found_tab = child == tally.tab;
367 }
368 });
369 menu.add (action_right);
370 var action_other = new Midori.ContextAction ("TabCloseOther", ngettext ("Close Ot_her Tab", "Close Ot_her Tabs", count - 1), null, null);
371 action_other.sensitive = count > 1;
372 action_other.activate.connect (()=>{
373 foreach (var child in notebook.get_children ())
374 if (child != tally.tab)
375 child.destroy ();
376 });
377 menu.add (action_other);
378 var action_close = new Midori.ContextAction ("TabClose", null, null, Gtk.STOCK_CLOSE);
379 action_close.activate.connect (()=>{
380 tally.tab.destroy ();
381 });
382 menu.add (action_close);
383 var popup = menu.create_menu (null, false);
384 popup.show ();
385 popup.attach_to_widget (this, null);
386 popup.popup (null, null, null, event.button, event.time);
387 }
388 return true;
389 }
390
391 public void move (Midori.Tab tab, int index) {
392 notebook.reorder_child (tab, index);
393 }
394
395 /* Chain up drawing manually to circumvent parent checks */
396#if HAVE_GTK3
397 public override bool draw (Cairo.Context cr) {
398 notebook.draw (cr);
399 return true;
400 }
401#else
402 public override bool expose_event (Gdk.EventExpose event) {
403 notebook.expose_event (event);
404 return true;
405 }
406#endif
407
408 public override void forall_internal (bool include_internal, Gtk.Callback callback) {
409 if (include_internal)
410 callback (notebook);
411 foreach (var child in notebook.get_children ())
412 callback (child);
413 }
414
415 /* Can't override Gtk.Container.remove because it checks the parent */
416 public new void remove (Midori.Tab tab) {
417 return_if_fail (notebook.get_children ().find (tab) != null);
418
419 notebook.remove (tab);
420 tab.destroy.disconnect (tab_removed);
421 tab.notify["minimized"].disconnect (tab_minimized);
422 tab_removed ();
423 tab.unref ();
424 }
425
426 void tab_minimized (GLib.ParamSpec pspec) {
427 var tally = notebook.get_tab_label (tab) as Tally;
428 tally.set_size_request (tab.minimized ? -1 : last_tab_size, -1);
429 }
430
431 public Midori.Tab get_nth_tab (int index) {
432 return notebook.get_nth_page (index) as Midori.Tab;
433 }
434
435 public int get_tab_index (Midori.Tab tab) {
436 return notebook.page_num (tab);
437 }
438
439 void index_changed (GLib.ParamSpec pspec) {
440 notebook.set_current_page (index);
441 }
442
443 void tab_changed (GLib.ParamSpec pspec) {
444 notebook.set_current_page (notebook.page_num (tab));
445 }
446
447 void labels_visible_changed (GLib.ParamSpec pspec) {
448 notebook.show_tabs = labels_visible;
449 }
450
451 void close_buttons_visible_changed (GLib.ParamSpec pspec) {
452 foreach (var child in notebook.get_children ()) {
453 var tally = notebook.get_tab_label (child) as Tally;
454 tally.close_button_visible = close_buttons_visible;
455 }
456 }
457
458 void close_buttons_left_changed (GLib.ParamSpec pspec) {
459 foreach (var child in notebook.get_children ()) {
460 var tally = notebook.get_tab_label (child) as Tally;
461 tally.close_button_left = close_buttons_left;
462 }
463 }
464
465#if HAVE_GTK3
466 void size_allocated (Gtk.Allocation allocation) {
467#else
468 void size_allocated (Gdk.Rectangle allocation) {
469#endif
470 if (labels_visible && count > 0)
471 resize (allocation.width);
472 }
473
474#if HAVE_GTK3
475 void page_switched (Gtk.Widget new_tab, uint new_index) {
476#else
477 void page_switched (Gtk.NotebookPage new_tab, uint new_index) {
478#endif
479 tab_switched (previous, new_tab as Tab);
480 previous = (Midori.Tab)new_tab;
481
482 notify["index"].disconnect (index_changed);
483 notify["tab"].disconnect (tab_changed);
484 index = (int)new_index;
485 tab = (Midori.Tab)new_tab;
486 notify["index"].connect (index_changed);
487 notify["tab"].connect (tab_changed);
488 }
489
490 void page_moved (Gtk.Widget moving_tab, uint new_index) {
491 tab_moved (moving_tab as Midori.Tab, new_index);
492 /* Indices change, current tab is not in the same position */
493 notify["index"].disconnect (index_changed);
494 index = (int)get_tab_index (tab);
495 notify["index"].connect (index_changed);
496 }
497
498 unowned Gtk.Notebook window_created (Gtk.Widget tab, int x, int y) {
499 tab_detached (tab as Tab, x, y);
500 /* The API allows now, the cast is due to bindings not having ? */
501 return (Gtk.Notebook)null;
502 }
503
504 void resize (int new_size) {
505 int n = int.max (1, (int)count);
506 new_size /= n;
507 int icon_size = 16;
508 Gtk.icon_size_lookup_for_settings (get_settings (),
509 Gtk.IconSize.MENU, out icon_size, null);
510 int max_size = 150;
511 int min_size = icon_size;
512 if (close_buttons_visible)
513 min_size += icon_size;
514 new_size = new_size.clamp (min_size, max_size);
515 if ((new_size - last_tab_size).abs () < 3)
516 return;
517
518 last_tab_size = new_size;
519 foreach (var child in notebook.get_children ()) {
520 var tab = child as Midori.Tab;
521 var tally = notebook.get_tab_label (child) as Tally;
522 tally.set_size_request (tab.minimized ? -1 : last_tab_size, -1);
523 }
524 }
525 }
526}
0527
=== modified file 'midori/midori-preferences.c'
--- midori/midori-preferences.c 2013-11-25 23:12:58 +0000
+++ midori/midori-preferences.c 2013-12-05 00:25:31 +0000
@@ -482,11 +482,6 @@
482 button = katze_property_proxy (settings, "close-buttons-on-tabs", NULL);482 button = katze_property_proxy (settings, "close-buttons-on-tabs", NULL);
483 gtk_button_set_label (GTK_BUTTON (button), _("Close Buttons on Tabs"));483 gtk_button_set_label (GTK_BUTTON (button), _("Close Buttons on Tabs"));
484 INDENTED_ADD (button);484 INDENTED_ADD (button);
485 #ifndef HAVE_GRANITE
486 button = katze_property_proxy (settings, "always-show-tabbar", NULL);
487 gtk_button_set_label (GTK_BUTTON (button), _("Always Show Tabbar"));
488 SPANNED_ADD (button);
489 #endif
490 button = katze_property_proxy (settings, "open-tabs-next-to-current", NULL);485 button = katze_property_proxy (settings, "open-tabs-next-to-current", NULL);
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"));
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"));
493488
=== modified file 'midori/midori-settings.vala'
--- midori/midori-settings.vala 2013-08-04 14:27:34 +0000
+++ midori/midori-settings.vala 2013-12-05 00:25:31 +0000
@@ -153,6 +153,7 @@
153 public bool close_buttons_on_tabs { get; set; default = true; }153 public bool close_buttons_on_tabs { get; set; default = true; }
154 public bool open_tabs_in_the_background { get; set; default = true; }154 public bool open_tabs_in_the_background { get; set; default = true; }
155 public bool open_tabs_next_to_current { get; set; default = true; }155 public bool open_tabs_next_to_current { get; set; default = true; }
156 // [Deprecated (since = "0.5.7")]
156 public bool always_show_tabbar { get; set; default = true; }157 public bool always_show_tabbar { get; set; default = true; }
157158
158 public string homepage { get; set; default = "about:search"; }159 public string homepage { get; set; default = "about:search"; }
159160
=== modified file 'midori/midori-tab.vala'
--- midori/midori-tab.vala 2013-10-08 20:13:36 +0000
+++ midori/midori-tab.vala 2013-12-05 00:25:31 +0000
@@ -51,6 +51,9 @@
5151
52 /* Special is an error, blank or delayed page */52 /* Special is an error, blank or delayed page */
53 public bool special { get; protected set; default = false; }53 public bool special { get; protected set; default = false; }
54 /* Minimizing a tab indicates that only the icon should be shown.
55 Since: 0.1.8 */
56 public bool minimized { get; set; default = false; }
54 /* Since: 0.4.8 */57 /* Since: 0.4.8 */
55 public string mime_type { get; protected set; default = "text/plain"; }58 public string mime_type { get; protected set; default = "text/plain"; }
56 /* Since: 0.1.2 */59 /* Since: 0.1.2 */
@@ -58,8 +61,18 @@
58 public LoadStatus load_status { get; protected set; default = LoadStatus.FINISHED; }61 public LoadStatus load_status { get; protected set; default = LoadStatus.FINISHED; }
59 public string? statusbar_text { get; protected set; default = null; }62 public string? statusbar_text { get; protected set; default = null; }
60 /* Since: 0.5.0 */63 /* Since: 0.5.0 */
64
61 public Gdk.Color? fg_color { get; protected set; default = null; }65 public Gdk.Color? fg_color { get; protected set; default = null; }
62 public Gdk.Color? bg_color { get; protected set; default = null; }66 private Gdk.Color? bg_color_ = null;
67 public Gdk.Color? bg_color { get {
68 return bg_color_;
69 } protected set {
70 bg_color_ = value;
71 colors_changed ();
72 } }
73 /* After fg_color and bg_color have changed.
74 Since: 0.5.7 */
75 public signal void colors_changed ();
6376
64 /* Special pages don't convey progress */77 /* Special pages don't convey progress */
65 private double current_progress = 0.0;78 private double current_progress = 0.0;
6679
=== modified file 'midori/midori-view.c'
--- midori/midori-view.c 2013-11-22 18:03:14 +0000
+++ midori/midori-view.c 2013-12-05 00:25:31 +0000
@@ -109,21 +109,13 @@
109 KatzeArray* news_feeds;109 KatzeArray* news_feeds;
110110
111 gboolean open_tabs_in_the_background;111 gboolean open_tabs_in_the_background;
112 gboolean close_buttons_on_tabs;
113 MidoriNewPage open_new_pages_in;112 MidoriNewPage open_new_pages_in;
114 gint find_links;113 gint find_links;
115 gint alerts;114 gint alerts;
116115
116 GtkWidget* tab_label;
117 GtkWidget* menu_item;117 GtkWidget* menu_item;
118 PangoEllipsizeMode ellipsize;118 PangoEllipsizeMode ellipsize;
119 #ifdef HAVE_GRANITE
120 GraniteWidgetsTab* tab;
121 #else
122 GtkWidget* tab_label;
123 GtkWidget* tab_icon;
124 GtkWidget* tab_title;
125 GtkWidget* tab_close;
126 #endif
127 KatzeItem* item;119 KatzeItem* item;
128 gint scrollh, scrollv;120 gint scrollh, scrollv;
129 GtkWidget* scrolled_window;121 GtkWidget* scrolled_window;
@@ -355,26 +347,6 @@
355 GDK_TYPE_PIXBUF,347 GDK_TYPE_PIXBUF,
356 G_PARAM_READABLE | G_PARAM_STATIC_STRINGS));348 G_PARAM_READABLE | G_PARAM_STATIC_STRINGS));
357349
358 /**
359 * MidoriView:minimized:
360 *
361 * Whether the view is minimized or in normal state.
362 *
363 * Minimizing a view indicates that only the icon should
364 * be advertised rather than the full blown tab label and
365 * it might otherwise be presented specially.
366 *
367 * Since: 0.1.8
368 */
369 g_object_class_install_property (gobject_class,
370 PROP_MINIMIZED,
371 g_param_spec_boolean (
372 "minimized",
373 "Minimized",
374 "Whether the view is minimized or in normal state",
375 FALSE,
376 G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
377
378 g_object_class_install_property (gobject_class,350 g_object_class_install_property (gobject_class,
379 PROP_ZOOM_LEVEL,351 PROP_ZOOM_LEVEL,
380 g_param_spec_float (352 g_param_spec_float (
@@ -428,21 +400,6 @@
428 const gchar* uri = midori_tab_get_uri (MIDORI_TAB (view));400 const gchar* uri = midori_tab_get_uri (MIDORI_TAB (view));
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)));
430 view->ellipsize = midori_tab_get_display_ellipsize (view->title, uri);402 view->ellipsize = midori_tab_get_display_ellipsize (view->title, uri);
431
432 #ifdef HAVE_GRANITE
433 if (view->tab)
434 g_object_set (view->tab,
435 "label", view->title, "ellipsize-mode", view->ellipsize, NULL);
436 #else
437 if (view->tab_label)
438 {
439 gtk_label_set_text (GTK_LABEL (view->tab_title), view->title);
440 gtk_widget_set_tooltip_text (view->tab_icon, view->title);
441 gtk_widget_set_tooltip_text (view->tab_title, view->title);
442 if (gtk_label_get_angle (GTK_LABEL (view->tab_title)) == 0.0)
443 gtk_label_set_ellipsize (GTK_LABEL (view->tab_title), view->ellipsize);
444 }
445 #endif
446 if (view->menu_item)403 if (view->menu_item)
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 (
448 view->menu_item))), view->title);405 view->menu_item))), view->title);
@@ -463,20 +420,6 @@
463 katze_object_assign (view->icon, icon);420 katze_object_assign (view->icon, icon);
464 g_object_notify (G_OBJECT (view), "icon");421 g_object_notify (G_OBJECT (view), "icon");
465422
466 #ifdef HAVE_GRANITE
467 if (view->tab)
468 g_object_set (view->tab, "icon", icon, NULL);
469 #else
470 if (view->tab_icon)
471 {
472 if (icon_name && !strchr (icon_name, '/'))
473 katze_throbber_set_static_icon_name (KATZE_THROBBER (view->tab_icon),
474 icon_name);
475 else
476 katze_throbber_set_static_pixbuf (KATZE_THROBBER (view->tab_icon),
477 view->icon);
478 }
479 #endif
480 if (view->menu_item)423 if (view->menu_item)
481 {424 {
482 GtkWidget* image = katze_item_get_image (view->item, view->web_view);425 GtkWidget* image = katze_item_get_image (view->item, view->web_view);
@@ -543,19 +486,6 @@
543{486{
544 if (midori_tab_get_load_status (MIDORI_TAB (view)) != load_status)487 if (midori_tab_get_load_status (MIDORI_TAB (view)) != load_status)
545 midori_tab_set_load_status (MIDORI_TAB (view), load_status);488 midori_tab_set_load_status (MIDORI_TAB (view), load_status);
546
547 #ifdef HAVE_GRANITE
548 if (view->tab)
549 {
550 g_object_set (view->tab, "working",
551 midori_view_get_progress (view) > 0.0, NULL);
552 g_object_set (view->tab, "menu", midori_view_get_tab_menu (view), NULL);
553 }
554 #else
555 if (view->tab_icon)
556 katze_throbber_set_animated (KATZE_THROBBER (view->tab_icon),
557 midori_view_get_progress (view) > 0.0);
558 #endif
559}489}
560490
561#if defined (HAVE_LIBSOUP_2_29_91)491#if defined (HAVE_LIBSOUP_2_29_91)
@@ -3056,7 +2986,6 @@
3056 view->title = NULL;2986 view->title = NULL;
3057 view->icon = NULL;2987 view->icon = NULL;
3058 view->icon_uri = NULL;2988 view->icon_uri = NULL;
3059 view->minimized = FALSE;
3060 view->hit_test = NULL;2989 view->hit_test = NULL;
3061 view->link_uri = NULL;2990 view->link_uri = NULL;
3062 view->selected_text = NULL;2991 view->selected_text = NULL;
@@ -3129,16 +3058,6 @@
3129 view->minimized ? 1 : -1);3058 view->minimized ? 1 : -1);
3130 g_signal_handlers_unblock_by_func (view->item,3059 g_signal_handlers_unblock_by_func (view->item,
3131 midori_view_item_meta_data_changed, view);3060 midori_view_item_meta_data_changed, view);
3132 #ifdef HAVE_GRANITE
3133 if (view->tab)
3134 g_object_set (view->tab,
3135 "fixed", view->minimized,
3136 "label", midori_view_get_display_title (view),
3137 NULL);
3138 #else
3139 if (view->tab_label)
3140 sokoke_widget_set_visible (view->tab_title, !view->minimized);
3141 #endif
3142 break;3061 break;
3143 case PROP_ZOOM_LEVEL:3062 case PROP_ZOOM_LEVEL:
3144 midori_view_set_zoom_level (view, g_value_get_float (value));3063 midori_view_set_zoom_level (view, g_value_get_float (value));
@@ -3168,9 +3087,6 @@
3168 case PROP_ICON:3087 case PROP_ICON:
3169 g_value_set_object (value, view->icon);3088 g_value_set_object (value, view->icon);
3170 break;3089 break;
3171 case PROP_MINIMIZED:
3172 g_value_set_boolean (value, view->minimized);
3173 break;
3174 case PROP_ZOOM_LEVEL:3090 case PROP_ZOOM_LEVEL:
3175 g_value_set_float (value, midori_view_get_zoom_level (view));3091 g_value_set_float (value, midori_view_get_zoom_level (view));
3176 break;3092 break;
@@ -3217,7 +3133,6 @@
3217 g_object_get (view->settings,3133 g_object_get (view->settings,
3218 "zoom-level", &zoom_level,3134 "zoom-level", &zoom_level,
3219 "zoom-text-and-images", &zoom_text_and_images,3135 "zoom-text-and-images", &zoom_text_and_images,
3220 "close-buttons-on-tabs", &view->close_buttons_on_tabs,
3221 "open-new-pages-in", &view->open_new_pages_in,3136 "open-new-pages-in", &view->open_new_pages_in,
3222 "open-tabs-in-the-background", &view->open_tabs_in_the_background,3137 "open-tabs-in-the-background", &view->open_tabs_in_the_background,
3223 NULL);3138 NULL);
@@ -3279,8 +3194,8 @@
3279 if (item)3194 if (item)
3280 {3195 {
3281 katze_object_assign (view->item, katze_item_copy (item));3196 katze_object_assign (view->item, katze_item_copy (item));
3282 view->minimized = katze_item_get_meta_string (3197 midori_tab_set_minimized (MIDORI_TAB (view),
3283 view->item, "minimized") != NULL;3198 katze_item_get_meta_string (view->item, "minimized") != NULL);
3284 }3199 }
3285 gtk_widget_show ((GtkWidget*)view);3200 gtk_widget_show ((GtkWidget*)view);
3286 return (GtkWidget*)view;3201 return (GtkWidget*)view;
@@ -3308,14 +3223,6 @@
3308 g_value_get_boolean (&value));3223 g_value_get_boolean (&value));
3309 }3224 }
3310 #endif3225 #endif
3311 else if (name == g_intern_string ("close-buttons-on-tabs"))
3312 {
3313 view->close_buttons_on_tabs = g_value_get_boolean (&value);
3314 #ifndef HAVE_GRANITE
3315 sokoke_widget_set_visible (view->tab_close,
3316 view->close_buttons_on_tabs);
3317 #endif
3318 }
3319 else if (name == g_intern_string ("open-tabs-in-the-background"))3226 else if (name == g_intern_string ("open-tabs-in-the-background"))
3320 view->open_tabs_in_the_background = g_value_get_boolean (&value);3227 view->open_tabs_in_the_background = g_value_get_boolean (&value);
3321 else if (name == g_intern_string ("enable-javascript"))3228 else if (name == g_intern_string ("enable-javascript"))
@@ -4395,14 +4302,6 @@
4395 return view->menu_item;4302 return view->menu_item;
4396}4303}
43974304
4398static void
4399midori_view_tab_label_menu_duplicate_tab_cb (GtkAction* action,
4400 gpointer user_data)
4401{
4402 MidoriView* view = user_data;
4403 midori_view_duplicate (view);
4404}
4405
4406GtkWidget*4305GtkWidget*
4407midori_view_duplicate (MidoriView* view)4306midori_view_duplicate (MidoriView* view)
4408{4307{
@@ -4415,58 +4314,6 @@
4415 return new_view;4314 return new_view;
4416}4315}
44174316
4418static void
4419midori_view_tab_label_menu_close_tabs_right_cb (GtkAction* action,
4420 gpointer user_data)
4421{
4422 GtkWidget* view = user_data;
4423 MidoriBrowser* browser = midori_browser_get_for_widget (view);
4424 GList* tabs = midori_browser_get_tabs (browser);
4425 gboolean found_tab = FALSE;
4426 for (; tabs; tabs = g_list_next (tabs))
4427 {
4428 if (tabs->data == view)
4429 {
4430 found_tab = TRUE;
4431 continue;
4432 }
4433 if (found_tab)
4434 midori_browser_close_tab (browser, tabs->data);
4435 }
4436 g_list_free (tabs);
4437}
4438
4439static void
4440midori_view_tab_label_menu_close_other_tabs_cb (GtkAction* action,
4441 gpointer user_data)
4442{
4443 GtkWidget* view = user_data;
4444 MidoriBrowser* browser = midori_browser_get_for_widget (view);
4445 GList* tabs = midori_browser_get_tabs (browser);
4446 for (; tabs; tabs = g_list_next (tabs))
4447 {
4448 if (tabs->data != view)
4449 midori_browser_close_tab (browser, tabs->data);
4450 }
4451 g_list_free (tabs);
4452}
4453
4454static void
4455midori_view_tab_label_menu_minimize_tab_cb (GtkAction* action,
4456 gpointer user_data)
4457{
4458 MidoriView* view = user_data;
4459 g_object_set (view, "minimized", !view->minimized, NULL);
4460}
4461
4462static void
4463midori_view_tab_label_menu_close_cb (GtkAction* action,
4464 gpointer user_data)
4465{
4466 GtkWidget* view = user_data;
4467 midori_browser_close_tab (midori_browser_get_for_widget (view), view);
4468}
4469
4470/**4317/**
4471 * midori_view_get_tab_menu:4318 * midori_view_get_tab_menu:
4472 * @view: a #MidoriView4319 * @view: a #MidoriView
@@ -4477,242 +4324,14 @@
4477 * Return value: a #GtkMenu4324 * Return value: a #GtkMenu
4478 *4325 *
4479 * Since: 0.1.84326 * Since: 0.1.8
4327 * Deprecated: 0.5.7: Use MidoriNotebook API instead.
4480 **/4328 **/
4481GtkWidget*4329GtkWidget*
4482midori_view_get_tab_menu (MidoriView* view)4330midori_view_get_tab_menu (MidoriView* view)
4483{4331{
4484 g_return_val_if_fail (MIDORI_IS_VIEW (view), NULL);4332 g_return_val_if_fail (MIDORI_IS_VIEW (view), NULL);
44854333
4486 MidoriBrowser* browser = midori_browser_get_for_widget (GTK_WIDGET (view));4334 return gtk_menu_new ();
4487 g_return_val_if_fail (browser != NULL, NULL);
4488
4489 GtkActionGroup* actions = midori_browser_get_action_group (browser);
4490 MidoriContextAction* menu = midori_context_action_new ("TabContextMenu", NULL, NULL, NULL);
4491 midori_context_action_add_action_group (menu, actions);
4492 gint pages = midori_browser_get_n_pages (browser);
4493
4494 midori_context_action_add_by_name (menu, "TabNew");
4495 midori_context_action_add_by_name (menu, "UndoTabClose");
4496 midori_context_action_add (menu, NULL);
4497 midori_context_action_add_simple (menu, "TabWindowNew", _("Open in New _Window"), NULL, STOCK_WINDOW_NEW,
4498 midori_view_tab_label_menu_window_new_cb, view);
4499 midori_context_action_add_simple (menu, "TabDuplicate", _("_Duplicate Tab"), NULL, NULL,
4500 midori_view_tab_label_menu_duplicate_tab_cb, view);
4501 midori_context_action_add_simple (menu, "TabMinimize",
4502 view->minimized ? _("Show Tab _Label") : _("Show Tab _Icon Only"), NULL, NULL,
4503 midori_view_tab_label_menu_minimize_tab_cb, view);
4504 midori_context_action_add (menu, NULL);
4505 midori_context_action_add_simple (menu, "TabCloseRight", _("Close Tabs to the R_ight"), NULL, NULL,
4506 midori_view_tab_label_menu_close_tabs_right_cb, view);
4507 GtkAction* action = gtk_action_new ("TabCloseOther", g_dngettext (NULL, "Close Ot_her Tab", "Close Ot_her Tabs", pages - 1), NULL, NULL);
4508 g_signal_connect (action, "activate", G_CALLBACK (midori_view_tab_label_menu_close_other_tabs_cb), view);
4509 gtk_action_set_sensitive (action, pages > 1);
4510 midori_context_action_add (menu, action);
4511 midori_context_action_add_simple (menu, "TabClose", NULL, NULL, GTK_STOCK_CLOSE,
4512 midori_view_tab_label_menu_close_cb, view);
4513
4514 return GTK_WIDGET (midori_context_action_create_menu (menu, NULL, FALSE));
4515}
4516
4517#ifdef HAVE_GRANITE
4518GraniteWidgetsTab*
4519midori_view_get_tab (MidoriView* view)
4520{
4521 if (view->tab == NULL)
4522 {
4523 view->tab = granite_widgets_tab_new (
4524 midori_view_get_display_title (view), G_ICON (view->icon), GTK_WIDGET (view));
4525 g_object_set (view->tab, "fixed", view->minimized, NULL);
4526 }
4527 return view->tab;
4528}
4529
4530void
4531midori_view_set_tab (MidoriView* view,
4532 GraniteWidgetsTab* tab)
4533{
4534 g_return_if_fail (MIDORI_IS_VIEW (view));
4535
4536 view->tab = tab;
4537 g_object_set (tab,
4538 "label", midori_view_get_display_title (view),
4539 "icon", G_ICON (view->icon),
4540 "page", GTK_WIDGET (view),
4541 "fixed", view->minimized,
4542 NULL);
4543}
4544
4545GtkWidget*
4546midori_view_get_proxy_tab_label (MidoriView* view)
4547{
4548 g_return_val_if_fail (MIDORI_IS_VIEW (view), NULL);
4549
4550 GtkWidget* tab = GTK_WIDGET (midori_view_get_tab (view));
4551 return tab;
4552}
4553
4554#else
4555static gboolean
4556midori_view_tab_label_button_press_event (GtkWidget* tab_label,
4557 GdkEventButton* event,
4558 GtkWidget* widget)
4559{
4560 if (event->button == 2)
4561 {
4562 /* Close the widget on middle click */
4563 midori_browser_close_tab (midori_browser_get_for_widget (widget), widget);
4564 return TRUE;
4565 }
4566 else if (MIDORI_EVENT_CONTEXT_MENU (event))
4567 {
4568 /* Show a context menu on right click */
4569 GtkWidget* menu = midori_view_get_tab_menu (MIDORI_VIEW (widget));
4570
4571 katze_widget_popup (widget, GTK_MENU (menu),
4572 event, KATZE_MENU_POSITION_CURSOR);
4573 return TRUE;
4574 }
4575
4576 return FALSE;
4577}
4578
4579static void
4580midori_view_tab_close_clicked (GtkWidget* tab_close,
4581 GtkWidget* widget)
4582{
4583 midori_browser_close_tab (midori_browser_get_for_widget (widget), widget);
4584}
4585
4586#if !GTK_CHECK_VERSION (3, 0, 0)
4587static void
4588midori_view_tab_icon_style_set_cb (GtkWidget* tab_close,
4589 GtkStyle* previous_style)
4590{
4591 GtkRequisition size;
4592 gtk_widget_size_request (gtk_bin_get_child (GTK_BIN (tab_close)), &size);
4593 gtk_widget_set_size_request (tab_close, size.width, size.height);
4594}
4595#endif
4596
4597static void
4598midori_view_update_tab_title (MidoriView* view,
4599 gdouble angle)
4600{
4601 if (angle == 0.0)
4602 gtk_label_set_ellipsize (GTK_LABEL (view->tab_title), view->ellipsize);
4603 else
4604 gtk_label_set_ellipsize (GTK_LABEL (view->tab_title), PANGO_ELLIPSIZE_NONE);
4605 gtk_label_set_angle (GTK_LABEL (view->tab_title), angle);
4606}
4607
4608static void
4609gtk_box_repack (GtkBox* box,
4610 GtkWidget* child)
4611{
4612 GtkWidget* old_box;
4613 gboolean expand, fill;
4614 guint padding;
4615 GtkPackType pack_type;
4616
4617 old_box = gtk_widget_get_parent (child);
4618 g_return_if_fail (GTK_IS_BOX (old_box));
4619
4620 gtk_box_query_child_packing (GTK_BOX (old_box), child,
4621 &expand, &fill, &padding, &pack_type);
4622
4623 g_object_ref (child);
4624 gtk_container_remove (GTK_CONTAINER (old_box), child);
4625 if (pack_type == GTK_PACK_START)
4626 gtk_box_pack_start (box, child, expand, fill, padding);
4627 else
4628 gtk_box_pack_end (box, child, expand, fill, padding);
4629 g_object_unref (child);
4630}
4631
4632static void
4633midori_view_tab_label_parent_set (GtkWidget* tab_label,
4634#if GTK_CHECK_VERSION(3,0,0)
4635 GObject* old_parent,
4636#else
4637 GtkObject* old_parent,
4638#endif
4639 MidoriView* view)
4640{
4641 GtkWidget* parent;
4642
4643 /* FIXME: Disconnect orientation notification
4644 if (old_parent)
4645 ; */
4646
4647 if (!(parent = gtk_widget_get_parent (tab_label)))
4648 return;
4649
4650 if (GTK_IS_NOTEBOOK (parent))
4651 {
4652 GtkPositionType pos;
4653 gdouble old_angle, angle;
4654 GtkWidget* box;
4655
4656 pos = gtk_notebook_get_tab_pos (GTK_NOTEBOOK (parent));
4657 old_angle = gtk_label_get_angle (GTK_LABEL (view->tab_title));
4658 switch (pos)
4659 {
4660 case GTK_POS_LEFT:
4661 angle = 90.0;
4662 break;
4663 case GTK_POS_RIGHT:
4664 angle = 270.0;
4665 break;
4666 default:
4667 angle = 0.0;
4668 }
4669
4670 if (old_angle != angle)
4671 {
4672 GtkWidget* align;
4673
4674 if (angle == 0.0)
4675 box = gtk_hbox_new (FALSE, 1);
4676 else
4677 box = gtk_vbox_new (FALSE, 1);
4678 gtk_box_repack (GTK_BOX (box), view->tab_icon);
4679 gtk_box_repack (GTK_BOX (box), view->tab_title);
4680 align = gtk_widget_get_parent (view->tab_close);
4681 gtk_box_repack (GTK_BOX (box), align);
4682
4683 gtk_container_remove (GTK_CONTAINER (tab_label),
4684 gtk_bin_get_child (GTK_BIN (tab_label)));
4685 gtk_container_add (GTK_CONTAINER (tab_label), GTK_WIDGET (box));
4686 gtk_widget_show (box);
4687 }
4688
4689 midori_view_update_tab_title (view, angle);
4690
4691 /* FIXME: Connect orientation notification */
4692 }
4693}
4694
4695static void midori_view_tab_label_data_received (GtkWidget* widget,
4696 GdkDragContext* context,
4697 gint x,
4698 gint y,
4699 GtkSelectionData* data,
4700 guint ttype,
4701 guint timestamp,
4702 MidoriView* view)
4703{
4704 gchar** uri = gtk_selection_data_get_uris (data);
4705 if (uri != NULL)
4706 {
4707 midori_view_set_uri (view, uri[0]);
4708 g_strfreev (uri);
4709 }
4710 else
4711 {
4712 gchar* text = (gchar*) gtk_selection_data_get_text (data);
4713 midori_view_set_uri (view, text);
4714 g_free (text);
4715 }
4716}4335}
47174336
4718/**4337/**
@@ -4722,115 +4341,22 @@
4722 * Retrieves a proxy tab label that is typically used when4341 * Retrieves a proxy tab label that is typically used when
4723 * adding the view to a notebook.4342 * adding the view to a notebook.
4724 *4343 *
4725 * Note that the label actually adjusts its orientation
4726 * to the according tab position when used in a notebook.
4727 *
4728 * The label is created on the first call and will be updated to reflect
4729 * changes of the loading progress and title.
4730 *
4731 * The label is valid until it is removed from its container.
4732 *
4733 * Return value: the proxy #GtkEventBox4344 * Return value: the proxy #GtkEventBox
4345 *
4346 * Deprecated: 0.5.7: Don't use this label.
4734 **/4347 **/
4735GtkWidget*4348GtkWidget*
4736midori_view_get_proxy_tab_label (MidoriView* view)4349midori_view_get_proxy_tab_label (MidoriView* view)
4737{4350{
4738 GtkWidget* event_box;
4739 GtkWidget* hbox;
4740 #if !GTK_CHECK_VERSION (3, 0, 0)
4741 static const gchar style_fixup[] =
4742 "style \"midori-close-button-style\"\n"
4743 "{\n"
4744 "GtkWidget::focus-padding = 0\n"
4745 "GtkWidget::focus-line-width = 0\n"
4746 "xthickness = 0\n"
4747 "ythickness = 0\n"
4748 "}\n"
4749 "widget \"*.midori-close-button\" style \"midori-close-button-style\"";
4750 #endif
4751 GtkWidget* image;
4752 GtkWidget* align;
4753
4754 g_return_val_if_fail (MIDORI_IS_VIEW (view), NULL);4351 g_return_val_if_fail (MIDORI_IS_VIEW (view), NULL);
47554352
4756 if (!view->tab_label)4353 if (!view->tab_label)
4757 {4354 {
4758 view->tab_icon = katze_throbber_new ();4355 view->tab_label = gtk_label_new ("dummy");
4759 katze_throbber_set_static_pixbuf (KATZE_THROBBER (view->tab_icon),4356 gtk_widget_show (view->tab_label);
4760 midori_view_get_icon (view));
4761
4762 view->tab_title = gtk_label_new (midori_view_get_display_title (view));
4763 gtk_misc_set_alignment (GTK_MISC (view->tab_title), 0.0, 0.5);
4764 gtk_misc_set_padding (GTK_MISC (view->tab_title), 0, 0);
4765
4766 event_box = gtk_event_box_new ();
4767 gtk_event_box_set_visible_window (GTK_EVENT_BOX (event_box), FALSE);
4768 hbox = gtk_hbox_new (FALSE, 1);
4769 gtk_container_add (GTK_CONTAINER (event_box), GTK_WIDGET (hbox));
4770 midori_view_update_tab_title (view, 0.0);
4771
4772 view->tab_close = gtk_button_new ();
4773 gtk_button_set_relief (GTK_BUTTON (view->tab_close), GTK_RELIEF_NONE);
4774 gtk_button_set_focus_on_click (GTK_BUTTON (view->tab_close), FALSE);
4775 #if !GTK_CHECK_VERSION (3, 0, 0)
4776 gtk_rc_parse_string (style_fixup);
4777 gtk_widget_set_name (view->tab_close, "midori-close-button");
4778 g_signal_connect (view->tab_close, "style-set",
4779 G_CALLBACK (midori_view_tab_icon_style_set_cb), NULL);
4780 #endif
4781 image = gtk_image_new_from_stock (GTK_STOCK_CLOSE, GTK_ICON_SIZE_MENU);
4782 gtk_container_add (GTK_CONTAINER (view->tab_close), image);
4783 align = gtk_alignment_new (1.0, 0.5, 0.0, 0.0);
4784 gtk_container_add (GTK_CONTAINER (align), view->tab_close);
4785
4786 if (katze_object_get_boolean (view->settings, "close-buttons-left"))
4787 {
4788 gtk_box_pack_end (GTK_BOX (hbox), view->tab_icon, FALSE, FALSE, 0);
4789 gtk_box_pack_end (GTK_BOX (hbox), view->tab_title, TRUE, TRUE, 0);
4790 gtk_box_pack_start (GTK_BOX (hbox), align, FALSE, FALSE, 0);
4791 }
4792 else
4793 {
4794 gtk_box_pack_start (GTK_BOX (hbox), view->tab_icon, FALSE, FALSE, 0);
4795 gtk_box_pack_start (GTK_BOX (hbox), view->tab_title, TRUE, TRUE, 0);
4796 gtk_box_pack_end (GTK_BOX (hbox), align, FALSE, FALSE, 0);
4797 }
4798 gtk_widget_show_all (GTK_WIDGET (event_box));
4799
4800 if (view->minimized)
4801 gtk_widget_hide (view->tab_title);
4802 if (!view->close_buttons_on_tabs)
4803 gtk_widget_hide (view->tab_close);
4804
4805 g_signal_connect (event_box, "button-press-event",
4806 G_CALLBACK (midori_view_tab_label_button_press_event), view);
4807 g_signal_connect (view->tab_close, "button-press-event",
4808 G_CALLBACK (midori_view_tab_label_button_press_event), view);
4809 g_signal_connect (view->tab_close, "clicked",
4810 G_CALLBACK (midori_view_tab_close_clicked), view);
4811
4812 view->tab_label = event_box;
4813 g_signal_connect (view->tab_icon, "destroy",
4814 G_CALLBACK (gtk_widget_destroyed),
4815 &view->tab_icon);
4816 g_signal_connect (view->tab_label, "destroy",
4817 G_CALLBACK (gtk_widget_destroyed),
4818 &view->tab_label);
4819
4820 g_signal_connect (view->tab_label, "parent-set",
4821 G_CALLBACK (midori_view_tab_label_parent_set),
4822 view);
4823 gtk_drag_dest_set (view->tab_label, GTK_DEST_DEFAULT_ALL, NULL,
4824 0, GDK_ACTION_COPY);
4825 gtk_drag_dest_add_text_targets (view->tab_label);
4826 gtk_drag_dest_add_uri_targets (view->tab_label);
4827 g_signal_connect (view->tab_label, "drag-data-received",
4828 G_CALLBACK (midori_view_tab_label_data_received),
4829 view);
4830 }4357 }
4831 return view->tab_label;4358 return view->tab_label;
4832}4359}
4833#endif
48344360
4835/**4361/**
4836 * midori_view_get_label_ellipsize:4362 * midori_view_get_label_ellipsize:
@@ -5450,60 +4976,22 @@
5450 #endif4976 #endif
5451 return MIDORI_VIEW (view);4977 return MIDORI_VIEW (view);
5452}4978}
54534979/**
4980 * midori_view_set_colors:
4981 * @view: a #MidoriView
4982 * @fg_color: a #GdkColor, or %NULL
4983 * @bg_color: a #GdkColor, or %NULL
4984 *
4985 * Sets colors on the label.
4986 *
4987 * Deprecated: 0.5.7: Use fg_color/ bg_color on Midori.Tab.
4988 **/
5454void4989void
5455midori_view_set_colors (MidoriView* view,4990midori_view_set_colors (MidoriView* view,
5456 GdkColor* fg_color,4991 GdkColor* fg_color,
5457 GdkColor* bg_color)4992 GdkColor* bg_color)
5458{4993{
5459 /*
5460 The proxy tab label is what's put in the notebook,
5461 in all known cases a GtkEventBox
5462 Contained can be a GtkLabel or a GtkBox including a GtkLabel
5463 Granite as of this writing uses a GtkLabel (which may change)
5464 */
5465 GtkWidget* box = midori_view_get_proxy_tab_label (view);
5466 GtkWidget* event_box = box;
5467 if (GTK_IS_BOX (box))
5468 {
5469 GList* children = gtk_container_get_children (GTK_CONTAINER (box));
5470 for (; children != NULL; children = g_list_next (children))
5471 if (GTK_IS_EVENT_BOX (children->data))
5472 {
5473 event_box = children->data;
5474 break;
5475 }
5476 g_list_free (children);
5477 }
5478
5479 GtkWidget* label = gtk_bin_get_child (GTK_BIN (event_box));
5480 if (GTK_IS_BOX (label))
5481 {
5482 GList* children = gtk_container_get_children (GTK_CONTAINER (label));
5483 for (; children != NULL; children = g_list_next (children))
5484 if (GTK_IS_LABEL (children->data))
5485 {
5486 label = children->data;
5487 break;
5488 }
5489 g_list_free (children);
5490 }
5491
5492 midori_tab_set_fg_color (MIDORI_TAB (view), fg_color);4994 midori_tab_set_fg_color (MIDORI_TAB (view), fg_color);
5493 midori_tab_set_bg_color (MIDORI_TAB (view), bg_color);4995 midori_tab_set_bg_color (MIDORI_TAB (view), bg_color);
5494
5495 gtk_event_box_set_visible_window (GTK_EVENT_BOX (event_box),
5496 fg_color != NULL || bg_color != NULL);
5497
5498 gtk_widget_modify_fg (label, GTK_STATE_NORMAL, fg_color);
5499 gtk_widget_modify_fg (label, GTK_STATE_ACTIVE, fg_color);
5500
5501 #if GTK_CHECK_VERSION (3, 0, 0)
5502 gtk_widget_modify_bg (event_box, GTK_STATE_NORMAL, bg_color);
5503 gtk_widget_modify_bg (event_box, GTK_STATE_ACTIVE, bg_color);
5504 #else
5505 gtk_widget_modify_bg (box, GTK_STATE_NORMAL, bg_color);
5506 gtk_widget_modify_bg (box, GTK_STATE_ACTIVE, bg_color);
5507 #endif
5508}4996}
55094997
55104998
=== modified file 'midori/midori.vapi'
--- midori/midori.vapi 2013-11-19 19:30:54 +0000
+++ midori/midori.vapi 2013-12-05 00:25:31 +0000
@@ -197,7 +197,6 @@
197197
198 public string title { get; }198 public string title { get; }
199 public Gdk.Pixbuf icon { get; }199 public Gdk.Pixbuf icon { get; }
200 public bool minimized { get; }
201 public float zoom_level { get; }200 public float zoom_level { get; }
202 public Katze.Array news_feeds { get; }201 public Katze.Array news_feeds { get; }
203 [NoAccessorMethod]202 [NoAccessorMethod]
204203
=== modified file 'po/POTFILES.in'
--- po/POTFILES.in 2013-10-09 09:15:33 +0000
+++ po/POTFILES.in 2013-12-05 00:25:31 +0000
@@ -14,6 +14,7 @@
14midori/midori-settings.vala14midori/midori-settings.vala
15midori/midori-websettings.c15midori/midori-websettings.c
16midori/midori-tab.vala16midori/midori-tab.vala
17midori/midori-notebook.vala
17midori/midori-view.c18midori/midori-view.c
18midori/midori-download.vala19midori/midori-download.vala
19midori/midori-speeddial.vala20midori/midori-speeddial.vala
@@ -28,7 +29,6 @@
28panels/midori-extensions.c29panels/midori-extensions.c
29panels/midori-history.c30panels/midori-history.c
30katze/katze-http-auth.c31katze/katze-http-auth.c
31katze/katze-throbber.c
32katze/katze-utils.c32katze/katze-utils.c
33katze/katze-item.c33katze/katze-item.c
34katze/katze-array.c34katze/katze-array.c

Subscribers

People subscribed via source and target branches

to all changes: