source: trunk/source/examples/cocoa/easygui/events.lisp @ 11306

Last change on this file since 11306 was 11306, checked in by gb, 11 years ago

Don't try to ignore lambda-list keywords. (Still not right, but less
embarrassing.)

File size: 3.1 KB
Line 
1(in-package :easygui)
2
3;;; Event handling basics
4
5(defmacro define-chaining-responder-method (class-name
6                                            (objc-name lisp-name)
7                                            (self-arg event-arg)
8                                            &body arg-compute-forms)
9  `(objc:defmethod (,objc-name :void) ((,self-arg ,class-name)
10                                       ,event-arg)
11     (let ((ev-class (class-name
12                      (class-of (easygui-view-of ,self-arg)))))
13       (if (find-method #',lisp-name nil `(,ev-class) nil) ; TODO: doesn't consider subclasses.
14           (,lisp-name (easygui-view-of ,self-arg)
15                     ,@arg-compute-forms)
16           (,objc-name (#/nextResponder ,self-arg) ,event-arg)))))
17
18(defmacro define-useful-mouse-event-handling-routines (class-name)
19  `(progn
20     (define-chaining-responder-method ,class-name
21         (#/mouseDown: mouse-down) (self event)
22       :cocoa-event event
23       :location (let ((objc-pt (#/convertPoint:fromView:
24                                 self
25                                 (#/locationInWindow event)
26                                 nil)))
27                   (point (ns:ns-point-x objc-pt) (ns:ns-point-y objc-pt)))
28       :button (#/buttonNumber event)
29       :click-count (#/clickCount event)
30       :delta (point (#/deltaX event) (#/deltaY event)))
31     (define-chaining-responder-method ,class-name
32         (#/mouseUp: mouse-up) (self event)
33       :cocoa-event event
34       :location (let ((objc-pt (#/convertPoint:fromView:
35                                 self
36                                 (#/locationInWindow event)
37                                 nil)))
38                   (point (ns:ns-point-x objc-pt) (ns:ns-point-y objc-pt)))
39       :button (#/buttonNumber event)
40       :click-count (#/clickCount event)
41       :delta (point (#/deltaX event) (#/deltaY event)))
42     (define-chaining-responder-method ,class-name
43         (#/mouseDragged: mouse-dragged) (self event)
44       :cocoa-event event
45       :location (let ((objc-pt (#/convertPoint:fromView:
46                                 self
47                                 (#/locationInWindow event)
48                                 nil)))
49                   (point (ns:ns-point-x objc-pt) (ns:ns-point-y objc-pt))))))
50
51;;; Mouse:
52
53(defclass event-handler-mixin () ())
54
55(defclass mouse-event-handler-mixin () ())
56
57
58(macrolet ((defgeneric-and-empty-method (name (&rest args) &rest options)
59               `(defgeneric ,name ,args
60                  ,@options
61                  (:method ,args
62                    (declare (ignore ,@(remove-if (lambda (sym) (member sym lambda-list-keywords)) args)))))))
63  ;; TODO: mouse-move
64  (defgeneric-and-empty-method mouse-down (view &key cocoa-event location button
65                                                click-count delta))
66  (defgeneric-and-empty-method mouse-up (view &key cocoa-event location button
67                                              click-count delta))
68  (defgeneric-and-empty-method mouse-dragged (view &key cocoa-event location
69                                                   delta)))
Note: See TracBrowser for help on using the repository browser.