;; TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
;; SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-;; $Id: gdk.lisp,v 1.33 2007/01/14 23:24:11 espen Exp $
+;; $Id: gdk.lisp,v 1.38 2007/06/01 09:17:17 espen Exp $
(in-package "GDK")
;;; Display
+#-debug-ref-counting
+(defmethod print-object ((display display) stream)
+ (if (and (proxy-valid-p display) (slot-boundp display 'name))
+ (print-unreadable-object (display stream :type t :identity nil)
+ (format stream "~S at 0x~X"
+ (display-name display) (pointer-address (foreign-location display))))
+ (call-next-method)))
+
(defbinding %display-open () display
(display-name (or null string)))
(defun display-open (&optional display-name)
- (let ((display (%display-open display-name)))
+ (let ((display (or
+ (%display-open display-name)
+ (error "Opening display failed: ~A" display-name))))
(unless (display-get-default)
(display-set-default display))
display))
(&optional (display (display-get-default))) int
(display display))
+(defun find-display (name)
+ (find name (list-displays) :key #'display-name :test #'string=))
+
+(defun ensure-display (display)
+ (etypecase display
+ (null (display-get-default))
+ (display display)
+ (string
+ (or
+ (find display (list-displays) :key #'display-name :test #'string=)
+ (display-open display)))))
;;; Display manager
(defbinding display-get-default () display)
-(defbinding (display-manager "gdk_display_manager_get") () display-manager)
-
(defbinding (display-set-default "gdk_display_manager_set_default_display")
(display) nil
((display-manager) display-manager)
(display display))
+(defbinding (list-displays "gdk_display_manager_list_displays") ()
+ (gslist (static display))
+ ((display-manager) display-manager))
+
+;; The only purpose of exporting this is to make it possible for
+;; applications to connect to the display-opened signal
+(defbinding (display-manager "gdk_display_manager_get") () display-manager)
+
+(defbinding display-get-core-pointer
+ (&optional (display (display-get-default))) device
+ (display display))
+
;;; Primitive graphics structures (points, rectangles and regions)
(location pointer))
(defmethod allocate-foreign ((region region) &key rectangle polygon fill-rule)
- (declare (ignore initargs))
(cond
((and rectangle polygon)
(error "Only one of the keyword arguments :RECTANGLE and :POLYGON can be specified"))
(etypecase region
(region region)
((or rectangle vector)
- (make-instance 'region :rectangle (ensure-rectangle region)))))
+ (make-instance 'region :rectangle (ensure-rectangle region)))
+ (list
+ (make-instance 'region :polygon region))))
(defbinding region-get-clipbox (region &optional (rectangle (make-instance 'rectangle))) nil
(region region)
"Obtains the area covered by the region as a list of rectangles."
(multiple-value-bind (location length) (%region-get-rectangles region)
(prog1
- (map-c-vector 'list #'identity location 'point length :get)
+ (map-c-vector 'list #'identity location '(inlined rectangle) length :get)
(deallocate-memory location))))
(defbinding region-empty-p () boolean
(dy int))
(defbinding region-intersect (source1 source2) nil
- (source1 region)
+ ((ensure-region source1) region :in/return)
((ensure-region source2) region))
(defbinding region-union (source1 source2) nil
- (source1 region)
+ ((ensure-region source1) region :in/return)
((ensure-region source2) region))
(defbinding region-subtract (source1 source2) nil
- (source1 region)
+ ((ensure-region source1) region :in/return)
((ensure-region source2) region))
(defbinding region-xor (source1 source2) nil
- (source1 region)
+ ((ensure-region source1) region :in/return)
((ensure-region source2) region))
(dx int)
(dy int))
+#?(pkg-exists-p "gtk+-2.0" :atleast-version "2.8.0")
+(defbinding window-move-region (window region dx dy) nil
+ (window window)
+ ((ensure-region region) region)
+ (dx int)
+ (dy int))
+
(defbinding window-reparent () nil
(window window)
(new-parent window)
(defun window-shape-combine (window shape offset-x offset-y)
(etypecase shape
- (nil (%window-shape-combine-region window nil 0 0)
+ (null (%window-shape-combine-region window nil 0 0))
(region (%window-shape-combine-region window shape offset-x offset-y))
- (bitmask (window-shape-combine-mask window shape offset-x offset-y)))))
+ (bitmap (window-shape-combine-mask window shape offset-x offset-y))))
(defbinding window-set-child-shapes () nil
(window window))
(defun window-input-shape-combine (window shape x y)
(etypecase shape
- (nil (%window-input-shape-combine-region window nil 0 0)
- (region (%window-input-shape-combine-region window shape x y))
- (bitmask (%window-input-shape-combine-mask window shape x y)))))
+ (null (%window-input-shape-combine-region window nil 0 0))
+ (region (%window-input-shape-combine-region window shape x y))
+ (bitmap (%window-input-shape-combine-mask window shape x y))))
(defbinding window-set-child-input-shapes () nil
(window window))
;; (defbinding cairo-region () nil
;; (cr cairo:context)
;; (region region))
+
+ (defbinding (cairo-surface-get-window "clg_gdk_cairo_surface_get_window") () window
+ (surface cairo:surface))
)