[CM] Re: Re: Re: Play Head (SND-8.3)

Kjetil Svalastog Matheussen k.s.matheussen at notam02.no
Tue Aug 15 08:42:43 PDT 2006


"Bill Schottstaedt":
> To: Kjetil Svalastog Matheussen <k.s.matheussen at notam02.no>,
>    cmdist at ccrma.Stanford.EDU
> Subject: Re: [CM] Re: Re: Play Head (SND-8.3)
> Date: Sun, 13 Aug 2006 04:28:27 -0700
> 
> > Anyone knows how to do this with gtk, if possible? 
> 
> ;; report on mouse scroll wheel changes when in the channel graph
> (g_signal_connect 
>  (car (channel-widgets)) "scroll_event" 
>  (lambda (w e i)
>    (snd-print (format #f "~%state: ~A, x: ~A, y: ~A, direction: ~A" 
>                       (.state (GDK_EVENT_SCROLL e))
>                       (.x (GDK_EVENT_SCROLL e))
>                       (.y (GDK_EVENT_SCROLL e))
>                       (.direction (GDK_EVENT_SCROLL e))))
>    #f))
> 
> ;; report which kind of click was received in the channel graph
> (g_signal_connect 
>  (car (channel-widgets)) "button_press_event"
>  (lambda (w e i)
>    (snd-print (format #f "~%button: ~A, ~A click" 
>                       (.type (GDK_EVENT_BUTTON e))
>                       (if (= (.type (GDK_EVENT_BUTTON e)) GDK_BUTTON_PRESS)
>                           "single"
>                           (if (= (.type (GDK_EVENT_BUTTON e)) GDK_2BUTTON_PRESS)
>                               "double"
>                               (if (= (.type (GDK_EVENT_BUTTON e)) GDK_3BUTTON_PRESS)
>                                   "triple"
>                                   "unknown")))))
>    #f))
> 
> ;; a double click is reported as single/single/double
> 
> ;; double-click time in milliseconds(?)
> (define (double-click-time)
>   (g_object_get (GPOINTER (gtk_settings_get_for_screen 
>                                             (gdk_display_get_default_screen 
>                                               (gdk_display_get_default))))
>                         "gtk-double-click-time" #f))
> 



Thank you very much! Attached is a diff for gui.scm that fixes the state 
for the scroll button and adds a new hook for double-click:

(-> mouse-doubleclick-hook add!
    (lambda (snd x y stat)
      (c-display "double-click" snd x y stat)))

-------------- next part --------------
--- gui.scm?revision=1.39	2006-08-15 17:40:20.000000000 +0200
+++ gui.scm	2006-08-15 17:35:13.000000000 +0200
@@ -89,6 +89,17 @@
 	 #f)))
 
 
+;; Copied from gtk-popup.scm
+(define* (c-g_signal_connect obj name func #:optional data)
+  (g_signal_connect_closure_by_id (GPOINTER obj)
+				  (g_signal_lookup name (G_OBJECT_TYPE (GTK_OBJECT obj)))
+				  0
+				  (g_cclosure_new func data #f)
+				  #f))
+
+
+
+
 (define-c <float> (c-scale ((<float> x)
 			    (<float> x1)
 			    (<float> x2)
@@ -359,6 +370,7 @@
 
 
 (define mouse-button-press-hook (<hook>))
+(define mouse-doubleclick-hook (<hook>))
 (define mouse-move-hook (<hook>))
 (define mouse-drag2-hook (<hook>))
 (define mouse-button-release-hook (<hook>))
@@ -421,24 +433,35 @@
 					   (focus-widget w)
 					   (set! ispressed #t)
 					   (set! ismoved #f)
-					   (if (and (not (eq? 'stop!
-							      (-> mouse-button-press-hook run
-								  snd (.x (GDK_EVENT_BUTTON e)) (.y (GDK_EVENT_BUTTON e))
-								  (.button (GDK_EVENT_BUTTON e)) (.state (GDK_EVENT_BUTTON e)))))
-						    (= (.button (GDK_EVENT_BUTTON e)) 3))
-					       (run-hook gtk-popup-hook w e i snd 0))))
+					   (let ((did-doubleclick? 'nope)
+						 (did-singleclick? 'nope))
+					     (if (= (.type (GDK_EVENT_BUTTON e)) GDK_2BUTTON_PRESS)
+						 (set! did-doubleclick? (-> mouse-doubleclick-hook run
+									    snd 
+									    (.x (GDK_EVENT_BUTTON e))
+									    (.y (GDK_EVENT_BUTTON e))
+									    (.state (GDK_EVENT_BUTTON e)))))
+					     (if (not (eq? 'stop! did-doubleclick?))
+						 (set! did-singleclick? (-> mouse-button-press-hook run
+									    snd (.x (GDK_EVENT_BUTTON e)) (.y (GDK_EVENT_BUTTON e))
+									    (.button (GDK_EVENT_BUTTON e)) (.state (GDK_EVENT_BUTTON e)))))
+					     
+					     (if (and (not (eq? 'stop! did-doubleclick?))
+						      (not (eq? 'stop! did-singleclick?))
+						      (= (.button (GDK_EVENT_BUTTON e)) 3))
+						 (run-hook gtk-popup-hook w e i snd 0)))))
 		     (c-g_signal_connect w "motion_notify_event"
-				       (lambda (w e i)
-					 (set! ismoved #t)
-					 ;;(c-display snd (.x (GDK_EVENT_BUTTON e)) (.y (GDK_EVENT_BUTTON e)) (.button (GDK_EVENT_BUTTON e)) (.state (GDK_EVENT_BUTTON e)))
-					 (let ((args (if (.is_hint (GDK_EVENT_MOTION e))
-							 (let ((s (cdr (gdk_window_get_pointer (.window e)))))
-							   (list snd (car s) (cadr s) (.button (GDK_EVENT_BUTTON e)) (caddr s)))
-							 (list snd (.x (GDK_EVENT_BUTTON e)) (.y (GDK_EVENT_BUTTON e))
-							       (.button (GDK_EVENT_BUTTON e)) (.state (GDK_EVENT_BUTTON e))))))
-					   (if (and (not (eq? 'stop! (apply (<- mouse-move-hook run) args)))
-						    ispressed)
-					       (apply (<- mouse-drag2-hook run) args)))))
+					 (lambda (w e i)
+					   (set! ismoved #t)
+					   ;;(c-display snd (.x (GDK_EVENT_BUTTON e)) (.y (GDK_EVENT_BUTTON e)) (.button (GDK_EVENT_BUTTON e)) (.state (GDK_EVENT_BUTTON e)))
+					   (let ((args (if (.is_hint (GDK_EVENT_MOTION e))
+							   (let ((s (cdr (gdk_window_get_pointer (.window e)))))
+							     (list snd (car s) (cadr s) (.button (GDK_EVENT_BUTTON e)) (caddr s)))
+							   (list snd (.x (GDK_EVENT_BUTTON e)) (.y (GDK_EVENT_BUTTON e))
+								 (.button (GDK_EVENT_BUTTON e)) (.state (GDK_EVENT_BUTTON e))))))
+					     (if (and (not (eq? 'stop! (apply (<- mouse-move-hook run) args)))
+						      ispressed)
+						 (apply (<- mouse-drag2-hook run) args)))))
 		     (c-g_signal_connect w "button_release_event"
 					 (lambda (w e i)
 					   (set! ispressed #f)
@@ -448,7 +471,7 @@
 					 (lambda (w e i)
 					   (set! ispressed #f)
 					   (-> mouse-scroll-hook run
-					       snd (.x (GDK_EVENT_BUTTON e)) (.y (GDK_EVENT_BUTTON e)) (.state (GDK_EVENT_BUTTON e)))
+					       snd (.direction (GDK_EVENT_SCROLL e)) (.x (GDK_EVENT_SCROLL e)) (.y (GDK_EVENT_SCROLL e)) (.state (GDK_EVENT_SCROLL e)))
 					   ))
 		     )))))
 
@@ -530,12 +553,12 @@
       (lambda (snd x y button stat)
 	(set! isdragged #t)))
   (-> mouse-scroll-hook add!
-      (lambda (snd orgx y stat)
+      (lambda (snd direction orgx y stat)
 	(c-get-mouse-info snd orgx y #t
 			  (lambda (ch x y)
 			    (focus-widget (c-editor-widget snd))
 			    (run-hook mouse-click-hook
-				      snd ch (+ stat 4) 0 orgx y time-graph)))))
+				      snd ch (+ direction 4) stat orgx y time-graph)))))
   (-> mouse-button-release-hook add!
       (lambda (snd orgx y button stat)
 	(if (not isdragged)


More information about the Cmdist mailing list