[Gd-chatter] r11421 - branches/opendylan-melange/gtk-duim
andreas at gwydiondylan.org
andreas at gwydiondylan.org
Tue Jul 3 23:34:49 CEST 2007
Author: andreas
Date: Tue Jul 3 23:34:47 2007
New Revision: 11421
Modified:
branches/opendylan-melange/gtk-duim/gtk-gadgets.dylan
branches/opendylan-melange/gtk-duim/gtk-menus.dylan
Log:
job: fd
* Popup menus, not quite working yet
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 Tue Jul 3 23:34:47 2007
@@ -1157,16 +1157,16 @@
let widget = mirror-widget(mirror);
let selection = with-gdk-lock gtk-tree-view-get-selection(widget) end;
g-signal-connect(selection, "changed", method (#rest args) handle-gtk-select-row-event(sheet) end);
- //duim-g-signal-connect(sheet, #"button-press-event") (widget, event, #rest args) handle-gtk-button-press-event(sheet, event) end;
- //with-gdk-lock
- // gtk-widget-add-events(widget, $GDK-BUTTON-PRESS-MASK);
- //end
+ duim-g-signal-connect(sheet, #"button-press-event") (widget, event, #rest args) handle-gtk-button-press-event(sheet, event) end;
+ with-gdk-lock
+ gtk-widget-add-events(widget, $GDK-BUTTON-PRESS-MASK);
+ end
end method install-event-handlers;
define sealed method handle-gtk-select-row-event
(gadget :: <gtk-tree-view-control-mixin>)
=> (handled? :: <boolean>)
- gtk-debug("Clicked on list control!");
+ gtk-debug("Selected list control item!");
let mirror = gadget.sheet-direct-mirror;
let widget = mirror-widget(mirror);
let selection = gtk-tree-view-get-selection(widget);
@@ -1215,6 +1215,12 @@
distribute-activate-callback(gadget);
end;
#t
+ elseif ((event.GdkEventButton-type == $GDK-BUTTON-PRESS) & (event.GdkEventButton-button == 3)) //right click
+ gtk-debug("right clicked on list control!");
+ when (gadget-popup-menu-callback(gadget))
+ distribute-popup-menu-callback(gadget, 0, x: round(event.GdkEventButton-x), y: round(event.GdkEventButton-y));
+ end;
+ #t
end
end method handle-gtk-button-press-event;
Modified: branches/opendylan-melange/gtk-duim/gtk-menus.dylan
==============================================================================
--- branches/opendylan-melange/gtk-duim/gtk-menus.dylan (original)
+++ branches/opendylan-melange/gtk-duim/gtk-menus.dylan Tue Jul 3 23:34:47 2007
@@ -30,6 +30,18 @@
mirror-widget(child))
end
end method set-mirror-parent;
+
+define method set-mirror-parent
+ (child :: <menu-button-mirror>, parent :: <popup-menu-mirror>)
+ => ()
+ duim-debug-message("Adding %= to popup menu %=",
+ gadget-label(mirror-sheet(child)),
+ gadget-label(mirror-sheet(parent)));
+ with-gdk-lock
+ gtk-menu-shell-append(mirror-widget(parent),
+ mirror-widget(child))
+ end
+end method set-mirror-parent;
define method set-mirror-parent
(child :: <menu-mirror>, parent :: <menu-mirror>)
@@ -405,13 +417,28 @@
sealed slot menu-record-selection? = #f;
end class <gtk-menu>;
+define sealed class <gtk-popup-menu> (<gtk-menu>)
+end;
define sealed method class-for-make-pane
- (framem :: <gtk-frame-manager>, class == <menu>, #key)
+ (framem :: <gtk-frame-manager>, class == <menu>, #key owner)
=> (class :: <class>, options :: false-or(<sequence>))
- values(<gtk-menu>, #f)
+ if (owner)
+ values(<gtk-popup-menu>, #f);
+ else
+ values(<gtk-menu>, #f)
+ end;
end method class-for-make-pane;
define sealed method make-gtk-mirror
+ (gadget :: <gtk-popup-menu>) => (mirror :: <menu-mirror>)
+ let widget = with-gdk-lock gtk-menu-new() end;
+ let selection-owner = menu-record-selection?(gadget) & gadget;
+ make(<popup-menu-mirror>,
+ widget: widget,
+ sheet: gadget,
+ selection-owner: selection-owner)
+end;
+define sealed method make-gtk-mirror
(gadget :: <gtk-menu>)
=> (mirror :: <menu-mirror>)
let (text, image, mnemonic, index)
@@ -420,35 +447,27 @@
ignoring("menu with image")
end;
let widget = with-gdk-lock gtk-menu-item-new-with-label(text) end;
- let owner = menu-owner(gadget);
- let owner = if (frame?(owner)) top-level-sheet(owner) else owner end;
- make-menu-mirror-for-owner(owner, gadget, widget)
-end method make-gtk-mirror;
-
-define sealed method make-menu-mirror-for-owner
- (owner :: <sheet>, gadget :: <gtk-menu>, widget :: <GtkMenuItem>)
- => (mirror :: <popup-menu-mirror>)
- let selection-owner = menu-record-selection?(gadget) & gadget;
- make(<popup-menu-mirror>,
- widget: widget,
- sheet: gadget,
- selection-owner: selection-owner)
-end method make-menu-mirror-for-owner;
-
-define sealed method make-menu-mirror-for-owner
- (owner == #f, gadget :: <gtk-menu>, widget :: <GtkMenuItem>)
- => (mirror :: <menu-mirror>)
make(<menu-mirror>,
widget: widget,
sheet: gadget)
-end method make-menu-mirror-for-owner;
+end method make-gtk-mirror;
define sealed method map-mirror
- (_port :: <gtk-port>, menu :: <gtk-menu>,
+ (_port :: <gtk-port>, menu :: <gtk-popup-menu>,
mirror :: <popup-menu-mirror>) => ()
- ignoring("map-mirror on a popup menu")
+ next-method();
+ with-gdk-lock
+ gtk-menu-popup(mirror.mirror-widget, null-pointer(<GtkWidget>), null-pointer(<GtkWidget>), null-pointer(<GtkMenuPositionFunc>),
+ null-pointer(<GPointer>), 3, 0);
+ end
end method map-mirror;
+define sealed method set-mirror-parent (menu :: <popup-menu-mirror>, widget :: <gtk-mirror>) => ()
+ with-gdk-lock
+ gtk-menu-attach-to-widget(menu.mirror-widget, menu.mirror-sheet.menu-owner.top-level-sheet.sheet-direct-mirror.mirror-widget, null-pointer(<GtkMenuDetachFunc>));
+ end
+end;
+
/*---*** Should be called just before a menu pops up
define method handle-menu-update
(menu :: <gtk-menu>) => ()
More information about the chatter
mailing list