devdocs/assets/javascripts/app/shortcuts.coffee
Natnael Getahun 1bc380f12d Add DuckDuckGo shortcut
Added an alias ```alt + d``` to be DuckDuckGo shortcut
2018-08-06 18:31:12 -04:00

184 lines
4.3 KiB
CoffeeScript

class app.Shortcuts
$.extend @prototype, Events
constructor: ->
@isMac = $.isMac()
@start()
start: ->
$.on document, 'keydown', @onKeydown
$.on document, 'keypress', @onKeypress
return
stop: ->
$.off document, 'keydown', @onKeydown
$.off document, 'keypress', @onKeypress
return
swapArrowKeysBehavior: ->
app.settings.get('arrowScroll')
showTip: ->
app.showTip('KeyNav')
@showTip = null
onKeydown: (event) =>
return if @buggyEvent(event)
result = if event.ctrlKey or event.metaKey
@handleKeydownSuperEvent event unless event.altKey or event.shiftKey
else if event.shiftKey
@handleKeydownShiftEvent event unless event.altKey
else if event.altKey
@handleKeydownAltEvent event
else
@handleKeydownEvent event
event.preventDefault() if result is false
return
onKeypress: (event) =>
return if @buggyEvent(event)
unless event.ctrlKey or event.metaKey
result = @handleKeypressEvent event
event.preventDefault() if result is false
return
handleKeydownEvent: (event, _force) ->
return @handleKeydownAltEvent(event, true) if not _force and event.which in [37, 38, 39, 40] and @swapArrowKeysBehavior()
if not event.target.form and (48 <= event.which <= 57 or 65 <= event.which <= 90)
@trigger 'typing'
return
switch event.which
when 8
@trigger 'typing' unless event.target.form
when 13
@trigger 'enter'
when 27
@trigger 'escape'
false
when 32
if event.target.type is 'search' and (not @lastKeypress or @lastKeypress < Date.now() - 500)
@trigger 'pageDown'
false
when 33
@trigger 'pageUp'
when 34
@trigger 'pageDown'
when 35
@trigger 'pageBottom' unless event.target.form
when 36
@trigger 'pageTop' unless event.target.form
when 37
@trigger 'left' unless event.target.value
when 38
@trigger 'up'
@showTip?()
false
when 39
@trigger 'right' unless event.target.value
when 40
@trigger 'down'
@showTip?()
false
when 191
unless event.target.form
@trigger 'typing'
false
handleKeydownSuperEvent: (event) ->
switch event.which
when 13
@trigger 'superEnter'
when 37
if @isMac
@trigger 'superLeft'
false
when 38
@trigger 'pageTop'
false
when 39
if @isMac
@trigger 'superRight'
false
when 40
@trigger 'pageBottom'
false
when 188
@trigger 'preferences'
false
handleKeydownShiftEvent: (event, _force) ->
return @handleKeydownEvent(event, true) if not _force and event.which in [37, 38, 39, 40] and @swapArrowKeysBehavior()
if not event.target.form and 65 <= event.which <= 90
@trigger 'typing'
return
switch event.which
when 32
@trigger 'pageUp'
false
when 38
unless getSelection()?.toString()
@trigger 'altUp'
false
when 40
unless getSelection()?.toString()
@trigger 'altDown'
false
handleKeydownAltEvent: (event, _force) ->
return @handleKeydownEvent(event, true) if not _force and event.which in [37, 38, 39, 40] and @swapArrowKeysBehavior()
switch event.which
when 9
@trigger 'altRight', event
when 37
unless @isMac
@trigger 'superLeft'
false
when 38
@trigger 'altUp'
false
when 39
unless @isMac
@trigger 'superRight'
false
when 40
@trigger 'altDown'
false
when 68
@trigger 'altD'
false
when 70
@trigger 'altF', event
when 71
@trigger 'altG'
false
when 79
@trigger 'altO'
false
when 82
@trigger 'altR'
false
when 83
@trigger 'altS'
false
handleKeypressEvent: (event) ->
if event.which is 63 and not event.target.value
@trigger 'help'
false
else
@lastKeypress = Date.now()
buggyEvent: (event) ->
try
event.target
event.ctrlKey
event.which
return false
catch
return true