diff options
Diffstat (limited to 'src/emacsgtkfixed.c')
-rw-r--r-- | src/emacsgtkfixed.c | 123 |
1 files changed, 122 insertions, 1 deletions
diff --git a/src/emacsgtkfixed.c b/src/emacsgtkfixed.c index aef1ffdf783..8cde68d8303 100644 --- a/src/emacsgtkfixed.c +++ b/src/emacsgtkfixed.c @@ -27,7 +27,9 @@ along with GNU Emacs. If not, see <http://www.gnu.org/licenses/>. */ #include "lisp.h" #include "frame.h" #include "xterm.h" - +#ifdef HAVE_XWIDGETS +#include "xwidget.h" +#endif struct _EmacsFixedPrivate { struct frame *f; @@ -42,6 +44,122 @@ static void emacs_fixed_get_preferred_height (GtkWidget *widget, gint *natural); G_DEFINE_TYPE (EmacsFixed, emacs_fixed, GTK_TYPE_FIXED) +#ifdef HAVE_XWIDGETS +/* void aloc_callback(GtkWidget* child, GtkWidget* fixed){ */ +/* GtkAllocation child_allocation; */ +/* GtkRequisition child_requisition; */ + +/* //TODO */ +/* // if child is an xwidget, find its clipping area and modify allocation */ + +/* struct xwidget_view* xv = (struct xwidget_view*) g_object_get_data (G_OBJECT (child), XG_XWIDGET_VIEW); */ +/* printf("aloc callback %d %s\n", xv, gtk_widget_get_name(child)); */ +/* if(xv){ */ +/* printf(" allocation modification for xw\n"); */ +/* gtk_widget_get_allocation(child, &child_allocation); */ +/* child_allocation.width = xv->clip_right; */ +/* child_allocation.height = xv->clip_bottom - xv->clip_top; */ +/* gtk_widget_size_allocate (child, &child_allocation); */ +/* //TODO find a way to remove this feeble workaround */ +/* } */ + +/* } */ + +struct GtkFixedPrivateL +{ + GList *children; +}; + +static void emacs_fixed_gtk_widget_size_allocate (GtkWidget *widget, + GtkAllocation *allocation){ + //for xwidgets + + + //TODO 1st call base class method + EmacsFixedClass *klass; + GtkWidgetClass *parent_class; + struct GtkFixedPrivateL* priv; + GtkFixedChild *child; + GtkAllocation child_allocation; + GtkRequisition child_requisition; + GList *children; + struct xwidget_view* xv; + + // printf(" emacs_fixed_gtk_widget_size_allocate\n"); + klass = EMACS_FIXED_GET_CLASS (widget); + parent_class = g_type_class_peek_parent (klass); + parent_class->size_allocate (widget, allocation); + + priv = G_TYPE_INSTANCE_GET_PRIVATE (widget, + GTK_TYPE_FIXED, + struct GtkFixedPrivateL); + //fixed->priv = G_TYPE_INSTANCE_GET_PRIVATE (fixed, GTK_TYPE_FIXED, GtkFixedPrivate); + //then modify allocations + /* gtk_container_foreach (widget, */ + /* aloc_callback, */ + /* widget); */ + + //begin copy paste extravaganza!!! + + //GtkFixed *fixed = GTK_FIXED (widget); + //GtkFixedPrivate *priv = fixed->priv; + + + gtk_widget_set_allocation (widget, allocation); + + if (gtk_widget_get_has_window (widget)) + { + if (gtk_widget_get_realized (widget)) + gdk_window_move_resize (gtk_widget_get_window (widget), + allocation->x, + allocation->y, + allocation->width, + allocation->height); + } + + for (children = priv->children; + children; + children = children->next) + { + child = children->data; + + if (!gtk_widget_get_visible (child->widget)) + continue; + + gtk_widget_get_preferred_size (child->widget, &child_requisition, NULL); + child_allocation.x = child->x; + child_allocation.y = child->y; + + if (!gtk_widget_get_has_window (widget)) + { + child_allocation.x += allocation->x; + child_allocation.y += allocation->y; + } + + child_allocation.width = child_requisition.width; + child_allocation.height = child_requisition.height; + + + + xv = (struct xwidget_view*) g_object_get_data (G_OBJECT (child->widget), XG_XWIDGET_VIEW); + //printf("aloc callback %d %s\n", xv, gtk_widget_get_name(child)); + if(xv){ + //gtk_widget_get_allocation(child, &child_allocation); + child_allocation.width = xv->clip_right; + child_allocation.height = xv->clip_bottom - xv->clip_top; + //gtk_widget_size_allocate (child, &child_allocation); + //TODO find a way to remove this feeble workaround + // printf(" allocation internal modification for xw %d %d,%d\n",xv, child_allocation.width, child_allocation.height); + + } + gtk_widget_size_allocate (child->widget, &child_allocation); + + } + +} + +#endif + static void emacs_fixed_class_init (EmacsFixedClass *klass) { @@ -53,6 +171,9 @@ emacs_fixed_class_init (EmacsFixedClass *klass) widget_class->get_preferred_width = emacs_fixed_get_preferred_width; widget_class->get_preferred_height = emacs_fixed_get_preferred_height; +#ifdef HAVE_XWIDGETS + widget_class->size_allocate = emacs_fixed_gtk_widget_size_allocate; +#endif g_type_class_add_private (klass, sizeof (EmacsFixedPrivate)); } |