Updating branch refs/heads/master to 4faa7f1f050a0342bb8c36e015071232597fc7b8 (commit) from c57681e3c1da9df6c3f5ac6aa1ec4af937e003cd (commit)
commit 4faa7f1f050a0342bb8c36e015071232597fc7b8 Author: Andrzej <ndrwr...@gmail.com> Date: Wed Mar 14 09:12:00 2012 +0100 Adapt the plugin to xfce4-panel 4.9+ panel-plugin/indicator-button.c | 334 +++++++++++++++++++++++++++++++++++++++ panel-plugin/indicator-button.h | 88 ++++++++++ 2 files changed, 422 insertions(+), 0 deletions(-) diff --git a/panel-plugin/indicator-button.c b/panel-plugin/indicator-button.c new file mode 100644 index 0000000..78bbee3 --- /dev/null +++ b/panel-plugin/indicator-button.c @@ -0,0 +1,334 @@ +/* Copyright (c) 2012 Andrzej <ndrwr...@gmail.com> + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Library General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + */ + +#include <glib.h> +#include <gtk/gtk.h> +#include <libxfce4panel/libxfce4panel.h> +#include <libindicator/indicator-object.h> + +#include "indicator-button.h" + +static void xfce_indicator_button_finalize (GObject *object); + + +G_DEFINE_TYPE (XfceIndicatorButton, xfce_indicator_button, GTK_TYPE_TOGGLE_BUTTON) + +static void +xfce_indicator_button_class_init (XfceIndicatorButtonClass *klass) +{ + GObjectClass *gobject_class; + + gobject_class = G_OBJECT_CLASS (klass); + gobject_class->finalize = xfce_indicator_button_finalize; +} + + + +static void +xfce_indicator_button_init (XfceIndicatorButton *button) +{ + GTK_WIDGET_UNSET_FLAGS (GTK_WIDGET (button), GTK_CAN_DEFAULT | GTK_CAN_FOCUS); + gtk_button_set_relief (GTK_BUTTON (button), GTK_RELIEF_NONE); + gtk_button_set_use_underline (GTK_BUTTON (button),TRUE); + gtk_button_set_focus_on_click (GTK_BUTTON (button), FALSE); + gtk_widget_set_name (GTK_WIDGET (button), "indicator-button"); + + button->io = NULL; + button->entry = NULL; + button->menu = NULL; + + button->label = NULL; + button->icon = NULL; + button->size = -1; + button->panel_size = -1; + button->panel_orientation = GTK_ORIENTATION_HORIZONTAL; + button->orientation = GTK_ORIENTATION_HORIZONTAL; + + + button->outer_box = xfce_hvbox_new (GTK_ORIENTATION_VERTICAL, FALSE, 1); + gtk_container_add (GTK_CONTAINER (button), button->outer_box); + gtk_widget_show (button->outer_box); + + button->box = xfce_hvbox_new (button->orientation, FALSE, 1); + gtk_box_pack_start (GTK_BOX (button->outer_box), button->box, TRUE, FALSE, 0); + gtk_widget_show (button->box); +} + + + +static void +xfce_indicator_button_finalize (GObject *object) +{ + XfceIndicatorButton *button = XFCE_INDICATOR_BUTTON (object); + + if (button->label != NULL) + { + g_object_unref (G_OBJECT (button->label)); + button->label = NULL; + } + if (button->icon != NULL) + { + g_object_unref (G_OBJECT (button->icon)); + button->icon = NULL; + } + if (button->io != NULL) + { + g_object_unref (G_OBJECT (button->io)); + button->io = NULL; + } + if (button->entry != NULL) + { + g_object_unref (G_OBJECT (button->entry)); + button->entry = NULL; + } + if (button->menu != NULL) + { + g_object_unref (G_OBJECT (button->menu)); + button->menu = NULL; + } + + G_OBJECT_CLASS (xfce_indicator_button_parent_class)->finalize (object); +} + + + +static void +xfce_indicator_button_check_label_size (XfceIndicatorButton *button) +{ + GtkRequisition label_size; + gint width, border_thickness; + GtkStyle *style; + + g_return_if_fail (XFCE_IS_INDICATOR_BUTTON (button)); + + if (button->panel_orientation == GTK_ORIENTATION_VERTICAL && + button->orientation == GTK_ORIENTATION_HORIZONTAL && + button->icon != NULL && + button->label != NULL) + { + gtk_widget_size_request (button->label, &label_size); + + width = gdk_pixbuf_get_width (gtk_image_get_pixbuf (button->icon)); + style = gtk_widget_get_style (GTK_WIDGET (button)); + border_thickness = 2 * MAX (style->xthickness, style->ythickness) + 2; + + if (label_size.width > button->panel_size - width - border_thickness) + gtk_orientable_set_orientation (GTK_ORIENTABLE (button->box), GTK_ORIENTATION_VERTICAL); + else + gtk_orientable_set_orientation (GTK_ORIENTABLE (button->box), GTK_ORIENTATION_HORIZONTAL); + } +} + + + +void +xfce_indicator_button_set_label (XfceIndicatorButton *button, + GtkLabel *label) +{ + g_return_if_fail (XFCE_IS_INDICATOR_BUTTON (button)); + g_return_if_fail (GTK_IS_LABEL (label)); + + if (button->label != GTK_WIDGET (label)) + { + if (button->label != NULL) + { + gtk_container_remove (GTK_CONTAINER (button->box), button->label); + g_object_unref (G_OBJECT (button->label)); + } + + button->label = GTK_WIDGET (label); + g_object_ref (G_OBJECT (button->label)); + gtk_box_pack_end (GTK_BOX (button->box), button->label, TRUE, FALSE, 1); + } + xfce_indicator_button_check_label_size (button); +} + + + +void +xfce_indicator_button_set_image (XfceIndicatorButton *button, + GtkImage *image) +{ + g_return_if_fail (XFCE_IS_INDICATOR_BUTTON (button)); + g_return_if_fail (GTK_IS_IMAGE (image)); + + if (button->icon != GTK_WIDGET (image)) + { + if (button->icon != NULL) + { + gtk_container_remove (GTK_CONTAINER (button->box), button->icon); + g_object_unref (G_OBJECT (button->icon)); + } + + button->icon = GTK_WIDGET (image); + g_object_ref (G_OBJECT (button->icon)); + gtk_box_pack_start (GTK_BOX (button->box), button->icon, TRUE, FALSE, 1); + } + xfce_indicator_button_check_label_size (button); +} + + + +void +xfce_indicator_button_set_menu (XfceIndicatorButton *button, + GtkMenu *menu) +{ + g_return_if_fail (XFCE_IS_INDICATOR_BUTTON (button)); + g_return_if_fail (GTK_IS_MENU (menu)); + + if (button->menu != menu) + { + if (button->menu != NULL) + g_object_unref (G_OBJECT (button->menu)); + button->menu = menu; + g_object_ref (G_OBJECT (button->menu)); + gtk_menu_attach_to_widget(menu, GTK_WIDGET (button), NULL); + } +} + + + +GtkWidget * +xfce_indicator_button_get_label (XfceIndicatorButton *button) +{ + g_return_val_if_fail (XFCE_IS_INDICATOR_BUTTON (button), NULL); + + return button->label; +} + + + +GtkWidget * +xfce_indicator_button_get_image (XfceIndicatorButton *button) +{ + g_return_val_if_fail (XFCE_IS_INDICATOR_BUTTON (button), NULL); + + return button->icon; +} + + + +IndicatorObjectEntry * +xfce_indicator_button_get_entry (XfceIndicatorButton *button) +{ + g_return_val_if_fail (XFCE_IS_INDICATOR_BUTTON (button), NULL); + + return button->entry; +} + + + +IndicatorObject * +xfce_indicator_button_get_io (XfceIndicatorButton *button) +{ + g_return_val_if_fail (XFCE_IS_INDICATOR_BUTTON (button), NULL); + + return button->io; +} + + + +GtkMenu * +xfce_indicator_button_get_menu (XfceIndicatorButton *button) +{ + g_return_val_if_fail (XFCE_IS_INDICATOR_BUTTON (button), NULL); + + return button->menu; +} + + + +void +xfce_indicator_button_set_orientation (XfceIndicatorButton *button, + GtkOrientation orientation) +{ + g_return_if_fail (XFCE_IS_INDICATOR_BUTTON (button)); + + button->orientation = orientation; + + gtk_orientable_set_orientation (GTK_ORIENTABLE (button->box), orientation); + + if (button->label != NULL) + gtk_label_set_angle (GTK_LABEL (button->label), + (orientation == GTK_ORIENTATION_VERTICAL) ? -90 : 0); + xfce_indicator_button_check_label_size (button); +} + + + +void +xfce_indicator_button_set_panel_orientation (XfceIndicatorButton *button, + GtkOrientation orientation) +{ + g_return_if_fail (XFCE_IS_INDICATOR_BUTTON (button)); + + button->panel_orientation = orientation; + + gtk_orientable_set_orientation + (GTK_ORIENTABLE (button->outer_box), + (orientation == GTK_ORIENTATION_HORIZONTAL) ? + GTK_ORIENTATION_VERTICAL : GTK_ORIENTATION_HORIZONTAL); + xfce_indicator_button_check_label_size (button); +} + + + +void +xfce_indicator_button_set_panel_size (XfceIndicatorButton *button, + gint size) +{ + g_return_if_fail (XFCE_IS_INDICATOR_BUTTON (button)); + + button->panel_size = size; + xfce_indicator_button_check_label_size (button); +} + + + +void +xfce_indicator_button_set_size (XfceIndicatorButton *button, + gint size) +{ + g_return_if_fail (XFCE_IS_INDICATOR_BUTTON (button)); + + button->size = size; + + size -= (2 + 2 * MAX (GTK_WIDGET (button)->style->xthickness, + GTK_WIDGET (button)->style->ythickness)); + if (button->icon != NULL) + { + gtk_widget_set_size_request (button->icon, size, size); + xfce_indicator_button_check_label_size (button); + } +} + + + +GtkWidget * +xfce_indicator_button_new (IndicatorObject *io, + IndicatorObjectEntry *entry) +{ + XfceIndicatorButton *button = g_object_new (XFCE_TYPE_INDICATOR_BUTTON, NULL); + button->io = io; + button->entry = entry; + g_object_ref (G_OBJECT (button->io)); + g_object_ref (G_OBJECT (button->entry)); + return GTK_WIDGET (button); +} + + + diff --git a/panel-plugin/indicator-button.h b/panel-plugin/indicator-button.h new file mode 100644 index 0000000..bf4a169 --- /dev/null +++ b/panel-plugin/indicator-button.h @@ -0,0 +1,88 @@ +/* Copyright (c) 2012 Andrzej <ndrwr...@gmail.com> + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Library General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + */ + +#ifndef __INDICATOR_BUTTON_H__ +#define __INDICATOR_BUTTON_H__ + +G_BEGIN_DECLS + +GType xfce_indicator_button_get_type (void); + +#define XFCE_TYPE_INDICATOR_BUTTON (xfce_indicator_button_get_type()) +#define XFCE_INDICATOR_BUTTON(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj), XFCE_TYPE_INDICATOR_BUTTON, XfceIndicatorButton)) +#define XFCE_INDICATOR_BUTTON_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST((klass), XFCE_TYPE_INDICATOR_BUTTON, XfceIndicatorButtonClass)) +#define XFCE_IS_INDICATOR_BUTTON(obj) (G_TYPE_CHECK_INSTANCE_TYPE((obj), XFCE_TYPE_INDICATOR_BUTTON)) +#define XFCE_IS_INDICATOR_BUTTON_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE((klass), XFCE_TYPE_INDICATOR_BUTTON)) +#define XFCE_INDICATOR_BUTTON_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS((obj), XFCE_TYPE_INDICATOR_BUTTON, XfceIndicatorButtonClass)) + +typedef struct _XfceIndicatorButton XfceIndicatorButton; +typedef struct _XfceIndicatorButtonClass XfceIndicatorButtonClass; + +struct _XfceIndicatorButton +{ + GtkToggleButton __parent__; + + IndicatorObject *io; + IndicatorObjectEntry *entry; + GtkMenu *menu; + + GtkWidget *outer_box; + GtkWidget *box; + GtkWidget *label; + GtkWidget *icon; + + gint panel_size; + gint size; + + GtkOrientation panel_orientation; + GtkOrientation orientation; +}; + +struct _XfceIndicatorButtonClass +{ + GtkToggleButtonClass __parent__; +}; + +void xfce_indicator_button_set_label (XfceIndicatorButton *button, GtkLabel *label); + +void xfce_indicator_button_set_image (XfceIndicatorButton *button, GtkImage *image); + +void xfce_indicator_button_set_menu (XfceIndicatorButton *button, GtkMenu *menu); + +GtkWidget *xfce_indicator_button_get_label (XfceIndicatorButton *button); + +GtkWidget *xfce_indicator_button_get_image (XfceIndicatorButton *button); + +IndicatorObjectEntry *xfce_indicator_button_get_entry (XfceIndicatorButton *button); + +IndicatorObject *xfce_indicator_button_get_io (XfceIndicatorButton *button); + +GtkMenu *xfce_indicator_button_get_menu (XfceIndicatorButton *button); + +void xfce_indicator_button_set_orientation (XfceIndicatorButton *button, GtkOrientation orientation); + +void xfce_indicator_button_set_panel_orientation (XfceIndicatorButton *button, GtkOrientation orientation); + +void xfce_indicator_button_set_panel_size (XfceIndicatorButton *button, gint size); + +void xfce_indicator_button_set_size (XfceIndicatorButton *button, gint size); + +GtkWidget *xfce_indicator_button_new (IndicatorObject *io, IndicatorObjectEntry *entry); + +G_END_DECLS + +#endif /* !__INDICATOR_BUTTON_H__ */ _______________________________________________ Xfce4-commits mailing list Xfce4-commits@xfce.org https://mail.xfce.org/mailman/listinfo/xfce4-commits