@@ -353,14 +353,24 @@ function isSelectionChangeEvent(event: IListMouseEvent<any> | IListTouchEvent<an
353353class MouseController < T > implements IDisposable {
354354
355355 private multipleSelectionSupport : boolean ;
356+ private didJustPressContextMenuKey : boolean = false ;
356357 private disposables : IDisposable [ ] = [ ] ;
357358
358359 @memoize get onContextMenu ( ) : Event < IListContextMenuEvent < T > > {
359- const fromKeyboard = chain ( domEvent ( this . view . domNode , 'keydown' ) )
360+ const fromKeydown = chain ( domEvent ( this . view . domNode , 'keydown' ) )
360361 . map ( e => new StandardKeyboardEvent ( e ) )
361- . filter ( e => this . list . getFocus ( ) . length > 0 )
362- . filter ( e => e . keyCode === KeyCode . ContextMenu || ( e . shiftKey && e . keyCode === KeyCode . F10 ) )
363- . map ( e => {
362+ . filter ( e => this . didJustPressContextMenuKey = e . keyCode === KeyCode . ContextMenu || ( e . shiftKey && e . keyCode === KeyCode . F10 ) )
363+ . filter ( e => { e . preventDefault ( ) ; e . stopPropagation ( ) ; return false ; } )
364+ . event as Event < any > ;
365+
366+ const fromKeyup = chain ( domEvent ( this . view . domNode , 'keyup' ) )
367+ . filter ( ( ) => {
368+ const didJustPressContextMenuKey = this . didJustPressContextMenuKey ;
369+ this . didJustPressContextMenuKey = false ;
370+ return didJustPressContextMenuKey ;
371+ } )
372+ . filter ( ( ) => this . list . getFocus ( ) . length > 0 )
373+ . map ( ( ) => {
364374 const index = this . list . getFocus ( ) [ 0 ] ;
365375 const element = this . view . element ( index ) ;
366376 const anchor = this . view . domElement ( index ) ;
@@ -370,10 +380,11 @@ class MouseController<T> implements IDisposable {
370380 . event ;
371381
372382 const fromMouse = chain ( this . view . onContextMenu )
383+ . filter ( ( ) => ! this . didJustPressContextMenuKey )
373384 . map ( ( { element, index, browserEvent } ) => ( { element, index, anchor : { x : browserEvent . clientX + 1 , y : browserEvent . clientY } } ) )
374385 . event ;
375386
376- return anyEvent < IListContextMenuEvent < T > > ( fromKeyboard , fromMouse ) ;
387+ return anyEvent < IListContextMenuEvent < T > > ( fromKeydown , fromKeyup , fromMouse ) ;
377388 }
378389
379390 constructor (
@@ -655,10 +666,7 @@ export class List<T> implements ISpliceable<T>, IDisposable {
655666 return mapEvent ( this . eventBufferer . wrapEvent ( this . selection . onChange ) , e => this . toListEvent ( e ) ) ;
656667 }
657668
658- private _onContextMenu : Event < IListContextMenuEvent < T > > = Event . None ;
659- get onContextMenu ( ) : Event < IListContextMenuEvent < T > > {
660- return this . _onContextMenu ;
661- }
669+ readonly onContextMenu : Event < IListContextMenuEvent < T > > = Event . None ;
662670
663671 private _onOpen = new Emitter < number [ ] > ( ) ;
664672 @memoize get onOpen ( ) : Event < IListEvent < T > > {
@@ -731,7 +739,7 @@ export class List<T> implements ISpliceable<T>, IDisposable {
731739 if ( typeof options . mouseSupport !== 'boolean' || options . mouseSupport ) {
732740 const controller = new MouseController ( this , this . view , options ) ;
733741 this . disposables . push ( controller ) ;
734- this . _onContextMenu = controller . onContextMenu ;
742+ this . onContextMenu = controller . onContextMenu ;
735743 }
736744
737745 this . onFocusChange ( this . _onFocusChange , this , this . disposables ) ;
0 commit comments