• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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 
37 G_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 
55 typedef struct _GtkFloatingContainer GtkFloatingContainer;
56 typedef struct _GtkFloatingContainerClass GtkFloatingContainerClass;
57 typedef struct _GtkFloatingContainerChild GtkFloatingContainerChild;
58 
59 struct _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 
68 struct _GtkFloatingContainerClass {
69   GtkBinClass parent_class;
70 };
71 
72 // Internal structure used to associate a widget and its x/y child properties.
73 struct _GtkFloatingContainerChild {
74   GtkWidget* widget;
75   gint x;
76   gint y;
77 };
78 
79 UI_EXPORT GType      gtk_floating_container_get_type() G_GNUC_CONST;
80 UI_EXPORT GtkWidget* gtk_floating_container_new();
81 UI_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 
87 G_END_DECLS
88 
89 #endif  // UI_BASE_GTK_GTK_FLOATING_CONTAINER_H_
90