diff options
Diffstat (limited to 'src/emacsgtkfixed.c')
-rw-r--r-- | src/emacsgtkfixed.c | 157 |
1 files changed, 143 insertions, 14 deletions
diff --git a/src/emacsgtkfixed.c b/src/emacsgtkfixed.c index c584dd80e70..3b997c0d4f5 100644 --- a/src/emacsgtkfixed.c +++ b/src/emacsgtkfixed.c @@ -23,6 +23,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 #include "emacsgtkfixed.h" /* Silence a bogus diagnostic; see GNOME bug 683906. */ @@ -31,26 +34,26 @@ along with GNU Emacs. If not, see <http://www.gnu.org/licenses/>. */ # pragma GCC diagnostic ignored "-Wunused-local-typedefs" #endif -#define EMACS_TYPE_FIXED emacs_fixed_get_type () -#define EMACS_FIXED(obj) \ - G_TYPE_CHECK_INSTANCE_CAST (obj, EMACS_TYPE_FIXED, EmacsFixed) +//#define EMACS_TYPE_FIXED emacs_fixed_get_type () +/* #define EMACS_FIXED(obj) \ */ +/* G_TYPE_CHECK_INSTANCE_CAST (obj, EMACS_TYPE_FIXED, EmacsFixed) */ typedef struct _EmacsFixed EmacsFixed; typedef struct _EmacsFixedPrivate EmacsFixedPrivate; typedef struct _EmacsFixedClass EmacsFixedClass; -struct _EmacsFixed -{ - GtkFixed container; +/* struct _EmacsFixed */ +/* { */ +/* GtkFixed container; */ - /*< private >*/ - EmacsFixedPrivate *priv; -}; +/* /\*< private >*\/ */ +/* EmacsFixedPrivate *priv; */ +/* }; */ -struct _EmacsFixedClass -{ - GtkFixedClass parent_class; -}; +/* struct _EmacsFixedClass */ +/* { */ +/* GtkFixedClass parent_class; */ +/* }; */ struct _EmacsFixedPrivate { @@ -64,21 +67,147 @@ static void emacs_fixed_get_preferred_width (GtkWidget *widget, static void emacs_fixed_get_preferred_height (GtkWidget *widget, gint *minimum, gint *natural); -static GType emacs_fixed_get_type (void); 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 /* HAVE_XWIDGETS */ + static void emacs_fixed_class_init (EmacsFixedClass *klass) { GtkWidgetClass *widget_class; + GtkFixedClass *fixed_class; widget_class = (GtkWidgetClass*) klass; + fixed_class = (GtkFixedClass*) 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)); } +static GType +emacs_fixed_child_type (GtkFixed *container) +{ + return GTK_TYPE_WIDGET; +} + static void emacs_fixed_init (EmacsFixed *fixed) { |