X-Git-Url: https://git.distorted.org.uk/~mdw/clg/blobdiff_plain/cc74b2c987edc3e2bc85413e92f33e2690a32b1c..e7f1852fd2ddecf0fe99df30c3fd1f8a90c13607:/gdk/gdk.lisp diff --git a/gdk/gdk.lisp b/gdk/gdk.lisp index 6528895..cc1af87 100644 --- a/gdk/gdk.lisp +++ b/gdk/gdk.lisp @@ -20,7 +20,7 @@ ;; 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.20 2006-02-08 22:20:22 espen Exp $ +;; $Id: gdk.lisp,v 1.25 2006-04-11 18:28:38 espen Exp $ (in-package "GDK") @@ -422,14 +422,12 @@ ;;; Cursor -(defmethod initialize-instance ((cursor cursor) &key type mask fg bg - (x 0) (y 0) (display (display-get-default))) - (setf - (foreign-location cursor) - (etypecase type - (keyword (%cursor-new-for-display display type)) - (pixbuf (%cursor-new-from-pixbuf display type x y)) - (pixmap (%cursor-new-from-pixmap type mask fg bg x y))))) +(defmethod allocate-foreign ((cursor cursor) &key type mask fg bg + (x 0) (y 0) (display (display-get-default))) + (etypecase type + (keyword (%cursor-new-for-display display type)) + (pixbuf (%cursor-new-from-pixbuf display type x y)) + (pixmap (%cursor-new-from-pixmap type mask fg bg x y)))) (defbinding %cursor-new-for-display () pointer @@ -505,13 +503,24 @@ ;;; Color +(defbinding %color-copy () pointer + (location pointer)) + +(defmethod allocate-foreign ((color color) &rest initargs) + (declare (ignore color initargs)) + ;; Color structs are allocated as memory chunks by gdk, and since + ;; there is no gdk_color_new we have to use this hack to get a new + ;; color chunk + (with-allocated-memory (location #.(foreign-size (find-class 'color))) + (%color-copy location))) + (defun %scale-value (value) (etypecase value (integer value) (float (truncate (* value 65535))))) (defmethod initialize-instance ((color color) &rest initargs - &key red green blue) + &key (red 0.0) (green 0.0) (blue 0.0)) (declare (ignore initargs)) (call-next-method) (with-slots ((%red red) (%green green) (%blue blue)) color @@ -520,15 +529,25 @@ %green (%scale-value green) %blue (%scale-value blue)))) +(defbinding %color-parse () boolean + (spec string) + (color color :return)) + +(defun color-parse (spec &optional (color (make-instance 'color))) + (multiple-value-bind (succeeded-p color) (%color-parse spec color) + (if succeeded-p + color + (error "Parsing color specification ~S failed." spec)))) + (defun ensure-color (color) (etypecase color (null nil) (color color) + (string (color-parse color)) (vector - (make-instance - 'color :red (svref color 0) :green (svref color 1) - :blue (svref color 2))))) - + (make-instance 'color + :red (svref color 0) :green (svref color 1) :blue (svref color 2))))) + ;;; Drawable @@ -690,9 +709,15 @@ (defbinding keyval-name () string (keyval unsigned-int)) -(defbinding keyval-from-name () unsigned-int +(defbinding %keyval-from-name () unsigned-int (name string)) +(defun keyval-from-name (name) + "Returns the keysym value for the given key name or NIL if it is not a valid name." + (let ((keyval (%keyval-from-name name))) + (unless (zerop keyval) + keyval))) + (defbinding keyval-to-upper () unsigned-int (keyval unsigned-int))