Detecting Double Button Clicks
QUESTION: I was wondering if anyone had code or hints on how to process double clicks on a mouse button within an IDL event handler?
![]()
ANSWER: Here is a piece of code that can reliably detect a double click on a button widget, at least on my Macintosh and Windows NT machines.
Here is how it works. The first click on the button sets a "firstClick" flag and sends a TIMER event to the button event handler. If a second button click event gets to the button event handler before the TIMER event does, then this is a double click on the button! If the TIMER event gets to the button event handler before another button event, then this is a single button click.
You may need to experiment with the timer delay on your machine. I find a timer delay of 0.2 seconds works for my two machines. Click here to download the example program.
![]()
PRO EXAMPLE_EVENT,event
WIDGET_CONTROL, event.top, /DESTROY
END ; of EXAMPLE_EVENT event handler **************************************
PRO DOUBLE_CLICK_DETECT, event
WIDGET_CONTROL, event.top, GET_UVALUE=info, /NO_COPY
thisEvent = TAG_NAMES(event, /Structure)
; Double click event.
IF (thisEvent EQ 'WIDGET_BUTTON') AND (info.firstClick EQ 1) THEN BEGIN
WIDGET_CONTROL, info.textID, SET_VALUE="Hooray, that's a DOUBLE click!"
info.firstClick = 0
WIDGET_CONTROL, event.top, SET_UVALUE=info, /NO_COPY
RETURN
ENDIF
; Initial click event.
IF (thisEvent EQ 'WIDGET_BUTTON') AND (info.firstClick EQ 0) THEN BEGIN
info.firstClick = 1
WIDGET_CONTROL, info.textID, SET_VALUE=''
WIDGET_CONTROL, event.id, Timer=info.delay
ENDIF
; Single click event.
IF (thisEvent EQ 'WIDGET_TIMER') AND (info.firstClick EQ 1) THEN BEGIN
WIDGET_CONTROL, info.textID, SET_VALUE="No, that's a SINGLE click!"
info.firstClick = 0
ENDIF
WIDGET_CONTROL, event.top, SET_UVALUE=info, /NO_COPY
END ; of DOUBLE_CLICK_DETECT event handler *******************************
PRO EXAMPLE, delay
IF N_PARAMS() EQ 0 THEN delay = 0.2
info = {firstClick:0, delay:delay, textID:0L}
tlb = WIDGET_BASE(ROW=2, TITLE='Double Click Example', $
BASE_ALIGN_CENTER=1)
info.textID = WIDGET_TEXT(tlb, Value='Button Messages Here...', $
SCR_XSIZE=250)
button = WIDGET_BUTTON(tlb, Value='Double Click Me...', $
EVENT_PRO='DOUBLE_CLICK_DETECT')
quit = WIDGET_BUTTON(tlb, Value='Quit')
WIDGET_CONTROL, tlb, /REALIZE, SET_UVALUE=info, /NO_COPY
XMANAGER, 'example', tlb
END ; of EXAMPLE ********************************************************
![]()
Note that you can detect double clicks on list widgets by examining the event.click field of the event structure. A double click is indicated by the value 2 instead of 1. You can detect double clicks in draw widgets by using a modified version of the program above.
![]()
Copyright © 1997 David W. Fanning