/* * Savyon * * Copyright (C) 2003 * * 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 #include #include "appbar.h" struct _SavyonAppbarPrivate { GtkWidget *button1; GtkWidget *button2; }; static GType savyon_appbar_child_type (GtkContainer *container) { return GTK_TYPE_WIDGET; } static void savyon_appbar_size_request (SavyonAppbar *widget, GtkRequisition *requisition) { GtkRequisition child_requisition1={0,0}, child_requisition2={0,0}; g_printf ("request\n"); if (widget->priv->button1) gtk_widget_size_request (widget->priv->button1, &child_requisition1); if(widget->priv->button2) gtk_widget_size_request (widget->priv->button2, &child_requisition2); requisition->height = child_requisition1.height + child_requisition2.height; requisition->width = child_requisition1.width + child_requisition2.width; } static void savyon_appbar_size_allocate (SavyonAppbar *widget, GtkAllocation *allocation) { GtkRequisition child_requisition1={0,0}, child_requisition2={0,0}; GtkAllocation child_allocation1, child_allocation2; g_printf ("allocate\n"); if (widget->priv->button1) gtk_widget_size_request (widget->priv->button1, &child_requisition1); if(widget->priv->button2) gtk_widget_size_request (widget->priv->button2, &child_requisition2); child_allocation1.x = 0; child_allocation1.y = 0; child_allocation1.width = child_requisition1.width; child_allocation1.height = child_requisition1.height; child_allocation2.x = child_requisition1.width; child_allocation2.y = child_requisition1.height; child_allocation2.width = child_requisition1.width + child_requisition2.width; child_allocation2.height = child_requisition1.height + child_requisition2.height; gtk_widget_size_allocate (widget->priv->button1, &child_allocation1); gtk_widget_size_allocate (widget->priv->button2, &child_allocation2); } static void savyon_appbar_forall (SavyonAppbar *container, gboolean include_internals, GtkCallback callback, gpointer callback_data) { SavyonAppbar *appbar = SAVYON_APPBAR (container); g_printf ("forall\n"); g_return_if_fail (callback != NULL); if (appbar->priv->button1!=NULL) { g_printf ("forall1\n"); (* callback) (appbar->priv->button1, callback_data); } if (appbar->priv->button2!=NULL) { g_printf ("forall2\n"); (* callback) (appbar->priv->button2, callback_data); } } static void savyon_appbar_dispose (GObject *object) { SavyonAppbar *appbar = SAVYON_APPBAR (object); g_free (appbar->priv); } static void savyon_appbar_class_init (SavyonAppbarClass *klass) { GObjectClass *object_class, *parent_class; GtkContainerClass *container_class; GtkWidgetClass *widget_class; parent_class = g_type_class_peek_parent (klass); object_class = G_OBJECT_CLASS (klass); container_class = GTK_CONTAINER_CLASS (klass); widget_class = GTK_WIDGET_CLASS (klass); object_class->dispose = savyon_appbar_dispose; container_class->forall = savyon_appbar_forall; container_class->child_type = savyon_appbar_child_type; widget_class->size_request = savyon_appbar_size_request; widget_class->size_allocate = savyon_appbar_size_allocate; } void savyon_appbar_add_objects (SavyonAppbar *appbar) { g_printf ("addobjects\n"); appbar->priv->button1 = GTK_BUTTON (gtk_button_new_with_label ("Test1")); appbar->priv->button2 = GTK_BUTTON (gtk_button_new_with_label ("Test2")); gtk_widget_set_parent (appbar->priv->button1, GTK_WIDGET (appbar)); gtk_widget_set_parent (appbar->priv->button2, GTK_WIDGET (appbar)); gtk_widget_show (GTK_WIDGET (appbar->priv->button1)); gtk_widget_show (GTK_WIDGET (appbar->priv->button2)); gtk_widget_queue_resize (GTK_WIDGET (appbar)); } static void savyon_appbar_instance_init (SavyonAppbar *appbar) { GTK_WIDGET_SET_FLAGS (appbar, GTK_NO_WINDOW); gtk_widget_set_redraw_on_allocate (GTK_WIDGET (appbar), FALSE); appbar->priv = g_new0 (SavyonAppbarPrivate, 1); appbar->priv->button1 = NULL; appbar->priv->button2 = NULL; } GtkWidget * savyon_appbar_new (void) { SavyonAppbar *bar = GTK_WIDGET (g_object_new (SAVYON_TYPE_APPBAR, NULL)); savyon_appbar_add_objects (bar); return bar; } GType savyon_appbar_get_type (void) { static GType appbar_type = 0; if (!appbar_type) { static const GTypeInfo appbar_info = { sizeof (SavyonAppbarClass), NULL, /* base_init */ NULL, /* base_finalize */ (GClassInitFunc) savyon_appbar_class_init, NULL, /* class_finalize */ NULL, /* class_data */ sizeof (SavyonAppbar), 0, /* n_preallocs */ (GInstanceInitFunc) savyon_appbar_instance_init, }; appbar_type = g_type_register_static (GTK_TYPE_CONTAINER, "SavyonAppbar", &appbar_info, 0); } return appbar_type; }