23
33
#include "indicator-button.h"
25
static void xfce_indicator_button_finalize (GObject *object);
36
#include <libindicator/indicator-object.h>
37
//#ifndef INDICATOR_OBJECT_SIGNAL_ENTRY_SCROLLED
38
//#define INDICATOR_OBJECT_SIGNAL_ENTRY_SCROLLED "scroll-entry"
42
static void xfce_indicator_button_finalize (GObject *object);
43
static gint xfce_indicator_button_get_icon_size (XfceIndicatorButton *button);
44
static gboolean xfce_indicator_button_button_press (GtkWidget *widget,
45
GdkEventButton *event);
46
static gboolean xfce_indicator_button_scroll (GtkWidget *widget,
47
GdkEventScroll *event);
48
static void xfce_indicator_button_menu_deactivate (XfceIndicatorButton *button,
50
static gint xfce_indicator_button_get_size (XfceIndicatorButton *button);
54
struct _XfceIndicatorButton
56
GtkToggleButton __parent__;
60
IndicatorObjectEntry *entry;
62
XfcePanelPlugin *plugin;
63
IndicatorConfig *config;
70
gboolean rectangular_icon;
72
gulong orig_icon_changed_id;
73
gulong configuration_changed_id;
76
struct _XfceIndicatorButtonClass
78
GtkToggleButtonClass __parent__;
28
84
G_DEFINE_TYPE (XfceIndicatorButton, xfce_indicator_button, GTK_TYPE_TOGGLE_BUTTON)
52
112
button->io = NULL;
53
113
button->entry = NULL;
114
button->plugin = NULL;
115
button->config = NULL;
54
116
button->menu = NULL;
56
118
button->label = NULL;
57
119
button->orig_icon = NULL;
58
120
button->icon = NULL;
59
button->orig_icon_handler = 0;
62
button->panel_size = 0;
63
button->icon_size = 24;
64
button->panel_orientation = GTK_ORIENTATION_HORIZONTAL;
65
button->orientation = GTK_ORIENTATION_HORIZONTAL;
67
outer_container = gtk_table_new (1, 1, FALSE);
68
gtk_container_add (GTK_CONTAINER (button), outer_container);
69
gtk_widget_show (outer_container);
71
button->box = xfce_hvbox_new (button->orientation, FALSE, 1);
72
gtk_table_attach (GTK_TABLE (outer_container), button->box,
74
GTK_EXPAND | GTK_SHRINK, GTK_EXPAND | GTK_SHRINK, 0, 0);
121
button->orig_icon_changed_id = 0;
122
button->configuration_changed_id = 0;
123
button->rectangular_icon = FALSE;
125
button->align_box = gtk_alignment_new (0.5, 0.5, 0.0, 0.0);
126
gtk_container_add (GTK_CONTAINER (button), button->align_box);
127
gtk_widget_show (button->align_box);
129
button->box = xfce_hvbox_new (GTK_ORIENTATION_HORIZONTAL, FALSE, 1);
130
gtk_container_add (GTK_CONTAINER (button->align_box), button->box);
75
131
gtk_widget_show (button->box);
105
163
xfce_indicator_button_update_layout (XfceIndicatorButton *button)
107
165
GtkRequisition label_size;
109
168
g_return_if_fail (XFCE_IS_INDICATOR_BUTTON (button));
111
if (button->icon != NULL && button->size != 0)
113
if (button->label != NULL &&
114
button->panel_orientation == GTK_ORIENTATION_VERTICAL &&
115
button->orientation == GTK_ORIENTATION_HORIZONTAL)
117
gtk_widget_size_request (button->label, &label_size);
119
/* put icon above the label if number of rows > 1 (they look better)
120
or if they don't fit when arranged horizontally */
121
if (button->panel_size != button->size ||
122
label_size.width > button->panel_size - button->size)
123
gtk_orientable_set_orientation (GTK_ORIENTABLE (button->box), GTK_ORIENTATION_VERTICAL);
125
gtk_orientable_set_orientation (GTK_ORIENTABLE (button->box), GTK_ORIENTATION_HORIZONTAL);
128
xfce_panel_image_set_size (XFCE_PANEL_IMAGE (button->icon), button->icon_size);
170
if (button->label != NULL)
171
gtk_label_set_ellipsize (GTK_LABEL (button->label), PANGO_ELLIPSIZE_NONE);
174
if (button->label != NULL &&
175
indicator_config_get_panel_orientation (button->config) == GTK_ORIENTATION_VERTICAL &&
176
indicator_config_get_orientation (button->config) == GTK_ORIENTATION_HORIZONTAL)
178
gtk_widget_size_request (button->label, &label_size);
180
/* check if icon and label fit side by side */
181
if (!indicator_config_get_align_left (button->config)
182
|| (button->icon != NULL
183
&& label_size.width >
184
indicator_config_get_panel_size (button->config)
185
- xfce_indicator_button_get_size (button)))
188
gtk_orientable_set_orientation (GTK_ORIENTABLE (button->box), GTK_ORIENTATION_VERTICAL);
193
gtk_orientable_set_orientation (GTK_ORIENTABLE (button->box), GTK_ORIENTATION_HORIZONTAL);
196
/* check if label alone fits in the panel */
197
if (label_size.width > indicator_config_get_panel_size (button->config) - 6)
199
gtk_alignment_set (GTK_ALIGNMENT (button->align_box), align_x, 0.5, 1.0, 0.0);
200
gtk_label_set_ellipsize (GTK_LABEL (button->label), PANGO_ELLIPSIZE_END);
204
gtk_alignment_set (GTK_ALIGNMENT (button->align_box), align_x, 0.5, 0.0, 0.0);
209
gtk_alignment_set (GTK_ALIGNMENT (button->align_box), 0.5, 0.5, 0.0, 0.0);
210
gtk_orientable_set_orientation (GTK_ORIENTABLE (button->box),
211
indicator_config_get_orientation (button->config));
215
if (button->label != NULL)
216
gtk_label_set_angle (GTK_LABEL (button->label),
217
(indicator_config_get_orientation (button->config) == GTK_ORIENTATION_VERTICAL)
135
225
xfce_indicator_button_update_icon (XfceIndicatorButton *button)
137
227
GdkPixbuf *pixbuf_s, *pixbuf_d;
230
gint border_thickness;
141
233
g_return_if_fail (GTK_IS_IMAGE (button->orig_icon));
142
g_return_if_fail (XFCE_IS_PANEL_IMAGE (button->icon));
144
size = button->icon_size;
146
/* Copied from xfce_panel_image.c, try to snap to icon sizes, which minimize smoothing */
234
g_return_if_fail (GTK_IS_IMAGE (button->icon));
236
size = xfce_indicator_button_get_icon_size (button);
148
239
if (size > 16 && size < 22)
158
249
if (pixbuf_s != NULL)
160
aspect = (gdouble) gdk_pixbuf_get_width (pixbuf_s) /
161
(gdouble) gdk_pixbuf_get_height (pixbuf_s);
163
pixbuf_d = gdk_pixbuf_scale_simple
164
(pixbuf_s, size, (gint) (size / aspect),
165
GDK_INTERP_BILINEAR);
251
w = gdk_pixbuf_get_width (pixbuf_s);
252
h = gdk_pixbuf_get_height (pixbuf_s);
253
aspect = (gdouble) w / (gdouble) h;
255
button->rectangular_icon = (w != h);
257
if (indicator_config_get_panel_orientation (button->config) == GTK_ORIENTATION_VERTICAL &&
258
size * aspect > indicator_config_get_panel_size (button->config))
260
style = gtk_widget_get_style (GTK_WIDGET (button->plugin));
261
border_thickness = 2 * MAX (style->xthickness, style->ythickness);
262
w = indicator_config_get_panel_size (button->config) - border_thickness;
263
h = (gint) (w / aspect);
167
pixbuf_d = gdk_pixbuf_scale_simple
168
(pixbuf_s, (gint) (size * aspect), size,
169
GDK_INTERP_BILINEAR);
170
xfce_panel_image_set_from_pixbuf (XFCE_PANEL_IMAGE (button->icon), pixbuf_d);
268
w = (gint) (h * aspect);
270
pixbuf_d = gdk_pixbuf_scale_simple (pixbuf_s, w, h, GDK_INTERP_BILINEAR);
271
gtk_image_set_from_pixbuf (GTK_IMAGE (button->icon), pixbuf_d);
272
g_object_unref (G_OBJECT (pixbuf_d));
174
xfce_panel_image_set_from_source (XFCE_PANEL_IMAGE (button->icon), "image-missing");
276
gtk_image_set_from_icon_name (GTK_IMAGE (button->icon),
277
"image-missing", GTK_ICON_SIZE_MENU);
177
xfce_panel_image_set_size (XFCE_PANEL_IMAGE (button->icon), button->icon_size);
284
xfce_indicator_button_label_changed (GtkLabel *label,
286
XfceIndicatorButton *button)
288
xfce_indicator_button_update_layout (button);
338
xfce_indicator_button_set_orientation (XfceIndicatorButton *button,
339
GtkOrientation panel_orientation,
340
GtkOrientation orientation)
342
gboolean needs_update = FALSE;
344
g_return_if_fail (XFCE_IS_INDICATOR_BUTTON (button));
346
if (button->orientation != orientation)
348
button->orientation = orientation;
350
if (button->label != NULL)
351
gtk_label_set_angle (GTK_LABEL (button->label),
352
(orientation == GTK_ORIENTATION_VERTICAL) ? -90 : 0);
356
if (button->panel_orientation != panel_orientation)
358
button->panel_orientation = panel_orientation;
364
gtk_orientable_set_orientation (GTK_ORIENTABLE (button->box), orientation);
365
xfce_indicator_button_update_layout (button);
372
xfce_indicator_button_set_size (XfceIndicatorButton *button,
376
gboolean needs_update = FALSE;
377
gint border_thickness;
381
g_return_if_fail (XFCE_IS_INDICATOR_BUTTON (button));
383
if (button->size != size)
389
if (button->panel_size != panel_size)
391
button->panel_size = panel_size;
397
style = gtk_widget_get_style (GTK_WIDGET (button));
398
border_thickness = 2 * MAX (style->xthickness, style->ythickness) + 2;
399
button->icon_size = button->size - border_thickness;
401
if (button->orig_icon != NULL)
403
xfce_indicator_button_update_icon (button);
404
xfce_indicator_button_update_layout (button);
474
xfce_indicator_button_is_icon_rectangular (XfceIndicatorButton *button)
476
g_return_val_if_fail (XFCE_IS_INDICATOR_BUTTON (button), FALSE);
478
return button->rectangular_icon;
485
xfce_indicator_button_get_icon_size (XfceIndicatorButton *button)
488
gint border_thickness;
491
g_return_val_if_fail (XFCE_IS_INDICATOR_BUTTON (button), 22);
493
indicator_size = xfce_indicator_button_get_size (button);
495
style = gtk_widget_get_style (GTK_WIDGET (button->plugin));
496
border_thickness = 2 * MAX (style->xthickness, style->ythickness);
498
return MIN (indicator_size - border_thickness,
499
indicator_config_get_icon_size_max (button->config));
505
xfce_indicator_button_get_size (XfceIndicatorButton *button)
507
gint border_thickness;
510
g_return_val_if_fail (XFCE_IS_INDICATOR_BUTTON (button), 24);
512
style = gtk_widget_get_style (GTK_WIDGET (button->plugin));
513
border_thickness = 2 * MAX (style->xthickness, style->ythickness) ;
515
return MIN (indicator_config_get_panel_size (button->config) /
516
indicator_config_get_nrows (button->config),
517
indicator_config_get_icon_size_max (button->config) + border_thickness);
524
xfce_indicator_configuration_changed (XfceIndicatorButton *button,
525
IndicatorConfig *config)
527
g_return_if_fail (XFCE_IS_INDICATOR_BUTTON (button));
528
g_return_if_fail (XFCE_IS_INDICATOR_CONFIG (config));
529
g_return_if_fail (GTK_WIDGET (button)->parent != NULL);
531
if (button->orig_icon != NULL)
532
xfce_indicator_button_update_icon (button);
533
xfce_indicator_button_update_layout (button);
412
xfce_indicator_button_new (IndicatorObject *io,
413
IndicatorObjectEntry *entry)
539
xfce_indicator_button_new (IndicatorObject *io,
540
const gchar *io_name,
541
IndicatorObjectEntry *entry,
542
XfcePanelPlugin *plugin,
543
IndicatorConfig *config)
415
545
XfceIndicatorButton *button = g_object_new (XFCE_TYPE_INDICATOR_BUTTON, NULL);
546
g_return_val_if_fail (XFCE_IS_INDICATOR_CONFIG (config), NULL);
547
g_return_val_if_fail (XFCE_IS_PANEL_PLUGIN (plugin), NULL);
550
button->io_name = io_name;
417
551
button->entry = entry;
552
button->plugin = plugin;
553
button->config = config;
418
555
if (button->io != NULL)
419
556
g_object_ref (G_OBJECT (button->io));
420
557
/* IndicatorObjectEntry is not GObject */
421
558
/* g_object_ref (G_OBJECT (button->entry)); */
560
button->configuration_changed_id =
561
g_signal_connect_swapped (G_OBJECT (button->config), "configuration-changed",
562
G_CALLBACK (xfce_indicator_configuration_changed), button);
422
564
return GTK_WIDGET (button);
570
xfce_indicator_button_disconnect_signals (XfceIndicatorButton *button)
572
g_return_if_fail (XFCE_IS_INDICATOR_BUTTON (button));
574
if (button->menu != 0)
576
gtk_menu_popdown (button->menu);
579
if (button->configuration_changed_id != 0)
581
g_signal_handler_disconnect (button->config, button->configuration_changed_id);
582
button->configuration_changed_id = 0;
585
if (button->orig_icon_changed_id != 0)
587
g_signal_handler_disconnect (G_OBJECT (button->orig_icon), button->orig_icon_changed_id);
588
button->orig_icon_changed_id = 0;
595
xfce_indicator_button_button_press (GtkWidget *widget,
596
GdkEventButton *event)
598
XfceIndicatorButton *button = XFCE_INDICATOR_BUTTON (widget);
600
if(event->button == 1 && button->menu != NULL) /* left click only */
602
gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(widget),TRUE);
603
gtk_menu_reposition (GTK_MENU (button->menu));
604
gtk_menu_popup (button->menu, NULL, NULL,
605
xfce_panel_plugin_position_menu, button->plugin,
606
event->button, event->time);
615
xfce_indicator_button_scroll (GtkWidget *widget, GdkEventScroll *event)
617
XfceIndicatorButton *button = XFCE_INDICATOR_BUTTON (widget);
619
g_signal_emit_by_name (button->io, INDICATOR_OBJECT_SIGNAL_ENTRY_SCROLLED,
620
button->entry, 1, event->direction);
627
xfce_indicator_button_menu_deactivate (XfceIndicatorButton *button,
630
g_return_if_fail (XFCE_IS_INDICATOR_BUTTON (button));
631
g_return_if_fail (GTK_IS_MENU (menu));
633
gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (button), FALSE);