1// Copyright (c) 2011 The Chromium Authors. All rights reserved. 2// Use of this source code is governed by a BSD-style license that can be 3// found in the LICENSE file. 4 5#ifndef UI_BASE_GTK_GTK_FLOATING_CONTAINER_H_ 6#define UI_BASE_GTK_GTK_FLOATING_CONTAINER_H_ 7 8#include <gdk/gdk.h> 9#include <gtk/gtk.h> 10 11#include "ui/base/ui_export.h" 12 13// A specialized container, which is a cross between a GtkBin and a 14// GtkFixed. This container dervies from GtkBin and the implementation of 15// gtk_container_add() is the same: only one GtkWidget can be added through 16// that interface. The GtkBin portion contains normal content and is given the 17// same allocation that this container has. 18// 19// In addition, any number of widgets can be added through the 20// gtk_floating_container_add_floating() method, which provides functionality 21// similar to a GtkFixed. Unlike a GtkFixed, coordinates are not set when you 22// gtk_fixed_put(). The location of the floating widgets is determined while 23// running the "set-floating-position" signal, which is emitted during this 24// container's "size-allocate" handler. 25// 26// The "set-floating-position" signal is (semi-)mandatory if you want widgets 27// placed anywhere other than the origin and should have the following 28// signature: 29// 30// void (*set_floating_position)(GtkFloatingContainer* container, 31// GtkAllocation* allocation, 32// gpointer userdata); 33// 34// Your handler should, for each floating widget, set the "x" and "y" child 35// properties. 36 37G_BEGIN_DECLS 38 39#define GTK_TYPE_FLOATING_CONTAINER \ 40 (gtk_floating_container_get_type()) 41#define GTK_FLOATING_CONTAINER(obj) \ 42 (G_TYPE_CHECK_INSTANCE_CAST((obj), GTK_TYPE_FLOATING_CONTAINER, \ 43 GtkFloatingContainer)) 44#define GTK_FLOATING_CONTAINER_CLASS(klass) \ 45 (G_TYPE_CHECK_CLASS_CAST((klass), GTK_TYPE_FLOATING_CONTAINER, \ 46 GtkFloatingContainerClass)) 47#define GTK_IS_FLOATING_CONTAINER(obj) \ 48 (G_TYPE_CHECK_INSTANCE_TYPE((obj), GTK_TYPE_FLOATING_CONTAINER)) 49#define GTK_IS_FLOATING_CONTAINER_CLASS(klass) \ 50 (G_TYPE_CHECK_CLASS_TYPE((klass), GTK_TYPE_FLOATING_CONTAINER)) 51#define GTK_FLOATING_CONTAINER_GET_CLASS(obj) \ 52 (G_TYPE_INSTANCE_GET_CLASS((obj), GTK_TYPE_FLOATING_CONTAINER, \ 53 GtkFloatingContainerClass)) 54 55typedef struct _GtkFloatingContainer GtkFloatingContainer; 56typedef struct _GtkFloatingContainerClass GtkFloatingContainerClass; 57typedef struct _GtkFloatingContainerChild GtkFloatingContainerChild; 58 59struct _GtkFloatingContainer { 60 // Parent class. 61 GtkBin bin; 62 63 // A GList of all our floating children, in GtkFloatingContainerChild 64 // structs. Owned by the GtkFloatingContainer. 65 GList* floating_children; 66}; 67 68struct _GtkFloatingContainerClass { 69 GtkBinClass parent_class; 70}; 71 72// Internal structure used to associate a widget and its x/y child properties. 73struct _GtkFloatingContainerChild { 74 GtkWidget* widget; 75 gint x; 76 gint y; 77}; 78 79UI_EXPORT GType gtk_floating_container_get_type() G_GNUC_CONST; 80UI_EXPORT GtkWidget* gtk_floating_container_new(); 81UI_EXPORT void gtk_floating_container_add_floating( 82 GtkFloatingContainer* container, 83 GtkWidget* widget); 84// Use gtk_container_remove to remove all widgets; both widgets added with 85// gtk_container_add() and gtk_floating_container_add_floating(). 86 87G_END_DECLS 88 89#endif // UI_BASE_GTK_GTK_FLOATING_CONTAINER_H_ 90