]> git.saurik.com Git - wxWidgets.git/blobdiff - src/gtk/win_gtk.c
Another Unicode fix.
[wxWidgets.git] / src / gtk / win_gtk.c
index 5f6245a89111adcd4e8773b84c69d62d14b464b0..c199d05b9b188cb67ad10ef60193262de91cba5e 100644 (file)
@@ -1,14 +1,14 @@
-/////////////////////////////////////////////////////////////////////////////
-// Name:        wx_gtk.h
-// Purpose:
+////////////////////////////////////////////////////////////////////////////
+// Name:        win_gtk.c
+// Purpose:     native GTK+ widget for wxWindows
 // Author:      Robert Roebling
 // Author:      Robert Roebling
-// Created:     01/02/97
-// Id:
-// Copyright:   (c) 1998 Robert Roebling, Julian Smart and Markus Holzem
+// Id:          $Id$
+// Copyright:   (c) 1998 Robert Roebling
 // Licence:    wxWindows licence
 // Licence:    wxWindows licence
-/////////////////////////////////////////////////////////////////////////////
+/////////////////////////////////////////////////////////////////////////// */
 
 #include "wx/gtk/win_gtk.h"
 
 #include "wx/gtk/win_gtk.h"
+#include "gtk/gtksignal.h"
 
 #ifdef __cplusplus
 extern "C" {
 
 #ifdef __cplusplus
 extern "C" {
@@ -17,7 +17,9 @@ extern "C" {
 static void gtk_myfixed_class_init    (GtkMyFixedClass    *klass);
 static void gtk_myfixed_init          (GtkMyFixed         *myfixed);
 static void gtk_myfixed_map           (GtkWidget        *widget);
 static void gtk_myfixed_class_init    (GtkMyFixedClass    *klass);
 static void gtk_myfixed_init          (GtkMyFixed         *myfixed);
 static void gtk_myfixed_map           (GtkWidget        *widget);
+#if (GTK_MINOR_VERSION == 0)
 static void gtk_myfixed_unmap         (GtkWidget        *widget);
 static void gtk_myfixed_unmap         (GtkWidget        *widget);
+#endif
 static void gtk_myfixed_realize       (GtkWidget        *widget);
 static void gtk_myfixed_size_request  (GtkWidget        *widget,
                                     GtkRequisition   *requisition);
 static void gtk_myfixed_realize       (GtkWidget        *widget);
 static void gtk_myfixed_size_request  (GtkWidget        *widget,
                                     GtkRequisition   *requisition);
@@ -34,12 +36,24 @@ static void gtk_myfixed_add           (GtkContainer     *container,
 static void gtk_myfixed_remove        (GtkContainer     *container,
                                     GtkWidget        *widget);
 static void gtk_myfixed_foreach       (GtkContainer     *container,
 static void gtk_myfixed_remove        (GtkContainer     *container,
                                     GtkWidget        *widget);
 static void gtk_myfixed_foreach       (GtkContainer     *container,
+#if (GTK_MINOR_VERSION > 0)
+                                    gboolean         include_internals,
+#endif
                                     GtkCallback      callback,
                                     gpointer         callback_data);
                                     GtkCallback      callback,
                                     gpointer         callback_data);
+#if (GTK_MINOR_VERSION > 0)
+static GtkType gtk_myfixed_child_type (GtkContainer     *container);
+#endif
+
+#if (GTK_MINOR_VERSION > 0)
+static void  gtk_myfixed_scroll_set_adjustments    (GtkMyFixed   *myfixed,
+                                              GtkAdjustment *hadj,
+                                              GtkAdjustment *vadj);
+#endif
 
 
 
 
-static GtkContainerClass *parent_class = NULL;
 
 
+static GtkContainerClass *parent_class = NULL;
 
 guint
 gtk_myfixed_get_type ()
 
 guint
 gtk_myfixed_get_type ()
@@ -55,8 +69,14 @@ gtk_myfixed_get_type ()
        sizeof (GtkMyFixedClass),
        (GtkClassInitFunc) gtk_myfixed_class_init,
        (GtkObjectInitFunc) gtk_myfixed_init,
        sizeof (GtkMyFixedClass),
        (GtkClassInitFunc) gtk_myfixed_class_init,
        (GtkObjectInitFunc) gtk_myfixed_init,
-       (GtkArgSetFunc) NULL,
+#if (GTK_MINOR_VERSION > 0)
+       /* reserved_1 */ NULL,
+        /* reserved_2 */ NULL,
+        (GtkClassInitFunc) NULL,
+#else
+        (GtkArgSetFunc) NULL,
         (GtkArgGetFunc) NULL,
         (GtkArgGetFunc) NULL,
+#endif
       };
 
       myfixed_type = gtk_type_unique (gtk_container_get_type (), &myfixed_info);
       };
 
       myfixed_type = gtk_type_unique (gtk_container_get_type (), &myfixed_info);
@@ -75,11 +95,17 @@ gtk_myfixed_class_init (GtkMyFixedClass *klass)
   object_class = (GtkObjectClass*) klass;
   widget_class = (GtkWidgetClass*) klass;
   container_class = (GtkContainerClass*) klass;
   object_class = (GtkObjectClass*) klass;
   widget_class = (GtkWidgetClass*) klass;
   container_class = (GtkContainerClass*) klass;
-
+  
+#if (GTK_MINOR_VERSION > 0)
+  parent_class = gtk_type_class (GTK_TYPE_CONTAINER);
+#else
   parent_class = gtk_type_class (gtk_container_get_type ());
   parent_class = gtk_type_class (gtk_container_get_type ());
+#endif
 
   widget_class->map = gtk_myfixed_map;
 
   widget_class->map = gtk_myfixed_map;
+#if (GTK_MINOR_VERSION == 0)
   widget_class->unmap = gtk_myfixed_unmap;
   widget_class->unmap = gtk_myfixed_unmap;
+#endif
   widget_class->realize = gtk_myfixed_realize;
   widget_class->size_request = gtk_myfixed_size_request;
   widget_class->size_allocate = gtk_myfixed_size_allocate;
   widget_class->realize = gtk_myfixed_realize;
   widget_class->size_request = gtk_myfixed_size_request;
   widget_class->size_allocate = gtk_myfixed_size_allocate;
@@ -88,15 +114,50 @@ gtk_myfixed_class_init (GtkMyFixedClass *klass)
 
   container_class->add = gtk_myfixed_add;
   container_class->remove = gtk_myfixed_remove;
 
   container_class->add = gtk_myfixed_add;
   container_class->remove = gtk_myfixed_remove;
+#if (GTK_MINOR_VERSION > 0)
+  container_class->forall = gtk_myfixed_foreach;
+#else
   container_class->foreach = gtk_myfixed_foreach;
   container_class->foreach = gtk_myfixed_foreach;
+#endif
+
+#if (GTK_MINOR_VERSION > 0)
+  container_class->child_type = gtk_myfixed_child_type;
+#endif
+
+#if (GTK_MINOR_VERSION > 0)
+  klass->set_scroll_adjustments = gtk_myfixed_scroll_set_adjustments;
+
+  widget_class->set_scroll_adjustments_signal =
+    gtk_signal_new ("set_scroll_adjustments",
+                   GTK_RUN_LAST,
+                   object_class->type,
+                   GTK_SIGNAL_OFFSET (GtkMyFixedClass, set_scroll_adjustments),
+                   gtk_marshal_NONE__POINTER_POINTER,
+                   GTK_TYPE_NONE, 2, GTK_TYPE_ADJUSTMENT, GTK_TYPE_ADJUSTMENT);
+#endif
 }
 
 }
 
+#if (GTK_MINOR_VERSION > 0)
+static GtkType
+gtk_myfixed_child_type (GtkContainer     *container)
+{
+  return GTK_TYPE_WIDGET;
+}
+#endif
+
 static void
 gtk_myfixed_init (GtkMyFixed *myfixed)
 {
   GTK_WIDGET_UNSET_FLAGS (myfixed, GTK_NO_WINDOW);
 static void
 gtk_myfixed_init (GtkMyFixed *myfixed)
 {
   GTK_WIDGET_UNSET_FLAGS (myfixed, GTK_NO_WINDOW);
-  GTK_WIDGET_SET_FLAGS (myfixed, GTK_BASIC);
   
   
+#if (GTK_MINOR_VERSION == 0)
+  GTK_WIDGET_SET_FLAGS (myfixed, GTK_BASIC);
+#endif
+
+#if (GTK_MINOR_VERSION > 0)
+  myfixed->shadow_type = GTK_SHADOW_NONE;
+#endif
+
   myfixed->children = NULL;
 }
 
   myfixed->children = NULL;
 }
 
@@ -107,37 +168,39 @@ gtk_myfixed_new ()
 
   myfixed = gtk_type_new (gtk_myfixed_get_type ());
   
 
   myfixed = gtk_type_new (gtk_myfixed_get_type ());
   
-  myfixed->scroll_offset_x = 0;
-  myfixed->scroll_offset_y = 0;
-  
   return GTK_WIDGET (myfixed);
 }
 
   return GTK_WIDGET (myfixed);
 }
 
-void       
-gtk_myfixed_set_offset (GtkMyFixed     *myfixed,
-                        gint16         x,
-                       gint16         y)
+#if (GTK_MINOR_VERSION > 0)
+void  gtk_myfixed_scroll_set_adjustments (GtkMyFixed     *myfixed,
+                                              GtkAdjustment *hadj,
+                                              GtkAdjustment *vadj)
+{
+   /* OK, this is embarassing, but this function has to be here */
+}
+
+void 
+gtk_myfixed_set_shadow_type (GtkMyFixed   *myfixed,
+                             GtkShadowType  type)
 {
 {
-  GtkWidget *widget;
   g_return_if_fail (myfixed != NULL);
   g_return_if_fail (GTK_IS_MYFIXED (myfixed));
   g_return_if_fail (myfixed != NULL);
   g_return_if_fail (GTK_IS_MYFIXED (myfixed));
-  
-  myfixed->scroll_offset_x = x;
-  myfixed->scroll_offset_y = y;
-  
-  widget = GTK_WIDGET( myfixed );
-  
-  if (GTK_WIDGET_REALIZED( GTK_WIDGET(myfixed) ))
-    gdk_window_move_resize (widget->window,
-                           widget->allocation.x + x, 
-                           widget->allocation.y + y,
-                            32000, 
-                           32000);
+
+  if ((GtkShadowType) myfixed->shadow_type != type)
+    {
+      myfixed->shadow_type = type;
+
+      if (GTK_WIDGET_VISIBLE (myfixed))
+       {
+         gtk_widget_size_allocate (GTK_WIDGET (myfixed), &(GTK_WIDGET (myfixed)->allocation));
+         gtk_widget_queue_draw (GTK_WIDGET (myfixed));
+       }
+    }
 }
 }
+#endif
 
 void
 
 void
-gtk_myfixed_put (GtkMyFixed       *myfixed,
+gtk_myfixed_put (GtkMyFixed   *myfixed,
                GtkWidget      *widget,
                gint16         x,
                gint16         y)
                GtkWidget      *widget,
                gint16         x,
                gint16         y)
@@ -152,7 +215,7 @@ gtk_myfixed_put (GtkMyFixed       *myfixed,
   child_info->widget = widget;
   child_info->x = x;
   child_info->y = y;
   child_info->widget = widget;
   child_info->x = x;
   child_info->y = y;
-
+  
   gtk_widget_set_parent (widget, GTK_WIDGET (myfixed));
 
   myfixed->children = g_list_append (myfixed->children, child_info); 
   gtk_widget_set_parent (widget, GTK_WIDGET (myfixed));
 
   myfixed->children = g_list_append (myfixed->children, child_info); 
@@ -188,6 +251,8 @@ gtk_myfixed_move (GtkMyFixed       *myfixed,
 
       if (child->widget == widget)
         {
 
       if (child->widget == widget)
         {
+         if ((child->x == x) && (child->y == y)) return;
+         
           child->x = x;
           child->y = y;
 
           child->x = x;
           child->y = y;
 
@@ -226,6 +291,7 @@ gtk_myfixed_map (GtkWidget *widget)
     }
 }
 
     }
 }
 
+#if (GTK_MINOR_VERSION == 0)
 static void
 gtk_myfixed_unmap (GtkWidget *widget)
 {
 static void
 gtk_myfixed_unmap (GtkWidget *widget)
 {
@@ -234,23 +300,43 @@ gtk_myfixed_unmap (GtkWidget *widget)
 
   GTK_WIDGET_UNSET_FLAGS (widget, GTK_MAPPED);
 }
 
   GTK_WIDGET_UNSET_FLAGS (widget, GTK_MAPPED);
 }
+#endif
 
 static void
 gtk_myfixed_realize (GtkWidget *widget)
 {
 
 static void
 gtk_myfixed_realize (GtkWidget *widget)
 {
+  GtkMyFixed *myfixed;
   GdkWindowAttr attributes;
   gint attributes_mask;
 
   g_return_if_fail (widget != NULL);
   g_return_if_fail (GTK_IS_MYFIXED (widget));
 
   GdkWindowAttr attributes;
   gint attributes_mask;
 
   g_return_if_fail (widget != NULL);
   g_return_if_fail (GTK_IS_MYFIXED (widget));
 
+  myfixed = GTK_MYFIXED (widget);
+  
   GTK_WIDGET_SET_FLAGS (widget, GTK_REALIZED);
 
   attributes.window_type = GDK_WINDOW_CHILD;
   GTK_WIDGET_SET_FLAGS (widget, GTK_REALIZED);
 
   attributes.window_type = GDK_WINDOW_CHILD;
+  
+#if (GTK_MINOR_VERSION > 0)
+  if (myfixed->shadow_type != GTK_SHADOW_NONE)
+    {
+      attributes.x = 2;
+      attributes.y = 2;
+    }
+  else
+    {
+      attributes.x = 0;
+      attributes.y = 0;
+    }
+  attributes.width = MAX (1, (gint)widget->allocation.width - attributes.x * 2 );
+  attributes.height = MAX (1, (gint)widget->allocation.height - attributes.y * 2 );
+#else
   attributes.x = widget->allocation.x;
   attributes.y = widget->allocation.y;
   attributes.width = 32000;
   attributes.height = 32000;
   attributes.x = widget->allocation.x;
   attributes.y = widget->allocation.y;
   attributes.width = 32000;
   attributes.height = 32000;
+#endif
   attributes.wclass = GDK_INPUT_OUTPUT;
   attributes.visual = gtk_widget_get_visual (widget);
   attributes.colormap = gtk_widget_get_colormap (widget);
   attributes.wclass = GDK_INPUT_OUTPUT;
   attributes.visual = gtk_widget_get_visual (widget);
   attributes.colormap = gtk_widget_get_colormap (widget);
@@ -258,6 +344,7 @@ gtk_myfixed_realize (GtkWidget *widget)
   attributes.event_mask |= 
   GDK_EXPOSURE_MASK    |
   GDK_POINTER_MOTION_MASK      |
   attributes.event_mask |= 
   GDK_EXPOSURE_MASK    |
   GDK_POINTER_MOTION_MASK      |
+  GDK_POINTER_MOTION_HINT_MASK  |
   GDK_BUTTON_MOTION_MASK       |
   GDK_BUTTON1_MOTION_MASK      |
   GDK_BUTTON2_MOTION_MASK      |
   GDK_BUTTON_MOTION_MASK       |
   GDK_BUTTON1_MOTION_MASK      |
   GDK_BUTTON2_MOTION_MASK      |
@@ -315,10 +402,10 @@ gtk_myfixed_size_allocate (GtkWidget     *widget,
                         GtkAllocation *allocation)
 {
   GtkMyFixed *myfixed;
                         GtkAllocation *allocation)
 {
   GtkMyFixed *myfixed;
+  gint border;
   GtkMyFixedChild *child;
   GtkMyFixedChild *child;
-  GtkAllocation child_allocation;
-  GList *children;
-  guint16 border_width;
+  GtkAllocation child_allocation; 
+  GList *children; 
 
   g_return_if_fail (widget != NULL);
   g_return_if_fail (GTK_IS_MYFIXED(widget));
 
   g_return_if_fail (widget != NULL);
   g_return_if_fail (GTK_IS_MYFIXED(widget));
@@ -326,17 +413,28 @@ gtk_myfixed_size_allocate (GtkWidget     *widget,
 
   myfixed = GTK_MYFIXED (widget);
 
 
   myfixed = GTK_MYFIXED (widget);
 
+#if (GTK_MINOR_VERSION > 0)
+  if (myfixed->shadow_type == GTK_SHADOW_NONE)
+    border = 0;
+  else
+    border = 2;
+#else
+  border = 0;
+#endif
+
   widget->allocation = *allocation;
   if (GTK_WIDGET_REALIZED (widget))
   widget->allocation = *allocation;
   if (GTK_WIDGET_REALIZED (widget))
-    gdk_window_move_resize (widget->window,
-                           allocation->x + myfixed->scroll_offset_x, 
-                           allocation->y + myfixed->scroll_offset_y,
-                           32000, 
-                           32000
-                           );
-
-  border_width = GTK_CONTAINER (myfixed)->border_width;
-  
+  {
+    gdk_window_move_resize( widget->window, 
+                            allocation->x+border, allocation->y+border, 
+#if (GTK_MINOR_VERSION > 0)
+                           allocation->width-border*2, allocation->height-border*2
+#else
+                           32000, 32000
+#endif
+                           );
+  }
+
   children = myfixed->children;
   while (children)
     {
   children = myfixed->children;
   while (children)
     {
@@ -345,8 +443,8 @@ gtk_myfixed_size_allocate (GtkWidget     *widget,
       
       if (GTK_WIDGET_VISIBLE (child->widget))
        {
       
       if (GTK_WIDGET_VISIBLE (child->widget))
        {
-         child_allocation.x = child->x + border_width;
-         child_allocation.y = child->y + border_width;
+         child_allocation.x = child->x;
+         child_allocation.y = child->y;
          child_allocation.width = child->widget->requisition.width;
          child_allocation.height = child->widget->requisition.height;
          gtk_widget_size_allocate (child->widget, &child_allocation);
          child_allocation.width = child->widget->requisition.width;
          child_allocation.height = child->widget->requisition.height;
          gtk_widget_size_allocate (child->widget, &child_allocation);
@@ -482,6 +580,9 @@ gtk_myfixed_remove (GtkContainer *container,
 
 static void
 gtk_myfixed_foreach (GtkContainer *container,
 
 static void
 gtk_myfixed_foreach (GtkContainer *container,
+#if (GTK_MINOR_VERSION > 0)
+                  gboolean      include_internals,
+#endif
                   GtkCallback   callback,
                   gpointer      callback_data)
 {
                   GtkCallback   callback,
                   gpointer      callback_data)
 {