]> Pileus Git - ~andy/gtk/blobdiff - gtk/gtkfixed.c
entrycompletion: Don't reconnect signals all the time
[~andy/gtk] / gtk / gtkfixed.c
index abdeb54aa5f33dfca0aa73b0631f79781f44b5cf..14c35afc84e18048d95cba46ae9b00afb94cf23c 100644 (file)
@@ -12,9 +12,7 @@
  * Lesser General Public License for more details.
  *
  * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the
- * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
- * Boston, MA 02111-1307, USA.
+ * License along with this library. If not, see <http://www.gnu.org/licenses/>.
  */
 
 /*
  * GTK+ at ftp://ftp.gtk.org/pub/gtk/.
  */
 
+/**
+ * SECTION:gtkfixed
+ * @Short_description: A container which allows you to position
+ * widgets at fixed coordinates
+ * @Title: GtkFixed
+ *
+ * The #GtkFixed widget is a container which can place child widgets
+ * at fixed positions and with fixed sizes, given in pixels. #GtkFixed
+ * performs no automatic layout management.
+ *
+ * For most applications, you should not use this container! It keeps
+ * you from having to learn about the other GTK+ containers, but it
+ * results in broken applications.  With #GtkFixed, the following
+ * things will result in truncated text, overlapping widgets, and
+ * other display bugs:
+ * <itemizedlist>
+ *  <listitem><para>
+ *   Themes, which may change widget sizes.
+ *  </para></listitem>
+ *  <listitem><para>
+ *   Fonts other than the one you used to write the app will of course
+ *   change the size of widgets containing text; keep in mind that
+ *   users may use a larger font because of difficulty reading the
+ *   default, or they may be using Windows or the framebuffer port of
+ *   GTK+, where different fonts are available.
+ *  </para></listitem>
+ *  <listitem><para>
+ *   Translation of text into other languages changes its size. Also,
+ *   display of non-English text will use a different font in many
+ *   cases.
+ *  </para></listitem>
+ * </itemizedlist>
+ *
+ * In addition, the fixed widget can't properly be mirrored in
+ * right-to-left languages such as Hebrew and Arabic. i.e. normally
+ * GTK+ will flip the interface to put labels to the right of the
+ * thing they label, but it can't do that with #GtkFixed. So your
+ * application will not be usable in right-to-left languages.
+ *
+ * Finally, fixed positioning makes it kind of annoying to add/remove
+ * GUI elements, since you have to reposition all the other
+ * elements. This is a long-term maintenance problem for your
+ * application.
+ *
+ * If you know none of these things are an issue for your application,
+ * and prefer the simplicity of #GtkFixed, by all means use the
+ * widget. But you should be aware of the tradeoffs.
+ */
+
 #include "config.h"
 
 #include "gtkfixed.h"
@@ -132,6 +179,13 @@ gtk_fixed_init (GtkFixed *fixed)
   fixed->priv->children = NULL;
 }
 
+/**
+ * gtk_fixed_new:
+ *
+ * Creates a new #GtkFixed.
+ *
+ * Returns: a new #GtkFixed.
+ */
 GtkWidget*
 gtk_fixed_new (void)
 {
@@ -158,6 +212,15 @@ get_child (GtkFixed  *fixed,
   return NULL;
 }
 
+/**
+ * gtk_fixed_put:
+ * @fixed: a #GtkFixed.
+ * @widget: the widget to add.
+ * @x: the horizontal position to place the widget at.
+ * @y: the vertical position to place the widget at.
+ *
+ * Adds a widget to a #GtkFixed container at the given position.
+ */
 void
 gtk_fixed_put (GtkFixed  *fixed,
                GtkWidget *widget,
@@ -210,6 +273,15 @@ gtk_fixed_move_internal (GtkFixed      *fixed,
     gtk_widget_queue_resize (GTK_WIDGET (fixed));
 }
 
+/**
+ * gtk_fixed_move:
+ * @fixed: a #GtkFixed.
+ * @widget: the child widget.
+ * @x: the horizontal position to move the widget to.
+ * @y: the vertical position to move the widget to.
+ *
+ * Moves a child of a #GtkFixed container to the given position.
+ */
 void
 gtk_fixed_move (GtkFixed  *fixed,
                 GtkWidget *widget,
@@ -307,10 +379,10 @@ gtk_fixed_realize (GtkWidget *widget)
       window = gdk_window_new (gtk_widget_get_parent_window (widget),
                                &attributes, attributes_mask);
       gtk_widget_set_window (widget, window);
-      gdk_window_set_user_data (window, widget);
+      gtk_widget_register_window (widget, window);
 
-      gtk_widget_style_attach (widget);
-      gtk_style_set_background (gtk_widget_get_style (widget), window, GTK_STATE_NORMAL);
+      gtk_style_context_set_background (gtk_widget_get_style_context (widget),
+                                        window);
     }
 }
 
@@ -337,8 +409,8 @@ gtk_fixed_get_preferred_width (GtkWidget *widget,
 
       gtk_widget_get_preferred_width (child->widget, &child_min, &child_nat);
 
-      *minimum = MAX (*minimum, child->y + child_min);
-      *natural = MAX (*natural, child->y + child_nat);
+      *minimum = MAX (*minimum, child->x + child_min);
+      *natural = MAX (*natural, child->x + child_nat);
     }
 }
 
@@ -452,8 +524,6 @@ gtk_fixed_remove (GtkContainer *container,
 
           break;
         }
-
-      children = children->next;
     }
 }
 
@@ -468,9 +538,11 @@ gtk_fixed_forall (GtkContainer *container,
   GtkFixedChild *child;
   GList *children;
 
-  for (children = priv->children; children; children = children->next)
+  children = priv->children;
+  while (children)
     {
       child = children->data;
+      children = children->next;
 
       (* callback) (child->widget, callback_data);
     }