Changeset 6711
- Timestamp:
- Jun 12, 2007, 12:59:09 PM (17 years ago)
- File:
-
- 1 edited
-
branches/ide-1.0/ccl/examples/cocoa-listener.lisp (modified) (9 diffs)
Legend:
- Unmodified
- Added
- Removed
-
branches/ide-1.0/ccl/examples/cocoa-listener.lisp
r6682 r6711 101 101 102 102 103 (defclass hemlock-listener-frame (hemlock-frame) 104 () 105 (:metaclass ns:+ns-object)) 103 106 104 107 … … 229 232 230 233 (defun hemlock::listener-document-send-string (document string) 231 (let* ((controller (#/objectAtIndex: (#/windowControllers document) 0)) 232 (filehandle (slot-value controller 'filehandle)) 233 (len (length string)) 234 (data (#/autorelease (make-instance 'ns:ns-mutable-data 235 :with-length len))) 236 (bytes (#/mutableBytes data))) 237 (%cstr-pointer string bytes nil) 238 (#/writeData: filehandle data) 239 (#/synchronizeFile filehandle))) 234 (let* ((buffer (hemlock-document-buffer document)) 235 (process (if buffer (hi::buffer-process buffer)))) 236 (if process 237 (hi::send-string-to-listener-process process string)))) 240 238 241 239 … … 269 267 nil) 270 268 269 270 271 271 (objc:defmethod #/init ((self hemlock-listener-document)) 272 272 (let* ((doc (call-next-method))) … … 292 292 (defloadvar *next-listener-y-pos* nil) ; likewise 293 293 294 (objc:defmethod (#/close :void) ((self hemlock-listener-document)) 295 (if (zerop (decf *cocoa-listener-count*)) 296 (setq *next-listener-x-pos* nil 297 *next-listener-y-pos* nil)) 298 (call-next-method)) 299 294 300 (objc:defmethod (#/makeWindowControllers :void) ((self hemlock-listener-document)) 295 301 (let* ((textstorage (slot-value self 'textstorage)) 296 302 (window (%hemlock-frame-for-textstorage 303 hemlock-listener-frame 297 304 textstorage 298 305 *listener-columns* … … 335 342 (ccl::force-break-in-listener process)))) 336 343 344 (objc:defmethod (#/continue: :void) ((self hemlock-listener-document) sender) 345 (declare (ignore sender)) 346 (let* ((buffer (hemlock-document-buffer self)) 347 (process (if buffer (hi::buffer-process buffer)))) 348 (when (typep process 'cocoa-listener-process) 349 (process-interrupt process #'continue)))) 350 351 (objc:defmethod (#/exitBreak: :void) ((self hemlock-listener-document) sender) 352 (declare (ignore sender)) 353 (let* ((buffer (hemlock-document-buffer self)) 354 (process (if buffer (hi::buffer-process buffer)))) 355 (when (typep process 'cocoa-listener-process) 356 (process-interrupt process #'abort-break)))) 357 337 358 (defmethod listener-backtrace-context ((proc cocoa-listener-process)) 338 359 (car (cocoa-listener-process-backtrace-contexts proc))) 339 360 340 361 (objc:defmethod (#/backtrace: :void) ((self hemlock-listener-document) sender) 341 (declare (ignore sender))342 362 (let* ((buffer (hemlock-document-buffer self)) 343 363 (process (if buffer (hi::buffer-process buffer)))) … … 345 365 (let* ((context (listener-backtrace-context process))) 346 366 (when context 347 (#/showWindow: (backtrace-controller-for-context context) +null-ptr+)))))) 367 (#/showWindow: (backtrace-controller-for-context context) sender)))))) 368 369 (defun restarts-controller-for-context (context) 370 (or (car (bt.restarts context)) 371 (setf (car (bt.restarts context)) 372 (let* ((tcr (bt.tcr context)) 373 (tsp-range (inspector::make-tsp-stack-range tcr context)) 374 (vsp-range (inspector::make-vsp-stack-range tcr context)) 375 (csp-range (inspector::make-csp-stack-range tcr context)) 376 (process (tcr->process (bt.tcr context)))) 377 (make-instance 'sequence-window-controller 378 :sequence (cdr (bt.restarts context)) 379 :result-callback #'(lambda (r) 380 (process-interrupt 381 process 382 #'invoke-restart-interactively 383 r)) 384 :display #'(lambda (item stream) 385 (let* ((ccl::*aux-vsp-ranges* vsp-range) 386 (ccl::*aux-tsp-ranges* tsp-range) 387 (ccl::*aux-csp-ranges* csp-range)) 388 (princ item stream))) 389 :title (format nil "Restarts for ~a(~d), break level ~d" 390 (process-name process) 391 (process-serial-number process) 392 (bt.break-level context))))))) 393 394 (objc:defmethod (#/restarts: :void) ((self hemlock-listener-document) sender) 395 (let* ((buffer (hemlock-document-buffer self)) 396 (process (if buffer (hi::buffer-process buffer)))) 397 (when (typep process 'cocoa-listener-process) 398 (let* ((context (listener-backtrace-context process))) 399 (when context 400 (#/showWindow: (restarts-controller-for-context context) sender)))))) 348 401 349 402 (objc:defmethod (#/continue: :void) ((self hemlock-listener-document) sender) … … 354 407 (let* ((context (listener-backtrace-context process))) 355 408 (when context 356 (hi::send-string-to-listener-process process ":go 357 ")))))) 409 (process-interrupt process #'invoke-restart-interactively 'continue)))))) 410 411 412 358 413 359 414 … … 374 429 ((eql action (@selector #/revertDocumentToSaved:)) 375 430 (values t nil)) 431 ((eql action (@selector #/makeKeyAndOrderFront:)) 432 (let* ((target (#/target item)) 433 (window (cocoa-listener-process-window process))) 434 (if (eql target window) 435 (progn 436 (#/setKeyEquivalent: item #@"L") 437 (#/setKeyEquivalentModifierMask: item #$NSCommandKeyMask)) 438 (#/setKeyEquivalent: item #@"")) 439 (values t t))) 376 440 ((eql action (@selector #/interrupt:)) (values t t)) 377 ((eql action (@selector #/backtrace:)) 441 ((eql action (@selector #/continue:)) 442 (let* ((context (listener-backtrace-context process))) 443 (values 444 t 445 (and context 446 (find 'continue (cdr (bt.restarts context)) 447 :key #'restart-name))))) 448 ((or (eql action (@selector #/backtrace:)) 449 (eql action (@selector #/exitBreak:)) 450 (eql action (@selector #/restarts:))) 378 451 (values t 379 452 (not (null (listener-backtrace-context process))))))) … … 455 528 (destructuring-bind (package path string) selection 456 529 (hi::send-string-to-listener-process target-listener string :package package :path path))))) 457 530 531 ;;; Give the windows menu item for the top listener a command-key 532 ;;; equivalent of cmd-L. Remove command-key equivalents from other windows. 533 ;;; (There are probably other ways of doing this.) 534 (objc:defmethod (#/validateMenuItem: :<BOOL>) ((self hemlock-listener-frame) 535 item) 536 (let* ((action (#/action item))) 537 (when (eql action (@selector #/makeKeyAndOrderFront:)) 538 (let* ((target (#/target item))) 539 (when (eql target self) 540 (let* ((top-doc (#/topListener hemlock-listener-document)) 541 (our-doc (#/document (#/windowController self)))) 542 (if (eql our-doc top-doc) 543 (progn 544 (#/setKeyEquivalent: item #@"l") 545 (#/setKeyEquivalentModifierMask: item #$NSCommandKeyMask)) 546 (#/setKeyEquivalent: item +null-ptr+))))))) 547 (call-next-method item)) 458 548 459 549
Note:
See TracChangeset
for help on using the changeset viewer.
