[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