+// This is not the same as GetBestSize() because that size may have
+// been recalculated and cached by us. We want GTK+ information.
+wxSize wxControl::GTKGetPreferredSize(GtkWidget* widget) const
+{
+ GtkRequisition req;
+#ifdef __WXGTK3__
+ if (gtk_widget_get_request_mode(widget) != GTK_SIZE_REQUEST_HEIGHT_FOR_WIDTH)
+ {
+ gtk_widget_get_preferred_height(widget, NULL, &req.height);
+ gtk_widget_get_preferred_width_for_height(widget, req.height, NULL, &req.width);
+ }
+ else
+ {
+ gtk_widget_get_preferred_width(widget, NULL, &req.width);
+ gtk_widget_get_preferred_height_for_width(widget, req.width, NULL, &req.height);
+ }
+#else
+ GTK_WIDGET_GET_CLASS(widget)->size_request(widget, &req);
+#endif
+
+ return wxSize(req.width, req.height);
+}
+
+wxPoint wxControl::GTKGetEntryMargins(GtkEntry* entry) const
+{
+ wxPoint marg(0, 0);
+
+#ifndef __WXGTK3__
+#if GTK_CHECK_VERSION(2,10,0)
+ // The margins we have previously set
+ const GtkBorder* border = gtk_entry_get_inner_border(entry);
+ if ( border )
+ {
+ marg.x = border->left + border->right;
+ marg.y = border->top + border->bottom;
+ }
+#endif // GTK+ 2.10+
+#else // GTK+ 3
+ // Gtk3 does not use inner border, but StyleContext and CSS
+ // TODO: implement it, starting with wxTextEntry::DoSetMargins()
+#endif // GTK+ 2/3
+
+ int x, y;
+ gtk_entry_get_layout_offsets(entry, &x, &y);
+ // inner borders are included. Substract them so we can get other margins
+ x -= marg.x;
+ y -= marg.y;
+ marg.x += 2 * x + 2;
+ marg.y += 2 * y + 2;
+
+ return marg;
+}
+
+