[Gd-chatter] r11406 - in branches/opendylan-melange: gobject2-tool gtk gtk-c-ffi gtk-duim

hannes at gwydiondylan.org hannes at gwydiondylan.org
Fri Jun 15 02:15:13 CEST 2007


Author: hannes
Date: Fri Jun 15 02:15:09 2007
New Revision: 11406

Modified:
   branches/opendylan-melange/gobject2-tool/gobject2-tool.c
   branches/opendylan-melange/gtk-c-ffi/gtk-2-10-win32.dylan
   branches/opendylan-melange/gtk-c-ffi/gtk-2-8-linux.dylan
   branches/opendylan-melange/gtk-duim/gtk-dialogs.dylan
   branches/opendylan-melange/gtk-duim/gtk-gadgets.dylan
   branches/opendylan-melange/gtk-duim/gtk-mirror.dylan
   branches/opendylan-melange/gtk-duim/gtk-port.dylan
   branches/opendylan-melange/gtk/gtk.dylan
   branches/opendylan-melange/gtk/module.dylan
   branches/opendylan-melange/gtk/support.c
Log:
Job: fd
*subclass GtkFixed because it changes child sizes, which is taken care of by DUIM
*box a <gtk-table-control> in a GtkScrolledWindow, this should be lifted to all scrolling lists [list, tree]
*show child windows after creation, otherwise size requests do not work
*threading model is platform-specific in gtk

Modified: branches/opendylan-melange/gobject2-tool/gobject2-tool.c
==============================================================================
--- branches/opendylan-melange/gobject2-tool/gobject2-tool.c	(original)
+++ branches/opendylan-melange/gobject2-tool/gobject2-tool.c	Fri Jun 15 02:15:09 2007
@@ -448,6 +448,7 @@
 	    "define module gtk-properties\n\n"
 	    "  use common-dylan;\n"
 	    "  use gtk-internal;\n\n"
+            "  use gtk-support;\n\n"
 	    "  export\n");
 
   g_print("module: gtk-internal\n\n"

Modified: branches/opendylan-melange/gtk-c-ffi/gtk-2-10-win32.dylan
==============================================================================
--- branches/opendylan-melange/gtk-c-ffi/gtk-2-10-win32.dylan	(original)
+++ branches/opendylan-melange/gtk-c-ffi/gtk-2-10-win32.dylan	Fri Jun 15 02:15:09 2007
@@ -45032,7 +45032,7 @@
   c-name: "gtk_file_chooser_button_set_focus_on_click";
 end;
 
-define C-subtype <_GtkFixed> (<_GtkContainer>, <_AtkImplementorIface>) end;
+define open C-subtype <_GtkFixed> (<_GtkContainer>, <_AtkImplementorIface>) end;
 define constant <GtkFixed> = <_GtkFixed>;
 
 define C-struct <_GtkFixedClass>

Modified: branches/opendylan-melange/gtk-c-ffi/gtk-2-8-linux.dylan
==============================================================================
--- branches/opendylan-melange/gtk-c-ffi/gtk-2-8-linux.dylan	(original)
+++ branches/opendylan-melange/gtk-c-ffi/gtk-2-8-linux.dylan	Fri Jun 15 02:15:09 2007
@@ -42129,7 +42129,7 @@
   c-name: "gtk_file_chooser_button_set_width_chars";
 end;
 
-define C-subtype <_GtkFixed> (<_GtkContainer>, <_AtkImplementorIface>) end;
+define open C-subtype <_GtkFixed> (<_GtkContainer>, <_AtkImplementorIface>) end;
 define constant <GtkFixed> = <_GtkFixed>;
 
 define C-struct <_GtkFixedClass>

Modified: branches/opendylan-melange/gtk-duim/gtk-dialogs.dylan
==============================================================================
--- branches/opendylan-melange/gtk-duim/gtk-dialogs.dylan	(original)
+++ branches/opendylan-melange/gtk-duim/gtk-dialogs.dylan	Fri Jun 15 02:15:09 2007
@@ -364,7 +364,7 @@
         gtk-file-chooser-get-filename(dialog); // FIXME: leaks the filename C string
       end;
     gtk-widget-destroy(dialog);
-    values(filename, #f)
+    values(as(<byte-string>, filename), #f)
   end;
 end method do-choose-file;
 

Modified: branches/opendylan-melange/gtk-duim/gtk-gadgets.dylan
==============================================================================
--- branches/opendylan-melange/gtk-duim/gtk-gadgets.dylan	(original)
+++ branches/opendylan-melange/gtk-duim/gtk-gadgets.dylan	Fri Jun 15 02:15:09 2007
@@ -1391,6 +1391,36 @@
   values(<gtk-table-control>, #f)
 end method class-for-make-pane;
 
+define method do-compose-space
+    (gadget :: <gtk-table-control>, #key width, height)
+ => (space-req :: <space-requirement>)
+  debug-message("do-compose-space(%= , %d, %d)", gadget, width, height);
+  let mirror = sheet-direct-mirror(gadget);
+  if (mirror)
+    let widget = scrolled-window(mirror);
+    gtk-space-requirements(gadget, widget)
+  else
+    gtk-debug("Composing space on an unmirrored gadget!");
+    default-space-requirement(gadget, width: width, height: height)
+  end
+end method do-compose-space;
+
+
+define class <table-mirror> (<gadget-mirror>)
+  constant slot scrolled-window, required-init-keyword: scrolled-window:;
+end;
+
+define method set-mirror-parent (child :: <table-mirror>, parent :: <widget-mirror>) => ()
+  with-gdk-lock
+    gtk-container-add(parent.mirror-widget, child.scrolled-window);
+  end;
+end;
+
+define method set-mirror-size
+    (mirror :: <table-mirror>, width :: <integer>, height :: <integer>)
+ => ()
+  set-widget-size(mirror, mirror.scrolled-window, width, height);
+end;
 define sealed method make-gtk-mirror
     (gadget :: <gtk-table-control>)
  => (mirror :: <gadget-mirror>)
@@ -1403,10 +1433,27 @@
       let column = gtk-tree-view-column-new();
       gtk-tree-view-column-pack-start(column, renderer, 0);
       gtk-tree-view-column-add-attribute(column, renderer, "text", i);
+      //gtk-tree-view-column-set-resizable(column, 1);
       gtk-tree-view-append-column(widget, column);
     end;
-    make(<gadget-mirror>,
+    gtk-tree-view-set-fixed-height-mode(widget, 1);
+    let scrolled-win
+      = gtk-scrolled-window-new(null-pointer(<GtkAdjustment>),
+                                null-pointer(<GtkAdjustment>));
+    gtk-container-add(scrolled-win, widget);
+    let (#rest policies)
+      = select (gadget-scroll-bars(gadget))
+          #f, #"none" => values($GTK-POLICY-NEVER, $GTK-POLICY-NEVER);
+          #t, #"dynamic" => values($GTK-POLICY-AUTOMATIC, $GTK-POLICY-AUTOMATIC);
+          #"both" => values($GTK-POLICY-ALWAYS, $GTK-POLICY-ALWAYS);
+          #"horizontal" => values($GTK-POLICY-ALWAYS, $GTK-POLICY-AUTOMATIC);
+          #"vertical" => values($GTK-POLICY-AUTOMATIC, $GTK-POLICY-ALWAYS);
+        end;
+    apply(gtk-scrolled-window-set-policy, scrolled-win, policies);
+    gtk-widget-show(scrolled-win);
+    make(<table-mirror>,
          widget: widget,
+         scrolled-window: scrolled-win,
          sheet:  gadget);
   end;
 end method make-gtk-mirror;
@@ -1446,14 +1493,30 @@
 end;
 
 define sealed method do-add-item
-    (pane :: <gtk-table-control>, item :: <gtk-table-item>, #key after) => ()
-//  let items = pane.gadget-items;
-//  let index = (after & position(items, after)) | size(items);
-//  insert-at!(items, item, index);
-//  item.%table := pane;
-  let mirror = sheet-direct-mirror(pane);
-  when (mirror)
-    update-list-control-items(pane, mirror);
+    (gadget :: <gtk-table-control>, item :: <gtk-table-item>, #key after) => ()
+  let mirror = sheet-direct-mirror(gadget);
+  let columns = table-control-columns(gadget);
+  let model = gadget.store-model;
+  let item = item-object(item);
+  mirror & with-gdk-lock
+    with-stack-structure (iter :: <GtkTreeIter>)
+      gtk-list-store-append(model, iter);
+      with-stack-structure (gvalue :: <GValue>)
+        g-value-nullify(gvalue);
+        g-value-set-value(gvalue, gadget-items(gadget).size);
+        gtk-list-store-set-value(model, iter, 0, gvalue);
+        for (c in columns, j from 1)
+          let generator = table-column-generator(c);
+          let label = gadget-item-label(gadget, generator(item));
+          unless (instance?(label, <string>))
+            label := format-to-string("%=", label);
+          end;
+          g-value-nullify(gvalue);
+          g-value-set-value(gvalue, label);
+          gtk-list-store-set-value(model, iter, j, gvalue);
+        end;
+      end;
+    end;
   end;
 end;
 
@@ -1528,6 +1591,7 @@
         end;
       end;
     end;
+    //gtk-tree-view-columns-autosize(widget);
   end;
 end method update-list-control-items;
 
@@ -1572,7 +1636,7 @@
 end;
 
 define sealed domain make (singleton(<gtk-tree-node>));
-define selaed domain initialize (<gtk-tree-node>);
+define sealed domain initialize (<gtk-tree-node>);
 
 define sealed method do-make-item
     (pane :: <gtk-tree-control>, class == <tree-node>, #key object)

Modified: branches/opendylan-melange/gtk-duim/gtk-mirror.dylan
==============================================================================
--- branches/opendylan-melange/gtk-duim/gtk-mirror.dylan	(original)
+++ branches/opendylan-melange/gtk-duim/gtk-mirror.dylan	Fri Jun 15 02:15:09 2007
@@ -62,7 +62,9 @@
  => (mirror :: <gtk-mirror>)
   let parent = sheet-device-parent(sheet);
   let mirror = make-gtk-mirror(sheet);
-  with-gdk-lock gtk-widget-realize(mirror.mirror-widget) end;
+  unless (instance?(mirror, <top-level-mirror>))
+    with-gdk-lock gtk-widget-show(mirror.mirror-widget) end;
+  end;
   install-event-handlers(sheet, mirror);
   update-mirror-attributes(sheet, mirror);
   set-mirror-parent(mirror, sheet-direct-mirror(parent));
@@ -304,7 +306,7 @@
 define method do-make-gtk-mirror 
     (sheet :: <mirrored-sheet-mixin>)
 => (mirror :: <widget-mirror>)
-  let widget = with-gdk-lock gtk-fixed-new() end;
+  let widget = with-gdk-lock fixed-new() end;
   //---*** We really want to switch this off entirely...
   //gtk-container-set-resize-mode(widget, $GTK-RESIZE-QUEUE);
   make(<fixed-container-mirror>,
@@ -467,8 +469,11 @@
 define method set-mirror-size
     (mirror :: <widget-mirror>, width :: <integer>, height :: <integer>)
  => ()
-  let widget = mirror.mirror-widget;
-  gtk-debug("set-mirror-size for %= to %=x%=", mirror-widget(mirror), width, height);
+  set-widget-size(mirror, mirror.mirror-widget, width, height);
+end;
+
+define method set-widget-size (mirror :: <widget-mirror>, widget :: <GtkWidget>, width :: <integer>, height :: <integer>)
+  gtk-debug("set-mirror-size for %= to %=x%=", widget, width, height);
   let (left, top) = box-position(mirror.%region);
   with-stack-structure (allocation :: <GtkAllocation>)
     allocation.GdkRectangle-x      := left;
@@ -478,13 +483,8 @@
     with-gdk-lock
       gtk-widget-size-allocate(widget, allocation)
     end
-  end
-  // ---*** debugging code
-//  let (new-width, new-height) = widget-size(widget);
-//  if (new-width ~== width | new-height ~== height)
-//    duim-debug-message("mirror not resized!: %= wanted: %d x %d, but still: %d x %d", mirror.mirror-sheet, width, height, new-width, new-height);
-//  end;
-end method set-mirror-size;
+  end;
+end method;
 
 define method set-mirror-size
     (mirror :: <drawing-area-mirror>, width :: <integer>, height :: <integer>)

Modified: branches/opendylan-melange/gtk-duim/gtk-port.dylan
==============================================================================
--- branches/opendylan-melange/gtk-duim/gtk-port.dylan	(original)
+++ branches/opendylan-melange/gtk-duim/gtk-port.dylan	Fri Jun 15 02:15:09 2007
@@ -34,7 +34,10 @@
 define sideways method class-for-make-port
     (type == #"gtk", #rest initargs, #key)
  => (class :: <class>, initargs :: false-or(<sequence>))
-  values(<gtk-port>, concatenate(initargs, #(event-processor-type:, #"n+1")))
+  values(<gtk-port>,
+         concatenate(initargs,
+                     list(event-processor-type:,
+                          if ($os-name == #"win32") #"n" else #"n+1" end)))
 end method class-for-make-port;
 
 define sealed method port-type

Modified: branches/opendylan-melange/gtk/gtk.dylan
==============================================================================
--- branches/opendylan-melange/gtk/gtk.dylan	(original)
+++ branches/opendylan-melange/gtk/gtk.dylan	Fri Jun 15 02:15:09 2007
@@ -50,6 +50,17 @@
   c-name: "gtk_dialog_get_action_area";
 end;
 
+define C-subtype <_Fixed> (<_GtkFixed>) end;
+define constant <Fixed> = <_Fixed>;
+define C-function fixed-new
+  result fixed :: <GtkWidget>;
+  c-name: "fixed_new";
+end;
+
+define C-function fixed-get-type
+  result type :: <GType>;
+  c-name: "fixed_get_type";
+end;
 
 define macro with-gdk-lock
   { with-gdk-lock ?:body end }
@@ -324,6 +335,8 @@
           => make(<GtkTreeIter>, address: address-thunk());
         gtk-tree-path-get-type()
           => make(<GtkTreePath>, address: address-thunk());
+        fixed-get-type()
+          => make(<Fixed>, address: address-thunk());
         otherwise       => error("Unknown Gtype %=", g-type);
       end select;
     end if;

Modified: branches/opendylan-melange/gtk/module.dylan
==============================================================================
--- branches/opendylan-melange/gtk/module.dylan	(original)
+++ branches/opendylan-melange/gtk/module.dylan	Fri Jun 15 02:15:09 2007
@@ -10,6 +10,8 @@
   use dylan-primitives;
   use dylan-extensions, import: { debug-name, integer-as-raw, raw-as-integer };
 
+  export fixed-new;
+
   export g-signal-connect, initialize-gtk,
     gtk-widget-get-window,
     gtk-widget-get-state,

Modified: branches/opendylan-melange/gtk/support.c
==============================================================================
--- branches/opendylan-melange/gtk/support.c	(original)
+++ branches/opendylan-melange/gtk/support.c	Fri Jun 15 02:15:09 2007
@@ -2,6 +2,46 @@
 #include <gtk/gtkwidget.h>
 #include <gdk/gdkwindow.h>
 #include <gtk/gtkdialog.h>
+#include <gtk/gtkfixed.h>
+
+typedef GtkFixed Fixed;
+typedef GtkFixedClass FixedClass;
+
+static void fixed_size_allocate (GtkWidget *widget, GtkAllocation *allocation);
+
+G_DEFINE_TYPE (Fixed, fixed, GTK_TYPE_FIXED)
+
+static void
+fixed_class_init (FixedClass *class) {
+  GTK_WIDGET_CLASS(class)->size_allocate = fixed_size_allocate;
+}
+
+static void
+fixed_init (Fixed *fixed) {
+}
+
+GtkWidget *
+fixed_new (void)
+{
+  return g_object_new (fixed_get_type (), NULL);
+}
+
+static void
+fixed_size_allocate (GtkWidget *widget, GtkAllocation *allocation)
+{
+
+  widget->allocation = *allocation;
+
+  if (!GTK_WIDGET_NO_WINDOW (widget))
+    {
+      if (GTK_WIDGET_REALIZED (widget))
+	gdk_window_move_resize (widget->window,
+				allocation->x, 
+				allocation->y,
+				allocation->width, 
+				allocation->height);
+    }
+}
 
 GType g_type_from_instance (GTypeInstance* instance) {
     return G_TYPE_FROM_INSTANCE(instance);



More information about the chatter mailing list