]> code.delx.au - gnu-emacs/blobdiff - src/emacsgtkfixed.c
upstream
[gnu-emacs] / src / emacsgtkfixed.c
index 1a62b59b7afb7c8d69fea7ee117c5b9d5f284d04..c190862ab7d1e33cb9679cd498a3afbda61c7743 100644 (file)
@@ -21,33 +21,40 @@ along with GNU Emacs.  If not, see <http://www.gnu.org/licenses/>.  */
 #include <config.h>
 
 #include "emacsgtkfixed.h"
-#include <signal.h>
 #include <stdio.h>
-#include <setjmp.h>
+
 #include "lisp.h"
 #include "frame.h"
 #include "xterm.h"
+#ifdef HAVE_XWIDGETS
+#include "xwidget.h"
+#endif
+/* Silence a bogus diagnostic; see GNOME bug 683906.  */
+#if (__GNUC__ == 4 && 6 <= __GNUC_MINOR__) || 4 < __GNUC__
+# pragma GCC diagnostic push
+# 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
 {
@@ -61,21 +68,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
+
 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)
 {