Update of /project/mcclim/cvsroot/mcclim/Backends/gtkairo
In directory clnet:/tmp/cvs-serv10515
Modified Files:
BUGS gadgets.lisp medium.lisp
Log Message:
Optimize Goatee cursor drawing to make the CLIM Listener usable.
* medium.lisp (FLIPPING-REGION): New accessor.
(APPLY-FLIPPING-INK): Draw only the affected region. ((SYNC-INK
FLIPPING-INK)): Default to the entire sheet.
(MEDIUM-DRAW-RECTANGLE*): Set flipping-region to the affected
rectangle.
Fix menu bar height:
* gadgets.lisp ((compose-space gtk-menu-bar)): Rewritten similar
to the default method.
--- /project/mcclim/cvsroot/mcclim/Backends/gtkairo/BUGS 2006/05/13 19:37:29 1.10
+++ /project/mcclim/cvsroot/mcclim/Backends/gtkairo/BUGS 2006/06/10 10:08:49 1.11
@@ -40,7 +40,7 @@
On windows, all we get is a sans serif font. No serif and notably
no monospace font, breaking climacs like bug 3 did.
-7a.
+(WONTFIX) 7a. [fixed for draw-rectangle, good enough for now]
flipping ink takes time proportional to the with the size of the
window, not with the size of the shape being drawn
@@ -98,7 +98,7 @@
but that doesn't work for gsharp when drawing ellipses. Find out
what this is all about.
-18.
+(WONTFIX) 18. [see 7a, good enough for now]
Flipping ink optimization: As suggested by Gilbert, make the temporary
pixmap just large enough for the clipping region and the currently
visible part of a (scrolled) sheet. Right now we're copying the
@@ -117,3 +117,10 @@
22.
medium-draw-ellipse* needs a rewrite.
+
+23.
+ Beirc problem: When connecting to a server, the first receiver pane
+ is created, and suddenly the windows gets unusably large, hiding the
+ interactor. Replacing the :min-height 800 in receivers.lisp with
+ :min-height 400 :max-height 400 fixes that, but CLX doesn't have the
+ same problem.
--- /project/mcclim/cvsroot/mcclim/Backends/gtkairo/gadgets.lisp 2006/05/13 19:37:29 1.5
+++ /project/mcclim/cvsroot/mcclim/Backends/gtkairo/gadgets.lisp 2006/06/10 10:08:49 1.6
@@ -301,7 +301,23 @@
(defmethod compose-space ((gadget gtk-menu-bar) &key width height)
(declare (ignore width height))
- (make-space-requirement :height 20 :min-height 20 :max-height 20))
+ (let* ((widget (native-widget gadget))
+ (widgetp widget)
+ (item nil))
+ (unless widgetp
+ (setf widget (realize-native-widget gadget))
+ (setf item (gtk_menu_item_new_with_label "foo"))
+ (gtk_menu_shell_append widget item)
+ (gtk_widget_show_all widget))
+ (prog1
+ (cffi:with-foreign-object (r 'gtkrequisition)
+ (gtk_widget_size_request widget r)
+ (cffi:with-foreign-slots ((height) r gtkrequisition)
+ (make-space-requirement :height height
+ :min-height height
+ :max-height height)))
+ (unless widgetp
+ (gtk_widget_destroy widget)))))
;;; Vermischtes
--- /project/mcclim/cvsroot/mcclim/Backends/gtkairo/medium.lisp 2006/05/13 19:37:29 1.7
+++ /project/mcclim/cvsroot/mcclim/Backends/gtkairo/medium.lisp 2006/06/10 10:08:49 1.8
@@ -34,6 +34,7 @@
(cr :initform nil :initarg :cr :accessor cr)
(flipping-original-cr :initform nil :accessor flipping-original-cr)
(flipping-pixmap :initform nil :accessor flipping-pixmap)
+ (flipping-region :accessor flipping-region)
(surface :initarg :surface :accessor surface)
(last-seen-sheet :accessor last-seen-sheet)
(last-seen-region :accessor last-seen-region)))
@@ -216,11 +217,15 @@
(cairo_surface_flush from-surface)
(cairo_surface_flush to-surface)
(let ((gc (gdk_gc_new to-drawable))
- (region (climi::sheet-mirror-region (medium-sheet medium))))
+ (region (flipping-region medium)))
(gdk_gc_set_function gc :xor)
- (gdk_draw_drawable to-drawable gc from-drawable 0 0 0 0
- (floor (bounding-rectangle-max-x region))
- (floor (bounding-rectangle-max-y region)))
+ (gdk_draw_drawable to-drawable gc from-drawable
+ (floor (bounding-rectangle-min-x region))
+ (floor (bounding-rectangle-min-y region))
+ (floor (bounding-rectangle-min-x region))
+ (floor (bounding-rectangle-min-y region))
+ (ceiling (bounding-rectangle-max-x region))
+ (ceiling (bounding-rectangle-max-y region)))
(gdk_gc_unref gc))
(cairo_surface_mark_dirty to-surface))
(cairo_destroy (cr medium))
@@ -244,6 +249,7 @@
(setf (flipping-pixmap medium)
(gdk_pixmap_new drawable width height -1)))))
(setf (cr medium) (gdk_cairo_create pixmap))
+ (setf (flipping-region medium) region)
(cairo_paint (cr medium))
(sync-transformation medium)
(sync-ink medium +white+)))))
@@ -516,6 +522,13 @@
(sync-clipping-region medium (medium-clipping-region medium))
(unless filled
(sync-line-style medium (medium-line-style medium)))
+ (when (flipping-original-cr medium)
+ (setf (flipping-region medium)
+ (transform-region
+ (if (medium-sheet medium)
+ (sheet-native-transformation (medium-sheet medium))
+ clim:+identity-transformation+)
+ (make-rectangle* x1 y1 x2 y2))))
(with-slots (cr) medium
(setf x1 (df x1))
(setf y1 (df y1))