master 2df31b866500 cached
537 files
4.6 MB
1.2M tokens
5983 symbols
1 requests
Download .txt
Showing preview only (4,977K chars total). Download the full file or copy to clipboard to get everything.
Repository: BillBillBillBill/Tickeys-linux
Branch: master
Commit: 2df31b866500
Files: 537
Total size: 4.6 MB

Directory structure:
gitextract_b93_15po/

├── .gitignore
├── AUTHOURS
├── Changelog
├── LICENSE
├── MANIFEST.in
├── README.md
├── README_en_US.md
├── README_zh_CN.md
├── build.sh
├── build32.sh
├── deb.sh
├── deb32.sh
├── setup.py
└── tickeys/
    ├── CLI.py
    ├── GUI.py
    ├── Resources/
    │   └── data/
    │       ├── bubble/
    │       │   └── license.txt
    │       ├── drum/
    │       │   └── _readme_and_license.txt
    │       ├── mechanical/
    │       │   └── license.txt
    │       └── schemes.json
    ├── __init__.py
    ├── build.py
    ├── config.py
    ├── keyboardHandler.py
    ├── kivy/
    │   ├── __init__.py
    │   ├── _event.pxd
    │   ├── adapters/
    │   │   ├── __init__.py
    │   │   ├── adapter.py
    │   │   ├── args_converters.py
    │   │   ├── dictadapter.py
    │   │   ├── listadapter.py
    │   │   ├── models.py
    │   │   └── simplelistadapter.py
    │   ├── animation.py
    │   ├── app.py
    │   ├── atlas.py
    │   ├── base.py
    │   ├── cache.py
    │   ├── clock.py
    │   ├── compat.py
    │   ├── config.py
    │   ├── context.py
    │   ├── core/
    │   │   ├── __init__.py
    │   │   ├── audio/
    │   │   │   ├── __init__.py
    │   │   │   ├── audio_ffpyplayer.py
    │   │   │   ├── audio_gi.py
    │   │   │   ├── audio_gstplayer.py
    │   │   │   ├── audio_pygame.py
    │   │   │   └── audio_pygst.py
    │   │   ├── camera/
    │   │   │   ├── __init__.py
    │   │   │   ├── camera_gi.py
    │   │   │   ├── camera_opencv.py
    │   │   │   ├── camera_pygst.py
    │   │   │   └── camera_videocapture.py
    │   │   ├── clipboard/
    │   │   │   ├── __init__.py
    │   │   │   ├── clipboard_android.py
    │   │   │   ├── clipboard_dbusklipper.py
    │   │   │   ├── clipboard_dummy.py
    │   │   │   ├── clipboard_gtk3.py
    │   │   │   ├── clipboard_nspaste.py
    │   │   │   ├── clipboard_pygame.py
    │   │   │   ├── clipboard_sdl2.py
    │   │   │   ├── clipboard_winctypes.py
    │   │   │   └── clipboard_xsel.py
    │   │   ├── gl/
    │   │   │   └── __init__.py
    │   │   ├── image/
    │   │   │   ├── __init__.py
    │   │   │   ├── img_dds.py
    │   │   │   ├── img_ffpyplayer.py
    │   │   │   ├── img_gif.py
    │   │   │   ├── img_pil.py
    │   │   │   ├── img_pygame.py
    │   │   │   ├── img_sdl2.py
    │   │   │   └── img_tex.py
    │   │   ├── spelling/
    │   │   │   ├── __init__.py
    │   │   │   ├── spelling_enchant.py
    │   │   │   └── spelling_osxappkit.py
    │   │   ├── text/
    │   │   │   ├── __init__.py
    │   │   │   ├── markup.py
    │   │   │   ├── text_layout.pxd
    │   │   │   ├── text_pil.py
    │   │   │   ├── text_pygame.py
    │   │   │   └── text_sdl2.py
    │   │   ├── video/
    │   │   │   ├── __init__.py
    │   │   │   ├── video_ffmpeg.py
    │   │   │   ├── video_ffpyplayer.py
    │   │   │   ├── video_gi.py
    │   │   │   ├── video_gstplayer.py
    │   │   │   ├── video_null.py
    │   │   │   ├── video_pyglet.py
    │   │   │   └── video_pygst.py
    │   │   └── window/
    │   │       ├── __init__.py
    │   │       ├── window_egl_rpi.py
    │   │       ├── window_pygame.py
    │   │       └── window_sdl2.py
    │   ├── data/
    │   │   ├── glsl/
    │   │   │   ├── default.fs
    │   │   │   ├── default.vs
    │   │   │   ├── header.fs
    │   │   │   └── header.vs
    │   │   ├── images/
    │   │   │   └── defaulttheme.atlas
    │   │   ├── keyboards/
    │   │   │   ├── azerty.json
    │   │   │   ├── de_CH.json
    │   │   │   ├── en_US.json
    │   │   │   ├── fr_CH.json
    │   │   │   ├── qwerty.json
    │   │   │   └── qwertz.json
    │   │   ├── settings_kivy.json
    │   │   └── style.kv
    │   ├── effects/
    │   │   ├── __init__.py
    │   │   ├── dampedscroll.py
    │   │   ├── kinetic.py
    │   │   ├── opacityscroll.py
    │   │   └── scroll.py
    │   ├── event.py
    │   ├── ext/
    │   │   └── __init__.py
    │   ├── extras/
    │   │   ├── __init__.py
    │   │   └── highlight.py
    │   ├── factory.py
    │   ├── factory_registers.py
    │   ├── garden/
    │   │   └── __init__.py
    │   ├── geometry.py
    │   ├── gesture.py
    │   ├── graphics/
    │   │   ├── __init__.py
    │   │   ├── buffer.pxd
    │   │   ├── c_opengl.pxd
    │   │   ├── c_opengl_debug.pxd
    │   │   ├── common.pxi
    │   │   ├── compiler.pxd
    │   │   ├── config.h
    │   │   ├── config.pxi
    │   │   ├── context.pxd
    │   │   ├── context_instructions.pxd
    │   │   ├── fbo.pxd
    │   │   ├── img_tools.pxi
    │   │   ├── instructions.pxd
    │   │   ├── opcodes.pxi
    │   │   ├── opengl_utils.pxd
    │   │   ├── opengl_utils_def.pxi
    │   │   ├── shader.pxd
    │   │   ├── stencil_instructions.pxd
    │   │   ├── svg.pxd
    │   │   ├── tesselator.pxd
    │   │   ├── texture.pxd
    │   │   ├── transformation.pxd
    │   │   ├── vbo.pxd
    │   │   ├── vertex.pxd
    │   │   ├── vertex_instructions.pxd
    │   │   └── vertex_instructions_line.pxi
    │   ├── input/
    │   │   ├── __init__.py
    │   │   ├── factory.py
    │   │   ├── motionevent.py
    │   │   ├── postproc/
    │   │   │   ├── __init__.py
    │   │   │   ├── calibration.py
    │   │   │   ├── dejitter.py
    │   │   │   ├── doubletap.py
    │   │   │   ├── ignorelist.py
    │   │   │   ├── retaintouch.py
    │   │   │   └── tripletap.py
    │   │   ├── provider.py
    │   │   ├── providers/
    │   │   │   ├── __init__.py
    │   │   │   ├── androidjoystick.py
    │   │   │   ├── hidinput.py
    │   │   │   ├── leapfinger.py
    │   │   │   ├── linuxwacom.py
    │   │   │   ├── mactouch.py
    │   │   │   ├── mouse.py
    │   │   │   ├── mtdev.py
    │   │   │   ├── probesysfs.py
    │   │   │   ├── tuio.py
    │   │   │   ├── wm_common.py
    │   │   │   ├── wm_pen.py
    │   │   │   └── wm_touch.py
    │   │   ├── recorder.py
    │   │   └── shape.py
    │   ├── interactive.py
    │   ├── lang.py
    │   ├── loader.py
    │   ├── logger.py
    │   ├── metrics.py
    │   ├── modules/
    │   │   ├── __init__.py
    │   │   ├── _webdebugger.py
    │   │   ├── inspector.py
    │   │   ├── keybinding.py
    │   │   ├── monitor.py
    │   │   ├── recorder.py
    │   │   ├── screen.py
    │   │   ├── touchring.py
    │   │   └── webdebugger.py
    │   ├── multistroke.py
    │   ├── network/
    │   │   ├── __init__.py
    │   │   └── urlrequest.py
    │   ├── parser.py
    │   ├── properties.pxd
    │   ├── resources.py
    │   ├── setupconfig.py
    │   ├── storage/
    │   │   ├── __init__.py
    │   │   ├── dictstore.py
    │   │   ├── jsonstore.py
    │   │   └── redisstore.py
    │   ├── support.py
    │   ├── tools/
    │   │   ├── __init__.py
    │   │   ├── benchmark.py
    │   │   ├── extensions/
    │   │   │   ├── __init__.py
    │   │   │   └── make-kivyext.py
    │   │   ├── generate-icons.py
    │   │   ├── highlight/
    │   │   │   ├── __init__.py
    │   │   │   ├── kivy-mode.el
    │   │   │   └── kivy.vim
    │   │   ├── packaging/
    │   │   │   ├── README.txt
    │   │   │   ├── __init__.py
    │   │   │   ├── factory.py
    │   │   │   ├── osx/
    │   │   │   │   ├── Info.plist
    │   │   │   │   ├── InfoPlist.strings
    │   │   │   │   └── kivy.sh
    │   │   │   ├── pyinstaller_hooks/
    │   │   │   │   ├── __init__.py
    │   │   │   │   ├── hook-kivy.py
    │   │   │   │   └── rt-hook-kivy.py
    │   │   │   └── win32/
    │   │   │       └── README.txt
    │   │   ├── report.py
    │   │   ├── stub-gl-debug.py
    │   │   └── texturecompress.py
    │   ├── uix/
    │   │   ├── __init__.py
    │   │   ├── abstractview.py
    │   │   ├── accordion.py
    │   │   ├── actionbar.py
    │   │   ├── anchorlayout.py
    │   │   ├── behaviors.py
    │   │   ├── boxlayout.py
    │   │   ├── bubble.py
    │   │   ├── button.py
    │   │   ├── camera.py
    │   │   ├── carousel.py
    │   │   ├── checkbox.py
    │   │   ├── codeinput.py
    │   │   ├── colorpicker.py
    │   │   ├── dropdown.py
    │   │   ├── effectwidget.py
    │   │   ├── filechooser.py
    │   │   ├── floatlayout.py
    │   │   ├── gesturesurface.py
    │   │   ├── gridlayout.py
    │   │   ├── image.py
    │   │   ├── label.py
    │   │   ├── layout.py
    │   │   ├── listview.py
    │   │   ├── modalview.py
    │   │   ├── pagelayout.py
    │   │   ├── popup.py
    │   │   ├── progressbar.py
    │   │   ├── relativelayout.py
    │   │   ├── rst.py
    │   │   ├── sandbox.py
    │   │   ├── scatter.py
    │   │   ├── scatterlayout.py
    │   │   ├── screenmanager.py
    │   │   ├── scrollview.py
    │   │   ├── selectableview.py
    │   │   ├── settings.py
    │   │   ├── slider.py
    │   │   ├── spinner.py
    │   │   ├── splitter.py
    │   │   ├── stacklayout.py
    │   │   ├── stencilview.py
    │   │   ├── switch.py
    │   │   ├── tabbedpanel.py
    │   │   ├── textinput.py
    │   │   ├── togglebutton.py
    │   │   ├── treeview.py
    │   │   ├── video.py
    │   │   ├── videoplayer.py
    │   │   ├── vkeyboard.py
    │   │   └── widget.py
    │   ├── utils.py
    │   ├── vector.py
    │   └── weakmethod.py
    ├── kivy_32/
    │   └── kivy/
    │       ├── __init__.py
    │       ├── _event.pxd
    │       ├── adapters/
    │       │   ├── __init__.py
    │       │   ├── adapter.py
    │       │   ├── args_converters.py
    │       │   ├── dictadapter.py
    │       │   ├── listadapter.py
    │       │   ├── models.py
    │       │   └── simplelistadapter.py
    │       ├── animation.py
    │       ├── app.py
    │       ├── atlas.py
    │       ├── base.py
    │       ├── cache.py
    │       ├── clock.py
    │       ├── compat.py
    │       ├── config.py
    │       ├── context.py
    │       ├── core/
    │       │   ├── __init__.py
    │       │   ├── audio/
    │       │   │   ├── __init__.py
    │       │   │   ├── audio_ffpyplayer.py
    │       │   │   ├── audio_gi.py
    │       │   │   ├── audio_gstplayer.py
    │       │   │   ├── audio_pygame.py
    │       │   │   └── audio_pygst.py
    │       │   ├── camera/
    │       │   │   ├── __init__.py
    │       │   │   ├── camera_gi.py
    │       │   │   ├── camera_opencv.py
    │       │   │   ├── camera_pygst.py
    │       │   │   └── camera_videocapture.py
    │       │   ├── clipboard/
    │       │   │   ├── __init__.py
    │       │   │   ├── clipboard_android.py
    │       │   │   ├── clipboard_dbusklipper.py
    │       │   │   ├── clipboard_dummy.py
    │       │   │   ├── clipboard_gtk3.py
    │       │   │   ├── clipboard_nspaste.py
    │       │   │   ├── clipboard_pygame.py
    │       │   │   ├── clipboard_sdl2.py
    │       │   │   ├── clipboard_winctypes.py
    │       │   │   └── clipboard_xsel.py
    │       │   ├── gl/
    │       │   │   └── __init__.py
    │       │   ├── image/
    │       │   │   ├── __init__.py
    │       │   │   ├── img_dds.py
    │       │   │   ├── img_ffpyplayer.py
    │       │   │   ├── img_gif.py
    │       │   │   ├── img_pil.py
    │       │   │   ├── img_pygame.py
    │       │   │   ├── img_sdl2.py
    │       │   │   └── img_tex.py
    │       │   ├── spelling/
    │       │   │   ├── __init__.py
    │       │   │   ├── spelling_enchant.py
    │       │   │   └── spelling_osxappkit.py
    │       │   ├── text/
    │       │   │   ├── __init__.py
    │       │   │   ├── markup.py
    │       │   │   ├── text_layout.pxd
    │       │   │   ├── text_pil.py
    │       │   │   ├── text_pygame.py
    │       │   │   └── text_sdl2.py
    │       │   ├── video/
    │       │   │   ├── __init__.py
    │       │   │   ├── video_ffmpeg.py
    │       │   │   ├── video_ffpyplayer.py
    │       │   │   ├── video_gi.py
    │       │   │   ├── video_gstplayer.py
    │       │   │   ├── video_null.py
    │       │   │   ├── video_pyglet.py
    │       │   │   └── video_pygst.py
    │       │   └── window/
    │       │       ├── __init__.py
    │       │       ├── window_egl_rpi.py
    │       │       ├── window_pygame.py
    │       │       └── window_sdl2.py
    │       ├── data/
    │       │   ├── glsl/
    │       │   │   ├── default.fs
    │       │   │   ├── default.vs
    │       │   │   ├── header.fs
    │       │   │   └── header.vs
    │       │   ├── images/
    │       │   │   └── defaulttheme.atlas
    │       │   ├── keyboards/
    │       │   │   ├── azerty.json
    │       │   │   ├── de_CH.json
    │       │   │   ├── en_US.json
    │       │   │   ├── fr_CH.json
    │       │   │   ├── qwerty.json
    │       │   │   └── qwertz.json
    │       │   ├── settings_kivy.json
    │       │   └── style.kv
    │       ├── effects/
    │       │   ├── __init__.py
    │       │   ├── dampedscroll.py
    │       │   ├── kinetic.py
    │       │   ├── opacityscroll.py
    │       │   └── scroll.py
    │       ├── event.py
    │       ├── ext/
    │       │   └── __init__.py
    │       ├── extras/
    │       │   ├── __init__.py
    │       │   └── highlight.py
    │       ├── factory.py
    │       ├── factory_registers.py
    │       ├── garden/
    │       │   └── __init__.py
    │       ├── geometry.py
    │       ├── gesture.py
    │       ├── graphics/
    │       │   ├── __init__.py
    │       │   ├── buffer.pxd
    │       │   ├── c_opengl.pxd
    │       │   ├── c_opengl_debug.pxd
    │       │   ├── common.pxi
    │       │   ├── compiler.pxd
    │       │   ├── config.h
    │       │   ├── config.pxi
    │       │   ├── context.pxd
    │       │   ├── context_instructions.pxd
    │       │   ├── fbo.pxd
    │       │   ├── img_tools.pxi
    │       │   ├── instructions.pxd
    │       │   ├── opcodes.pxi
    │       │   ├── opengl_utils.pxd
    │       │   ├── opengl_utils_def.pxi
    │       │   ├── shader.pxd
    │       │   ├── stencil_instructions.pxd
    │       │   ├── svg.pxd
    │       │   ├── tesselator.pxd
    │       │   ├── texture.pxd
    │       │   ├── transformation.pxd
    │       │   ├── vbo.pxd
    │       │   ├── vertex.pxd
    │       │   ├── vertex_instructions.pxd
    │       │   └── vertex_instructions_line.pxi
    │       ├── input/
    │       │   ├── __init__.py
    │       │   ├── factory.py
    │       │   ├── motionevent.py
    │       │   ├── postproc/
    │       │   │   ├── __init__.py
    │       │   │   ├── calibration.py
    │       │   │   ├── dejitter.py
    │       │   │   ├── doubletap.py
    │       │   │   ├── ignorelist.py
    │       │   │   ├── retaintouch.py
    │       │   │   └── tripletap.py
    │       │   ├── provider.py
    │       │   ├── providers/
    │       │   │   ├── __init__.py
    │       │   │   ├── androidjoystick.py
    │       │   │   ├── hidinput.py
    │       │   │   ├── leapfinger.py
    │       │   │   ├── linuxwacom.py
    │       │   │   ├── mactouch.py
    │       │   │   ├── mouse.py
    │       │   │   ├── mtdev.py
    │       │   │   ├── probesysfs.py
    │       │   │   ├── tuio.py
    │       │   │   ├── wm_common.py
    │       │   │   ├── wm_pen.py
    │       │   │   └── wm_touch.py
    │       │   ├── recorder.py
    │       │   └── shape.py
    │       ├── interactive.py
    │       ├── lang.py
    │       ├── loader.py
    │       ├── logger.py
    │       ├── metrics.py
    │       ├── modules/
    │       │   ├── __init__.py
    │       │   ├── _webdebugger.py
    │       │   ├── inspector.py
    │       │   ├── keybinding.py
    │       │   ├── monitor.py
    │       │   ├── recorder.py
    │       │   ├── screen.py
    │       │   ├── touchring.py
    │       │   └── webdebugger.py
    │       ├── multistroke.py
    │       ├── network/
    │       │   ├── __init__.py
    │       │   └── urlrequest.py
    │       ├── parser.py
    │       ├── properties.pxd
    │       ├── resources.py
    │       ├── setupconfig.py
    │       ├── storage/
    │       │   ├── __init__.py
    │       │   ├── dictstore.py
    │       │   ├── jsonstore.py
    │       │   └── redisstore.py
    │       ├── support.py
    │       ├── tools/
    │       │   ├── __init__.py
    │       │   ├── benchmark.py
    │       │   ├── extensions/
    │       │   │   ├── __init__.py
    │       │   │   └── make-kivyext.py
    │       │   ├── generate-icons.py
    │       │   ├── highlight/
    │       │   │   ├── __init__.py
    │       │   │   ├── kivy-mode.el
    │       │   │   └── kivy.vim
    │       │   ├── packaging/
    │       │   │   ├── README.txt
    │       │   │   ├── __init__.py
    │       │   │   ├── factory.py
    │       │   │   ├── osx/
    │       │   │   │   ├── Info.plist
    │       │   │   │   ├── InfoPlist.strings
    │       │   │   │   └── kivy.sh
    │       │   │   ├── pyinstaller_hooks/
    │       │   │   │   ├── __init__.py
    │       │   │   │   ├── hook-kivy.py
    │       │   │   │   └── rt-hook-kivy.py
    │       │   │   └── win32/
    │       │   │       └── README.txt
    │       │   ├── report.py
    │       │   ├── stub-gl-debug.py
    │       │   └── texturecompress.py
    │       ├── uix/
    │       │   ├── __init__.py
    │       │   ├── abstractview.py
    │       │   ├── accordion.py
    │       │   ├── actionbar.py
    │       │   ├── anchorlayout.py
    │       │   ├── behaviors.py
    │       │   ├── boxlayout.py
    │       │   ├── bubble.py
    │       │   ├── button.py
    │       │   ├── camera.py
    │       │   ├── carousel.py
    │       │   ├── checkbox.py
    │       │   ├── codeinput.py
    │       │   ├── colorpicker.py
    │       │   ├── dropdown.py
    │       │   ├── effectwidget.py
    │       │   ├── filechooser.py
    │       │   ├── floatlayout.py
    │       │   ├── gesturesurface.py
    │       │   ├── gridlayout.py
    │       │   ├── image.py
    │       │   ├── label.py
    │       │   ├── layout.py
    │       │   ├── listview.py
    │       │   ├── modalview.py
    │       │   ├── pagelayout.py
    │       │   ├── popup.py
    │       │   ├── progressbar.py
    │       │   ├── relativelayout.py
    │       │   ├── rst.py
    │       │   ├── sandbox.py
    │       │   ├── scatter.py
    │       │   ├── scatterlayout.py
    │       │   ├── screenmanager.py
    │       │   ├── scrollview.py
    │       │   ├── selectableview.py
    │       │   ├── settings.py
    │       │   ├── slider.py
    │       │   ├── spinner.py
    │       │   ├── splitter.py
    │       │   ├── stacklayout.py
    │       │   ├── stencilview.py
    │       │   ├── switch.py
    │       │   ├── tabbedpanel.py
    │       │   ├── textinput.py
    │       │   ├── togglebutton.py
    │       │   ├── treeview.py
    │       │   ├── video.py
    │       │   ├── videoplayer.py
    │       │   ├── vkeyboard.py
    │       │   └── widget.py
    │       ├── utils.py
    │       ├── vector.py
    │       └── weakmethod.py
    ├── locale/
    │   ├── en_US/
    │   │   └── LC_MESSAGES/
    │   │       └── tickeys.po
    │   ├── gen_mo.sh
    │   └── zh_CN/
    │       └── LC_MESSAGES/
    │           └── tickeys.po
    ├── logger.py
    ├── pyxhook.py
    ├── requirements.txt
    ├── run.py
    ├── run_with_CLI.py
    ├── soundPlayer.py
    ├── startupHandler.py
    ├── tickeys
    ├── tickeys_tray.py
    ├── tickeysui.kv
    └── windowManager.py

================================================
FILE CONTENTS
================================================

================================================
FILE: .gitignore
================================================
# Byte-compiled / optimized / DLL files
__pycache__/
*.py[cod]


# Distribution / packaging
.Python
env/
build/
develop-eggs/
dist/
downloads/
eggs/
.eggs/
lib/
lib64/
parts/
sdist/
var/
*.egg-info/
.installed.cfg
*.egg

# PyInstaller
#  Usually these files are written by a python script from a template
#  before PyInstaller builds the exe, so as to inject date/other infos into it.
*.manifest
*.spec

# Installer logs
pip-log.txt
pip-delete-this-directory.txt

# Unit test / coverage reports
htmlcov/
.tox/
.coverage
.coverage.*
.cache
nosetests.xml
coverage.xml
*,cover

# Translations
*.mo
*.pot

# Django stuff:
*.log

# Sphinx documentation
docs/_build/

# PyBuilder
target/


================================================
FILE: AUTHOURS
================================================
Huang Xiongbiao

================================================
FILE: Changelog
================================================
2016-08-18 version 0.2.6
1.启动不再需要root权限
2.更换键盘和音效实现
3.更加人性化

2016-08-02 version 0.2.5
1.修复小键盘的123不能响应热键的问题
2.修复隐藏按钮的一个交互问题
3.增加英语翻译,语言切换

2016-01-29 version 0.2.4
1.修复一个配置的bug
2.提供32位的deb包

2016-01-27 version 0.2.3
1.打包为deb包
2.软件字体更换为DroidSansFallbackFull
3.修复一些bug

2016-01-25 version 0.2.2
1.添加新音效(爆裂鼓手)
2.修改界面,现在显示中文
3.修改音效显示名称
4.修复一个键盘监测bug
5.再次运行程序自动打开设置界面

2015-10-31 version 0.2.1
1.修复错误弹出更新提示的bug

2015-10-13 version 0.2.0
1.打包成单独运行文件,制作了安装脚本,解决依赖问题
2.改为使用pyinstaller打包

2015-10-11 version 0.1.9
1.UI微调(字体,颜色等)

2015-10-10 version 0.1.8
1.修改了背景颜色,与mac版同步
2.同步了mac版的两款(Cherry)新音效

2015-09-05 version 0.1.7
1.增加了检查更新的功能

2015-08-31 version 0.1.6
1.实现将程序运行情况输出到log文件,以便调试 保存位置为/tmp/tickeys.log

2015-08-10 version 0.1.5
1.实现真正后台化,启动后会隐藏窗口
2.修改当前音效显示颜色

2015-08-10 version 0.1.4
1.打开程序后会出现气泡提醒

2015-08-04 version 0.1.3
1.修正因路径问题导致的配置无法正确显示的问题

2015-08-03 version 0.1.2
1.更新键盘检测方法(测试中)
2.增加配置自动保存功能
3.修改默认音效为mechanical
4.修改部分函数名称

2015-08-02 version 0.1.1a6
1.修改键盘检测方法,支持更多键盘类型(测试中)

2015-08-02 version 0.1.1a5
1.修改配色,使风格大致与mac版相同
2.修改布局,适应大小变化
3.加入开机自启动设置(测试中)

2015-07-31 version 0.1.0a4
1.加入changlog
2.修改setup,修改相关安装依赖


================================================
FILE: LICENSE
================================================
The MIT License (MIT)

Copyright (c) 2015 Xiongbiao Huang

Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.



================================================
FILE: MANIFEST.in
================================================
recursive-include tickeys/Resources/data *
recursive-include tickeys/Resources/fonts *
recursive-include tickeys/locale *
include tickeys/requirements.txt
include tickeys/tickeys
include tickeys/tickeysui.kv
include tickeys/tickeys.png
include README.md
include LICENSE
include AUTHOURS
include Changelog

================================================
FILE: README.md
================================================
# Tickeys-linux

Instant audio feedback when typing. For Linux.

![Tickeys Icon](http://img.blog.csdn.net/20150802103616846)

English Readme: [English Readme](https://github.com/BillBillBillBill/Tickeys-linux/blob/master/README_en_US.md)

中文版Readme: [中文Readme](https://github.com/BillBillBillBill/Tickeys-linux/blob/master/README_zh_CN.md)

# Screenshot

## v0.2.5
![Tickeys v0.2.5](https://github.com/BillBillBillBill/Tickeys-linux/blob/master/screenshot/tickeys_v0.2.5.png)

## v0.2.2
![Tickeys v0.2.2](https://github.com/BillBillBillBill/Tickeys-linux/blob/master/screenshot/tickeys_v0.2.2.png)

## v0.1.9
![Tickeys v0.1.9](https://github.com/BillBillBillBill/Tickeys-linux/blob/master/screenshot/tickeys_v0.1.9.png)

## v0.1.8
![Tickeys v0.1.8](https://github.com/BillBillBillBill/Tickeys-linux/blob/master/screenshot/tickeys_v0.1.8.png)

## v0.1.1
![Tickeys v0.1.1](https://github.com/BillBillBillBill/Tickeys-linux/blob/master/screenshot/tickeys_v0.1.1.png)

## v0.0.1
![Tickeys v0.0.1](https://github.com/BillBillBillBill/Tickeys-linux/blob/master/screenshot/tickeys_v0.0.1.png)


================================================
FILE: README_en_US.md
================================================
[Downlod 32 bit version tickeys_0.2.5_i386.deb:http://pan.baidu.com/s/1c2BN3Pm](http://pan.baidu.com/s/1c2BN3Pm)

[Downlod 64 bit version tickeys_0.2.5_amd64.deb:http://pan.baidu.com/s/1o8AhmwM](http://pan.baidu.com/s/1o8AhmwM)

Bug or question?

Please tell me in issue.

[![Join the chat at https://gitter.im/BillBillBillBill/Tickeys-linux](https://badges.gitter.im/Join%20Chat.svg)](https://gitter.im/BillBillBillBill/Tickeys-linux?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge&utm_content=badge)
![Tickeys Icon](http://img.blog.csdn.net/20150802103616846)

# Introduce
Tickeys is an powerful keyboard sound effect tool。Tickeys now brings seven sound styles,include Bubble, Typewriter, Mechanical, Sword, etc.

This tool have Windows and Mac version,Mac Version:([GitHub](https://github.com/yingDev/Tickeys))

# Project Website
http://www.yingdev.com/projects/tickeys

# PyPI
https://pypi.python.org/pypi/tickeys

# Tickeys Mac Version
https://github.com/yingDev/Tickeys

# Install
Tickeys has not been fully tested to install in different distribution yet, some distribution may need installing related requirements.

## Download the packaged deb(suggest)

* deb links:

[Downlod 32 bit version tickeys_0.2.5_i386.deb:http://pan.baidu.com/s/1c2BN3Pm](http://pan.baidu.com/s/1c2BN3Pm)

[Downlod 64 bit version tickeys_0.2.5_amd64.deb:http://pan.baidu.com/s/1o8AhmwM](http://pan.baidu.com/s/1o8AhmwM)

* After install, find Tickeys on launcher and open it

## Compile(Build from source, need requirements):

* next operation show **execute** `sudo apt-get install python-dev python-pip python-kivy xdotool gksu`first to meet the requirements for Tickeys to run.
* install package(Notice Version): sudo pip install cython==0.20.2 notify2 pyinstaller==3.0 kivy==1.9.0 evdev

#### Quick Compile Install:

* execute `sudo apt-get install python-dev python-pip python-kivy xdotool && sudo easy_install tickeys`。
* execute `sudo easy_install tickeys` or `sudo pip install tickeys`
* Use command `sudo tickeys` to open (`sudo tickeys -c` for CLI version)


#### Running Problem

* Couldn't hide window:

Solve:execute `sudo apt-get install xdotool ` to install xdotool

* no setuptools or pip

Solve:execute `sudo apt-get install python-pip` to install

* Python.h:no such file

Solve:execute `sudo apt-get install python-dev` to install

* ImportError: No module named Cython.Distutils

Solve:execute `sudo easy_install cython` to install

* ImportError: libSDL-1.2.so.0: cannot open shared object file: No such file or directory

    Solve:execute `yum install libSDL-1.2.so.0` to install

* NotImplementedError: mixer module not available

    Solve:same with above

Debian and Ubuntu User may try to install:

    * sudo apt-get install xdotool
    * sudo apt-get install libsdl1.2-dev
    * sudo apt-get install libsdl-mixer1.2
    * sudo apt-get install libsdl-ttf2.0

# How to use
Root permission is needed,implement the CLI and GUI version,GUI version is run by default,it will auto hide after open,press QAZ123 to show the window of tickeys.


# How to Develop
* ####Code Style: PEP8

* ####Application UI framework:Kivy

* ####Open sources license: MIT License

Install requirements:

    pip install -r requirements.txt

# Project struct
Tickeys-linux
```
├── AUTHOURS
├── build.sh
├── build.spec               pyinstaller
├── Changelog
├── deb.sh
├── dist
│   ├── make_deb.sh          script for deb
├── lib                      lib for run
├── LICENSE
├── MANIFEST.in
├── README.md
├── screenshot
├── setup.py
├── tickeys
│   ├── locale              translation
│   ├── build.py            cx_freeze(desperate)
│   ├── CLI.py              start CLI
│   ├── config.py           config controller
│   ├── GUI.py              start GUI
│   ├── __init__.py
│   ├── keyboardHandler.py  handler keyboard events
│   ├── logger.py
│   ├── requirements.txt
│   ├── Resources
│   │   ├── data
│   │   │   ├── bubble
│   │   │   ├── Cherry_G80_3000
│   │   │   ├── Cherry_G80_3494
│   │   │   ├── drum
│   │   │   ├── mechanical
│   │   │   ├── sword
│   │   │   └── typewriter
│   │   │   ├── schemes.json
│   │   └── fonts
│   │       └── DroidSansFallbackFull.ttf
│   ├── run.py            entry
│   ├── run_with_CLI.py   entry with CLI
│   ├── soundPlayer.py
│   ├── startupHandler.py
│   ├── tickeys
│   ├── tickeys.png
│   ├── tickeys_tray.py   (not use)
│   ├── tickeysui.kv      (desperate)
│   └── windowManager.py
└── tickeys.egg-info
```

# Author
Huang Xiongbiao

billo@qq.com


================================================
FILE: README_zh_CN.md
================================================
[下载32位tickeys_0.2.5_i386.deb:http://pan.baidu.com/s/1c2BN3Pm](http://pan.baidu.com/s/1c2BN3Pm)

[下载64位tickeys_0.2.5_amd64.deb:http://pan.baidu.com/s/1o8AhmwM](http://pan.baidu.com/s/1o8AhmwM)

如果有任何问题或者建议,请在issue中提出

[![Join the chat at https://gitter.im/BillBillBillBill/Tickeys-linux](https://badges.gitter.im/Join%20Chat.svg)](https://gitter.im/BillBillBillBill/Tickeys-linux?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge&utm_content=badge)
![Tickeys Icon](http://img.blog.csdn.net/20150802103616846)

# 简介
Tickeys是一款很强大的键盘音效软件。Tickeys 自带了七种声音效果方案,有打字机、冒泡、机械键盘、剑气等。每天都听着键盘声音是不是很烦闷,现在有了这款神器你就可以瞬间帮助自己的键盘加上逼格特效。

这个软件之前发布了Windows和Mac版,Tickeys 是由 Nozama 所做的一个 Mac 平台的开源小项目 ([GitHub](https://github.com/yingDev/Tickeys)),Windows 版由黄飞实现。我使用了之后,觉得挺有意思的,因此用Python写了个Linux版的。

# 项目网站
http://www.yingdev.com/projects/tickeys

PyPI: https://pypi.python.org/pypi/tickeys

# Tickeys的Mac版本
https://github.com/yingDev/Tickeys

# 安装说明
在不同发行版上可能会有因为文件的缺失或者环境不同导致无法使用,需要安装相关依赖。

## 下载打包好的安装包安装(建议)

* 下载deb安装包:

[下载32位tickeys_0.2.4_i386.deb:http://pan.baidu.com/s/1geOYtdp](http://pan.baidu.com/s/1c2BN3Pm)

[下载64位tickeys_0.2.4_amd64.deb:http://pan.baidu.com/s/1o8AhmwM](http://pan.baidu.com/s/1o8AhmwM)

* 安装后,在启动器中找到Tickeys打开。

## 编译安装(需要安装依赖):

* 以下方法需要**先执行**`sudo apt-get install python-dev python-pip python-kivy xdotool gksu`来安装依赖,一般这样就可以满足运行条件了。
* 安装库(注意版本): sudo pip install cython==0.20.2 notify2 pyinstaller==3.0 kivy==1.9.0 evdev

#### 快速编译安装:执行`sudo apt-get install python-dev python-pip python-kivy xdotool && sudo easy_install tickeys`。

### 方法1.自动安装

* 执行`sudo easy_install tickeys` or `sudo pip install tickeys`安装
* 然后通过 `sudo tickeys` 来打开 (sudo tickeys -c 打开CLI版本)

### 方法2.半自动安装

* 下载 https://github.com/BillBillBillBill/Tickeys-linux/archive/master.zip ,解压后运行 `sudo python setup.py install`
* 然后通过 `sudo tickeys` 来打开 (sudo tickeys -c 打开CLI版本)


#### 错误解决方案:

* 无法隐藏窗口:

解决方法:使用`sudo apt-get install xdotool `安装xdotool

* 若没有setuptools or pip

解决方法:使用`sudo apt-get install python-pip` 安装

* Python.h:没有那个文件或目录

解决方法:使用`sudo apt-get install python-dev`安装

* ImportError: No module named Cython.Distutils

解决方法:使用`sudo easy_install cython`安装


* ImportError: libSDL-1.2.so.0: cannot open shared object file: No such file or directory

    解决方法:使用`yum install libSDL-1.2.so.0`安装依赖

* NotImplementedError: mixer module not available

    解决方法:同上

Debian and Ubuntu 用户则可以尝试安装:

    * sudo apt-get install xdotool
    * sudo apt-get install libsdl1.2-dev
    * sudo apt-get install libsdl-mixer1.2
    * sudo apt-get install libsdl-ttf2.0

# 使用说明
需要以root权限才能启动,实现了CLI版本和GUI版本,默认启动GUI版本,GUI版本启动后会自动隐藏,按QAZ123唤出窗口。

调整参数后会自动保存,下次开启会使用该设置。

Open at startup是开启开机自启动功能选项,开关置为ON开启功能,开关置为OFF关闭功能。

# TODO
1.打开程序后出现气泡提醒(已实现)
2.使GUI真正后台化(已实现)
3.按最小化按钮或退出按钮隐藏GUI
4.程序运行情况输出到log文件中,以便调试(已实现)

# 开发
* ####编码规范: PEP8

* ####应用UI框架:Kivy

* ####开源许可证: MIT License

依赖安装:

    pip install -r requirements.txt

使用pyinstaller打包
    命令:`pyinstaller build.spec`

播放音乐通过pygame的mixer实现。

键盘事件的获取通过evdev实现。

窗口的控制使用工具xdotool来实现。(另一方法是使用wmctrl来控制窗口)

xdotool的使用:
* 获取窗口ID:
    WID=`xdotool search "Tickeys" | head -1`

* 激活窗口:
    xdotool windowactivate --sync $WID
    xdotool windowmap --sync $WID && xdotool windowactivate --sync $WID

* 隐藏窗口实现:
    xdotool getactivewindow windowunmap
    ~~xdotool getactivewindow windowminimize~~
    或
    ~~xdotool getactivewindow windowmove 999 0~~


# 项目结构
Tickeys-linux
```
├── AUTHOURS
├── build.sh
├── build.spec               pyinstaller打包用
├── Changelog                版本变动说明
├── deb.sh
├── dist
│   ├── make_deb.sh          打包成deb包的脚本
├── lib                      运行所用的一些库
├── LICENSE
├── MANIFEST.in
├── README.md
├── screenshot              Tickeys截图文件
├── setup.py                分发用
├── tickeys
│   ├── locale              翻译文件
│   ├── build.py            cx_freeze打包,已不用
│   ├── CLI.py              启动CLI的模块
│   ├── config.py            处理配置保存和读取的模块
│   ├── GUI.py              启动GUI的模块
│   ├── __init__.py
│   ├── keyboardHandler.py  处理键盘输入的函数
│   ├── logger.py           日志记录函数,调试时使用
│   ├── requirements.txt    开发模块依赖包
│   ├── Resources           程序资源,包括音效,字体等
│   │   ├── data
│   │   │   ├── bubble
│   │   │   ├── Cherry_G80_3000
│   │   │   ├── Cherry_G80_3494
│   │   │   ├── drum
│   │   │   ├── mechanical
│   │   │   ├── sword
│   │   │   └── typewriter
│   │   │   ├── schemes.json
│   │   └── fonts
│   │       └── DroidSansFallbackFull.ttf
│   ├── run.py            程序入口
│   ├── run_with_CLI.py   程序入口,带CLI版(失败时运行CLI)
│   ├── soundPlayer.py       播放声效的模块
│   ├── startupHandler.py    控制开机自启动的模块
│   ├── tickeys           启动tickeys的脚本,打包时放进打包后的文件夹使用
│   ├── tickeys.png
│   ├── tickeys_tray.py   托盘,由于打包大小问题尚未放入
│   ├── tickeysui.kv      kv的ui文件,现在已直接写入GUI.py中
│   └── windowManager.py  提供窗口控制的方法
└── tickeys.egg-info
```

# 文件说明
* build.py cx_freeze打包函数

* run.py 存放入口函数

* readme.txt 放进打包后程序文件夹的readme

* requirements.txt

* tickeys

* CLI.py

* GUI.py

* config.py

* tickeysui.kv

* KeyboardHandler.py

* logger.py

* SoundPlayer.py

* StartupHandler.py


# 问题
* 目前在Fedora上好像无法使用GUI的,不知道是因为我用虚拟机开的问题还是Kivy这个框架的问题,因为提示The 3D features of the virtual machine will be disabled。


# 作者
Huang Xiongbiao

billo@qq.com


================================================
FILE: build.sh
================================================
#!/bin/bash
pyinstaller build.spec

================================================
FILE: build32.sh
================================================
#!/bin/bash
pyinstaller build32.spec

================================================
FILE: deb.sh
================================================
#!/bin/bash
sh build.sh
cd dist
sudo sh make_deb.sh

================================================
FILE: deb32.sh
================================================
#!/bin/bash
sh build32.sh
cd dist
sudo sh make_deb32.sh

================================================
FILE: setup.py
================================================
from setuptools import setup, find_packages
from tickeys import __version__, __author__, __email__

requirements = [
    'cython==0.20.2',
    'kivy==1.9.0',
    'evdev',
    'sounddevice',
    'soundfile',
    'notify2',
]


setup(name='tickeys',
      version=__version__,
      download_url='https://github.com/BillBillBillBill/Tickeys-linux',
      packages=['tickeys'],
      package_dir={'tickeys': 'tickeys'},
      include_package_data=True,
      package_data={'tickeys': ['*.*']},
      # data_files=[],
      classifiers=[
          'Intended Audience :: End Users/Desktop',
          'Development Status :: 3 - Alpha',
          'Environment :: X11 Applications',
          'License :: OSI Approved :: MIT License',
          'Operating System :: POSIX :: Linux',
          'Natural Language :: Chinese (Simplified)',
          'Programming Language :: Python :: 2.7',
      ],
      author=__author__,
      author_email=__email__,
      description='Instant audio feedback when typing. For Linux.',
      long_description=open('README.md').read(),
      keywords='keyboard typing audio feedback ',
      url='https://github.com/BillBillBillBill/Tickeys-linux',
      license='MIT',
      entry_points={
          'console_scripts': ['tickeys = tickeys:main']
      },
      install_requires=requirements,
      tests_require=requirements)


================================================
FILE: tickeys/CLI.py
================================================
#!/usr/bin/env python
# coding: utf-8
import cmd
from keyboardHandler import KeyboardHandler
from __init__ import __version__
import sys
reload(sys)

sys.setdefaultencoding("utf-8")


class CLI(cmd.Cmd):

    def __init__(self):
        cmd.Cmd.__init__(self)
        self.intro = "Tickeys %s - Linux\nType 'help' for help" % __version__
        self.prompt = ">>> "
        self.detecter = KeyboardHandler()
        self.detecter.start_detecting()

        self.volume = self.detecter.get_player_infor()['volume'] * 100.0
        self.pitch = self.detecter.get_player_infor()['pitch'] * 10.0
        self.style = self.detecter.get_player_infor()['style']

    def default(self, line):
        print "Command '%s' is invalid, try 'help'" % line

    def help_setstyle(self):
        print "Set style, change the sound's effect"

    def do_setstyle(self, arg):
        style_index = raw_input(
            "Input the effect style number you want"
            "(0:bubble 1:mechanical 2:sword 3:typewriter 4:Cherry_G80_3000 5:Cherry_G80_3494 6:drum):")
        style_list = ['bubble', 'mechanical', 'sword', 'typewriter', 'Cherry_G80_3000', 'Cherry_G80_3494', 'drum']

        try:
            style_index = int(style_index)
            assert(0 <= style_index <= 6)
        except Exception:
            print "Input must between 0~6!!"
            return

        self.style = style_list[style_index]
        self.detecter.set_style(self.style)

    def help_setvol(self):
        print "Set volume, input the volume you want"

    def do_setvol(self, arg):
        volume = raw_input("Input the volume(0~100) you want:")

        try:
            volume = float(volume)
            assert(0 <= volume <= 100)
        except Exception:
            print "Volume must between 0~100!!"
            return

        self.volume = volume
        self.detecter.set_volume(self.volume/100.0)

    # def help_getvol(self):
    #     print "Get the volume"

    # def do_getvol(self, arg):
    #     print self.volume

    def help_setpitch(self):
        print "Set pitch, input the pitch you want"

    def do_setpitch(self, arg):
        pitch = raw_input("Input the pitch(0~30, default 10) you want:")

        try:
            pitch = float(pitch)
            assert(0 <= pitch <= 30)
        except Exception:
            print "Pitch must between 0~30!!"
            return

        self.pitch = pitch
        self.detecter.set_pitch(self.pitch/10.0)

    # def help_getpitch(self):
    #     print "Get the pitch"

    # def do_getpitch(self, arg):
    #     print self.pitch

    def help_getinfo(self):
        print "Get tickeys' sound effect, volume and pitch"

    def do_getinfo(self, arg):
        print "Sound effect: %s  Volume: %s  Pitch: %s" \
            % (self.style, self.volume, self.pitch)

    def do_quit(self, arg):
        try:
            self.detecter.stop_detecting()
        except Exception:
            pass
        finally:
            sys.exit(0)
            return True


if __name__ == "__main__":
    cli = CLI()
    cli.cmdloop()


================================================
FILE: tickeys/GUI.py
================================================
#!/usr/bin/env python
# coding: utf-8
from kivy.app import App
from kivy.uix.spinner import Spinner
from kivy.uix.boxlayout import BoxLayout
from kivy.uix.gridlayout import GridLayout
from kivy.uix.modalview import ModalView
from kivy.uix.button import Button
from kivy.uix.label import Label
from keyboardHandler import KeyboardHandler
from kivy.lang import Builder
from startupHandler import add_startup_linux, check_startup_file, delete_startup_linux
from logger import logger
from config import configer
from __init__ import __version__, debug_mode

import sys
import os
import gettext
from ast import literal_eval

from threading import Thread
import notify2
from windowManager import hide_GUI, save_GUI_window_id

reload(sys)
sys.setdefaultencoding("utf-8")

# set font
from kivy.core.text import Label as textLabel
try:
    os.chdir(os.path.dirname(__file__))
except Exception:
    pass
textLabel.register("DroidSans", "./Resources/fonts/DroidSansFallbackFull.ttf")


t = gettext.translation('tickeys', 'locale', languages=[configer.lang], fallback=True)
_ = t.ugettext

Builder.load_string(('''
<Main>:
    pos: 0,0
    padding: 50
    rows: 6
    row_force_default: True
    row_default_height: 50
    spacing: 50
    orientation: 'vertical'

    canvas:
        Color:
            rgba: 0.368, 0.384, 0.447, 0.8
        Rectangle:
            pos: 0,0
            size: self.size
    Label:
        bold: True
        text: 'Tickeys'
        font_size: 50
        size_hint_y: None

    SpinnerRow
    AdjustVol
    AdjustPitch
    ExitAndSwitchRow
    InforRow


<AdjustVol>
    Label:
        bold: True
        color: 1, 1, 1, 1
        font_size: 33
        size_hint_x: None
        width: 250
        text: '%s'
    Slider:
        min: 0.0
        max: 1.0
        value: root.parent.configer.volume
        width: 300
        on_value: root.setVolume(self.value)

<AdjustPitch>
    Label:
        bold: True
        color: 1, 1, 1, 1
        font_size: 33
        size_hint_x: None
        width: 250
        text: '%s'
    Slider:
        min: 0.8
        max: 2.5
        value: root.parent.configer.pitch
        width: 300
        on_value: root.setPitch(self.value)


<SpinnerRow>:
    Label:
        bold: True
        color: 1, 1, 1, 1
        font_size: 33
        size_hint_x: None
        text: "%s"
        width: 250
    EffectSpinner:
        on_text: root.change_style()


<EffectSpinner>:
    bold: True
    font_size: 30
    text: root.get_style_name()
    background_color: 3, 3, 3, 1
    color: 0.1, 0.67, 0.93, 1
    values: %s

<ExitAndSwitchRow>:
    Label:
        size_hint_x: None
        width: root.width/6.0 - 120
    Label:
        size_hint_x: None
        color: 1, 1, 1, 1
        font_size: 17
        width: root.width/6.0 + 60
        text: '%s:'
    Switch:
        size_hint_x: None
        width: 40
        id: switcher
        active: root.have_added
        on_active: root.add_delete_startup_file(self.active)
    Label:
        size_hint_x: None
        width: root.width/6.0 - 85
    Spinner:
        width: 40
        bold: True
        font_size: 20
        text: root.get_language_name()
        background_color: 3, 3, 3, 1
        color: 0.1, 0.67, 0.93, 1
        values: ['English', '简体中文']
        on_text: root.set_language(self.text)
    Label:
        size_hint_x: None
        width: 20
    Button:
        size_hint_x: None
        width: 150
        font_size: 20
        background_color: 3, 3, 3, 1
        bold: True
        text: "%s"
        color: 0,0,0,1
        on_press: root.Exit()
    Label:
        size_hint_x: None
        width: 20
    Button:
        size_hint_x: None
        width: 150
        font_size: 20
        background_color: 3, 3, 3, 1
        bold: True
        text: "%s"
        color: 0,0,0,1
        on_release: root.Hide()

<InforRow>:
    Label:
        color: 0.8, 0.8, 0.8, 1
        font_size: 20
        size_hint_x: None
        text: root.get_version()
        width: root.width/3.0
    Label:
        color: 0.8, 0.8, 0.8, 1
        font_size: 20
        size_hint_x: None
        markup: True
        text: "[ref=%s]%s[/ref]"
        width: root.width/3.0
        on_ref_press:root.open_project_website()
    Label:
        color: 0.8, 0.8, 0.8, 1
        font_size: 20
        size_hint_x: None
        text: "%s: Bill (billo@qq.com)"
        width: root.width/3.0
        border: 1,1,1,1
        on_touch_move:
''' % (_("Volume"), _("Pitch"), _("Sound Style"), _("Sound Style Items"), _("Start at startup"), _("Quit"), _("Hide"), _("Project Website"), _("Project Website"), _("Author"))).encode('utf-8'))


def show_notify(notify_content=""):
    try:
        notify2.init('Tickeys')
        title = 'Tickeys'
        icon_file_path = os.getcwd() + '/tickeys.png'
        notify = notify2.Notification(title, notify_content, icon_file_path)
        notify.show()
    except Exception, e:
        logger.exception(e)
        logger.error("show notify fail")


def show_startup_notify():
    notify_content = _("Startup Notify")
    show_notify(notify_content)


def check_update_and_notify():
    try:
        import urllib
        import json
        logger.info("Version checking...")
        r = urllib.urlopen('http://billbill.sinaapp.com/tickeys')
        return_msg = json.loads(r.read())
        print return_msg
        if return_msg["version"] <= __version__:
            logger.debug("Version checking success. It is the latest version...")
        else:
            # show update notify
            notify_content = _("Update Notify") % (return_msg["version"], return_msg["update"])
            print notify_content
            show_notify(notify_content)
    except Exception, e:
        logger.exception(e)
        logger.error("Version checking fail:" + str(e))


class EffectSpinner(Spinner):
    def get_style_name(self):
        style_list = literal_eval(_("Sound Style Items"))
        style_display_name_map = {
            'bubble': style_list[0],
            'typewriter': style_list[1],
            'mechanical': style_list[2],
            'sword': style_list[3],
            'Cherry_G80_3000': style_list[4],
            'Cherry_G80_3494': style_list[5],
            'drum': style_list[6]
        }
        name = self.parent.parent.configer.style
        return style_display_name_map.get(name, name)


class SpinnerRow(BoxLayout):
    def change_style(self):
        style_list = literal_eval(_("Sound Style Items"))
        style_display_name_map = {
            style_list[0]: "bubble",
            style_list[1]: "typewriter",
            style_list[2]: "mechanical",
            style_list[3]: "sword",
            style_list[4]: "Cherry_G80_3000",
            style_list[5]: "Cherry_G80_3494",
            style_list[6]: "drum"
        }
        # for safe
        if self.children[0].text not in style_display_name_map:
            return
        style_name = style_display_name_map[self.children[0].text]
        self.parent.detecter.set_style(style_name)


class AdjustVol(BoxLayout):
    def setVolume(self, volume):
        self.parent.detecter.set_volume(volume)


class AdjustPitch(BoxLayout):
    def setPitch(self, pitch):
        self.parent.detecter.set_pitch(pitch)


class SwitcherRow(BoxLayout):
    pass


class ExitAndSwitchRow(BoxLayout):
    def Exit(self):
        os._exit(0)

    def Hide(self):
        self.parent.Hide()

    def add_delete_startup_file(self, active):
        if active:
            add_startup_linux()
        else:
            delete_startup_linux()

    def set_language(self, language):
        language_map = {
            "English": "en_US",
            "简体中文": "zh_CN"
        }
        self.parent.configer.lang = language_map.get(language, "en_US")
        self.parent.configer.save_config()
        # show popup hint
        view = ModalView(size_hint=(None, None), size=(0, 0))
        view.add_widget(Label(text=_("This will take effect next time you start"), font_size=30))
        view.open()

    def get_language_name(self):
        lang_display_name_map = {
            "en_US": "English",
            "zh_CN": "简体中文"
        }
        lang = self.parent.configer.lang
        return lang_display_name_map.get(lang, "English")

    @property
    def have_added(self):
        return check_startup_file()


class InforRow(BoxLayout):
    def open_project_website(self, *args):
        from webbrowser import open_new
        open_new("https://github.com/BillBillBillBill/Tickeys-linux")

    def get_version(self):
        return 'Version: ' + __version__


class Main(GridLayout):
    def __init__(self, *args, **kwargs):
        self.configer = configer
        super(Main, self).__init__(**kwargs)
        save_GUI_window_id()
        self.Hide()
        # set up keyboard detecter
        self.detecter = KeyboardHandler()
        self.detecter.start_detecting()
        # show notify message
        Thread(target=show_startup_notify).start()
        # now not check update
        # Thread(target=check_update_and_notify).start()

    def Hide(self):
        if not debug_mode:
            hide_GUI()


class TickeysApp(App):
    def __init__(self, *args, **kwargs):
        super(TickeysApp, self).__init__(**kwargs)

    def build(self):
        self.icon = 'tickeys.png'
        root = Main()
        return root

    def on_stop(self):
        os._exit(0)


if __name__ == '__main__':
    TickeysApp().run()


================================================
FILE: tickeys/Resources/data/bubble/license.txt
================================================
Sound pack downloaded from Freesound.org
----------------------------------------

This pack of sounds contains sounds by Glaneur de sons ( http://www.freesound.org/people/Glaneur%20de%20sons/  )
You can find this pack online at: http://www.freesound.org/people/Glaneur%20de%20sons/packs/6686/


License details
---------------

Sampling+: http://creativecommons.org/licenses/sampling+/1.0/
Creative Commons 0: http://creativecommons.org/publicdomain/zero/1.0/
Attribution: http://creativecommons.org/licenses/by/3.0/
Attribution Noncommercial: http://creativecommons.org/licenses/by-nc/3.0/


Sounds in this pack
-------------------

  * 104950__Glaneur_de_sons__bubbles_2_.wav
    * url: http://www.freesound.org/people/Glaneur%20de%20sons/sounds/104950/
    * license: Attribution
  * 104949__Glaneur_de_sons__bubbles_1_.wav
    * url: http://www.freesound.org/people/Glaneur%20de%20sons/sounds/104949/
    * license: Attribution
  * 104948__Glaneur_de_sons__bubble_9_.wav
    * url: http://www.freesound.org/people/Glaneur%20de%20sons/sounds/104948/
    * license: Attribution
  * 104947__Glaneur_de_sons__bubble_8_.wav
    * url: http://www.freesound.org/people/Glaneur%20de%20sons/sounds/104947/
    * license: Attribution
  * 104946__Glaneur_de_sons__bubble_7_.wav
    * url: http://www.freesound.org/people/Glaneur%20de%20sons/sounds/104946/
    * license: Attribution
  * 104945__Glaneur_de_sons__bubble_6_.wav
    * url: http://www.freesound.org/people/Glaneur%20de%20sons/sounds/104945/
    * license: Attribution
  * 104944__Glaneur_de_sons__bubble_5_.wav
    * url: http://www.freesound.org/people/Glaneur%20de%20sons/sounds/104944/
    * license: Attribution
  * 104943__Glaneur_de_sons__bubble_4_.wav
    * url: http://www.freesound.org/people/Glaneur%20de%20sons/sounds/104943/
    * license: Attribution
  * 104942__Glaneur_de_sons__bubble_3_.wav
    * url: http://www.freesound.org/people/Glaneur%20de%20sons/sounds/104942/
    * license: Attribution
  * 104941__Glaneur_de_sons__bubble_2_.wav
    * url: http://www.freesound.org/people/Glaneur%20de%20sons/sounds/104941/
    * license: Attribution
  * 104940__Glaneur_de_sons__bubble_1_.wav
    * url: http://www.freesound.org/people/Glaneur%20de%20sons/sounds/104940/
    * license: Attribution



================================================
FILE: tickeys/Resources/data/drum/_readme_and_license.txt
================================================
Sound pack downloaded from Freesound.org
----------------------------------------

This pack of sounds contains sounds by Veiler ( http://www.freesound.org/people/Veiler/  )
You can find this pack online at: http://www.freesound.org/people/Veiler/packs/16053/


License details
---------------

Sampling+: http://creativecommons.org/licenses/sampling+/1.0/
Creative Commons 0: http://creativecommons.org/publicdomain/zero/1.0/
Attribution: http://creativecommons.org/licenses/by/3.0/
Attribution Noncommercial: http://creativecommons.org/licenses/by-nc/3.0/


Sounds in this pack
-------------------

  * 261413__veiler__crash.wav
    * url: http://www.freesound.org/people/Veiler/sounds/261413/
    * license: Creative Commons 0
  * 261412__veiler__tom-2.wav
    * url: http://www.freesound.org/people/Veiler/sounds/261412/
    * license: Creative Commons 0
  * 261411__veiler__tom-3.wav
    * url: http://www.freesound.org/people/Veiler/sounds/261411/
    * license: Creative Commons 0
  * 261410__veiler__tom-4.wav
    * url: http://www.freesound.org/people/Veiler/sounds/261410/
    * license: Creative Commons 0
  * 261409__veiler__kick-bass-win.wav
    * url: http://www.freesound.org/people/Veiler/sounds/261409/
    * license: Creative Commons 0
  * 261408__veiler__snare-3.wav
    * url: http://www.freesound.org/people/Veiler/sounds/261408/
    * license: Creative Commons 0
  * 261407__veiler__tom-1.wav
    * url: http://www.freesound.org/people/Veiler/sounds/261407/
    * license: Creative Commons 0



================================================
FILE: tickeys/Resources/data/mechanical/license.txt
================================================
Sound pack downloaded from Freesound.org
----------------------------------------

This pack of sounds contains sounds by jim-ph ( http://www.freesound.org/people/jim-ph/  )
You can find this pack online at: http://www.freesound.org/people/jim-ph/packs/12363/


License details
---------------

Sampling+: http://creativecommons.org/licenses/sampling+/1.0/
Creative Commons 0: http://creativecommons.org/publicdomain/zero/1.0/
Attribution: http://creativecommons.org/licenses/by/3.0/
Attribution Noncommercial: http://creativecommons.org/licenses/by-nc/3.0/


Sounds in this pack
-------------------

  * 194799__jim-ph__keyboard5.wav
    * url: http://www.freesound.org/people/jim-ph/sounds/194799/
    * license: Creative Commons 0
  * 194798__jim-ph__vintage-keyboard-4.wav
    * url: http://www.freesound.org/people/jim-ph/sounds/194798/
    * license: Creative Commons 0
  * 194797__jim-ph__vintage-keyboard-3.wav
    * url: http://www.freesound.org/people/jim-ph/sounds/194797/
    * license: Creative Commons 0
  * 194796__jim-ph__vintage-keyboard-2.wav
    * url: http://www.freesound.org/people/jim-ph/sounds/194796/
    * license: Creative Commons 0
  * 194795__jim-ph__vintage-keyboard-1.wav
    * url: http://www.freesound.org/people/jim-ph/sounds/194795/
    * license: Creative Commons 0



================================================
FILE: tickeys/Resources/data/schemes.json
================================================
[
	{
		"name":"bubble",
		"display_name":"冒泡",
		"files":["1.wav","2.wav","3.wav","4.wav","5.wav","6.wav","7.wav","8.wav", "enter.wav"],
		"non_unique_count":8,
		"key_audio_map":{"36":8}
	},

	{
		"name":"typewriter",
		"display_name":"打字机",
		"files":["key-new-05.wav","key-new-04.wav","key-new-03.wav","key-new-02.wav","key-new-01.wav","space-new.wav","scrollUp.wav","scrollDown.wav","backspace.wav", "return-new.wav"],
		"non_unique_count":5,
		"key_audio_map":{"36":9, "49":5, "51":8}
	},

	{
		"name": "mechanical",
		"display_name":"机械键盘",
		"files":["1.wav", "2.wav", "3.wav", "4.wav", "5.wav"],
		"non_unique_count":4,
		"key_audio_map":{"36":4}
	},

	{
		"name": "sword",
		"display_name": "剑气",
		"files": ["1.wav", "2.wav", "3.wav", "4.wav", "5.wav", "6.wav", "back.wav", "enter.wav", "space.wav"],
		"non_unique_count": 6,
		"key_audio_map":{"36": 7,"49":8, "51":6}
	},

	{
		"name": "Cherry_G80_3000",
		"display_name": "Cherry G80-3000",
		"files": ["G80-3000.wav",  "G80-3000_fast1.wav", "G80-3000_slow1.wav", "G80-3000_fast2.wav","G80-3000_slow2.wav"],
		"non_unique_count": 5,
		"key_audio_map":{"36": 4, "49": 4}
	},

	{
		"name": "Cherry_G80_3494",
		"display_name": "Cherry G80-3494",
		"files": ["G80-3494.wav", "G80-3494_fast1.wav", "G80-3494_slow1.wav", "G80-3494_enter.wav", "G80-3494_space.wav", "G80-3494_backspace.wav"],
		"non_unique_count": 3,
		"key_audio_map":{"36": 3, "49": 4, "51": 5}
	},

	{
		"name": "drum",
		"display_name": "爆裂鼓手",
		"files": ["1.wav", "2.wav", "3.wav", "4.wav", "space.wav", "backspace.wav", "enter.wav"],
		"non_unique_count": 4,
		"key_audio_map":{"36": 6, "49": 4, "51": 5}
	}
]

================================================
FILE: tickeys/__init__.py
================================================
__author__ = 'Huang Xiongbiao'
__email__ = 'billo@qq.com'
__version__ = '0.2.6'
debug_mode = False

from run import main


def tickeys():
    main()


================================================
FILE: tickeys/build.py
================================================
import shutil
import os
from cx_Freeze import setup, Executable
from __init__ import __version__

executable_filename = "tickeys"

if __name__ == '__main__':

    buildOptions = dict(
        compressed=True,
        include_files=['kivy', 'tickeys', 'Resources'],)

    setup(
        name=executable_filename,
        version=__version__,
        description='Instant audio feedback when typing. For Linux.',
        options=dict(build_exe=buildOptions),
        executables=[Executable("run.py")])

    # print "Move resources file..."
    # shutil.copytree("../Resources", os.getcwd() + "/build/Resources")

    print "Add readme file..."
    shutil.copyfile("../README.md", os.getcwd() + "/build/README.md")

    print "Add some docs..."
    shutil.copyfile("../AUTHOURS", os.getcwd() + "/build/AUTHOURS")
    shutil.copyfile("../Changelog", os.getcwd() + "/build/Changelog")
    shutil.copyfile("../LICENSE", os.getcwd() + "/build/LICENSE")

================================================
FILE: tickeys/config.py
================================================
import ConfigParser
import os
from logger import logger


class Configer():
    """docstring for Configer"""
    def __init__(self, *arg):
        try:
            os.chdir(os.path.dirname(__file__))
        except Exception:
            pass
        self.config_path = os.environ["HOME"] + "/.tickeys/tickeys.conf"
        self.cf = ConfigParser.ConfigParser()
        self.read_config()

    def init_config(self):
        self.style = 'mechanical'
        self.volume = 1.0
        self.pitch = 1.0
        self.lang = 'en_US'
        self.autostart = False
        self.save_config()

    def read_config(self):
        try:
            if not os.path.exists(self.config_path):
                self.init_config()
            else:
                self.cf.read(self.config_path)
                self.volume = self.cf.getfloat('options', 'volume')
                self.pitch = self.cf.getfloat('options', 'pitch')
                self.style = self.cf.get('options', 'style')
                self.autostart = self.cf.get('options', 'autostart')
                self.lang = self.cf.get('options', 'lang')
        except Exception, e:
            self.init_config()
            logger.debug(e)

    def save_config(self):
        if not self.cf.sections():
            self.cf.add_section('options')
        self.cf.set('options', 'volume', self.volume)
        self.cf.set('options', 'pitch', self.pitch)
        self.cf.set('options', 'style', self.style)
        self.cf.set('options', 'lang', self.lang)
        self.cf.set('options', 'autostart', self.autostart)

        with open(self.config_path, 'w') as f:
            self.cf.write(f)

    @property
    def volume(self):
        return self.volume

    @property
    def pitch(self):
        return self.pitch

    @property
    def style(self):
        return self.style

    @property
    def lang(self):
        return self.lang

    @property
    def autostart(self):
        return self.autostart

configer = Configer()


================================================
FILE: tickeys/keyboardHandler.py
================================================
#!/usr/bin/env python
# coding: utf-8
import threading
from soundPlayer import SoundPlayer
from logger import logger
from pyxhook import HookManager
from windowManager import show_GUI

__author__ = 'Huang xiongbiao(billo@qq.com)'


class KeyboardHandler():

    def __init__(self):
        logger.debug("Keyboard deteccter created.")
        self.hm = HookManager()
        self.hm.KeyDown = self.key_down
        self.hm_thread = None
        self.input_record_list = []
        self.hot_key_list = [24, 38, 52, 10, 11, 12]      # QAZ123
        self.hot_key_list2 = [24, 38, 52, 87, 88, 89]  # QAZ123 with 123 in side keyboard
        self.sp = SoundPlayer()

    def set_style(self, style):
        self.sp.set_style(style)

    def set_volume(self, volume):
        self.sp.set_volume(volume)

    def set_pitch(self, pitch):
        self.sp.set_pitch(pitch)

    def get_player_infor(self):
        return self.sp.get_infor()

    def key_down(self, event):
        self.sp.play(event.ScanCode)
        self.check_show_window(event.ScanCode)
        # logger.debug(str(event))

    # check input if satisfy the hotkey
    def check_show_window(self, key_code):
        if self.input_record_list and key_code == self.input_record_list[-1]:
            return
        input_record_length = len(self.input_record_list)
        next_key_code = self.hot_key_list[input_record_length]
        next_key_code2 = self.hot_key_list2[input_record_length]
        if key_code == next_key_code or key_code == next_key_code2:
            self.input_record_list.append(key_code)
            if input_record_length == 5:
                show_GUI()
                self.input_record_list = []
        else:
            # clear the record if not satisfy
            self.input_record_list = []

    def start_detecting(self):
        self.hm_thread = threading.Thread(target=self.hm.start, args=())
        self.hm_thread.start()

    # kill all threads
    def stop_detecting(self):
        self.hm_thread._Thread__stop()
        self.hm.cancel()

if __name__ == '__main__':
    detecter = KeyboardHandler()
    detecter.start_detecting()


================================================
FILE: tickeys/kivy/__init__.py
================================================
'''
Kivy framework
==============

Kivy is an open source library for developing multi-touch applications. It is
completely cross-platform (Linux/OSX/Win) and released under the terms of the
MIT License.

It comes with native support for many multi-touch input devices, a growing
library of multi-touch aware widgets and hardware accelerated OpenGL drawing.
Kivy is designed to let you focus on building custom and highly interactive
applications as quickly and easily as possible.

With Kivy, you can take full advantage of the dynamic nature of Python. There
are thousands of high-quality, free libraries that can be integrated in your
application. At the same time, performance-critical parts are implemented
in the C language.

See http://kivy.org for more information.
'''

__all__ = (
    'require',
    'kivy_configure', 'kivy_register_post_configuration',
    'kivy_options', 'kivy_base_dir',
    'kivy_modules_dir', 'kivy_data_dir', 'kivy_shader_dir',
    'kivy_icons_dir', 'kivy_home_dir', 'kivy_userexts_dir',
    'kivy_config_fn', 'kivy_usermodules_dir',
)

__version__ = '1.9.0'

import sys
import shutil
from getopt import getopt, GetoptError
from os import environ, mkdir
from os.path import dirname, join, basename, exists, expanduser
from kivy.logger import Logger, LOG_LEVELS
from kivy.utils import platform

# internals for post-configuration
__kivy_post_configuration = []


if platform == 'macosx' and sys.maxsize < 9223372036854775807:
    r = '''Unsupported Python version detected!:
    Kivy requires a 64 bit version of Python to run on OS X. We strongly
    advise you to use the version of Python that is provided by Apple
    (don't use ports, fink or homebrew unless you know what you're
    doing).
    See http://kivy.org/docs/installation/installation-macosx.html for
    details.
    '''
    Logger.critical(r)


def require(version):
    '''Require can be used to check the minimum version required to run a Kivy
    application. For example, you can start your application code like this::

        import kivy
        kivy.require('1.0.1')

    If a user attempts to run your application with a version of Kivy that is
    older than the specified version, an Exception is raised.

    The Kivy version string is built like this::

        X.Y.Z[-tag[-tagrevision]]

        X is the major version
        Y is the minor version
        Z is the bugfixes revision

    The tag is optional, but may be one of 'dev', 'alpha', or 'beta'.
    The tagrevision is the revision of the tag.

    .. warning::

        You must not ask for a version with a tag, except -dev. Asking for a
        'dev' version will just warn the user if the current Kivy
        version is not a -dev, but it will never raise an exception.
        You must not ask for a version with a tagrevision.

    '''

    def parse_version(version):
        # check for tag
        tag = None
        tagrev = None
        if '-' in version:
            l = version.split('-')
            if len(l) == 2:
                version, tag = l
            elif len(l) == 3:
                version, tag, tagrev = l
            else:
                raise Exception('Revision format must be X.Y.Z[-tag]')

        # check x y z
        l = version.split('.')
        if len(l) != 3:
            raise Exception('Revision format must be X.Y.Z[-tag]')
        return [int(x) for x in l], tag, tagrev

    # user version
    revision, tag, tagrev = parse_version(version)
    # current version
    sysrevision, systag, systagrev = parse_version(__version__)

    # ensure that the required version don't contain tag, except dev
    if tag not in (None, 'dev'):
        raise Exception('Revision format must not have any tag except "dev"')
    if tag == 'dev' and systag != 'dev':
        Logger.warning('Application requested a -dev version of Kivy. '
                       '(You have %s, but the application requires %s)' % (
                           __version__, version))
    # not tag rev (-alpha-1, -beta-x) allowed.
    if tagrev is not None:
        raise Exception('Revision format must not contain any tagrevision')

    # finally, checking revision
    if sysrevision < revision:
        raise Exception('The version of Kivy installed on this system '
                        'is too old. '
                        '(You have %s, but the application requires %s)' % (
                            __version__, version))


def kivy_configure():
    '''Call post-configuration of Kivy.
    This function must be called if you create the window yourself.
    '''
    for callback in __kivy_post_configuration:
        callback()


def kivy_register_post_configuration(callback):
    '''Register a function to be called when kivy_configure() is called.

    .. warning::
        Internal use only.
    '''
    __kivy_post_configuration.append(callback)


def kivy_usage():
    '''Kivy Usage: %s [OPTION...]::

        -h, --help
            Prints this help message.
        -d, --debug
            Shows debug log.
        -a, --auto-fullscreen
            Force 'auto' fullscreen mode (no resolution change).
            Uses your display's resolution. This is most likely what you want.
        -c, --config section:key[:value]
            Set a custom [section] key=value in the configuration object.
        -f, --fullscreen
            Force running in fullscreen mode.
        -k, --fake-fullscreen
            Force 'fake' fullscreen mode (no window border/decoration).
            Uses the resolution specified by width and height in your config.
        -w, --windowed
            Force running in a window.
        -p, --provider id:provider[,options]
            Add an input provider (eg: ccvtable1:tuio,192.168.0.1:3333).
        -m mod, --module=mod
            Activate a module (use "list" to get a list of available modules).
        -r, --rotation
            Rotate the window's contents (0, 90, 180, 270).
        -s, --save
            Save current Kivy configuration.
        --size=640x480
            Size of window geometry.
        --dpi=96
            Manually overload the Window DPI (for testing only.)
    '''
    print(kivy_usage.__doc__ % (basename(sys.argv[0])))


#: Global settings options for kivy
kivy_options = {
    'window': ('egl_rpi', 'sdl2', 'pygame', 'sdl', 'x11'),
    'text': ('pil', 'sdl2', 'pygame', 'sdlttf'),
    'video': (
        'gstplayer', 'ffmpeg', 'ffpyplayer', 'gi', 'pygst', 'pyglet',
        'null'),
    'audio': ('gstplayer', 'pygame', 'gi', 'pygst', 'ffpyplayer', 'sdl2'),
    'image': ('tex', 'imageio', 'dds', 'gif', 'sdl2', 'pygame', 'pil', 'ffpy'),
    'camera': ('opencv', 'gi', 'pygst', 'videocapture', 'avfoundation'),
    'spelling': ('enchant', 'osxappkit', ),
    'clipboard': (
        'android', 'winctypes', 'xsel', 'dbusklipper', 'nspaste', 'sdl2',
        'pygame', 'dummy', 'gtk3', )}

# Read environment
for option in kivy_options:
    key = 'KIVY_%s' % option.upper()
    if key in environ:
        try:
            if type(kivy_options[option]) in (list, tuple):
                kivy_options[option] = environ[key].split(',')
            else:
                kivy_options[option] = environ[key].lower() in \
                    ('true', '1', 'yes', 'yup')
        except Exception:
            Logger.warning('Core: Wrong value for %s environment key' % key)
            Logger.exception('')

# Extract all needed path in kivy
#: Kivy directory
kivy_base_dir = dirname(sys.modules[__name__].__file__)
#: Kivy modules directory

kivy_modules_dir = environ.get('KIVY_MODULES_DIR',
                               join(kivy_base_dir, 'modules'))
#: Kivy extension directory
kivy_exts_dir = environ.get('KIVY_EXTS_DIR',
                            join(kivy_base_dir, 'extensions'))
#: Kivy data directory
kivy_data_dir = environ.get('KIVY_DATA_DIR',
                            join(kivy_base_dir, 'data'))
#: Kivy glsl shader directory
kivy_shader_dir = join(kivy_data_dir, 'glsl')
#: Kivy icons config path (don't remove the last '')
kivy_icons_dir = join(kivy_data_dir, 'icons', '')
#: Kivy user-home storage directory
kivy_home_dir = ''
#: Kivy configuration filename
kivy_config_fn = ''
#: Kivy user modules directory
kivy_usermodules_dir = ''
#: Kivy user extensions directory
kivy_userexts_dir = ''


# Don't go further if we generate documentation
if any(name in sys.argv[0] for name in ('sphinx-build', 'autobuild.py')):
    environ['KIVY_DOC'] = '1'
if 'sphinx-build' in sys.argv[0]:
    environ['KIVY_DOC_INCLUDE'] = '1'
if any('nosetests' in arg for arg in sys.argv):
    environ['KIVY_UNITTEST'] = '1'
if any('pyinstaller' in arg for arg in sys.argv):
    environ['KIVY_PACKAGING'] = '1'

if not environ.get('KIVY_DOC_INCLUDE'):
    # Configuration management
    if 'KIVY_HOME' in environ:
        kivy_home_dir = expanduser(environ['KIVY_HOME'])
    else:
        user_home_dir = expanduser('~')
        if platform == 'android':
            user_home_dir = environ['ANDROID_APP_PATH']
        elif platform == 'ios':
            user_home_dir = join(expanduser('~'), 'Documents')
        kivy_home_dir = join(user_home_dir, '.kivy')
    kivy_config_fn = join(kivy_home_dir, 'config.ini')
    kivy_usermodules_dir = join(kivy_home_dir, 'mods')
    kivy_userexts_dir = join(kivy_home_dir, 'extensions')
    icon_dir = join(kivy_home_dir, 'icon')

    if 'KIVY_NO_CONFIG' not in environ:
        if not exists(kivy_home_dir):
            mkdir(kivy_home_dir)
        if not exists(kivy_usermodules_dir):
            mkdir(kivy_usermodules_dir)
        if not exists(kivy_userexts_dir):
            mkdir(kivy_userexts_dir)
        if not exists(icon_dir):
            try:
                shutil.copytree(join(kivy_data_dir, 'logo'), icon_dir)
            except:
                Logger.exception('Error when copying logo directory')

    # configuration
    from kivy.config import Config

    # Set level of logger
    level = LOG_LEVELS.get(Config.get('kivy', 'log_level'))
    Logger.setLevel(level=level)

    # Can be overrided in command line
    if ('KIVY_UNITTEST' not in environ and
        'KIVY_PACKAGING' not in environ and
        'KIVY_NO_ARGS' not in environ):
        # save sys argv, otherwize, gstreamer use it and display help..
        sys_argv = sys.argv
        sys.argv = sys.argv[:1]

        try:
            opts, args = getopt(sys_argv[1:], 'hp:fkawFem:sr:dc:', [
                'help', 'fullscreen', 'windowed', 'fps', 'event',
                'module=', 'save', 'fake-fullscreen', 'auto-fullscreen',
                'display=', 'size=', 'rotate=', 'config=', 'debug',
                'dpi='])

        except GetoptError as err:
            Logger.error('Core: %s' % str(err))
            kivy_usage()
            sys.exit(2)

        # set argv to the non-read args
        sys.argv = sys_argv[0:1] + args
    else:
        opts = []
        args = []

    need_save = False
    for opt, arg in opts:
        if opt in ('-h', '--help'):
            kivy_usage()
            sys.exit(0)
        elif opt in ('-p', '--provider'):
            try:
                pid, args = arg.split(':', 1)
                Config.set('input', pid, args)
            except ValueError:
                # when we are doing an executable on macosx with
                # pyinstaller, they are passing information with -p. so
                # it will conflict with our current -p option. since the
                # format is not the same, just avoid it.
                pass
        elif opt in ('-a', '--auto-fullscreen'):
            Config.set('graphics', 'fullscreen', 'auto')
        elif opt in ('-c', '--config'):
            l = arg.split(':', 2)
            if len(l) == 2:
                Config.set(l[0], l[1], '')
            elif len(l) == 3:
                Config.set(l[0], l[1], l[2])
            else:
                raise Exception('Invalid --config value')
            if l[0] == 'kivy' and l[1] == 'log_level':
                level = LOG_LEVELS.get(Config.get('kivy', 'log_level'))
                Logger.setLevel(level=level)
        elif opt in ('-k', '--fake-fullscreen'):
            Config.set('graphics', 'fullscreen', 'fake')
        elif opt in ('-f', '--fullscreen'):
            Config.set('graphics', 'fullscreen', '1')
        elif opt in ('-w', '--windowed'):
            Config.set('graphics', 'fullscreen', '0')
        elif opt in ('--size', ):
            w, h = str(arg).split('x')
            Config.set('graphics', 'width', w)
            Config.set('graphics', 'height', h)
        elif opt in ('--display', ):
            Config.set('graphics', 'display', str(arg))
        elif opt in ('-m', '--module'):
            if str(arg) == 'list':
                from kivy.modules import Modules
                Modules.usage_list()
                sys.exit(0)
            args = arg.split(':', 1)
            if len(args) == 1:
                args += ['']
            Config.set('modules', args[0], args[1])
        elif opt in ('-s', '--save'):
            need_save = True
        elif opt in ('-r', '--rotation'):
            Config.set('graphics', 'rotation', arg)
        elif opt in ('-d', '--debug'):
            level = LOG_LEVELS.get('debug')
            Logger.setLevel(level=level)
        elif opt == '--dpi':
            environ['KIVY_DPI'] = arg

    if need_save and 'KIVY_NO_CONFIG' not in environ:
        try:
            with open(kivy_config_fn, 'w') as fd:
                Config.write(fd)
        except Exception as e:
            Logger.exception('Core: error while saving default'
                             'configuration file:', str(e))
        Logger.info('Core: Kivy configuration saved.')
        sys.exit(0)

    # configure all activated modules
    from kivy.modules import Modules
    Modules.configure()

    # android hooks: force fullscreen and add android touch input provider
    if platform in ('android', 'ios'):
        from kivy.config import Config
        Config.set('graphics', 'fullscreen', 'auto')
        Config.remove_section('input')
        Config.add_section('input')

    if platform == 'android':
        Config.set('input', 'androidtouch', 'android')

Logger.info('Kivy: v%s' % (__version__))
Logger.info('Python: v{}'.format(sys.version))



================================================
FILE: tickeys/kivy/_event.pxd
================================================
from cpython.ref cimport PyObject

cdef class ObjectWithUid(object):
    cdef readonly int uid


cdef class Observable(ObjectWithUid):
    cdef object __fast_bind_mapping
    cdef object bound_uid


cdef class EventDispatcher(ObjectWithUid):
    cdef dict __event_stack
    cdef dict __properties
    cdef dict __storage
    cdef object __weakref__
    cpdef dict properties(self)


cdef enum BoundLock:
    # the state of the BoundCallback, i.e. whether it can be deleted
    unlocked  # whether the BoundCallback is unlocked and can be deleted
    locked  # whether the BoundCallback is locked and cannot be deleted
    deleted  # whether the locked BoundCallback was marked for deletion

cdef class BoundCallback:
    cdef object func
    cdef tuple largs
    cdef dict kwargs
    cdef int is_ref  # if func is a ref to the function
    cdef BoundLock lock  # see BoundLock
    cdef BoundCallback next  # next callback in chain
    cdef BoundCallback prev  # previous callback in chain
    cdef object uid  # the uid given for this callback, None if not given


cdef class EventObservers:
    # If dispatching should occur in normal or reverse order of binding.
    cdef int dispatch_reverse
    # If in dispatch, the value parameter is dispatched or ignored.
    cdef int dispatch_value
    # The first callback bound
    cdef BoundCallback first_callback
    # The last callback bound
    cdef BoundCallback last_callback
    # The uid to assign to the next bound callback.
    cdef object uid

    cdef inline void bind(self, object observer, int is_ref=*) except *
    cdef inline object fast_bind(self, object observer, tuple largs, dict kwargs, int is_ref)
    cdef inline void unbind(self, object observer, int is_ref, int stop_on_first) except *
    cdef inline void fast_unbind(self, object observer, tuple largs, dict kwargs) except *
    cdef inline object unbind_uid(self, object uid)
    cdef inline void remove_callback(self, BoundCallback callback, int force=*) except *
    cdef inline object _dispatch(
        self, object f, tuple slargs, dict skwargs, object obj, object value, tuple largs, dict kwargs)
    cdef inline int dispatch(self, object obj, object value, tuple largs, dict kwargs, int stop_on_true) except 2


================================================
FILE: tickeys/kivy/adapters/__init__.py
================================================
'''
Adapters
========

.. versionadded:: 1.5.0

An adapter is a mediating controller-type class that processes and presents
data for use in views. It does this by generating models, generally lists of
:class:`~kivy.uix.listview.SelectableView` items, that are consumed and
presented by views. Views are top-level widgets, such as a
:class:`~kivy.uix.listview.ListView`, that allow users to scroll through
and (optionally) interact with your data.

The Concept
-----------

Kivy adapters are modelled on the
`Adapter design pattern <http://en.wikipedia.org/wiki/Adapter_pattern>`_.
Conceptually, they play the role of a 'controller' between you data and views
in a `Model-View-Controller
<https://en.wikipedia.org/wiki/Model%E2%80%93view%E2%80%93controller>`_
type architecture.

The role of an adapter can be depicted as follows:

.. image:: images/adapters.png


The Components
--------------

The components involved in this process are:

- **Adapters**: The adapter plays a mediating role between the user interface
  and your data. It manages the creation of the view elements for the model
  using the args_converter to prepare the contructor arguments for your
  cls/template view items.

  The base :class:`Adapter` is subclassed by the
  :class:`SimpleListAdapter` and :class:`ListAdapter`. The :class:`DictAdapter`
  is a more advanced and flexible subclass of :class:`ListAdapter`.

    :doc:`api-kivy.adapters.adapter`,
    :doc:`api-kivy.adapters.simplelistadapter`,
    :doc:`api-kivy.adapters.listadapter`,
    :doc:`api-kivy.adapters.dictadapter`.

- **Models**: The data for which an adapter serves as a bridge to views can be
  any sort of data. However, for convenience, model mixin classes can ease the
  preparation or shaping of data for use in the system. For selection
  operations, the :class:`SelectableDataItem` can optionally prepare data items
  to provide and receive selection information (data items are not required to
  be "selection-aware", but in some cases it may be desired).

    :doc:`api-kivy.adapters.models`.

- **Args Converters**: Argument converters are made by the application
  programmer to do the work of converting data items to argument dictionaries
  suitable for instantiating views. In effect, they take each row of your data
  and create dictionaries that are passed into the constructors of your
  cls/template which are then used populate your View.

    :doc:`api-kivy.adapters.args_converters`.

- **Views**: Models of your data are presented to the user via views. Each of
  your data items create a corresponding view subitem (the cls or template)
  presented in a list by the View. The base :class:`AbstractView` currently has
  one concrete implementation: the :class:`ListView`.

    :doc:`api-kivy.uix.abstractview`,
    :doc:`api-kivy.uix.listview`.

----
'''


================================================
FILE: tickeys/kivy/adapters/adapter.py
================================================
'''
Adapter
=======

.. versionadded:: 1.5

.. warning::

    This code is still experimental, and its API is subject to change in a
    future version.

An :class:`~kivy.adapters.adapter.Adapter` is a bridge between data and
an :class:`~kivy.uix.abstractview.AbstractView` or one of its subclasses, such
as a :class:`~kivy.uix.listview.ListView`.

The following arguments can be passed to the contructor to initialise the
corresponding properties:

* :attr:`~Adapter.data`: for any sort of data to be used in a view. For an
  :class:`~kivy.adapters.adapter.Adapter`, data can be an object as well as a
  list, dict, etc. For a :class:`~kivy.adapters.listadapter.ListAdapter`, data
  should be a list. For a :class:`~kivy.adapters.dictadapter.DictAdapter`,
  data should be a dict.

* :attr:`~Adapter.cls`: the class used to instantiate each list item view
  instance (Use this or the template argument).

* :attr:`~Adapter.template`: a kv template to use to instantiate each list item
  view instance (Use this or the cls argument).

* :attr:`~Adapter.args_converter`: a function used to transform the data items
  in preparation for either a cls instantiation or a kv template
  invocation. If no args_converter is provided, the data items are assumed
  to be simple strings.

Please refer to the :mod:`~kivy.adapters` documentation for an overview of how
adapters are used.

'''

__all__ = ('Adapter', )

from kivy.event import EventDispatcher
from kivy.properties import ObjectProperty
from kivy.lang import Builder
from kivy.adapters.args_converters import list_item_args_converter
from kivy.factory import Factory
from kivy.compat import string_types


class Adapter(EventDispatcher):
    '''An :class:`~kivy.adapters.adapter.Adapter` is a bridge between data and
    an :class:`~kivy.uix.abstractview.AbstractView` or one of its subclasses,
    such as a :class:`~kivy.uix.listview.ListView`.
    '''

    data = ObjectProperty(None)
    '''
    The data for which a view is to be constructed using either the cls or
    template provided, together with the args_converter provided or the default
    args_converter.

    In this base class, data is an ObjectProperty, so it could be used for a
    wide variety of single-view needs.

    Subclasses may override it in order to use another data type, such as a
    :class:`~kivy.properties.ListProperty` or
    :class:`~kivy.properties.DictProperty` as appropriate. For example, in a
    :class:`~.kivy.adapters.listadapter.ListAdapter`, data is a
    :class:`~kivy.properties.ListProperty`.

    :attr:`data` is an :class:`~kivy.properties.ObjectProperty` and defaults
    to None.
    '''

    cls = ObjectProperty(None)
    '''
    A class for instantiating a given view item (Use this or template). If this
    is not set and neither is the template, a :class:`~kivy.uix.label.Label`
    is used for the view item.

    :attr:`cls` is an :class:`~kivy.properties.ObjectProperty` and defaults
    to None.
    '''

    template = ObjectProperty(None)
    '''
    A kv template for instantiating a given view item (Use this or cls).

    :attr:`template` is an :class:`~kivy.properties.ObjectProperty` and defaults
    to None.
    '''

    args_converter = ObjectProperty(None)
    '''
    A function that prepares an args dict for the cls or kv template to build
    a view from a data item.

    If an args_converter is not provided, a default one is set that assumes
    simple content in the form of a list of strings.

    :attr:`args_converter` is an :class:`~kivy.properties.ObjectProperty` and
    defaults to None.
    '''

    def __init__(self, **kwargs):

        if 'data' not in kwargs:
            raise Exception('adapter: input must include data argument')

        if 'cls' in kwargs:
            if 'template' in kwargs:
                msg = 'adapter: cannot use cls and template at the same time'
                raise Exception(msg)
            elif not kwargs['cls']:
                raise Exception('adapter: a cls or template must be defined')
        else:
            if 'template' in kwargs:
                if not kwargs['template']:
                    msg = 'adapter: a cls or template must be defined'
                    raise Exception(msg)
            else:
                raise Exception('adapter: a cls or template must be defined')

        if 'args_converter' in kwargs:
            self.args_converter = kwargs['args_converter']
        else:
            self.args_converter = list_item_args_converter

        super(Adapter, self).__init__(**kwargs)

    def bind_triggers_to_view(self, func):
        self.bind(data=func)

    def get_data_item(self):
        return self.data

    def get_cls(self):
        '''
        .. versionadded:: 1.9.0

        Returns the widget type specified by self.cls. If it is a
        string, the :class:`~kivy.factory.Factory` is queried to retrieve the
        widget class with the given name, otherwise it is returned directly.
        '''
        cls = self.cls
        if isinstance(cls, string_types):
            try:
                cls = getattr(Factory, cls)
            except AttributeError:
                raise AttributeError(
                    'Listadapter cls widget does not exist.')
        return cls

    def get_view(self, index):  # pragma: no cover
        item_args = self.args_converter(self.data)

        cls = self.get_cls()
        if cls:
            return cls(**item_args)
        else:
            return Builder.template(self.template, **item_args)


================================================
FILE: tickeys/kivy/adapters/args_converters.py
================================================
'''
List Item View Argument Converters
==================================

.. versionadded:: 1.5


The default list item args converter for list adapters is a function (shown
below) that takes a row index and a string. It returns a dict with the string as
the *text* item, along with two properties suited for simple text items with
a height of 25.

Simple Usage
------------

Argument converters may be normal functions or, as in the case of the default
args converter, lambdas::

    list_item_args_converter = lambda row_index, x: {'text': x,
                                                     'size_hint_y': None,
                                                     'height': 25}

Advanced Usage
--------------

Typically, having the argument converter perform a simple mapping suffices.
There are times, however, when more complex manipulation is required. When using
a :class:`~kivy.uix.listview.CompositeListItem`, it is possible to specify
a list of cls dictionaries. This allows you so compose a single view item
out of multiple classes, each of which can recieve their own class constructor
arguments via the *kwargs* keyword::

    args_converter = lambda row_index, rec: \\
            {'text': rec['text'],
             'size_hint_y': None,
             'height': 25,
             'cls_dicts': [{'cls': ListItemButton,
                            'kwargs': {'text': rec['text']}},
                           {'cls': ListItemLabel,
                            'kwargs': {'text': "Middle-{0}".format(rec['text']),
                                       'is_representing_cls': True}},
                           {'cls': ListItemButton,
                            'kwargs': {'text': rec['text']}}]}

Please see the `list_composite.py <https://github.com/\
kivy/kivy/tree/master/examples/widgets/lists/list_composite.py>`_ for a complete
example.

'''
list_item_args_converter = lambda row_index, x: {'text': x,
                                                 'size_hint_y': None,
                                                 'height': 25}


================================================
FILE: tickeys/kivy/adapters/dictadapter.py
================================================
'''
DictAdapter
===========

.. versionadded:: 1.5

.. warning::

    This code is still experimental, and its API is subject to change in a
    future version.

A :class:`~kivy.adapters.dictadapter.DictAdapter` is an adapter around a
python dictionary of records. It extends the list-like capabilities of the
:class:`~kivy.adapters.listadapter.ListAdapter`.

If you wish to have a bare-bones list adapter, without selection, use the
:class:`~kivy.adapters.simplelistadapter.SimpleListAdapter`.

'''

__all__ = ('DictAdapter', )

from kivy.properties import ListProperty, DictProperty
from kivy.adapters.listadapter import ListAdapter


class DictAdapter(ListAdapter):
    '''A :class:`~kivy.adapters.dictadapter.DictAdapter` is an adapter around a
    python dictionary of records. It extends the list-like capabilities of
    the :class:`~kivy.adapters.listadapter.ListAdapter`.
    '''

    sorted_keys = ListProperty([])
    '''The sorted_keys list property contains a list of hashable objects (can
    be strings) that will be used directly if no args_converter function is
    provided. If there is an args_converter, the record received from a
    lookup of the data, using keys from sorted_keys, will be passed
    to it for instantiation of list item view class instances.

    :attr:`sorted_keys` is a :class:`~kivy.properties.ListProperty` and
    defaults to [].
    '''

    data = DictProperty(None)
    '''A dict that indexes records by keys that are equivalent to the keys in
    sorted_keys, or they are a superset of the keys in sorted_keys.

    The values can be strings, class instances, dicts, etc.

    :attr:`data` is a :class:`~kivy.properties.DictProperty` and defaults
    to None.
    '''

    def __init__(self, **kwargs):
        if 'sorted_keys' in kwargs:
            if type(kwargs['sorted_keys']) not in (tuple, list):
                msg = 'DictAdapter: sorted_keys must be tuple or list'
                raise Exception(msg)
        else:
            self.sorted_keys = sorted(kwargs['data'].keys())

        super(DictAdapter, self).__init__(**kwargs)

        self.bind(sorted_keys=self.initialize_sorted_keys)

    def bind_triggers_to_view(self, func):
        self.bind(sorted_keys=func)
        self.bind(data=func)

    # self.data is paramount to self.sorted_keys. If sorted_keys is reset to
    # mismatch data, force a reset of sorted_keys to data.keys(). So, in order
    # to do a complete reset of data and sorted_keys, data must be reset
    # first, followed by a reset of sorted_keys, if needed.
    def initialize_sorted_keys(self, *args, **kwargs):
        stale_sorted_keys = False
        for key in self.sorted_keys:
            if not key in self.data:
                stale_sorted_keys = True
                break
        else:
            if kwargs.get('new_data'):
                if len(self.sorted_keys) != len(self.data):
                    stale_sorted_keys = True
        if stale_sorted_keys:
            self.sorted_keys = sorted(self.data.keys())
        self.delete_cache()
        self.initialize_selection()

    # Override ListAdapter.update_for_new_data().
    def update_for_new_data(self, *args):
        self.initialize_sorted_keys(new_data=True)

    # Note: this is not len(self.data).
    def get_count(self):
        return len(self.sorted_keys)

    def get_data_item(self, index):
        if index < 0 or index >= len(self.sorted_keys):
            return None
        return self.data[self.sorted_keys[index]]

    # [TODO] Also make methods for scroll_to_sel_start, scroll_to_sel_end,
    #        scroll_to_sel_middle.

    def trim_left_of_sel(self, *args):
        '''Cut list items with indices in sorted_keys that are less than the
        index of the first selected item, if there is a selection.

        sorted_keys will be updated by update_for_new_data().
        '''
        if len(self.selection) > 0:
            selected_keys = [sel.text for sel in self.selection]
            first_sel_index = self.sorted_keys.index(selected_keys[0])
            desired_keys = self.sorted_keys[first_sel_index:]
            self.data = dict([(key, self.data[key]) for key in desired_keys])

    def trim_right_of_sel(self, *args):
        '''Cut list items with indices in sorted_keys that are greater than
        the index of the last selected item, if there is a selection.

        sorted_keys will be updated by update_for_new_data().
        '''
        if len(self.selection) > 0:
            selected_keys = [sel.text for sel in self.selection]
            last_sel_index = self.sorted_keys.index(selected_keys[-1])
            desired_keys = self.sorted_keys[:last_sel_index + 1]
            self.data = dict([(key, self.data[key]) for key in desired_keys])

    def trim_to_sel(self, *args):
        '''Cut list items with indices in sorted_keys that are les than or
        greater than the index of the last selected item, if there is a
        selection. This preserves intervening list items within the selected
        range.

        sorted_keys will be updated by update_for_new_data().
        '''
        if len(self.selection) > 0:
            selected_keys = [sel.text for sel in self.selection]
            first_sel_index = self.sorted_keys.index(selected_keys[0])
            last_sel_index = self.sorted_keys.index(selected_keys[-1])
            desired_keys = self.sorted_keys[first_sel_index:last_sel_index + 1]
            self.data = dict([(key, self.data[key]) for key in desired_keys])

    def cut_to_sel(self, *args):
        '''Same as trim_to_sel, but intervening list items within the selected
        range are also cut, leaving only list items that are selected.

        sorted_keys will be updated by update_for_new_data().
        '''
        if len(self.selection) > 0:
            selected_keys = [sel.text for sel in self.selection]
            self.data = dict([(key, self.data[key]) for key in selected_keys])


================================================
FILE: tickeys/kivy/adapters/listadapter.py
================================================
'''
ListAdapter
=================

.. versionadded:: 1.5

.. warning::

    This code is still experimental, and its API is subject to change in a
    future version.

A :class:`ListAdapter` is an adapter around a python list and adds support
for selection operations. If you wish to have a bare-bones list adapter,
without selection, use a
:class:`~kivy.adapters.simplelistadapter.SimpleListAdapter`.

From an :class:`~kivy.adapters.Adapter`, a :class:`ListAdapter` inherits cls,
template, and args_converter properties and adds others that control selection
behaviour:

* :attr:`~ListAdapter.selection`: a list of selected items.

* :attr:`~ListAdapter.selection_mode`: one of 'single', 'multiple' or 'none'.

* :attr:`~ListAdapter.allow_empty_selection`: a boolean. If False, a selection
  is forced. If True, and only user or programmatic action will change
  selection, it can be empty.

A :class:`~kivy.adapters.dictadapter.DictAdapter` is a subclass of a
:class:`~kivy.adapters.listadapter.ListAdapter`. They both dispatch the
:attr:`~ListAdapter.on_selection_change` event when selection changes.

.. versionchanged:: 1.6.0
    Added data = ListProperty([]), which was proably inadvertently deleted at
    some point. This means that whenever data changes an update will fire,
    instead of having to reset the data object (Adapter has data defined as
    an ObjectProperty, so we need to reset it here to ListProperty). See also
    DictAdapter and its set of data = DictProperty().

'''

__all__ = ('ListAdapter', )

import inspect
from kivy.event import EventDispatcher
from kivy.adapters.adapter import Adapter
from kivy.adapters.models import SelectableDataItem
from kivy.properties import ListProperty
from kivy.properties import DictProperty
from kivy.properties import BooleanProperty
from kivy.properties import OptionProperty
from kivy.properties import NumericProperty
from kivy.lang import Builder


class ListAdapter(Adapter, EventDispatcher):
    '''
    A base class for adapters interfacing with lists, dictionaries or other
    collection type data, adding selection, view creation and management
    functonality.
    '''

    data = ListProperty([])
    '''The data list property is redefined here, overriding its definition as
    an ObjectProperty in the Adapter class. We bind to data so that any
    changes will trigger updates. See also how the
    :class:`~kivy.adapters.DictAdapter` redefines data as a
    :class:`~kivy.properties.DictProperty`.

    :attr:`data` is a :class:`~kivy.properties.ListProperty` and defaults
    to [].
    '''

    selection = ListProperty([])
    '''The selection list property is the container for selected items.

    :attr:`selection` is a :class:`~kivy.properties.ListProperty` and defaults
    to [].
    '''

    selection_mode = OptionProperty('single',
            options=('none', 'single', 'multiple'))
    '''The selection_mode is a string and can be set to one of the following
    values:

       * 'none': use the list as a simple list (no select action). This option
         is here so that selection can be turned off, momentarily or
         permanently, for an existing list adapter.
         A :class:`~kivy.adapters.listadapter.ListAdapter` is not meant to be
         used as a primary no-selection list adapter. Use a
         :class:`~kivy.adapters.simplelistadapter.SimpleListAdapter` for that.

       * 'single': multi-touch/click ignored. Single item selection only.

       * 'multiple': multi-touch / incremental addition to selection allowed;
         may be limited to a count by setting the
         :attr:`~ListAdapter.selection_limit`.

    :attr:`selection_mode` is an :class:`~kivy.properties.OptionProperty` and
    defaults to 'single'.
    '''

    propagate_selection_to_data = BooleanProperty(False)
    '''Normally, data items are not selected/deselected because the data items
    might not have an is_selected boolean property -- only the item view for a
    given data item is selected/deselected as part of the maintained selection
    list. However, if the data items do have an is_selected property, or if
    they mix in :class:`~kivy.adapters.models.SelectableDataItem`, the
    selection machinery can propagate selection to data items. This can be
    useful for storing selection state in a local database or backend database
    for maintaining state in game play or other similar scenarios. It is a
    convenience function.

    To propagate selection or not?

    Consider a shopping list application for shopping for fruits at the
    market. The app allows for the selection of fruits to buy for each day of
    the week, presenting seven lists: one for each day of the week. Each list is
    loaded with all the available fruits, but the selection for each is a
    subset. There is only one set of fruit data shared between the lists, so
    it would not make sense to propagate selection to the data because
    selection in any of the seven lists would clash and mix with that of the
    others.

    However, consider a game that uses the same fruits data for selecting
    fruits available for fruit-tossing. A given round of play could have a
    full fruits list, with fruits available for tossing shown selected. If the
    game is saved and rerun, the full fruits list, with selection marked on
    each item, would be reloaded correctly if selection is always propagated to
    the data. You could accomplish the same functionality by writing code to
    operate on list selection, but having selection stored in the data
    ListProperty might prove convenient in some cases.

    .. note::

        This setting should be set to True if you wish to initialize the view
        with item views already selected.

    :attr:`propagate_selection_to_data` is a
    :class:`~kivy.properties.BooleanProperty` and defaults to False.
    '''

    allow_empty_selection = BooleanProperty(True)
    '''The allow_empty_selection may be used for cascading selection between
    several list views, or between a list view and an observing view. Such
    automatic maintenance of the selection is important for all but simple
    list displays. Set allow_empty_selection to False and the selection is
    auto-initialized and always maintained, so any observing views
    may likewise be updated to stay in sync.

    :attr:`allow_empty_selection` is a
    :class:`~kivy.properties.BooleanProperty` and defaults to True.
    '''

    selection_limit = NumericProperty(-1)
    '''When the :attr:`~ListAdapter.selection_mode` is 'multiple' and the
    selection_limit is
    non-negative, this number will limit the number of selected items. It can
    be set to 1, which is equivalent to single selection. If selection_limit is
    not set, the default value is -1, meaning that no limit will be enforced.

    :attr:`selection_limit` is a :class:`~kivy.properties.NumericProperty` and
    defaults to -1 (no limit).
    '''

    cached_views = DictProperty({})
    '''View instances for data items are instantiated and managed by the
    adapter. Here we maintain a dictionary containing the view
    instances keyed to the indices in the data.

    This dictionary works as a cache. get_view() only asks for a view from
    the adapter if one is not already stored for the requested index.

    :attr:`cached_views` is a :class:`~kivy.properties.DictProperty` and
    defaults to {}.
    '''

    __events__ = ('on_selection_change', )

    def __init__(self, **kwargs):
        super(ListAdapter, self).__init__(**kwargs)

        self.bind(selection_mode=self.selection_mode_changed,
                  allow_empty_selection=self.check_for_empty_selection,
                  data=self.update_for_new_data)

        self.update_for_new_data()

    def delete_cache(self, *args):
        self.cached_views = {}

    def get_count(self):
        return len(self.data)

    def get_data_item(self, index):
        if index < 0 or index >= len(self.data):
            return None
        return self.data[index]

    def selection_mode_changed(self, *args):
        if self.selection_mode == 'none':
            for selected_view in self.selection:
                self.deselect_item_view(selected_view)
        else:
            self.check_for_empty_selection()

    def get_view(self, index):
        if index in self.cached_views:
            return self.cached_views[index]
        item_view = self.create_view(index)
        if item_view:
            self.cached_views[index] = item_view
        return item_view

    def create_view(self, index):
        '''This method is more complicated than the ones in the
        :class:`~kivy.adapters.adapter.Adapter` and
        :class:`~kivy.adapters.simplelistadapter.SimpleListAdapter` classes
        because here we create bindings for the data items and their children
        back to the *self.handle_selection()* event. We also perform
        other selection-related tasks to keep item views in sync with the data.
        '''
        item = self.get_data_item(index)
        if item is None:
            return None

        item_args = self.args_converter(index, item)

        item_args['index'] = index

        cls = self.get_cls()
        if cls:
            view_instance = cls(**item_args)
        else:
            view_instance = Builder.template(self.template, **item_args)

        if self.propagate_selection_to_data:
            # The data item must be a subclass of SelectableDataItem, or must
            # have an is_selected boolean or function, so it has is_selected
            # available. If is_selected is unavailable on the data item, an
            # exception is raised.
            #
            if isinstance(item, SelectableDataItem):
                if item.is_selected:
                    self.handle_selection(view_instance)
            elif type(item) == dict and 'is_selected' in item:
                if item['is_selected']:
                    self.handle_selection(view_instance)
            elif hasattr(item, 'is_selected'):
                if (inspect.isfunction(item.is_selected)
                        or inspect.ismethod(item.is_selected)):
                    if item.is_selected():
                        self.handle_selection(view_instance)
                else:
                    if item.is_selected:
                        self.handle_selection(view_instance)
            else:
                msg = "ListAdapter: unselectable data item for {0}"
                raise Exception(msg.format(index))

        view_instance.bind(on_release=self.handle_selection)

        for child in view_instance.children:
            child.bind(on_release=self.handle_selection)

        return view_instance

    def on_selection_change(self, *args):
        '''on_selection_change() is the default handler for the
        on_selection_change event. You can bind to this event to get notified
        of selection changes.

        :Parameters:
            adapter: :class:`~ListAdapter` or subclass
                The instance of the list adapter where the selection changed.
                Use the adapters :attr:`selection` property to see what has been
                selected.
        '''
        pass

    def handle_selection(self, view, hold_dispatch=False, *args):
        if view not in self.selection:
            if self.selection_mode in ['none', 'single'] and \
                    len(self.selection) > 0:
                for selected_view in self.selection:
                    self.deselect_item_view(selected_view)
            if self.selection_mode != 'none':
                if self.selection_mode == 'multiple':
                    if self.allow_empty_selection:
                        # If < 0, selection_limit is not active.
                        if self.selection_limit < 0:
                            self.select_item_view(view)
                        else:
                            if len(self.selection) < self.selection_limit:
                                self.select_item_view(view)
                    else:
                        self.select_item_view(view)
                else:
                    self.select_item_view(view)
        else:
            self.deselect_item_view(view)
            if self.selection_mode != 'none':
                # If the deselection makes selection empty, the following call
                # will check allows_empty_selection, and if False, will
                # select the first item. If view happens to be the first item,
                # this will be a reselection, and the user will notice no
                # change, except perhaps a flicker.
                #
                self.check_for_empty_selection()

        if not hold_dispatch:
            self.dispatch('on_selection_change')

    def select_data_item(self, item):
        self.set_data_item_selection(item, True)

    def deselect_data_item(self, item):
        self.set_data_item_selection(item, False)

    def set_data_item_selection(self, item, value):
        if isinstance(item, SelectableDataItem):
            item.is_selected = value
        elif type(item) == dict:
            item['is_selected'] = value
        elif hasattr(item, 'is_selected'):
            if (inspect.isfunction(item.is_selected)
                    or inspect.ismethod(item.is_selected)):
                item.is_selected()
            else:
                item.is_selected = value

    def select_item_view(self, view):
        view.select()
        view.is_selected = True
        self.selection.append(view)

        # [TODO] sibling selection for composite items
        #        Needed? Or handled from parent?
        #        (avoid circular, redundant selection)
        #if hasattr(view, 'parent') and hasattr(view.parent, 'children'):
         #siblings = [child for child in view.parent.children if child != view]
         #for sibling in siblings:
             #if hasattr(sibling, 'select'):
                 #sibling.select()

        if self.propagate_selection_to_data:
            data_item = self.get_data_item(view.index)
            self.select_data_item(data_item)

    def select_list(self, view_list, extend=True):
        '''The select call is made for the items in the provided view_list.

        Arguments:

            view_list: the list of item views to become the new selection, or
            to add to the existing selection

            extend: boolean for whether or not to extend the existing list
        '''
        if not extend:
            self.selection = []

        for view in view_list:
            self.handle_selection(view, hold_dispatch=True)

        self.dispatch('on_selection_change')

    def deselect_item_view(self, view):
        view.deselect()
        view.is_selected = False
        self.selection.remove(view)

        # [TODO] sibling deselection for composite items
        #        Needed? Or handled from parent?
        #        (avoid circular, redundant selection)
        #if hasattr(view, 'parent') and hasattr(view.parent, 'children'):
         #siblings = [child for child in view.parent.children if child != view]
         #for sibling in siblings:
             #if hasattr(sibling, 'deselect'):
                 #sibling.deselect()

        if self.propagate_selection_to_data:
            item = self.get_data_item(view.index)
            self.deselect_data_item(item)

    def deselect_list(self, l):
        for view in l:
            self.handle_selection(view, hold_dispatch=True)

        self.dispatch('on_selection_change')

    # [TODO] Could easily add select_all() and deselect_all().

    def update_for_new_data(self, *args):
        self.delete_cache()
        self.initialize_selection()

    def initialize_selection(self, *args):
        if len(self.selection) > 0:
            self.selection = []
            self.dispatch('on_selection_change')

        self.check_for_empty_selection()

    def check_for_empty_selection(self, *args):
        if not self.allow_empty_selection:
            if len(self.selection) == 0:
                # Select the first item if we have it.
                v = self.get_view(0)
                if v is not None:
                    self.handle_selection(v)

    # [TODO] Also make methods for scroll_to_sel_start, scroll_to_sel_end,
    #        scroll_to_sel_middle.

    def trim_left_of_sel(self, *args):
        '''Cut list items with indices in sorted_keys that are less than the
        index of the first selected item if there is a selection.
        '''
        if len(self.selection) > 0:
            first_sel_index = min([sel.index for sel in self.selection])
            self.data = self.data[first_sel_index:]

    def trim_right_of_sel(self, *args):
        '''Cut list items with indices in sorted_keys that are greater than
        the index of the last selected item if there is a selection.
        '''
        if len(self.selection) > 0:
            last_sel_index = max([sel.index for sel in self.selection])
            print('last_sel_index', last_sel_index)
            self.data = self.data[:last_sel_index + 1]

    def trim_to_sel(self, *args):
        '''Cut list items with indices in sorted_keys that are less than or
        greater than the index of the last selected item if there is a
        selection. This preserves intervening list items within the selected
        range.
        '''
        if len(self.selection) > 0:
            sel_indices = [sel.index for sel in self.selection]
            first_sel_index = min(sel_indices)
            last_sel_index = max(sel_indices)
            self.data = self.data[first_sel_index:last_sel_index + 1]

    def cut_to_sel(self, *args):
        '''Same as trim_to_sel, but intervening list items within the selected
        range are also cut, leaving only list items that are selected.
        '''
        if len(self.selection) > 0:
            self.data = self.selection


================================================
FILE: tickeys/kivy/adapters/models.py
================================================
'''
SelectableDataItem
==================

.. versionadded:: 1.5

.. warning::

    This code is still experimental, and its API is subject to change in a
    future version.

Data Models
-----------

Kivy is open about the type of data used in applications built with
the system. However, base classes are sometimes needed to ensure data conforms
to the requirements of some parts of the system.

A :class:`SelectableDataItem` is a basic Python data model class that can be
used as a mixin to build data objects that are compatible with Kivy's
:class:`~kivy.adapters.adapter.Adapter`
and selection system and which work with views such as a
:class:`~kivy.uix.listview.ListView`. A boolean *is_selected*
property a requirement.

The default operation of the selection system is to not propogate selection in
views such as ListView to the underlying data: selection is by default a
view-only operation. However, in some cases, it is useful to propogate
selection to the actual data items.

You may, of course, build your own Python data model system as the backend for
a Kivy application. For instance, to use the `Google App Engine Data Modeling
<https://cloud.google.com/appengine/docs/python/datastore/datamodeling>`_
system with Kivy, you could define your class as follows::

    from google.appengine.ext import db

    class MySelectableDataItem(db.Model):
        # ... other properties
        is_selected = db.BooleanProperty()

It is easy to build such a class with plain Python.

'''

__all__ = ('SelectableDataItem', )


class SelectableDataItem(object):
    '''
    A mixin class containing requirements for selection operations.
    '''

    def __init__(self, **kwargs):
        super(SelectableDataItem, self).__init__()

        self._is_selected = kwargs.get('is_selected', False)

    @property
    def is_selected(self):
        """A boolean property indicating whether the data item is selected or
        not."""
        return self._is_selected

    @is_selected.setter
    def is_selected(self, value):
        self._is_selected = value


================================================
FILE: tickeys/kivy/adapters/simplelistadapter.py
================================================
'''
SimpleListAdapter
=================

.. versionadded:: 1.5

.. warning::

    This code is still experimental, and its API is subject to change in a
    future version.

The :class:`~kivy.adapters.simplelistadapter.SimpleListAdapter` is used for
basic lists. For example, it can be used for displaying a list of read-only
strings that do not require user interaction.

'''

__all__ = ('SimpleListAdapter', )

from kivy.adapters.adapter import Adapter
from kivy.properties import ListProperty
from kivy.lang import Builder


class SimpleListAdapter(Adapter):
    '''A :class:`~kivy.adapters.simplelistadapter.SimpleListAdapter` is an
    adapter around a Python list.

    From :class:`~kivy.adapters.adapter.Adapter`, the
    :class:`~kivy.adapters.simplelistadapter.ListAdapter` gets cls, template,
    and args_converter properties.
    '''

    data = ListProperty([])
    '''The data list property contains a list of objects (which can be strings)
    that will be used directly if no args_converter function is provided. If
    there is an args_converter, the data objects will be passed to it for
    instantiating the item view class instances.

    :attr:`data` is a :class:`~kivy.properties.ListProperty` and
    defaults to [].
    '''

    def __init__(self, **kwargs):
        if 'data' not in kwargs:
            raise Exception('list adapter: input must include data argument')
        if not isinstance(kwargs['data'], list) and \
                not isinstance(kwargs['data'], tuple):
            raise Exception('list adapter: data must be a tuple or list')
        super(SimpleListAdapter, self).__init__(**kwargs)

    def get_count(self):
        return len(self.data)

    def get_data_item(self, index):
        if index < 0 or index >= len(self.data):
            return None
        return self.data[index]

    # Returns a view instance for an item.
    def get_view(self, index):
        item = self.get_data_item(index)

        if item is None:
            return None

        item_args = self.args_converter(index, item)

        cls = self.get_cls()
        if cls:
            instance = cls(**item_args)
            return instance
        else:
            return Builder.template(self.template, **item_args)


================================================
FILE: tickeys/kivy/animation.py
================================================
'''
Animation
=========

:class:`Animation` and :class:`AnimationTransition` are used to animate
:class:`~kivy.uix.widget.Widget` properties. You must specify at least a
property name and target value. To use an Animation, follow these steps:

    * Setup an Animation object
    * Use the Animation object on a Widget

Simple animation
----------------

To animate a Widget's x or y position, simply specify the target x/y values
where you want the widget positioned at the end of the animation::

    anim = Animation(x=100, y=100)
    anim.start(widget)

The animation will last for 1 second unless :attr:`duration` is specified.
When anim.start() is called, the Widget will move smoothly from the current
x/y position to (100, 100).

Multiple properties and transitions
-----------------------------------

You can animate multiple properties and use built-in or custom transition
functions using :attr:`transition` (or the `t=` shortcut). For example,
to animate the position and size using the 'in_quad' transition::

    anim = Animation(x=50, size=(80, 80), t='in_quad')
    anim.start(widget)

Note that the `t=` parameter can be the string name of a method in the
:class:`AnimationTransition` class or your own animation function.

Sequential animation
--------------------

To join animations sequentially, use the '+' operator. The following example
will animate to x=50 over 1 second, then animate the size to (80, 80) over the
next two seconds::

    anim = Animation(x=50) + Animation(size=(80, 80), duration=2.)
    anim.start(widget)

Parallel animation
------------------

To join animations in parallel, use the '&' operator. The following example
will animate the position to (80, 10) over 1 second, whilst in parallel
animating the size to (800, 800)::

    anim = Animation(pos=(80, 10))
    anim &= Animation(size=(800, 800), duration=2.)
    anim.start(widget)

Keep in mind that creating overlapping animations on the same property may have
unexpected results. If you want to apply multiple animations to the same
property, you should either schedule them sequentially (via the '+' operator or
using the *on_complete* callback) or cancel previous animations using the
:attr:`~Animation.cancel_all` method.

Repeating animation
-------------------

.. versionadded:: 1.8.0

.. note::
    This is currently only implemented for 'Sequence' animations.

To set an animation to repeat, simply set the :attr:`Sequence.repeat`
property to `True`::

    anim = Animation(...) + Animation(...)
    anim.repeat = True
    anim.start(widget)

For flow control of animations such as stopping and cancelling, use the methods
already in place in the animation module.
'''

__all__ = ('Animation', 'AnimationTransition')

from math import sqrt, cos, sin, pi
from kivy.event import EventDispatcher
from kivy.clock import Clock
from kivy.compat import string_types, iterkeys
from kivy.weakproxy import WeakProxy


class Animation(EventDispatcher):
    '''Create an animation definition that can be used to animate a Widget.

    :Parameters:
        `duration` or `d`: float, defaults to 1.
            Duration of the animation, in seconds.
        `transition` or `t`: str or func
            Transition function for animate properties. It can be the name of a
            method from :class:`AnimationTransition`.
        `step` or `s`: float
            Step in milliseconds of the animation. Defaults to 1 / 60.

    :Events:
        `on_start`: widget
            Fired when the animation is started on a widget.
        `on_complete`: widget
            Fired when the animation is completed or stopped on a widget.
        `on_progress`: widget, progression
            Fired when the progression of the animation is changing.

    .. versionchanged:: 1.4.0
        Added s/step parameter.

    '''

    _instances = set()

    __events__ = ('on_start', 'on_progress', 'on_complete')

    def __init__(self, **kw):
        super(Animation, self).__init__(**kw)

        # Initialize
        self._clock_installed = False
        self._duration = kw.get('d', kw.get('duration', 1.))
        self._transition = kw.get('t', kw.get('transition', 'linear'))
        self._step = kw.get('s', kw.get('step', 1. / 60.))
        if isinstance(self._transition, string_types):
            self._transition = getattr(AnimationTransition, self._transition)
        for key in ('d', 't', 's', 'step', 'duration', 'transition'):
            kw.pop(key, None)
        self._animated_properties = kw
        self._widgets = {}

    @property
    def duration(self):
        '''Return the duration of the animation.
        '''
        return self._duration

    @property
    def transition(self):
        '''Return the transition of the animation.
        '''
        return self._transition

    @property
    def animated_properties(self):
        '''Return the properties used to animate.
        '''
        return self._animated_properties

    @staticmethod
    def stop_all(widget, *largs):
        '''Stop all animations that concern a specific widget / list of
        properties.

        Example::

            anim = Animation(x=50)
            anim.start(widget)

            # and later
            Animation.stop_all(widget, 'x')
        '''
        if len(largs):
            for animation in list(Animation._instances):
                for x in largs:
                    animation.stop_property(widget, x)
        else:
            for animation in set(Animation._instances):
                animation.stop(widget)

    @staticmethod
    def cancel_all(widget, *largs):
        '''Cancel all animations that concern a specific widget / list of
        properties. See :attr:`cancel`.

        Example::

            anim = Animation(x=50)
            anim.start(widget)

            # and later
            Animation.cancel_all(widget, 'x')

        .. versionadded:: 1.4.0
        '''
        if len(largs):
            for animation in list(Animation._instances):
                for x in largs:
                    animation.cancel_property(widget, x)
        else:
            for animation in set(Animation._instances):
                animation.cancel(widget)

    def start(self, widget):
        '''Start the animation on a widget.
        '''
        self.stop(widget)
        self._initialize(widget)
        self._register()
        self.dispatch('on_start', widget)

    def stop(self, widget):
        '''Stop the animation previously applied to a widget, triggering the
        `on_complete` event.'''
        props = self._widgets.pop(widget.uid, None)
        if props:
            self.dispatch('on_complete', widget)
        self.cancel(widget)

    def cancel(self, widget):
        '''Cancel the animation previously applied to a widget. Same
        effect as :attr:`stop`, except the `on_complete` event will
        *not* be triggered!

        .. versionadded:: 1.4.0
        '''
        self._widgets.pop(widget.uid, None)
        self._clock_uninstall()
        if not self._widgets:
            self._unregister()

    def stop_property(self, widget, prop):
        '''Even if an animation is running, remove a property. It will not be
        animated futher. If it was the only/last property being animated,
        the animation will be stopped (see :attr:`stop`).
        '''
        props = self._widgets.get(widget.uid, None)
        if not props:
            return
        props['properties'].pop(prop, None)

        # no more properties to animation ? kill the animation.
        if not props['properties']:
            self.stop(widget)

    def cancel_property(self, widget, prop):
        '''Even if an animation is running, remove a property. It will not be
        animated further. If it was the only/last property being animated,
        the animation will be canceled (see :attr:`cancel`)

        .. versionadded:: 1.4.0
        '''
        props = self._widgets.get(widget.uid, None)
        if not props:
            return
        props['properties'].pop(prop, None)

        # no more properties to animation ? kill the animation.
        if not props['properties']:
            self.cancel(widget)

    def have_properties_to_animate(self, widget):
        '''Return True if a widget still has properties to animate.

        .. versionadded:: 1.8.0
        '''
        props = self._widgets.get(widget.uid, None)
        if props and props['properties']:
            return True

    #
    # Private
    #
    def _register(self):
        Animation._instances.add(self)

    def _unregister(self):
        if self in Animation._instances:
            Animation._instances.remove(self)

    def _initialize(self, widget):
        d = self._widgets[widget.uid] = {
            'widget': widget,
            'properties': {},
            'time': None}

        # get current values
        p = d['properties']
        for key, value in self._animated_properties.items():
            original_value = getattr(widget, key)
            if isinstance(original_value, (tuple, list)):
                original_value = original_value[:]
            elif isinstance(original_value, dict):
                original_value = original_value.copy()
            p[key] = (original_value, value)

        # install clock
        self._clock_install()

    def _clock_install(self):
        if self._clock_installed:
            return
        Clock.schedule_interval(self._update, self._step)
        self._clock_installed = True

    def _clock_uninstall(self):
        if self._widgets or not self._clock_installed:
            return
        self._clock_installed = False
        Clock.unschedule(self._update)

    def _update(self, dt):
        widgets = self._widgets
        transition = self._transition
        calculate = self._calculate
        for uid in list(widgets.keys())[:]:
            anim = widgets[uid]
            widget = anim['widget']

            if isinstance(widget, WeakProxy) and not len(dir(widget)):
                # empty proxy, widget is gone. ref: #2458
                del widgets[uid]
                continue

            if anim['time'] is None:
                anim['time'] = 0.
            else:
                anim['time'] += dt

            # calculate progression
            if self._duration:
                progress = min(1., anim['time'] / self._duration)
            else:
                progress = 1
            t = transition(progress)

            # apply progression on widget
            for key, values in anim['properties'].items():
                a, b = values
                value = calculate(a, b, t)
                setattr(widget, key, value)

            self.dispatch('on_progress', widget, progress)

            # time to stop ?
            if progress >= 1.:
                self.stop(widget)

    def _calculate(self, a, b, t):
        _calculate = self._calculate
        if isinstance(a, list) or isinstance(a, tuple):
            if isinstance(a, list):
                tp = list
            else:
                tp = tuple
            return tp([_calculate(a[x], b[x], t) for x in range(len(a))])
        elif isinstance(a, dict):
            d = {}
            for x in iterkeys(a):
                if x not in b:
                    # User requested to animate only part of the dict.
                    # Copy the rest
                    d[x] = a[x]
                else:
                    d[x] = _calculate(a[x], b[x], t)
            return d
        else:
            return (a * (1. - t)) + (b * t)

    #
    # Default handlers
    #
    def on_start(self, widget):
        pass

    def on_progress(self, widget, progress):
        pass

    def on_complete(self, widget):
        pass

    def __add__(self, animation):
        return Sequence(self, animation)

    def __and__(self, animation):
        return Parallel(self, animation)


class Sequence(Animation):

    def __init__(self, anim1, anim2):
        super(Sequence, self).__init__()

        #: Repeat the sequence. See 'Repeating animation' in the header
        #: documentation.
        self.repeat = False

        self.anim1 = anim1
        self.anim2 = anim2

        self.anim1.bind(on_start=self.on_anim1_start,
                        on_progress=self.on_anim1_progress)
        self.anim2.bind(on_complete=self.on_anim2_complete,
                        on_progress=self.on_anim2_progress)

    @property
    def duration(self):
        return self.anim1.duration + self.anim2.duration

    def start(self, widget):
        self.stop(widget)
        self._widgets[widget.uid] = True
        self._register()
        self.anim1.start(widget)
        self.anim1.bind(on_complete=self.on_anim1_complete)

    def stop(self, widget):
        self.anim1.stop(widget)
        self.anim2.stop(widget)
        props = self._widgets.pop(widget.uid, None)
        if props:
            self.dispatch('on_complete', widget)
        super(Sequence, self).cancel(widget)

    def stop_property(self, widget, prop):
        self.anim1.stop_property(widget, prop)
        self.anim2.stop_property(widget, prop)
        if (not self.anim1.have_properties_to_animate(widget) and
                not self.anim2.have_properties_to_animate(widget)):
            self.stop(widget)

    def cancel(self, widget):
        self.anim1.cancel(widget)
        self.anim2.cancel(widget)
        super(Sequence, self).cancel(widget)

    def on_anim1_start(self, instance, widget):
        self.dispatch('on_start', widget)

    def on_anim1_complete(self, instance, widget):
        self.anim1.unbind(on_complete=self.on_anim1_complete)
        self.anim2.start(widget)

    def on_anim1_progress(self, instance, widget, progress):
        self.dispatch('on_progress', widget, progress / 2.)

    def on_anim2_complete(self, instance, widget):
        '''Repeating logic used with boolean variable "repeat".

        .. versionadded:: 1.7.1
        '''
        if self.repeat:
            self.anim1.start(widget)
            self.anim1.bind(on_complete=self.on_anim1_complete)
        else:
            self.dispatch('on_complete', widget)

    def on_anim2_progress(self, instance, widget, progress):
        self.dispatch('on_progress', widget, .5 + progress / 2.)


class Parallel(Animation):

    def __init__(self, anim1, anim2):
        super(Parallel, self).__init__()
        self.anim1 = anim1
        self.anim2 = anim2

        self.anim1.bind(on_complete=self.on_anim_complete)
        self.anim2.bind(on_complete=self.on_anim_complete)

    @property
    def duration(self):
        return max(self.anim1.duration, self.anim2.duration)

    def start(self, widget):
        self.stop(widget)
        self.anim1.start(widget)
        self.anim2.start(widget)
        self._widgets[widget.uid] = {'complete': 0}
        self._register()
        self.dispatch('on_start', widget)

    def stop(self, widget):
        self.anim1.stop(widget)
        self.anim2.stop(widget)
        props = self._widgets.pop(widget.uid, None)
        if props:
            self.dispatch('on_complete', widget)
        super(Parallel, self).cancel(widget)

    def stop_property(self, widget, prop):
        self.anim1.stop_property(widget, prop)
        self.anim2.stop_property(widget, prop)
        if (not self.anim1.have_properties_to_animate(widget) and
                not self.anim2.have_properties_to_animate(widget)):
            self.stop(widget)

    def cancel(self, widget):
        self.anim1.cancel(widget)
        self.anim2.cancel(widget)
        super(Parallel, self).cancel(widget)

    def on_anim_complete(self, instance, widget):
        self._widgets[widget.uid]['complete'] += 1
        if self._widgets[widget.uid]['complete'] == 2:
            self.stop(widget)


class AnimationTransition(object):
    '''Collection of animation functions to be used with the Animation object.
    Easing Functions ported to Kivy from the Clutter Project
    http://www.clutter-project.org/docs/clutter/stable/ClutterAlpha.html

    The `progress` parameter in each animation function is in the range 0-1.
    '''

    @staticmethod
    def linear(progress):
        '''.. image:: images/anim_linear.png'''
        return progress

    @staticmethod
    def in_quad(progress):
        '''.. image:: images/anim_in_quad.png
        '''
        return progress * progress

    @staticmethod
    def out_quad(progress):
        '''.. image:: images/anim_out_quad.png
        '''
        return -1.0 * progress * (progress - 2.0)

    @staticmethod
    def in_out_quad(progress):
        '''.. image:: images/anim_in_out_quad.png
        '''
        p = progress * 2
        if p < 1:
            return 0.5 * p * p
        p -= 1.0
        return -0.5 * (p * (p - 2.0) - 1.0)

    @staticmethod
    def in_cubic(progress):
        '''.. image:: images/anim_in_cubic.png
        '''
        return progress * progress * progress

    @staticmethod
    def out_cubic(progress):
        '''.. image:: images/anim_out_cubic.png
        '''
        p = progress - 1.0
        return p * p * p + 1.0

    @staticmethod
    def in_out_cubic(progress):
        '''.. image:: images/anim_in_out_cubic.png
        '''
        p = progress * 2
        if p < 1:
            return 0.5 * p * p * p
        p -= 2
        return 0.5 * (p * p * p + 2.0)

    @staticmethod
    def in_quart(progress):
        '''.. image:: images/anim_in_quart.png
        '''
        return progress * progress * progress * progress

    @staticmethod
    def out_quart(progress):
        '''.. image:: images/anim_out_quart.png
        '''
        p = progress - 1.0
        return -1.0 * (p * p * p * p - 1.0)

    @staticmethod
    def in_out_quart(progress):
        '''.. image:: images/anim_in_out_quart.png
        '''
        p = progress * 2
        if p < 1:
            return 0.5 * p * p * p * p
        p -= 2
        return -0.5 * (p * p * p * p - 2.0)

    @staticmethod
    def in_quint(progress):
        '''.. image:: images/anim_in_quint.png
        '''
        return progress * progress * progress * progress * progress

    @staticmethod
    def out_quint(progress):
        '''.. image:: images/anim_out_quint.png
        '''
        p = progress - 1.0
        return p * p * p * p * p + 1.0

    @staticmethod
    def in_out_quint(progress):
        '''.. image:: images/anim_in_out_quint.png
        '''
        p = progress * 2
        if p < 1:
            return 0.5 * p * p * p * p * p
        p -= 2.0
        return 0.5 * (p * p * p * p * p + 2.0)

    @staticmethod
    def in_sine(progress):
        '''.. image:: images/anim_in_sine.png
        '''
        return -1.0 * cos(progress * (pi / 2.0)) + 1.0

    @staticmethod
    def out_sine(progress):
        '''.. image:: images/anim_out_sine.png
        '''
        return sin(progress * (pi / 2.0))

    @staticmethod
    def in_out_sine(progress):
        '''.. image:: images/anim_in_out_sine.png
        '''
        return -0.5 * (cos(pi * progress) - 1.0)

    @staticmethod
    def in_expo(progress):
        '''.. image:: images/anim_in_expo.png
        '''
        if progress == 0:
            return 0.0
        return pow(2, 10 * (progress - 1.0))

    @staticmethod
    def out_expo(progress):
        '''.. image:: images/anim_out_expo.png
        '''
        if progress == 1.0:
            return 1.0
        return -pow(2, -10 * progress) + 1.0

    @staticmethod
    def in_out_expo(progress):
        '''.. image:: images/anim_in_out_expo.png
        '''
        if progress == 0:
            return 0.0
        if progress == 1.:
            return 1.0
        p = progress * 2
        if p < 1:
            return 0.5 * pow(2, 10 * (p - 1.0))
        p -= 1.0
        return 0.5 * (-pow(2, -10 * p) + 2.0)

    @staticmethod
    def in_circ(progress):
        '''.. image:: images/anim_in_circ.png
        '''
        return -1.0 * (sqrt(1.0 - progress * progress) - 1.0)

    @staticmethod
    def out_circ(progress):
        '''.. image:: images/anim_out_circ.png
        '''
        p = progress - 1.0
        return sqrt(1.0 - p * p)

    @staticmethod
    def in_out_circ(progress):
        '''.. image:: images/anim_in_out_circ.png
        '''
        p = progress * 2
        if p < 1:
            return -0.5 * (sqrt(1.0 - p * p) - 1.0)
        p -= 2.0
        return 0.5 * (sqrt(1.0 - p * p) + 1.0)

    @staticmethod
    def in_elastic(progress):
        '''.. image:: images/anim_in_elastic.png
        '''
        p = .3
        s = p / 4.0
        q = progress
        if q == 1:
            return 1.0
        q -= 1.0
        return -(pow(2, 10 * q) * sin((q - s) * (2 * pi) / p))

    @staticmethod
    def out_elastic(progress):
        '''.. image:: images/anim_out_elastic.png
        '''
        p = .3
        s = p / 4.0
        q = progress
        if q == 1:
            return 1.0
        return pow(2, -10 * q) * sin((q - s) * (2 * pi) / p) + 1.0

    @staticmethod
    def in_out_elastic(progress):
        '''.. image:: images/anim_in_out_elastic.png
        '''
        p = .3 * 1.5
        s = p / 4.0
        q = progress * 2
        if q == 2:
            return 1.0
        if q < 1:
            q -= 1.0
            return -.5 * (pow(2, 10 * q) * sin((q - s) * (2.0 * pi) / p))
        else:
            q -= 1.0
            return pow(2, -10 * q) * sin((q - s) * (2.0 * pi) / p) * .5 + 1.0

    @staticmethod
    def in_back(progress):
        '''.. image:: images/anim_in_back.png
        '''
        return progress * progress * ((1.70158 + 1.0) * progress - 1.70158)

    @staticmethod
    def out_back(progress):
        '''.. image:: images/anim_out_back.png
        '''
        p = progress - 1.0
        return p * p * ((1.70158 + 1) * p + 1.70158) + 1.0

    @staticmethod
    def in_out_back(progress):
        '''.. image:: images/anim_in_out_back.png
        '''
        p = progress * 2.
        s = 1.70158 * 1.525
        if p < 1:
            return 0.5 * (p * p * ((s + 1.0) * p - s))
        p -= 2.0
        return 0.5 * (p * p * ((s + 1.0) * p + s) + 2.0)

    @staticmethod
    def _out_bounce_internal(t, d):
        p = t / d
        if p < (1.0 / 2.75):
            return 7.5625 * p * p
        elif p < (2.0 / 2.75):
            p -= (1.5 / 2.75)
            return 7.5625 * p * p + .75
        elif p < (2.5 / 2.75):
            p -= (2.25 / 2.75)
            return 7.5625 * p * p + .9375
        else:
            p -= (2.625 / 2.75)
            return 7.5625 * p * p + .984375

    @staticmethod
    def _in_bounce_internal(t, d):
        return 1.0 - AnimationTransition._out_bounce_internal(d - t, d)

    @staticmethod
    def in_bounce(progress):
        '''.. image:: images/anim_in_bounce.png
        '''
        return AnimationTransition._in_bounce_internal(progress, 1.)

    @staticmethod
    def out_bounce(progress):
        '''.. image:: images/anim_out_bounce.png
        '''
        return AnimationTransition._out_bounce_internal(progress, 1.)

    @staticmethod
    def in_out_bounce(progress):
        '''.. image:: images/anim_in_out_bounce.png
        '''
        p = progress * 2.
        if p < 1.:
            return AnimationTransition._in_bounce_internal(p, 1.) * .5
        return AnimationTransition._out_bounce_internal(p - 1., 1.) * .5 + .5


================================================
FILE: tickeys/kivy/app.py
================================================
'''
Application
===========

The :class:`App` class is the base for creating Kivy applications.
Think of it as your main entry point into the Kivy run loop. In most
cases, you subclass this class and make your own app. You create an
instance of your specific app class and then, when you are ready to
start the application's life cycle, you call your instance's
:meth:`App.run` method.


Creating an Application
-----------------------

Method using build() override
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

To initialize your app with a widget tree, override the :meth:`~App.build`
method in your app class and return the widget tree you constructed.

Here's an example of a very simple application that just shows a button:

.. include:: ../../examples/application/app_with_build.py
   :literal:

The file is also available in the examples folder at
:file:`kivy/examples/application/app_with_build.py`.

Here, no widget tree was constructed (or if you will, a tree with only
the root node).


Method using kv file
~~~~~~~~~~~~~~~~~~~~

You can also use the :doc:`api-kivy.lang` for creating applications. The
.kv can contain rules and root widget definitions at the same time. Here
is the same example as the Button one in a kv file.

Contents of 'test.kv':

.. include:: ../../examples/application/test.kv
   :literal:

Contents of 'main.py':

.. include:: ../../examples/application/app_with_kv.py
   :literal:

See :file:`kivy/examples/application/app_with_kv.py`.

The relation between main.py and test.kv is explained in :meth:`App.load_kv`.


Application configuration
-------------------------

.. versionadded:: 1.0.7

Use the configuration file
~~~~~~~~~~~~~~~~~~~~~~~~~~

Your application might want to have its own configuration file. The
:class:`App` is able to handle an INI file automatically. You add your
section/key/value in the :meth:`App.build_config` method by using the `config`
parameter (which is an instance of :class:`~kivy.config.ConfigParser`)::

    class TestApp(App):
        def build_config(self, config):
            config.setdefaults('section1', {
                'key1': 'value1',
                'key2': '42'
            })

As soon as you add one section in the config, a file is created on the
disk and named from the mangled name of your class. "TestApp" will give
a config file-name "test.ini" with the content::

    [section1]
    key1 = value1
    key2 = 42

The "test.ini" will be automatically loaded at runtime and you can access the
configuration in your :meth:`App.build` method::

    class TestApp(App):
        def build_config(self, config):
            config.setdefaults('section1', {
                'key1': 'value1',
                'key2': '42'
            })

        def build(self):
            config = self.config
            return Label(text='key1 is %s and key2 is %d' % (
                config.get('section1', 'key1'),
                config.getint('section1', 'key2')))

Create a settings panel
~~~~~~~~~~~~~~~~~~~~~~~

Your application can have a settings panel to let your user configure some of
your config tokens. Here is an example done in the KinectViewer example
(available in the examples directory):

    .. image:: images/app-settings.jpg
        :align: center

You can add your own panels of settings by extending
the :meth:`App.build_settings` method.
Check the :class:`~kivy.uix.settings.Settings` about how to create a panel,
because you need a JSON file / data first.

Let's take as an example the previous snippet of TestApp with custom
config. We could create a JSON like this::

    [
        { "type": "title",
          "title": "Test application" },

        { "type": "options",
          "title": "My first key",
          "desc": "Description of my first key",
          "section": "section1",
          "key": "key1",
          "options": ["value1", "value2", "another value"] },

        { "type": "numeric",
          "title": "My second key",
          "desc": "Description of my second key",
          "section": "section1",
          "key": "key2" }
    ]

Then, we can create a panel using this JSON to automatically create all the
options and link them to our :attr:`App.config` ConfigParser instance::

    class TestApp(App):
        # ...
        def build_settings(self, settings):
            jsondata = """... put the json data here ..."""
            settings.add_json_panel('Test application',
                self.config, data=jsondata)

That's all! Now you can press F1 (default keystroke) to toggle the
settings panel or press the "settings" key on your android device. You
can manually call :meth:`App.open_settings` and
:meth:`App.close_settings` if you want to handle this manually. Every
change in the panel is automatically saved in the config file.

You can also use :meth:`App.build_settings` to modify properties of
the settings panel. For instance, the default panel has a sidebar for
switching between json panels whose width defaults to 200dp. If you'd
prefer this to be narrower, you could add::

    settings.interface.menu.width = dp(100)

to your :meth:`build_settings` method.

You might want to know when a config value has been changed by the
user in order to adapt or reload your UI. You can then overload the
:meth:`on_config_change` method::

    class TestApp(App):
        # ...
        def on_config_change(self, config, section, key, value):
            if config is self.config:
                token = (section, key)
                if token == ('section1', 'key1'):
                    print('Our key1 have been changed to', value)
                elif token == ('section1', 'key2'):
                    print('Our key2 have been changed to', value)

The Kivy configuration panel is added by default to the settings
instance. If you don't want this panel, you can declare your Application as
follows::

    class TestApp(App):
        use_kivy_settings = False
        # ...

This only removes the Kivy panel but does not stop the settings instance
from appearing. If you want to prevent the settings instance from appearing
altogether, you can do this::

    class TestApp(App):
        def open_settings(self, *largs):
            pass

Profiling with on_start and on_stop
-----------------------------------

It is often useful to profile python code in order to discover locations to
optimise. The standard library profilers
(http://docs.python.org/2/library/profile.html) provides multiple options for
profiling code. For profiling the entire program, the natural
approaches of using profile as a module or profile's run method does not work
with Kivy. It is however, possible to use :meth:`App.on_start` and
:meth:`App.on_stop` methods::

    import cProfile

    class MyApp(App):
        def on_start(self):
            self.profile = cProfile.Profile()
            self.profile.enable()

        def on_stop(self):
            self.profile.disable()
            self.profile.dump_stats('myapp.profile')

This will create a file called `myapp.profile` when you exit your app.

Customising layout
------------------

You can choose different settings widget layouts by setting
:attr:`App.settings_cls`. By default, this is a
:class:`~kivy.uix.settings.Settings` class which provides the pictured
sidebar layout, but you could set it to any of the other layouts
provided in :mod:`kivy.uix.settings` or create your own. See the
module documentation for :mod:`kivy.uix.settings` for more
information.

You can customise how the settings panel is displayed by
overriding :meth:`App.display_settings` which is called before
displaying the settings panel on the screen. By default, it
simply draws the panel on top of the window, but you could modify it
to (for instance) show the settings in a
:class:`~kivy.uix.popup.Popup` or add it to your app's
:class:`~kivy.uix.screenmanager.ScreenManager` if you are using
one. If you do so, you should also modify :meth:`App.close_settings`
to exit the panel appropriately. For instance, to have the settings
panel appear in a popup you can do::

    def display_settings(self, settings):
        try:
            p = self.settings_popup
        except AttributeError:
            self.settings_popup = Popup(content=settings,
                                        title='Settings',
                                        size_hint=(0.8, 0.8))
            p = self.settings_popup
        if p.content is not settings:
            p.content = settings
        p.open()

    def close_settings(self, *args):
        try:
            p = self.settings_popup
            p.dismiss()
        except AttributeError:
            pass # Settings popup doesn't exist

Finally, if you want to replace the current settings panel widget, you
can remove the internal references to it using
:meth:`App.destroy_settings`. If you have modified
:meth:`App.display_settings`, you should be careful to detect if the
settings panel has been replaced.

Pause mode
----------

.. versionadded:: 1.1.0

On tablets and phones, the user can switch at any moment to another
application. By default, your application will close and the
:meth:`App.on_stop` event will be fired.

If you support Pause mode, when switching to another application, your
application will wait indefinitely until the user
switches back to your application. There is an issue with OpenGL on Android
devices: it is not guaranteed that the OpenGL ES Context will be restored when
your app resumes. The mechanism for restoring all the OpenGL data is not yet
implemented in Kivy.

The currently implemented Pause mechanism is:

    #. Kivy checks every frame if Pause mode is activated by the Operating
       System due to the user switching to another application, a phone
       shutdown or any other reason.
    #. :meth:`App.on_pause` is called:
    #. If False is returned (default case), then :meth:`App.on_stop` is
       called.
    #. Otherwise the application will sleep until the OS resumes our App
    #. When the app is resumed, :meth:`App.on_resume` is called.
    #. If our app memory has been reclaimed by the OS, then nothing will be
       called.

Here is a simple example of how on_pause() should be used::

   class TestApp(App):

      def on_pause(self):
         # Here you can save data if needed
         return True

      def on_resume(self):
         # Here you can check if any data needs replacing (usually nothing)
         pass

.. warning::

    Both `on_pause` and `on_stop` must save important data because after
    `on_pause` is called, `on_resume` may not be called at all.

'''

__all__ = ('App', )

import os
from inspect import getfile
from os.path import dirname, join, exists, sep, expanduser, isfile
from kivy.config import ConfigParser
from kivy.base import runTouchApp, stopTouchApp
from kivy.compat import string_types
from kivy.factory import Factory
from kivy.logger import Logger
from kivy.event import EventDispatcher
from kivy.lang import Builder
from kivy.resources import resource_find
from kivy.utils import platform as core_platform
from kivy.uix.widget import Widget
from kivy.properties import ObjectProperty, StringProperty


platform = core_platform


class App(EventDispatcher):
    ''' Application class, see module documentation for more information.

    :Events:
        `on_start`:
            Fired when the application is being started (before the
            :func:`~kivy.base.runTouchApp` call.
        `on_stop`:
            Fired when the application stops.
        `on_pause`:
            Fired when the application is paused by the OS.
        `on_resume`:
            Fired when the application is resumed from pause by the OS. Beware:
            you have no guarantee that this event will be fired after the
            `on_pause` event has been called.

    .. versionchanged:: 1.7.0
        Parameter `kv_file` added.

    .. versionchanged:: 1.8.0
        Parameters `kv_file` and `kv_directory` are now properties of App.
    '''

    title = StringProperty(None)
    '''
    Title of your application. You can set this as follows::

        class MyApp(App):
            def build(self):
                self.title = 'Hello world'

    .. versionadded:: 1.0.5

    .. versionchanged:: 1.8.0
        `title` is now a :class:`~kivy.properties.StringProperty`. Don't set the
        title in the class as previously stated in the documentation.

    .. note::

        For Kivy < 1.8.0, you can set this as follows::

            class MyApp(App):
                title = 'Custom title'

        If you want to dynamically change the title, you can do::

            from kivy.base import EventLoop
            EventLoop.window.title = 'New title'

    '''

    icon = StringProperty(None)
    '''Icon of your application.
    The icon can be located in the same directory as your main file. You can set
    this as follows::

        class MyApp(App):
            def build(self):
                self.icon = 'myicon.png'

    .. versionadded:: 1.0.5

    .. versionchanged:: 1.8.0
        `icon` is now a :class:`~kivy.properties.StringProperty`. Don't set the
        icon in the class as previously stated in the documentation.

    .. note::

        For Kivy prior to 1.8.0, you need to set this as follows::

            class MyApp(App):
                icon = 'customicon.png'

         Recommended 256x256 or 1024x1024? for GNU/Linux and Mac OSX
         32x32 for Windows7 or less. <= 256x256 for windows 8
         256x256 does work (on Windows 8 at least), but is scaled
         down and doesn't look as good as a 32x32 icon.
    '''

    use_kivy_settings = True
    '''.. versionadded:: 1.0.7

    If True, the application settings will also include the Kivy settings. If
    you don't want the user to change any kivy settings from your settings UI,
    change this to False.
    '''

    settings_cls = ObjectProperty(None)
    '''.. versionadded:: 1.8.0

    The class used to construct the settings panel and
    the instance passed to :meth:`build_config`. You should
    use either :class:`~kivy.uix.settings.Settings` or one of the provided
    subclasses with different layouts
    (:class:`~kivy.uix.settings.SettingsWithSidebar`,
    :class:`~kivy.uix.settings.SettingsWithSpinner`,
    :class:`~kivy.uix.settings.SettingsWithTabbedPanel`,
    :class:`~kivy.uix.settings.SettingsWithNoMenu`). You can also create your
    own Settings subclass. See the documentation
    of :mod:`~kivy.uix.settings.Settings` for more information.

    :attr:`~App.settings_cls` is an :class:`~kivy.properties.ObjectProperty`
    and defaults to :class:`~kivy.uix.settings.SettingsWithSpinner` which
    displays settings panels with a spinner to switch between them. If you set a
    string, the :class:`~kivy.factory.Factory` will be used to resolve the
    class.

    '''

    kv_directory = StringProperty(None)
    '''Path of the directory where application kv is stored, defaults to None

    .. versionadded:: 1.8.0

    If a kv_directory is set, it will be used to get the initial kv file. By
    default, the file is assumed to be in the same directory as the current App
    definition file.
    '''

    kv_file = StringProperty(None)
    '''Filename of the Kv file to load, defaults to None.

    .. versionadded:: 1.8.0

    If a kv_file is set, it will be loaded when the application starts. The
    loading of the "default" kv file will be prevented.
    '''

    # Return the current running App instance
    _running_app = None

    __events__ = ('on_start', 'on_stop', 'on_pause', 'on_resume')

    def __init__(self, **kwargs):
        App._running_app = self
        self._app_directory = None
        self._app_name = None
        self._app_settings = None
        self._app_window = None
        super(App, self).__init__(**kwargs)
        self.built = False

        #: Options passed to the __init__ of the App
        self.options = kwargs

        #: Returns an instance of the :class:`~kivy.config.ConfigParser` for
        #: the application configuration. You can use this to query some config
        #: tokens in the :meth:`build` method.
        self.config = None

        #: The *root* widget returned by the :meth:`build` method or by the
        #: :meth:`load_kv` method if the kv file contains a root widget.
        self.root = None

    def build(self):
        '''Initializes the application; it will be called only once.
        If this method returns a widget (tree), it will be used as the root
        widget and added to the window.

        :return:
            None or a root :class:`~kivy.uix.widget.Widget` instance
            if no self.root exists.'''

        if not self.root:
            return Widget()

    def build_config(self, config):
        '''.. versionadded:: 1.0.7

        This method is called before the application is initialized to
        construct your :class:`~kivy.config.ConfigParser` object. This
        is where you can put any default section / key / value for your
        config. If anything is set, the configuration will be
        automatically saved in the file returned by
        :meth:`get_application_config`.

        :Parameters:
            `config`: :class:`~kivy.config.ConfigParser`
                Use this to add default section / key / value items

        '''

    def build_settings(self, settings):
        '''.. versionadded:: 1.0.7

        This method is called when the user (or you) want to show the
        application settings. It is called once when the settings panel
        is first opened, after which the panel is cached. It may be
        called again if the cached settings panel is removed by
        :meth:`destroy_settings`.

        You can use this method to add settings panels and to
        customise the settings widget e.g. by changing the sidebar
        width. See the module documentation for full details.

        :Parameters:
            `settings`: :class:`~kivy.uix.settings.Settings`
                Settings instance for adding panels

        '''

    def load_kv(self, filename=None):
        '''This method is invoked the first time the app is being run if no
        widget tree has been constructed before for this app.
        This method then looks for a matching kv file in the same directory as
        the file that contains the application class.

        For example, say you have a file named main.py that contains::

            class ShowcaseApp(App):
                pass

        This method will search for a file named `showcase.kv` in
        the directory that contains main.py. The name of the kv file has to be
        the lowercase name of the class, without the 'App' postfix at the end
        if it exists.

        You can define rules and a root widget in your kv file::

            <ClassName>: # this is a rule
                ...

            ClassName: # this is a root widget
                ...

        There must be only one root widget. See the :doc:`api-kivy.lang`
        documentation for more information on how to create kv files. If your
        kv file contains a root widget, it will be used as self.root, the root
        widget for the application.

        .. note::

            This function is called from :meth:`run`, therefore, any widget
            whose styling is defined in this kv file and is created before
            :meth:`run` is called (e.g. in `__init__`), won't have its styling
            applied. Note that :meth:`build` is called after :attr:`load_kv`
            has been called.
        '''
        # Detect filename automatically if it was not specified.
        if filename:
            filename = resource_find(filename)
        else:
            try:
                default_kv_directory = dirname(getfile(self.__class__))
                if default_kv_directory == '':
                    default_kv_directory = '.'
            except TypeError:
                # if it's a builtin module.. use the current dir.
                default_kv_directory = '.'

            kv_directory = self.kv_directory or default_kv_directory
            clsname = self.__class__.__name__.lower()
            if (clsname.endswith('app') and
                    not isfile(join(kv_directory, '%s.kv' % clsname))):
                clsname = clsname[:-3]
            filename = join(kv_directory, '%s.kv' % clsname)

        # Load KV file
        Logger.debug('App: Loading kv <{0}>'.format(filename))
        rfilename = resource_find(filename)
        if rfilename is None or not exists(rfilename):
            Logger.debug('App: kv <%s> not found' % filename)
            return False
        root = Builder.load_file(rfilename)
        if root:
            self.root = root
        return True

    def get_application_name(self):
        '''Return the name of the application.
        '''
        if self.title is not None:
            return self.title
        clsname = self.__class__.__name__
        if clsname.endswith('App'):
            clsname = clsname[:-3]
        return clsname

    def get_application_icon(self):
        '''Return the icon of the application.
        '''
        if not resource_find(self.icon):
            return ''
        else:
            return resource_find(self.icon)

    def get_application_config(self, defaultpath='%(appdir)s/%(appname)s.ini'):
        '''.. versionadded:: 1.0.7

        .. versionchanged:: 1.4.0
            Customized the default path for iOS and Android platforms. Added a
            defaultpath parameter for desktop OS's (not applicable to iOS
            and Android.)

        Return the filename of your application configuration. Depending
        on the platform, the application file will be stored in
        different locations:

            - on iOS: <appdir>/Documents/.<appname>.ini
            - on Android: /sdcard/.<appname>.ini
            - otherwise: <appdir>/<appname>.ini

        When you are distributing your application on Desktops, please
        note that if the application is meant to be installed
        system-wide, the user might not have write-access to the
        application directory. If you want to store user settings, you
        should overload this method and change the default behavior to
        save the configuration file in the user directory.::

            class TestApp(App):
                def get_application_config(self):
                    return super(TestApp, self).get_application_config(
                        '~/.%(appname)s.ini')

        Some notes:

        - The tilda '~' will be expanded to the user directory.
        - %(appdir)s will be replaced with the application :attr:`directory`
        - %(appname)s will be replaced with the application :attr:`name`
        '''

        if platform == 'android':
            defaultpath = '/sdcard/.%(appname)s.ini'
        elif platform == 'ios':
            defaultpath = '~/Documents/%(appname)s.ini'
        elif platform == 'win':
            defaultpath = defaultpath.replace('/', sep)
        return expanduser(defaultpath) % {
            'appname': self.name, 'appdir': self.directory}

    @property
    def root_window(self):
        '''.. versionadded:: 1.9.0

        Returns the root window instance used by :meth:`run`.
        '''
        return self._app_window

    def load_config(self):
        '''(internal) This function is used for returning a ConfigParser with
        the application configuration. It's doing 3 things:

            #. Creating an instance of a ConfigParser
            #. Loading the default configuration by calling
               :meth:`build_config`, then
            #. If it exists, it loads the application configuration file,
               otherwise it creates one.

        :return:
            :class:`~kivy.config.ConfigParser` instance
        '''
        try:
            config = ConfigParser.get_configparser('app')
        except KeyError:
            config = None
        if config is None:
            config = ConfigParser(name='app')
        self.config = config
        self.build_config(config)
        # if no sections are created, that's mean the user don't have
        # configuration.
        if len(config.sections()) == 0:
            return
        # ok, the user have some sections, read the default file if exist
        # or write it !
        filename = self.get_application_config()
        if filename is None:
            return config
        Logger.debug('App: Loading configuration <{0}>'.format(filename))
        if exists(filename):
            try:
                config.read(filename)
            except:
                Logger.error('App: Corrupted config file, ignored.')
                config.name = ''
                try:
                    config = ConfigParser.get_configparser('app')
                except KeyError:
                    config = None
                if config is None:
                    config = ConfigParser(name='app')
                self.config = config
                self.build_config(config)
                pass
        else:
            Logger.debug('App: First configuration, create <{0}>'.format(
                filename))
            config.filename = filename
            config.write()
        return config

    @property
    def directory(self):
        '''.. versionadded:: 1.0.7

        Return the directory where the application lives.
        '''
        if self._app_directory is None:
            try:
                self._app_directory = dirname(getfile(self.__class__))
                if self._app_directory == '':
                    self._app_directory = '.'
            except TypeError:
                # if it's a builtin module.. use the current dir.
                self._app_directory = '.'
        return self._app_directory

    @property
    def user_data_dir(self):
        '''
        .. versionadded:: 1.7.0

        Returns the path to the directory in the users file system which the
        application can use to store additional data.

        Different platforms have different conventions with regards to where
        the user can store data such as preferences, saved games and settings.
        This function implements these conventions. The <app_name> directory
        is created when the property is called, unless it already exists.

        On iOS, `~/Documents<app_name>` is returned (which is inside the
        app's sandbox).

        On Android, `/sdcard/<app_name>` is returned.

        On Windows, `%APPDATA%/<app_name>` is returned.

        On Mac OSX, `~/Library/Application Support/<app_name>` is returned.

        On Linux, `$XDG_CONFIG_HOME/<app_name>` is returned.
        '''
        data_dir = ""
        if platform == 'ios':
            data_dir = join('~/Documents', self.name)
        elif platform == 'android':
            data_dir = join('/sdcard', self.name)
        elif platform == 'win':
            data_dir = os.path.join(os.environ['APPDATA'], self.name)
        elif platform == 'macosx':
            data_dir = '~/Library/Application Support/{}'.format(self.name)
        else:  # _platform == 'linux' or anything else...:
            data_dir = os.environ.get('XDG_CONFIG_HOME', '~/.config')
            data_dir = join(data_dir, self.name)
        data_dir = expanduser(data_dir)
        if not exists(data_dir):
            os.mkdir(data_dir)
        return data_dir

    @property
    def name(self):
        '''.. versionadded:: 1.0.7

        Return the name of the application based on the class name.
        '''
        if self._app_name is None:
            clsname = self.__class__.__name__
            if clsname.endswith('App'):
                clsname = clsname[:-3]
            self._app_name = clsname.lower()
        return self._app_name

    def run(self):
        '''Launches the app in standalone mode.
        '''
        if not self.built:
            self.load_config()
            self.load_kv(filename=self.kv_file)
            root = self.build()
            if root:
                self.root = root
        if self.root:
            if not isinstance(self.root, Widget):
                Logger.critical('App.root must be an _instance_ of Widget')
                raise Exception('Invalid instance in App.root')
            from kivy.core.window import Window
            Window.add_widget(self.root)

        # Check if the window is already created
        from kivy.base import EventLoop
        window = EventLoop.window
        if window:
            self._app_window = window
            window.set_title(self.get_application_name())
            icon = self.get_application_icon()
            if icon:
                window.set_icon(icon)
            self._install_settings_keys(window)
        else:
            Logger.critical("Application: No window is created."
                            " Terminating application run.")
            return

        self.dispatch('on_start')
        runTouchApp()
        self.stop()

    def stop(self, *largs):
        '''Stop the application.

        If you use this method, the whole application will stop by issuing
        a call to :func:`~kivy.base.stopTouchApp`.
        '''
        self.dispatch('on_stop')
        stopTouchApp()

        # Clear the window children
        for child in self._app_window.children:
            self._app_window.remove_widget(child)

    def on_start(self):
        '''Event handler for the `on_start` event which is fired after
        initialization (after build() has been called) but before the
        application has started running.
        '''
        pass

    def on_stop(self):
        '''Event handler for the `on_stop` event which is fired when the
        application has finished running (i.e. the window is about to be
        closed).
        '''
        pass

    def on_pause(self):
        '''Event handler called when Pause mode is requested. You should
        return True if your app can go into Pause mode, otherwise
        return False and your application will be stopped (the default).

        You cannot control when the application is going to go into this mode.
        It's determined by the Operating System and mostly used for mobile
        devices (android/ios) and for resizing.

        The default return value is False.

        .. versionadded:: 1.1.0
        '''
        return False

    def on_resume(self):
        '''Event handler called when your application is resuming from
        the Pause mode.

        .. versionadded:: 1.1.0

        .. warning::

            When resuming, the OpenGL Context might have been damaged / freed.
            This is where you can reconstruct some of your OpenGL state
            e.g. FBO content.
        '''
        pass

    @staticmethod
    def get_running_app():
        '''Return the currently running application instance.

        .. versionadded:: 1.1.0
        '''
        return App._running_app

    def on_config_change(self, config, section, key, value):
        '''Event handler fired when a configuration token has been changed by
        the settings page.
        '''
        pass

    def open_settings(self, *largs):
        '''Open the application settings panel. It will be created the very
        first time, or recreated if the previously cached panel has been
        removed by :meth:`destroy_settings`. The settings panel will be
        displayed with the
        :meth:`display_settings` method, which by default adds the
        settings panel to the Window attached to your application. You
        should override that method if you want to display the
        settings panel differently.

        :return:
            True if the settings has been opened.

        '''
        if self._app_settings is None:
            self._app_settings = self.create_settings()
        displayed = self.display_settings(self._app_settings)
        if displayed:
            return True
        return False

    def display_settings(self, settings):
        '''.. versionadded:: 1.8.0

        Display the settings panel. By default, the panel is drawn directly
        on top of the window. You can define other behaviour by overriding
        this method, such as adding it to a ScreenManager or Popup.

        You should return True if the display is successful, otherwise False.

        :Parameters:
            `settings`: :class:`~kivy.uix.settings.Settings`
                You can modify this object in order to modify the settings
                display.

        '''
        win = self._app_window
        if not win:
            raise Exception('No windows are set on the application, you cannot'
                            ' open settings yet.')
        if settings not in win.children:
            win.add_widget(settings)
            return True
        return False

    def close_settings(self, *largs):
        '''Close the previously opened settings panel.

        :return:
            True if the settings has been closed.
        '''
        win = self._app_window
        settings = self._app_settings
        if win is None or settings is None:
            return
        if settings in win.children:
            win.remove_widget(settings)
            return True
        return False

    def create_settings(self):
        '''Create the settings panel. This method will normally
        be called only one time per
        application life-time and the result is cached internally,
        but it may be called again if the cached panel is removed
        by :meth:`destroy_settings`.

        By default, it will build a settings panel according to
        :attr:`settings_cls`, call :meth:`build_settings`, add a Kivy panel if
        :attr:`use_kivy_settings` is True, and bind to
        on_close/on_config_change.

        If you want to plug your own way of doing settings, without the Kivy
        panel or close/config change events, this is the method you want to
        overload.

        .. versionadded:: 1.8.0
        '''
        if self.settings_cls is None:
            from kivy.uix.settings import SettingsWithSpinner
            self.settings_cls = SettingsWithSpinner
        elif isinstance(self.settings_cls, string_types):
            self.settings_cls = Factory.get(self.settings_cls)
        s = self.settings_cls()
        self.build_settings(s)
        if self.use_kivy_settings:
            s.add_kivy_panel()
        s.bind(on_close=self.close_settings,
               on_config_change=self._on_config_change)
        return s

    def destroy_settings(self):
        '''.. versionadded:: 1.8.0

        Dereferences the current settings panel if one
        exists. This means that when :meth:`App.open_settings` is next
        run, a new panel will be created and displayed. It doesn't
        affect any of the contents of the panel, but lets you (for
        instance) refresh the settings panel layout if you have
        changed the settings widget in response to a screen size
        change.

        If you have modified :meth:`~App.open_settings` or
        :meth:`~App.display_settings`, you should be careful to
        correctly detect if the previous settings widget has been
        destroyed.

        '''
        if self._app_settings is not None:
            self._app_settings = None

    #
    # privates
    #

    def _on_config_change(self, *largs):
        self.on_config_change(*largs[1:])

    def _install_settings_keys(self, window):
        window.bind(on_keyboard=self._on_keyboard_settings)

    def _on_keyboard_settings(self, window, *largs):
        key = largs[0]
        setting_key = 282  # F1

        # android hack, if settings key is pygame K_MENU
        if platform == 'android':
            import pygame
            setting_key = pygame.K_MENU

        if key == setting_key:
            # toggle settings panel
            if not self.open_settings():
                self.close_settings()
            return True
        if key == 27:
            return self.close_settings()

    def on_title(self, instance, title):
        if self._app_window:
            self._app_window.set_title(title)

    def on_icon(self, instance, icon):
        if self._app_window:
            self._app_window.set_icon(self.get_application_icon())



================================================
FILE: tickeys/kivy/atlas.py
================================================
'''
Atlas
=====

.. versionadded:: 1.1.0

Atlas manages texture atlases: packing multiple textures into
one. With it, you reduce the number of images loaded and speedup the
application loading. This module contains both the Atlas class and command line
processing for creating an atlas from a set of individual PNG files. The
command line section requires the Pillow library, or the defunct Python Imaging
Library (PIL), to be installed.

An Atlas is composed of files:
    - a json file (.atlas) that contains the image file names and texture
      locations of the atlas.
    - one or multiple image files containing textures referenced by the .atlas
      file.

Definition of .atlas files
--------------------------

A file with ``<basename>.atlas`` is a json file formatted like this::

    {
        "<basename>-<index>.png": {
            "id1": [ <x>, <y>, <width>, <height> ],
            "id2": [ <x>, <y>, <width>, <height> ],
            # ...
        },
        # ...
    }

Example from the Kivy ``data/images/defaulttheme.atlas``::

    {
        "defaulttheme-0.png": {
            "progressbar_background": [431, 224, 59, 24],
            "image-missing": [253, 344, 48, 48],
            "filechooser_selected": [1, 207, 118, 118],
            "bubble_btn": [83, 174, 32, 32],
            # ... and more ...
        }
    }

In this example, "defaulttheme-0.png" is a large image, with the pixels in the
rectangle from (431, 224) to (431 + 59, 224 + 24) usable as
``atlas://data/images/defaulttheme/progressbar_background`` in
any image parameter.

How to create an Atlas
----------------------

.. warning::

    The atlas creation requires the Pillow library (or the defunct Imaging/PIL
    library). This requirement will be removed in the future when the Kivy core
    Image is able to support loading, blitting, and saving operations.

You can directly use this module to create atlas files with this command::

    $ python -m kivy.atlas <basename> <size> <list of images...>


Let's say you have a list of images that you want to put into an Atlas. The
directory is named ``images`` with lots of 64x64 png files inside::

    $ ls
    images
    $ cd images
    $ ls
    bubble.png bubble-red.png button.png button-down.png

You can combine all the png's into one and generate the atlas file with::

    $ python -m kivy.atlas myatlas 256x256 *.png
    Atlas created at myatlas.atlas
    1 image has been created
    $ ls
    bubble.png bubble-red.png button.png button-down.png myatlas.atlas
    myatlas-0.png

As you can see, we get 2 new files: ``myatlas.atlas`` and ``myatlas-0.png``.
``myatlas-0.png`` is a new 256x256 .png composed of all your images.

.. note::

    When using this script, the ids referenced in the atlas are the base names
    of the images without the extension. So, if you are going to name a file
    ``../images/button.png``, the id for this image will be ``button``.

    If you need path information included, you should include ``use_path`` as
    follows::

        $ python -m kivy.atlas use_path myatlas 256 *.png

    In which case the id for ``../images/button.png`` will be ``images_button``


How to use an Atlas
-------------------

Usually, you would use the atlas as follows::

    a = Button(background_normal='images/button.png',
               background_down='images/button_down.png')

In our previous example, we have created the atlas containing both images and
put them in ``images/myatlas.atlas``. You can use url notation to reference
them::

    atlas://path/to/myatlas/id
    # will search for the ``path/to/myatlas.atlas`` and get the image ``id``

In our case, it would be::

    atlas://images/myatlas/button

.. note::

    In the atlas url, there is no need to add the ``.atlas`` extension. It will
    be automatically append to the filename.

Manual usage of the Atlas
-------------------------

::

    >>> from kivy.atlas import Atlas
    >>> atlas = Atlas('path/to/myatlas.atlas')
    >>> print(atlas.textures.keys())
    ['bubble', 'bubble-red', 'button', 'button-down']
    >>> print(atlas['button'])
    <kivy.graphics.texture.TextureRegion object at 0x2404d10>
'''

__all__ = ('Atlas', )

import json
from os.path import basename, dirname, join, splitext
from kivy.event import EventDispatcher
from kivy.logger import Logger
from kivy.properties import AliasProperty, DictProperty
import os


# late import to prevent recursion
CoreImage = None


class Atlas(EventDispatcher):
    '''Manage texture atlas. See module documentation for more information.
    '''

    textures = DictProperty({})
    '''List of available textures within the atlas.

    :attr:`textures` is a :class:`~kivy.properties.DictProperty` and defaults
    to {}.
    '''

    def _get_filename(self):
        return self._filename

    filename = AliasProperty(_get_filename, None)
    '''Filename of the current Atlas.

    :attr:`filename` is an :class:`~kivy.properties.AliasProperty` and defaults
    to None.
    '''

    def __init__(self, filename):
        self._filename = filename
        super(Atlas, self).__init__()
        self._load()

    def __getitem__(self, key):
        return self.textures[key]

    def _load(self):
        # late import to prevent recursive import.
        global CoreImage
        if CoreImage is None:
            from kivy.core.image import Image as CoreImage

        # must be a name finished by .atlas ?
        filename = self._filename
        assert(filename.endswith('.atlas'))
        filename = filename.replace('/', os.sep)

        Logger.debug('Atlas: Load <%s>' % filename)
        with open(filename, 'r') as fd:
            meta = json.load(fd)

        Logger.debug('Atlas: Need to load %d images' % len(meta))
        d = dirname(filename)
        textures = {}
        for subfilename, ids in meta.items():
            subfilename = join(d, subfilename)
            Logger.debug('Atlas: Load <%s>' % subfilename)

            # load the image
            ci = CoreImage(subfilename)

            # for all the uid, load the image, get the region, and put
            # it in our dict.
            for meta_id, meta_coords in ids.items():
                x, y, w, h = meta_coords
                textures[meta_id] = ci.texture.get_region(*meta_coords)

        self.textures = textures

    @staticmethod
    def create(outname, filenames, size, padding=2, use_path=False):
        '''This method can be used to create an atlas manually from a set of
        images.

        :Parameters:
            `outname`: str
                Basename to use for ``.atlas`` creation and ``-<idx>.png``
                associated images.
            `filenames`: list
                List of filenames to put in the atlas.
            `size`: int or list (width, height)
                Size of the atlas image.
            `padding`: int, defaults to 2
                Padding to put around each image.

                Be careful. If you're using a padding < 2, you might have
                issues with the borders of the images. Because of the OpenGL
                linearization, it might use the pixels of the adjacent image.

                If you're using a padding >= 2, we'll automatically generate a
                "border" of 1px around your image. If you look at
                the result, don't be scared if the image inside is not
                exactly the same as yours :).

            `use_path`: bool, defaults to False
                If True, the relative path of the source png
                file names will be included in the atlas ids rather
                that just in the file names. Leading dots and slashes will be
                excluded and all other slashes in the path will be replaced
                with underscores. For example, if `use_path` is False
                (the default) and the file name is
                ``../data/tiles/green_grass.png``, the id will be
                ``green_grass``. If `use_path` is True, it will be
                ``data_tiles_green_grass``.

            .. versionchanged:: 1.8.0
                Parameter use_path added
        '''
        # Thanks to
        # omnisaurusgames.com/2011/06/texture-atlas-generation-using-python/
        # for its initial implementation.
        try:
            from PIL import Image
        except ImportError:
            Logger.critical('Atlas: Imaging/PIL are missing')
            raise

        if isinstance(size, (tuple, list)):
            size_w, size_h = map(int, size)
        else:
            size_w = size_h = int(size)

        # open all of the images
        ims = list()
        for f in filenames:
            fp = open(f, 'rb')
            im = Image.open(fp)
            im.load()
            fp.close()
            ims.append((f, im))

        # sort by image area
        ims = sorted(ims, key=lambda im: im[1].size[0] * im[1].size[1],
                     reverse=True)

        # free boxes are empty space in our output image set
        # the freebox tuple format is: outidx, x, y, w, h
        freeboxes = [(0, 0, 0, size_w, size_h)]
        numoutimages = 1

        # full boxes are areas where we have placed images in the atlas
        # the full box tuple format is: image, outidx, x, y, w, h, filename
        fullboxes = []

        # do the actual atlasing by sticking the largest images we can
        # have into the smallest valid free boxes
        for imageinfo in ims:
            im = imageinfo[1]
            imw, imh = im.size
            imw += padding
            imh += padding
            if imw > size_w or imh > size_h:
                Logger.error(
                    'Atlas: image %s (%d by %d) is larger than the atlas size!'
                    % (imageinfo[0], imw, imh))
                return

            inserted = False
            while not inserted:
                for idx, fb in enumerate(freeboxes):
                    # find the smallest free box that will contain this image
                    if fb[3] >= imw and fb[4] >= imh:
                        # we found a valid spot! Remove the current
                        # freebox, and split the leftover space into (up to)
                        # two new freeboxes
                        del freeboxes[idx]
                        if fb[3] > imw:
                            freeboxes.append((
                                fb[0], fb[1] + imw, fb[2],
                                fb[3] - imw, imh))

                        if fb[4] > imh:
                            freeboxes.append((
                                fb[0], fb[1], fb[2] + imh,
                                fb[3], fb[4] - imh))

                        # keep this sorted!
                        freeboxes = sorted(freeboxes,
                                           key=lambda fb: fb[3] * fb[4])
                        fullboxes.append((im,
                                          fb[0], fb[1] + padding,
                                          fb[2] + padding, imw - padding,
                                          imh - padding, imageinfo[0]))
                        inserted = True
                        break

                if not inserted:
                    # oh crap - there isn't room in any of our free
                    # boxes, so we have to add a new output image
                    freeboxes.append((numoutimages, 0, 0, size_w, size_h))
                    numoutimages += 1

        # now that we've figured out where everything goes, make the output
        # images and blit the source images to the approriate locations
        Logger.info('Atlas: create an {0}x{1} rgba image'.format(size_w,
                                                                 size_h))
        outimages = [Image.new('RGBA', (size_w, size_h))
                     for i in range(0, int(numoutimages))]
        for fb in fullboxes:
            x, y = fb[2], fb[3]
            out = outimages[fb[1]]
            out.paste(fb[0], (fb[2], fb[3]))
            w, h = fb[0].size
            if padding > 1:
                out.paste(fb[0].crop((0, 0, w, 1)), (x, y - 1))
                out.paste(fb[0].crop((0, h - 1, w, h)), (x, y + h))
                out.paste(fb[0].crop((0, 0, 1, h)), (x - 1, y))
                out.paste(fb[0].crop((w - 1, 0, w, h)), (x + w, y))

        # save the output images
        for idx, outimage in enumerate(outimages):
            outimage.save('%s-%d.png' % (outname, idx))

        # write out an json file that says where everything ended up
        meta = {}
        for fb in fullboxes:
            fn = '%s-%d.png' % (basename(outname), fb[1])
            if fn not in meta:
                d = meta[fn] = {}
            else:
                d = meta[fn]

            # fb[6] contain the filename
            if use_path:
                # use the path with separators replaced by _
                # example '../data/tiles/green_grass.png' becomes
                # 'data_tiles_green_grass'
                uid = splitext(fb[6])[0]
                # remove leading dots and slashes
                uid = uid.lstrip('./\\')
                # replace remaining slashes with _
                uid = uid.replace('/', '_').replace('\\', '_')
            else:
                # for example, '../data/tiles/green_grass.png'
                # just get only 'green_grass' as the uniq id.
                uid = splitext(basename(fb[6]))[0]

            x, y, w, h = fb[2:6]
            d[uid] = x, size_h - y - h, w, h

        outfn = '%s.atlas' % outname
        with open(outfn, 'w') as fd:
            json.dump(meta, fd)

        return outfn, meta


if __name__ == '__main__':
    """ Main line program. Process command line arguments
    to make a new atlas. """

    import sys
    from glob import glob
    argv = sys.argv[1:]
    # earlier import of kivy has already called getopt to remove kivy system
    # arguments from this line. That is all arguments up to the first '--'
    if len(argv) < 3:
        print('Usage: python -m kivy.atlas [-- [--use-path] '
              '[--padding=2]] <outname> '
              '<size|512x256> <img1.png> [<img2.png>, ...]')
        sys.exit(1)

    options = {'use_path': False}
    while True:
        option = argv[0]
        if option == '--use-path':
            options['use_path'] = True
        elif option.startswith('--padding='):
            options['padding'] = int(option.split('=', 1)[-1])
        elif option[:2] == '--':
            print('Unknown option {}'.format(option))
            sys.exit(1)
        else:
            break
        argv = argv[1:]

    outname = argv[0]
    try:
        if 'x' in argv[1]:
            size = map(int, argv[1].split('x', 1))
        else:
            size = int(argv[1])
    except ValueError:
        print('Error: size must be an integer or <integer>x<integer>')
        sys.exit(1)

    filenames = [fname for fnames in argv[2:] for fname in glob(fnames)]
    ret = Atlas.create(outname, filenames, size, **options)
    if not ret:
        print('Error while creating atlas!')
        sys.exit(1)

    fn, meta = ret
    print('Atlas created at', fn)
    print('%d image%s been created' % (len(meta),
          's have' if len(meta) > 1 else ' has'))


================================================
FILE: tickeys/kivy/base.py
================================================
# pylint: disable=W0611
'''
Kivy Base
=========

This module contains core Kivy functionality and is not intended for end users.
Feel free to look though it, but calling any of these methods directly may well
result in unpredicatable behavior.

Event loop management
---------------------

'''

__all__ = (
    'EventLoop',
    'EventLoopBase',
    'ExceptionHandler',
    'ExceptionManagerBase',
    'ExceptionManager',
    'runTouchApp',
    'stopTouchApp',
)

import sys
from kivy.config import Config
from kivy.logger import Logger
from kivy.utils import platform
from kivy.clock import Clock
from kivy.event import EventDispatcher
from kivy.lang import Builder
from kivy.context import register_context

# private vars
EventLoop = None


class ExceptionHandler(object):
    '''Base handler that catches exceptions in :func:`runTouchApp`.
    You can subclass and extend it as follows::

        class E(ExceptionHandler):
            def handle_exception(self, inst):
                Logger.exception('Exception catched by ExceptionHandler')
                return ExceptionManager.PASS

        ExceptionManager.add_handler(E())

    All exceptions will be set to PASS, and logged to the console!
    '''

    def __init__(self):
        pass

    def handle_exception(self, exception):
        '''Handle one exception, defaults to returning
        ExceptionManager.STOP.
        '''
        return ExceptionManager.RAISE


class ExceptionManagerBase:
    '''ExceptionManager manages exceptions handlers.'''

    RAISE = 0
    PASS = 1

    def __init__(self):
        self.handlers = []
        self.policy = ExceptionManagerBase.RAISE

    def add_handler(self, cls):
        '''Add a new exception handler to the stack.'''
        if not cls in self.handlers:
            self.handlers.append(cls)

    def remove_handler(self, cls):
        '''Remove a exception handler from the stack.'''
        if cls in self.handlers:
            self.handlers.remove(cls)

    def handle_exception(self, inst):
        '''Called when an exception occured in the runTouchApp() main loop.'''
        ret = self.policy
        for handler in self.handlers:
            r = handler.handle_exception(inst)
            if r == ExceptionManagerBase.PASS:
                ret = r
        return ret

#: Instance of a :class:`ExceptionManagerBase` implementation.
ExceptionManager = register_context('ExceptionManager', ExceptionManagerBase)


class EventLoopBase(EventDispatcher):
    '''Main event loop. This loop handles the updating of input and
    dispatching events.
    '''

    __events__ = ('on_start', 'on_pause', 'on_stop')

    def __init__(self):
        super(EventLoopBase, self).__init__()
        self.quit = False
        self.input_events = []
        self.postproc_modules = []
        self.status = 'idle'
        self.input_providers = []
        self.input_providers_autoremove = []
        self.event_listeners = []
        self.window = None
        self.me_list = []

    @property
    def touches(self):
        '''Return the list of all touches currently in down or move states.
        '''
        return self.me_list

    def ensure_window(self):
        '''Ensure that we have a window.
        '''
        import kivy.core.window  # NOQA
        if not self.window:
            Logger.critical('App: Unable to get a Window, abort.')
            sys.exit(1)

    def set_window(self, window):
        '''Set the window used for the event loop.
        '''
        self.window = window

    def add_input_provider(self, provider, auto_remove=False):
        '''Add a new input provider to listen for touch events.
        '''
        if provider not in self.input_providers:
            self.input_providers.append(provider)
            if auto_remove:
                self.input_providers_autoremove.append(provider)

    def remove_input_provider(self, provider):
        '''Remove an input provider.
        '''
        if provider in self.input_providers:
            self.input_providers.remove(provider)

    def add_event_listener(self, listener):
        '''Add a new event listener for getting touch events.
        '''
        if not listener in self.event_listeners:
            self.event_listeners.append(listener)

    def remove_event_listener(self, listener):
        '''Remove an event listener from the list.
        '''
        if listener in self.event_listeners:
            self.event_listeners.remove(listener)

    def start(self):
        '''Must be called only once before run().
        This starts all configured input providers.'''
        self.status = 'started'
        self.quit = False
        for provider in self.input_providers:
            provider.start()
        self.dispatch('on_start')

    def close(self):
        '''Exit from the main loop and stop all configured
        input providers.'''
        self.quit = True
        self.stop()
        self.status = 'closed'

    def stop(self):
        '''Stop all input providers and call callbacks registered using
        EventLoop.add_stop_callback().'''

        # XXX stop in reverse order that we started them!! (like push
        # pop), very important because e.g. wm_touch and WM_PEN both
        # store old window proc and the restore, if order is messed big
        # problem happens, crashing badly without error
        for provider in reversed(self.input_providers[:]):
            provider.stop()
            if provider in self.input_providers_autoremove:
                self.input_providers_autoremove.remove(provider)
                self.input_providers.remove(provider)

        # ensure any restart will not break anything later.
        self.input_events = []

        self.status = 'stopped'
        self.dispatch('on_stop')

    def add_postproc_module(self, mod):
        '''Add a postproc input module (DoubleTap, TripleTap, DeJitter
        RetainTouch are defaults).'''
        if mod not in self.postproc_modules:
            self.postproc_modules.append(mod)

    def remove_postproc_module(self, mod):
        '''Remove a postproc module.'''
        if mod in self.postproc_modules:
            self.postproc_modules.remove(mod)

    def post_dispatch_input(self, etype, me):
        '''This function is called by dispatch_input() when we want to dispatch
        an input event. The event is dispatched to all listeners and if
        grabbed, it's dispatched to grabbed widgets.
        '''
        # update available list
        if etype == 'begin':
            self.me_list.append(me)
        elif etype == 'end':
            if me in self.me_list:
                self.me_list.remove(me)

        # dispatch to listeners
        if not me.grab_exclusive_class:
            for listener in self.event_listeners:
                listener.dispatch('on_motion', etype, me)

        # dispatch grabbed touch
        me.grab_state = True
        for _wid in me.grab_list[:]:

            # it's a weakref, call it!
            wid = _wid()
            if wid is None:
                # object is gone, stop.
                me.grab_list.remove(_wid)
                continue

            root_window = wid.get_root_window()
            if wid != root_window and root_window is not None:
                me.push()
                w, h = root_window.system_size
                if platform == 'ios':
                    w, h = root_window.size
                kheight = root_window.keyboard_height
                smode = root_window.softinput_mode
                me.scale_for_screen(w, h, rotation=root_window.rotation,
                                    smode=smode, kheight=kheight)
                parent = wid.parent
                # and do to_local until the widget
                try:
                    if parent:
                        me.apply_transform_2d(parent.to_widget)
                    else:
                        me.apply_transform_2d(wid.to_widget)
                        me.apply_transform_2d(wid.to_parent)
                except AttributeError:
                    # when using inner window, an app have grab the touch
                    # but app is removed. the touch can't access
                    # to one of the parent. (i.e, self.parent will be None)
                    # and BAM the bug happen.
                    me.pop()
                    continue

            me.grab_current = wid

            wid._context.push()

            if etype == 'begin':
                # don't dispatch again touch in on_touch_down
                # a down event are nearly uniq here.
                # wid.dispatch('on_touch_down', touch)
                pass
            elif etype == 'update':
                if wid._context.sandbox:
                    with wid._context.sandbox:
                        wid.dispatch('on_touch_move', me)
                else:
                    wid.dispatch('on_touch_move', me)

            elif etype == 'end':
                if wid._context.sandbox:
                    with wid._context.sandbox:
                        wid.dispatch('on_touch_up', me)
                else:
                    wid.dispatch('on_touch_up', me)

            wid._context.pop()

            me.grab_current = None

            if wid != root_window and root_window is not None:
                me.pop()
        me.grab_state = False

    def _dispatch_input(self, *ev):
        # remove the save event for the touch if exist
        if ev in self.input_events:
            self.input_events.remove(ev)
        self.input_events.append(ev)

    def dispatch_input(self):
        '''Called by idle() to read events from input providers, pass events to
        postproc, and dispatch final events.
        '''

        # first, aquire input events
        for provider in self.input_providers:
            provider.update(dispatch_fn=self._dispatch_input)

        # execute post-processing modules
        for mod in self.postproc_modules:
            self.input_events = mod.process(events=self.input_events)

        # real dispatch input
        input_events = self.input_events
        pop = input_events.pop
        post_dispatch_input = self.post_dispatch_input
        while input_events:
            post_dispatch_input(*pop(0))

    def idle(self):
        '''This function is called after every frame. By default:

           * it "ticks" the clock to the next frame.
           * it reads all input and dispatches events.
           * it dispatches `on_update`, `on_draw` and `on_flip` events to the
             window.
        '''

        # update dt
        Clock.tick()

        # read and dispatch input from providers
        self.dispatch_input()

        # flush all the canvas operation
        Builder.sync()

        # tick before draw
        Clock.tick_draw()

        # flush all the canvas operation
        Builder.sync()

        window = self.window
        if window and window.canvas.needs_redraw:
            window.dispatch('on_draw')
            window.dispatch('on_flip')

        # don't loop if we don't have listeners !
        if len(self.event_listeners) == 0:
            Logger.error('Base: No event listeners have been created')
            Logger.error('Base: Application will leave')
            self.exit()
            return False

        return self.quit

    def run(self):
        '''Main loop'''
        while not self.quit:
            self.idle()
        self.exit()

    def exit(self):
        '''Close the main loop and close the window.'''
        self.close()
        if self.window:
            self.window.close()

    def on_stop(self):
        '''Event handler for `on_stop` events which will be fired right
        after all input providers have been stopped.'''
        pass

    def on_pause(self):
        '''Event handler for `on_pause` which will be fired when
        the event loop is paused.'''
        pass

    def on_start(self):
        '''Event handler for `on_start` which will be fired right
        after all input providers have been started.'''
        pass

#: EventLoop instance
EventLoop = EventLoopBase()


def _run_mainloop():
    '''If no window has been created, this will be the executed mainloop.'''
    while True:
        try:
            EventLoop.run()
            stopTouchApp()
            break
        except BaseException as inst:
            # use exception manager first
            r = ExceptionManager.handle_exception(inst)
            if r == ExceptionManager.RAISE:
                stopTouchApp()
                raise
            else:
                pass


def runTouchApp(widget=None, slave=False):
    '''Static main function that starts the application loop.
    You can access some magic via the following arguments:

    :Parameters:
        `<empty>`
            To make dispatching work, you need at least one
            input listener. If not, application will leave.
            (MTWindow act as an input listener)

        `widget`
            If you pass only a widget, a MTWindow will be created
            and your widget will be added to the window as the root
            widget.

        `slave`
            No event dispatching is done. This will be your job.

        `widget + slave`
            No event dispatching is done. This will be your job but
            we try to get the window (must be created by you beforehand)
            and add the widget to it. Very usefull for embedding Kivy
            in another toolkit. (like Qt, check kivy-designed)

    '''

    from kivy.input import MotionEventFactory, kivy_postproc_modules

    # Ok, we got one widget, and we are not in slave mode
    # so, user don't create the window, let's create it for him !
    if widget:
        EventLoop.ensure_window()

    # Instance all configured input
    for key, value in Config.items('input'):
        Logger.debug('Base: Create provider from %s' % (str(value)))

        # split value
        args = str(value).split(',', 1)
        if len(args) == 1:
            args.append('')
        provider_id, args = args
        provider = MotionEventFactory.get(provider_id)
        if provider is None:
            Logger.warning('Base: Unknown <%s> provider' % str(provider_id))
            continue

        # create provider
        p = provider(key, args)
        if p:
            EventLoop.add_input_provider(p, True)

    # add postproc modules
    for mod in list(kivy_postproc_modules.values()):
        EventLoop.add_postproc_module(mod)

    # add main widget
    if widget and EventLoop.window:
        if widget not in EventLoop.window.children:
            EventLoop.window.add_widget(widget)

    # start event loop
    Logger.info('Base: Start application main loop')
    EventLoop.start()

    # we are in a slave mode, don't do dispatching.
    if slave:
        return

    # in non-slave mode, they are 2 issues
    #
    # 1. if user created a window, call the mainloop from window.
    #    This is due to glut, it need to be called with
    #    glutMainLoop(). Only FreeGLUT got a gluMainLoopEvent().
    #    So, we are executing the dispatching function inside
    #    a redisplay event.
    #
    # 2. if no window is created, we are dispatching event lopp
    #    ourself (previous behavior.)
    #
    try:
        if EventLoop.window is None:
            _run_mainloop()
        else:
            EventLoop.window.mainloop()
    finally:
        stopTouchApp()


def stopTouchApp():
    '''Stop the current application by leaving the main loop'''
    if EventLoop is None:
        return
    if EventLoop.status != 'started':
        return
    Logger.info('Base: Leaving application in progress...')
    EventLoop.close()


================================================
FILE: tickeys/kivy/cache.py
================================================
'''
Cache manager
=============

The cache manager can be used to store python objects attached to a unique
key. The cache can be controlled in two ways: with a object limit or a
timeout.

For example, we can create a new cache with a limit of 10 objects and a
timeout of 5 seconds::

    # register a new Cache
    Cache.register('mycache', limit=10, timeout=5)

    # create an object + id
    key = 'objectid'
    instance = Label(text=text)
    Cache.append('mycache', key, instance)

    # retrieve the cached object
    instance = Cache.get('mycache', key)

If the instance is NULL, the cache may have trashed it because you've
not used the label for 5 seconds and you've reach the limit.
'''

__all__ = ('Cache', )

from os import environ
from kivy.logger import Logger
from kivy.clock import Clock


class Cache(object):
    '''See module documentation for more information.
    '''

    _categories = {}
    _objects = {}

    @staticmethod
    def register(category, limit=None, timeout=None):
        '''Register a new category in the cache with the specified limit.

        :Parameters:
            `category` : str
                Identifier of the category.
            `limit` : int (optional)
                Maximum number of objects allowed in the cache.
                If None, no limit is applied.
            `timeout` : double (optional)
                Time after which to delete the object if it has not been used.
                If None, no timeout is applied.
        '''
        Cache._categories[category] = {
            'limit': limit,
            'timeout': timeout}
        Cache._objects[category] = {}
        Logger.debug(
            'Cache: register <%s> with limit=%s, timeout=%s' %
            (category, str(limit), str(timeout)))

    @staticmethod
    def append(category, key, obj, timeout=None):
        '''Add a new object to the cache.

        :Parameters:
            `category` : str
                Identifier of the category.
            `key` : str
                Unique identifier of the object to store.
            `obj` : object
                Object to store in cache.
            `timeout` : double (optional)
                Time after which to delete the object if it has not been used.
                If None, no timeout is applied.
        '''
        #check whether obj should not be cached first
        if getattr(obj, '_no_cache', False):
            return
        try:
            cat = Cache._categories[category]
        except KeyError:
            Logger.warning('Cache: category <%s> not exist' % category)
            return
        timeout = timeout or cat['timeout']
        # FIXME: activate purge when limit is hit
        #limit = cat['limit']
        #if limit is not None and len(Cache._objects[category]) >= limit:
        #    Cache._purge_oldest(category)
        Cache._objects[category][key] = {
            'object': obj,
            'timeout': timeout,
            'lastaccess': Clock.get_time(),
            'timestamp': Clock.get_time()}

    @staticmethod
    def get(category, key, default=None):
        '''Get a object from the cache.

        :Parameters:
            `category` : str
                Identifier of the category.
            `key` : str
                Unique identifier of the object in the store.
            `default` : anything, defaults to None
                Default value to be returned if the key is not found.
        '''
        try:
            Cache._objects[category][key]['lastaccess'] = Clock.get_time()
            return Cache._objects[category][key]['object']
        except Exception:
            return default

    @staticmethod
    def get_timestamp(category, key, default=None):
        '''Get the object timestamp in the cache.

        :Parameters:
            `category` : str
                Identifier of the category.
            `key` : str
                Unique identifier of the object in the store.
            `default` : anything, defaults to None
                Default value to be returned if the key is not found.
        '''
        try:
            return Cache._objects[category][key]['timestamp']
        except Exception:
            return default

    @staticmethod
    def get_lastaccess(category, key, default=None):
        '''Get the objects last access time in the cache.

        :Parameters:
            `category` : str
                Identifier of the category.
            `key` : str
                Unique identifier of the object in the store.
            `default` : anything, defaults to None
                Default value to be returned if the key is not found.
        '''
        try:
            return Cache._objects[category][key]['lastaccess']
        except Exception:
            return default

    @staticmethod
    def remove(category, key=None):
        '''Purge the cache.

        :Parameters:
            `category` : str
                Identifier of the category.
            `key` : str (optional)
                Unique identifier of the object in the store. If this
                arguement is not supplied, the entire category will be purged.
        '''
        try:
            if key is not None:
                del Cache._objects[category][key]
            else:
                Cache._objects[category] = {}
        except Exception:
            pass

    @staticmethod
    def _purge_oldest(category, maxpurge=1):
        print('PURGE', category)
        import heapq
        heap_list = []
        for key in Cache._objects[category]:
            obj = Cache._objects[category][key]
            if obj['lastaccess'] == obj['timestamp']:
                continue
            heapq.heappush(heap_list, (obj['lastaccess'], key))
            print('<<<', obj['lastaccess'])
        n = 0
        while n < maxpurge:
            try:
                lastaccess, key = heapq.heappop(heap_list)
                print('=>', key, lastaccess, Clock.get_time())
            except Exception:
                return
            del Cache._objects[category][key]

    @staticmethod
    def _purge_by_timeout(dt):
        curtime = Clock.get_time()

        for category in Cache._objects:
            if category not in Cache._categories:
                continue
            timeout = Cache._categories[category]['timeout']
            if timeout is not None and dt > timeout:
                # XXX got a lag ! that may be because the frame take lot of
                # time to draw. and the timeout is not adapted to the current
                # framerate. So, increase the timeout by two.
                # ie: if the timeout is 1 sec, and framerate go to 0.7, newly
                # object added will be automaticly trashed.
                timeout *= 2
                Cache._categories[category]['timeout'] = timeout
                continue

            for key in list(Cache._objects[category].keys())[:]:
                lastaccess = Cache._objects[category][key]['lastaccess']
                objtimeout = Cache._objects[category][key]['timeout']

                # take the object timeout if available
                if objtimeout is not None:
                    timeout = objtimeout

                # no timeout, cancel
                if timeout is None:
                    continue

                if curtime - lastaccess > timeout:
                    del Cache._objects[category][key]

    @staticmethod
    def print_usage():
        '''Print the cache usage to the console.'''
        print('Cache usage :')
        for category in Cache._categories:
            print(' * %s : %d / %s, timeout=%s' % (
                category.capitalize(),
                len(Cache._objects[category]),
                str(Cache._categories[category]['limit']),
                str(Cache._categories[category]['timeout'])))

if 'KIVY_DOC_INCLUDE' not in environ:
    # install the schedule clock for purging
    Clock.schedule_interval(Cache._purge_by_timeout, 1)


================================================
FILE: tickeys/kivy/clock.py
================================================
'''
Clock object
============

The :class:`Clock` object allows you to schedule a function call in the
future; once or repeatedly at specified intervals. You can get the time
elapsed between the scheduling and the calling of the callback via the
`dt` argument::

    # dt means delta-time
    def my_callback(dt):
        pass

    # call my_callback every 0.5 seconds
    Clock.schedule_interval(my_callback, 0.5)

    # call my_callback in 5 seconds
    Clock.schedule_once(my_callback, 5)

    # call my_callback as soon as possible (usually next frame.)
    Clock.schedule_once(my_callback)

.. note::

    If the callback returns False, the schedule will be removed.

If you want to schedule a function to call with default arguments, you can use
the `functools.partial
<http://docs.python.org/library/functools.html#functools.partial>`_ python
module::

    from functools import partial

    def my_callback(value, key, *largs):
        pass

    Clock.schedule_interval(partial(my_callback, 'my value', 'my key'), 0.5)

Conversely, if you want to schedule a function that doesn't accept the dt
argument, you can use a `lambda
<http://docs.python.org/2/reference/expressions.html#lambda>`_ expression
to write a short function that does accept dt. For Example::

    def no_args_func():
        print("I accept no arguments, so don't schedule me in the clock")

    Clock.schedule_once(lambda dt: no_args_func(), 0.5)

.. note::

    You cannot unschedule an anonymous function unless you keep a
    reference to it. It's better to add \*args to your function
    definition so that it can be called with an arbitrary number of
    parameters.
Download .txt
gitextract_b93_15po/

├── .gitignore
├── AUTHOURS
├── Changelog
├── LICENSE
├── MANIFEST.in
├── README.md
├── README_en_US.md
├── README_zh_CN.md
├── build.sh
├── build32.sh
├── deb.sh
├── deb32.sh
├── setup.py
└── tickeys/
    ├── CLI.py
    ├── GUI.py
    ├── Resources/
    │   └── data/
    │       ├── bubble/
    │       │   └── license.txt
    │       ├── drum/
    │       │   └── _readme_and_license.txt
    │       ├── mechanical/
    │       │   └── license.txt
    │       └── schemes.json
    ├── __init__.py
    ├── build.py
    ├── config.py
    ├── keyboardHandler.py
    ├── kivy/
    │   ├── __init__.py
    │   ├── _event.pxd
    │   ├── adapters/
    │   │   ├── __init__.py
    │   │   ├── adapter.py
    │   │   ├── args_converters.py
    │   │   ├── dictadapter.py
    │   │   ├── listadapter.py
    │   │   ├── models.py
    │   │   └── simplelistadapter.py
    │   ├── animation.py
    │   ├── app.py
    │   ├── atlas.py
    │   ├── base.py
    │   ├── cache.py
    │   ├── clock.py
    │   ├── compat.py
    │   ├── config.py
    │   ├── context.py
    │   ├── core/
    │   │   ├── __init__.py
    │   │   ├── audio/
    │   │   │   ├── __init__.py
    │   │   │   ├── audio_ffpyplayer.py
    │   │   │   ├── audio_gi.py
    │   │   │   ├── audio_gstplayer.py
    │   │   │   ├── audio_pygame.py
    │   │   │   └── audio_pygst.py
    │   │   ├── camera/
    │   │   │   ├── __init__.py
    │   │   │   ├── camera_gi.py
    │   │   │   ├── camera_opencv.py
    │   │   │   ├── camera_pygst.py
    │   │   │   └── camera_videocapture.py
    │   │   ├── clipboard/
    │   │   │   ├── __init__.py
    │   │   │   ├── clipboard_android.py
    │   │   │   ├── clipboard_dbusklipper.py
    │   │   │   ├── clipboard_dummy.py
    │   │   │   ├── clipboard_gtk3.py
    │   │   │   ├── clipboard_nspaste.py
    │   │   │   ├── clipboard_pygame.py
    │   │   │   ├── clipboard_sdl2.py
    │   │   │   ├── clipboard_winctypes.py
    │   │   │   └── clipboard_xsel.py
    │   │   ├── gl/
    │   │   │   └── __init__.py
    │   │   ├── image/
    │   │   │   ├── __init__.py
    │   │   │   ├── img_dds.py
    │   │   │   ├── img_ffpyplayer.py
    │   │   │   ├── img_gif.py
    │   │   │   ├── img_pil.py
    │   │   │   ├── img_pygame.py
    │   │   │   ├── img_sdl2.py
    │   │   │   └── img_tex.py
    │   │   ├── spelling/
    │   │   │   ├── __init__.py
    │   │   │   ├── spelling_enchant.py
    │   │   │   └── spelling_osxappkit.py
    │   │   ├── text/
    │   │   │   ├── __init__.py
    │   │   │   ├── markup.py
    │   │   │   ├── text_layout.pxd
    │   │   │   ├── text_pil.py
    │   │   │   ├── text_pygame.py
    │   │   │   └── text_sdl2.py
    │   │   ├── video/
    │   │   │   ├── __init__.py
    │   │   │   ├── video_ffmpeg.py
    │   │   │   ├── video_ffpyplayer.py
    │   │   │   ├── video_gi.py
    │   │   │   ├── video_gstplayer.py
    │   │   │   ├── video_null.py
    │   │   │   ├── video_pyglet.py
    │   │   │   └── video_pygst.py
    │   │   └── window/
    │   │       ├── __init__.py
    │   │       ├── window_egl_rpi.py
    │   │       ├── window_pygame.py
    │   │       └── window_sdl2.py
    │   ├── data/
    │   │   ├── glsl/
    │   │   │   ├── default.fs
    │   │   │   ├── default.vs
    │   │   │   ├── header.fs
    │   │   │   └── header.vs
    │   │   ├── images/
    │   │   │   └── defaulttheme.atlas
    │   │   ├── keyboards/
    │   │   │   ├── azerty.json
    │   │   │   ├── de_CH.json
    │   │   │   ├── en_US.json
    │   │   │   ├── fr_CH.json
    │   │   │   ├── qwerty.json
    │   │   │   └── qwertz.json
    │   │   ├── settings_kivy.json
    │   │   └── style.kv
    │   ├── effects/
    │   │   ├── __init__.py
    │   │   ├── dampedscroll.py
    │   │   ├── kinetic.py
    │   │   ├── opacityscroll.py
    │   │   └── scroll.py
    │   ├── event.py
    │   ├── ext/
    │   │   └── __init__.py
    │   ├── extras/
    │   │   ├── __init__.py
    │   │   └── highlight.py
    │   ├── factory.py
    │   ├── factory_registers.py
    │   ├── garden/
    │   │   └── __init__.py
    │   ├── geometry.py
    │   ├── gesture.py
    │   ├── graphics/
    │   │   ├── __init__.py
    │   │   ├── buffer.pxd
    │   │   ├── c_opengl.pxd
    │   │   ├── c_opengl_debug.pxd
    │   │   ├── common.pxi
    │   │   ├── compiler.pxd
    │   │   ├── config.h
    │   │   ├── config.pxi
    │   │   ├── context.pxd
    │   │   ├── context_instructions.pxd
    │   │   ├── fbo.pxd
    │   │   ├── img_tools.pxi
    │   │   ├── instructions.pxd
    │   │   ├── opcodes.pxi
    │   │   ├── opengl_utils.pxd
    │   │   ├── opengl_utils_def.pxi
    │   │   ├── shader.pxd
    │   │   ├── stencil_instructions.pxd
    │   │   ├── svg.pxd
    │   │   ├── tesselator.pxd
    │   │   ├── texture.pxd
    │   │   ├── transformation.pxd
    │   │   ├── vbo.pxd
    │   │   ├── vertex.pxd
    │   │   ├── vertex_instructions.pxd
    │   │   └── vertex_instructions_line.pxi
    │   ├── input/
    │   │   ├── __init__.py
    │   │   ├── factory.py
    │   │   ├── motionevent.py
    │   │   ├── postproc/
    │   │   │   ├── __init__.py
    │   │   │   ├── calibration.py
    │   │   │   ├── dejitter.py
    │   │   │   ├── doubletap.py
    │   │   │   ├── ignorelist.py
    │   │   │   ├── retaintouch.py
    │   │   │   └── tripletap.py
    │   │   ├── provider.py
    │   │   ├── providers/
    │   │   │   ├── __init__.py
    │   │   │   ├── androidjoystick.py
    │   │   │   ├── hidinput.py
    │   │   │   ├── leapfinger.py
    │   │   │   ├── linuxwacom.py
    │   │   │   ├── mactouch.py
    │   │   │   ├── mouse.py
    │   │   │   ├── mtdev.py
    │   │   │   ├── probesysfs.py
    │   │   │   ├── tuio.py
    │   │   │   ├── wm_common.py
    │   │   │   ├── wm_pen.py
    │   │   │   └── wm_touch.py
    │   │   ├── recorder.py
    │   │   └── shape.py
    │   ├── interactive.py
    │   ├── lang.py
    │   ├── loader.py
    │   ├── logger.py
    │   ├── metrics.py
    │   ├── modules/
    │   │   ├── __init__.py
    │   │   ├── _webdebugger.py
    │   │   ├── inspector.py
    │   │   ├── keybinding.py
    │   │   ├── monitor.py
    │   │   ├── recorder.py
    │   │   ├── screen.py
    │   │   ├── touchring.py
    │   │   └── webdebugger.py
    │   ├── multistroke.py
    │   ├── network/
    │   │   ├── __init__.py
    │   │   └── urlrequest.py
    │   ├── parser.py
    │   ├── properties.pxd
    │   ├── resources.py
    │   ├── setupconfig.py
    │   ├── storage/
    │   │   ├── __init__.py
    │   │   ├── dictstore.py
    │   │   ├── jsonstore.py
    │   │   └── redisstore.py
    │   ├── support.py
    │   ├── tools/
    │   │   ├── __init__.py
    │   │   ├── benchmark.py
    │   │   ├── extensions/
    │   │   │   ├── __init__.py
    │   │   │   └── make-kivyext.py
    │   │   ├── generate-icons.py
    │   │   ├── highlight/
    │   │   │   ├── __init__.py
    │   │   │   ├── kivy-mode.el
    │   │   │   └── kivy.vim
    │   │   ├── packaging/
    │   │   │   ├── README.txt
    │   │   │   ├── __init__.py
    │   │   │   ├── factory.py
    │   │   │   ├── osx/
    │   │   │   │   ├── Info.plist
    │   │   │   │   ├── InfoPlist.strings
    │   │   │   │   └── kivy.sh
    │   │   │   ├── pyinstaller_hooks/
    │   │   │   │   ├── __init__.py
    │   │   │   │   ├── hook-kivy.py
    │   │   │   │   └── rt-hook-kivy.py
    │   │   │   └── win32/
    │   │   │       └── README.txt
    │   │   ├── report.py
    │   │   ├── stub-gl-debug.py
    │   │   └── texturecompress.py
    │   ├── uix/
    │   │   ├── __init__.py
    │   │   ├── abstractview.py
    │   │   ├── accordion.py
    │   │   ├── actionbar.py
    │   │   ├── anchorlayout.py
    │   │   ├── behaviors.py
    │   │   ├── boxlayout.py
    │   │   ├── bubble.py
    │   │   ├── button.py
    │   │   ├── camera.py
    │   │   ├── carousel.py
    │   │   ├── checkbox.py
    │   │   ├── codeinput.py
    │   │   ├── colorpicker.py
    │   │   ├── dropdown.py
    │   │   ├── effectwidget.py
    │   │   ├── filechooser.py
    │   │   ├── floatlayout.py
    │   │   ├── gesturesurface.py
    │   │   ├── gridlayout.py
    │   │   ├── image.py
    │   │   ├── label.py
    │   │   ├── layout.py
    │   │   ├── listview.py
    │   │   ├── modalview.py
    │   │   ├── pagelayout.py
    │   │   ├── popup.py
    │   │   ├── progressbar.py
    │   │   ├── relativelayout.py
    │   │   ├── rst.py
    │   │   ├── sandbox.py
    │   │   ├── scatter.py
    │   │   ├── scatterlayout.py
    │   │   ├── screenmanager.py
    │   │   ├── scrollview.py
    │   │   ├── selectableview.py
    │   │   ├── settings.py
    │   │   ├── slider.py
    │   │   ├── spinner.py
    │   │   ├── splitter.py
    │   │   ├── stacklayout.py
    │   │   ├── stencilview.py
    │   │   ├── switch.py
    │   │   ├── tabbedpanel.py
    │   │   ├── textinput.py
    │   │   ├── togglebutton.py
    │   │   ├── treeview.py
    │   │   ├── video.py
    │   │   ├── videoplayer.py
    │   │   ├── vkeyboard.py
    │   │   └── widget.py
    │   ├── utils.py
    │   ├── vector.py
    │   └── weakmethod.py
    ├── kivy_32/
    │   └── kivy/
    │       ├── __init__.py
    │       ├── _event.pxd
    │       ├── adapters/
    │       │   ├── __init__.py
    │       │   ├── adapter.py
    │       │   ├── args_converters.py
    │       │   ├── dictadapter.py
    │       │   ├── listadapter.py
    │       │   ├── models.py
    │       │   └── simplelistadapter.py
    │       ├── animation.py
    │       ├── app.py
    │       ├── atlas.py
    │       ├── base.py
    │       ├── cache.py
    │       ├── clock.py
    │       ├── compat.py
    │       ├── config.py
    │       ├── context.py
    │       ├── core/
    │       │   ├── __init__.py
    │       │   ├── audio/
    │       │   │   ├── __init__.py
    │       │   │   ├── audio_ffpyplayer.py
    │       │   │   ├── audio_gi.py
    │       │   │   ├── audio_gstplayer.py
    │       │   │   ├── audio_pygame.py
    │       │   │   └── audio_pygst.py
    │       │   ├── camera/
    │       │   │   ├── __init__.py
    │       │   │   ├── camera_gi.py
    │       │   │   ├── camera_opencv.py
    │       │   │   ├── camera_pygst.py
    │       │   │   └── camera_videocapture.py
    │       │   ├── clipboard/
    │       │   │   ├── __init__.py
    │       │   │   ├── clipboard_android.py
    │       │   │   ├── clipboard_dbusklipper.py
    │       │   │   ├── clipboard_dummy.py
    │       │   │   ├── clipboard_gtk3.py
    │       │   │   ├── clipboard_nspaste.py
    │       │   │   ├── clipboard_pygame.py
    │       │   │   ├── clipboard_sdl2.py
    │       │   │   ├── clipboard_winctypes.py
    │       │   │   └── clipboard_xsel.py
    │       │   ├── gl/
    │       │   │   └── __init__.py
    │       │   ├── image/
    │       │   │   ├── __init__.py
    │       │   │   ├── img_dds.py
    │       │   │   ├── img_ffpyplayer.py
    │       │   │   ├── img_gif.py
    │       │   │   ├── img_pil.py
    │       │   │   ├── img_pygame.py
    │       │   │   ├── img_sdl2.py
    │       │   │   └── img_tex.py
    │       │   ├── spelling/
    │       │   │   ├── __init__.py
    │       │   │   ├── spelling_enchant.py
    │       │   │   └── spelling_osxappkit.py
    │       │   ├── text/
    │       │   │   ├── __init__.py
    │       │   │   ├── markup.py
    │       │   │   ├── text_layout.pxd
    │       │   │   ├── text_pil.py
    │       │   │   ├── text_pygame.py
    │       │   │   └── text_sdl2.py
    │       │   ├── video/
    │       │   │   ├── __init__.py
    │       │   │   ├── video_ffmpeg.py
    │       │   │   ├── video_ffpyplayer.py
    │       │   │   ├── video_gi.py
    │       │   │   ├── video_gstplayer.py
    │       │   │   ├── video_null.py
    │       │   │   ├── video_pyglet.py
    │       │   │   └── video_pygst.py
    │       │   └── window/
    │       │       ├── __init__.py
    │       │       ├── window_egl_rpi.py
    │       │       ├── window_pygame.py
    │       │       └── window_sdl2.py
    │       ├── data/
    │       │   ├── glsl/
    │       │   │   ├── default.fs
    │       │   │   ├── default.vs
    │       │   │   ├── header.fs
    │       │   │   └── header.vs
    │       │   ├── images/
    │       │   │   └── defaulttheme.atlas
    │       │   ├── keyboards/
    │       │   │   ├── azerty.json
    │       │   │   ├── de_CH.json
    │       │   │   ├── en_US.json
    │       │   │   ├── fr_CH.json
    │       │   │   ├── qwerty.json
    │       │   │   └── qwertz.json
    │       │   ├── settings_kivy.json
    │       │   └── style.kv
    │       ├── effects/
    │       │   ├── __init__.py
    │       │   ├── dampedscroll.py
    │       │   ├── kinetic.py
    │       │   ├── opacityscroll.py
    │       │   └── scroll.py
    │       ├── event.py
    │       ├── ext/
    │       │   └── __init__.py
    │       ├── extras/
    │       │   ├── __init__.py
    │       │   └── highlight.py
    │       ├── factory.py
    │       ├── factory_registers.py
    │       ├── garden/
    │       │   └── __init__.py
    │       ├── geometry.py
    │       ├── gesture.py
    │       ├── graphics/
    │       │   ├── __init__.py
    │       │   ├── buffer.pxd
    │       │   ├── c_opengl.pxd
    │       │   ├── c_opengl_debug.pxd
    │       │   ├── common.pxi
    │       │   ├── compiler.pxd
    │       │   ├── config.h
    │       │   ├── config.pxi
    │       │   ├── context.pxd
    │       │   ├── context_instructions.pxd
    │       │   ├── fbo.pxd
    │       │   ├── img_tools.pxi
    │       │   ├── instructions.pxd
    │       │   ├── opcodes.pxi
    │       │   ├── opengl_utils.pxd
    │       │   ├── opengl_utils_def.pxi
    │       │   ├── shader.pxd
    │       │   ├── stencil_instructions.pxd
    │       │   ├── svg.pxd
    │       │   ├── tesselator.pxd
    │       │   ├── texture.pxd
    │       │   ├── transformation.pxd
    │       │   ├── vbo.pxd
    │       │   ├── vertex.pxd
    │       │   ├── vertex_instructions.pxd
    │       │   └── vertex_instructions_line.pxi
    │       ├── input/
    │       │   ├── __init__.py
    │       │   ├── factory.py
    │       │   ├── motionevent.py
    │       │   ├── postproc/
    │       │   │   ├── __init__.py
    │       │   │   ├── calibration.py
    │       │   │   ├── dejitter.py
    │       │   │   ├── doubletap.py
    │       │   │   ├── ignorelist.py
    │       │   │   ├── retaintouch.py
    │       │   │   └── tripletap.py
    │       │   ├── provider.py
    │       │   ├── providers/
    │       │   │   ├── __init__.py
    │       │   │   ├── androidjoystick.py
    │       │   │   ├── hidinput.py
    │       │   │   ├── leapfinger.py
    │       │   │   ├── linuxwacom.py
    │       │   │   ├── mactouch.py
    │       │   │   ├── mouse.py
    │       │   │   ├── mtdev.py
    │       │   │   ├── probesysfs.py
    │       │   │   ├── tuio.py
    │       │   │   ├── wm_common.py
    │       │   │   ├── wm_pen.py
    │       │   │   └── wm_touch.py
    │       │   ├── recorder.py
    │       │   └── shape.py
    │       ├── interactive.py
    │       ├── lang.py
    │       ├── loader.py
    │       ├── logger.py
    │       ├── metrics.py
    │       ├── modules/
    │       │   ├── __init__.py
    │       │   ├── _webdebugger.py
    │       │   ├── inspector.py
    │       │   ├── keybinding.py
    │       │   ├── monitor.py
    │       │   ├── recorder.py
    │       │   ├── screen.py
    │       │   ├── touchring.py
    │       │   └── webdebugger.py
    │       ├── multistroke.py
    │       ├── network/
    │       │   ├── __init__.py
    │       │   └── urlrequest.py
    │       ├── parser.py
    │       ├── properties.pxd
    │       ├── resources.py
    │       ├── setupconfig.py
    │       ├── storage/
    │       │   ├── __init__.py
    │       │   ├── dictstore.py
    │       │   ├── jsonstore.py
    │       │   └── redisstore.py
    │       ├── support.py
    │       ├── tools/
    │       │   ├── __init__.py
    │       │   ├── benchmark.py
    │       │   ├── extensions/
    │       │   │   ├── __init__.py
    │       │   │   └── make-kivyext.py
    │       │   ├── generate-icons.py
    │       │   ├── highlight/
    │       │   │   ├── __init__.py
    │       │   │   ├── kivy-mode.el
    │       │   │   └── kivy.vim
    │       │   ├── packaging/
    │       │   │   ├── README.txt
    │       │   │   ├── __init__.py
    │       │   │   ├── factory.py
    │       │   │   ├── osx/
    │       │   │   │   ├── Info.plist
    │       │   │   │   ├── InfoPlist.strings
    │       │   │   │   └── kivy.sh
    │       │   │   ├── pyinstaller_hooks/
    │       │   │   │   ├── __init__.py
    │       │   │   │   ├── hook-kivy.py
    │       │   │   │   └── rt-hook-kivy.py
    │       │   │   └── win32/
    │       │   │       └── README.txt
    │       │   ├── report.py
    │       │   ├── stub-gl-debug.py
    │       │   └── texturecompress.py
    │       ├── uix/
    │       │   ├── __init__.py
    │       │   ├── abstractview.py
    │       │   ├── accordion.py
    │       │   ├── actionbar.py
    │       │   ├── anchorlayout.py
    │       │   ├── behaviors.py
    │       │   ├── boxlayout.py
    │       │   ├── bubble.py
    │       │   ├── button.py
    │       │   ├── camera.py
    │       │   ├── carousel.py
    │       │   ├── checkbox.py
    │       │   ├── codeinput.py
    │       │   ├── colorpicker.py
    │       │   ├── dropdown.py
    │       │   ├── effectwidget.py
    │       │   ├── filechooser.py
    │       │   ├── floatlayout.py
    │       │   ├── gesturesurface.py
    │       │   ├── gridlayout.py
    │       │   ├── image.py
    │       │   ├── label.py
    │       │   ├── layout.py
    │       │   ├── listview.py
    │       │   ├── modalview.py
    │       │   ├── pagelayout.py
    │       │   ├── popup.py
    │       │   ├── progressbar.py
    │       │   ├── relativelayout.py
    │       │   ├── rst.py
    │       │   ├── sandbox.py
    │       │   ├── scatter.py
    │       │   ├── scatterlayout.py
    │       │   ├── screenmanager.py
    │       │   ├── scrollview.py
    │       │   ├── selectableview.py
    │       │   ├── settings.py
    │       │   ├── slider.py
    │       │   ├── spinner.py
    │       │   ├── splitter.py
    │       │   ├── stacklayout.py
    │       │   ├── stencilview.py
    │       │   ├── switch.py
    │       │   ├── tabbedpanel.py
    │       │   ├── textinput.py
    │       │   ├── togglebutton.py
    │       │   ├── treeview.py
    │       │   ├── video.py
    │       │   ├── videoplayer.py
    │       │   ├── vkeyboard.py
    │       │   └── widget.py
    │       ├── utils.py
    │       ├── vector.py
    │       └── weakmethod.py
    ├── locale/
    │   ├── en_US/
    │   │   └── LC_MESSAGES/
    │   │       └── tickeys.po
    │   ├── gen_mo.sh
    │   └── zh_CN/
    │       └── LC_MESSAGES/
    │           └── tickeys.po
    ├── logger.py
    ├── pyxhook.py
    ├── requirements.txt
    ├── run.py
    ├── run_with_CLI.py
    ├── soundPlayer.py
    ├── startupHandler.py
    ├── tickeys
    ├── tickeys_tray.py
    ├── tickeysui.kv
    └── windowManager.py
Download .txt
Showing preview only (416K chars total). Download the full file or copy to clipboard to get everything.
SYMBOL INDEX (5983 symbols across 376 files)

FILE: tickeys/CLI.py
  class CLI (line 12) | class CLI(cmd.Cmd):
    method __init__ (line 14) | def __init__(self):
    method default (line 25) | def default(self, line):
    method help_setstyle (line 28) | def help_setstyle(self):
    method do_setstyle (line 31) | def do_setstyle(self, arg):
    method help_setvol (line 47) | def help_setvol(self):
    method do_setvol (line 50) | def do_setvol(self, arg):
    method help_setpitch (line 69) | def help_setpitch(self):
    method do_setpitch (line 72) | def do_setpitch(self, arg):
    method help_getinfo (line 91) | def help_getinfo(self):
    method do_getinfo (line 94) | def do_getinfo(self, arg):
    method do_quit (line 98) | def do_quit(self, arg):

FILE: tickeys/GUI.py
  function show_notify (line 200) | def show_notify(notify_content=""):
  function show_startup_notify (line 212) | def show_startup_notify():
  function check_update_and_notify (line 217) | def check_update_and_notify():
  class EffectSpinner (line 237) | class EffectSpinner(Spinner):
    method get_style_name (line 238) | def get_style_name(self):
  class SpinnerRow (line 253) | class SpinnerRow(BoxLayout):
    method change_style (line 254) | def change_style(self):
  class AdjustVol (line 272) | class AdjustVol(BoxLayout):
    method setVolume (line 273) | def setVolume(self, volume):
  class AdjustPitch (line 277) | class AdjustPitch(BoxLayout):
    method setPitch (line 278) | def setPitch(self, pitch):
  class SwitcherRow (line 282) | class SwitcherRow(BoxLayout):
  class ExitAndSwitchRow (line 286) | class ExitAndSwitchRow(BoxLayout):
    method Exit (line 287) | def Exit(self):
    method Hide (line 290) | def Hide(self):
    method add_delete_startup_file (line 293) | def add_delete_startup_file(self, active):
    method set_language (line 299) | def set_language(self, language):
    method get_language_name (line 311) | def get_language_name(self):
    method have_added (line 320) | def have_added(self):
  class InforRow (line 324) | class InforRow(BoxLayout):
    method open_project_website (line 325) | def open_project_website(self, *args):
    method get_version (line 329) | def get_version(self):
  class Main (line 333) | class Main(GridLayout):
    method __init__ (line 334) | def __init__(self, *args, **kwargs):
    method Hide (line 347) | def Hide(self):
  class TickeysApp (line 352) | class TickeysApp(App):
    method __init__ (line 353) | def __init__(self, *args, **kwargs):
    method build (line 356) | def build(self):
    method on_stop (line 361) | def on_stop(self):

FILE: tickeys/__init__.py
  function tickeys (line 9) | def tickeys():

FILE: tickeys/config.py
  class Configer (line 6) | class Configer():
    method __init__ (line 8) | def __init__(self, *arg):
    method init_config (line 17) | def init_config(self):
    method read_config (line 25) | def read_config(self):
    method save_config (line 40) | def save_config(self):
    method volume (line 53) | def volume(self):
    method pitch (line 57) | def pitch(self):
    method style (line 61) | def style(self):
    method lang (line 65) | def lang(self):
    method autostart (line 69) | def autostart(self):

FILE: tickeys/keyboardHandler.py
  class KeyboardHandler (line 12) | class KeyboardHandler():
    method __init__ (line 14) | def __init__(self):
    method set_style (line 24) | def set_style(self, style):
    method set_volume (line 27) | def set_volume(self, volume):
    method set_pitch (line 30) | def set_pitch(self, pitch):
    method get_player_infor (line 33) | def get_player_infor(self):
    method key_down (line 36) | def key_down(self, event):
    method check_show_window (line 42) | def check_show_window(self, key_code):
    method start_detecting (line 57) | def start_detecting(self):
    method stop_detecting (line 62) | def stop_detecting(self):

FILE: tickeys/kivy/__init__.py
  function require (line 57) | def require(version):
  function kivy_configure (line 130) | def kivy_configure():
  function kivy_register_post_configuration (line 138) | def kivy_register_post_configuration(callback):
  function kivy_usage (line 147) | def kivy_usage():

FILE: tickeys/kivy/adapters/adapter.py
  class Adapter (line 51) | class Adapter(EventDispatcher):
    method __init__ (line 106) | def __init__(self, **kwargs):
    method bind_triggers_to_view (line 132) | def bind_triggers_to_view(self, func):
    method get_data_item (line 135) | def get_data_item(self):
    method get_cls (line 138) | def get_cls(self):
    method get_view (line 155) | def get_view(self, index):  # pragma: no cover

FILE: tickeys/kivy/adapters/dictadapter.py
  class DictAdapter (line 27) | class DictAdapter(ListAdapter):
    method __init__ (line 54) | def __init__(self, **kwargs):
    method bind_triggers_to_view (line 66) | def bind_triggers_to_view(self, func):
    method initialize_sorted_keys (line 74) | def initialize_sorted_keys(self, *args, **kwargs):
    method update_for_new_data (line 90) | def update_for_new_data(self, *args):
    method get_count (line 94) | def get_count(self):
    method get_data_item (line 97) | def get_data_item(self, index):
    method trim_left_of_sel (line 105) | def trim_left_of_sel(self, *args):
    method trim_right_of_sel (line 117) | def trim_right_of_sel(self, *args):
    method trim_to_sel (line 129) | def trim_to_sel(self, *args):
    method cut_to_sel (line 144) | def cut_to_sel(self, *args):

FILE: tickeys/kivy/adapters/listadapter.py
  class ListAdapter (line 56) | class ListAdapter(Adapter, EventDispatcher):
    method __init__ (line 180) | def __init__(self, **kwargs):
    method delete_cache (line 189) | def delete_cache(self, *args):
    method get_count (line 192) | def get_count(self):
    method get_data_item (line 195) | def get_data_item(self, index):
    method selection_mode_changed (line 200) | def selection_mode_changed(self, *args):
    method get_view (line 207) | def get_view(self, index):
    method create_view (line 215) | def create_view(self, index):
    method on_selection_change (line 268) | def on_selection_change(self, *args):
    method handle_selection (line 281) | def handle_selection(self, view, hold_dispatch=False, *args):
    method select_data_item (line 314) | def select_data_item(self, item):
    method deselect_data_item (line 317) | def deselect_data_item(self, item):
    method set_data_item_selection (line 320) | def set_data_item_selection(self, item, value):
    method select_item_view (line 332) | def select_item_view(self, view):
    method select_list (line 350) | def select_list(self, view_list, extend=True):
    method deselect_item_view (line 368) | def deselect_item_view(self, view):
    method deselect_list (line 386) | def deselect_list(self, l):
    method update_for_new_data (line 394) | def update_for_new_data(self, *args):
    method initialize_selection (line 398) | def initialize_selection(self, *args):
    method check_for_empty_selection (line 405) | def check_for_empty_selection(self, *args):
    method trim_left_of_sel (line 416) | def trim_left_of_sel(self, *args):
    method trim_right_of_sel (line 424) | def trim_right_of_sel(self, *args):
    method trim_to_sel (line 433) | def trim_to_sel(self, *args):
    method cut_to_sel (line 445) | def cut_to_sel(self, *args):

FILE: tickeys/kivy/adapters/models.py
  class SelectableDataItem (line 49) | class SelectableDataItem(object):
    method __init__ (line 54) | def __init__(self, **kwargs):
    method is_selected (line 60) | def is_selected(self):
    method is_selected (line 66) | def is_selected(self, value):

FILE: tickeys/kivy/adapters/simplelistadapter.py
  class SimpleListAdapter (line 25) | class SimpleListAdapter(Adapter):
    method __init__ (line 44) | def __init__(self, **kwargs):
    method get_count (line 52) | def get_count(self):
    method get_data_item (line 55) | def get_data_item(self, index):
    method get_view (line 61) | def get_view(self, index):

FILE: tickeys/kivy/animation.py
  class Animation (line 93) | class Animation(EventDispatcher):
    method __init__ (line 122) | def __init__(self, **kw):
    method duration (line 138) | def duration(self):
    method transition (line 144) | def transition(self):
    method animated_properties (line 150) | def animated_properties(self):
    method stop_all (line 156) | def stop_all(widget, *largs):
    method cancel_all (line 177) | def cancel_all(widget, *largs):
    method start (line 199) | def start(self, widget):
    method stop (line 207) | def stop(self, widget):
    method cancel (line 215) | def cancel(self, widget):
    method stop_property (line 227) | def stop_property(self, widget, prop):
    method cancel_property (line 241) | def cancel_property(self, widget, prop):
    method have_properties_to_animate (line 257) | def have_properties_to_animate(self, widget):
    method _register (line 269) | def _register(self):
    method _unregister (line 272) | def _unregister(self):
    method _initialize (line 276) | def _initialize(self, widget):
    method _clock_install (line 295) | def _clock_install(self):
    method _clock_uninstall (line 301) | def _clock_uninstall(self):
    method _update (line 307) | def _update(self, dt):
    method _calculate (line 344) | def _calculate(self, a, b, t):
    method on_start (line 368) | def on_start(self, widget):
    method on_progress (line 371) | def on_progress(self, widget, progress):
    method on_complete (line 374) | def on_complete(self, widget):
    method __add__ (line 377) | def __add__(self, animation):
    method __and__ (line 380) | def __and__(self, animation):
  class Sequence (line 384) | class Sequence(Animation):
    method __init__ (line 386) | def __init__(self, anim1, anim2):
    method duration (line 402) | def duration(self):
    method start (line 405) | def start(self, widget):
    method stop (line 412) | def stop(self, widget):
    method stop_property (line 420) | def stop_property(self, widget, prop):
    method cancel (line 427) | def cancel(self, widget):
    method on_anim1_start (line 432) | def on_anim1_start(self, instance, widget):
    method on_anim1_complete (line 435) | def on_anim1_complete(self, instance, widget):
    method on_anim1_progress (line 439) | def on_anim1_progress(self, instance, widget, progress):
    method on_anim2_complete (line 442) | def on_anim2_complete(self, instance, widget):
    method on_anim2_progress (line 453) | def on_anim2_progress(self, instance, widget, progress):
  class Parallel (line 457) | class Parallel(Animation):
    method __init__ (line 459) | def __init__(self, anim1, anim2):
    method duration (line 468) | def duration(self):
    method start (line 471) | def start(self, widget):
    method stop (line 479) | def stop(self, widget):
    method stop_property (line 487) | def stop_property(self, widget, prop):
    method cancel (line 494) | def cancel(self, widget):
    method on_anim_complete (line 499) | def on_anim_complete(self, instance, widget):
  class AnimationTransition (line 505) | class AnimationTransition(object):
    method linear (line 514) | def linear(progress):
    method in_quad (line 519) | def in_quad(progress):
    method out_quad (line 525) | def out_quad(progress):
    method in_out_quad (line 531) | def in_out_quad(progress):
    method in_cubic (line 541) | def in_cubic(progress):
    method out_cubic (line 547) | def out_cubic(progress):
    method in_out_cubic (line 554) | def in_out_cubic(progress):
    method in_quart (line 564) | def in_quart(progress):
    method out_quart (line 570) | def out_quart(progress):
    method in_out_quart (line 577) | def in_out_quart(progress):
    method in_quint (line 587) | def in_quint(progress):
    method out_quint (line 593) | def out_quint(progress):
    method in_out_quint (line 600) | def in_out_quint(progress):
    method in_sine (line 610) | def in_sine(progress):
    method out_sine (line 616) | def out_sine(progress):
    method in_out_sine (line 622) | def in_out_sine(progress):
    method in_expo (line 628) | def in_expo(progress):
    method out_expo (line 636) | def out_expo(progress):
    method in_out_expo (line 644) | def in_out_expo(progress):
    method in_circ (line 658) | def in_circ(progress):
    method out_circ (line 664) | def out_circ(progress):
    method in_out_circ (line 671) | def in_out_circ(progress):
    method in_elastic (line 681) | def in_elastic(progress):
    method out_elastic (line 693) | def out_elastic(progress):
    method in_out_elastic (line 704) | def in_out_elastic(progress):
    method in_back (line 720) | def in_back(progress):
    method out_back (line 726) | def out_back(progress):
    method in_out_back (line 733) | def in_out_back(progress):
    method _out_bounce_internal (line 744) | def _out_bounce_internal(t, d):
    method _in_bounce_internal (line 759) | def _in_bounce_internal(t, d):
    method in_bounce (line 763) | def in_bounce(progress):
    method out_bounce (line 769) | def out_bounce(progress):
    method in_out_bounce (line 775) | def in_out_bounce(progress):

FILE: tickeys/kivy/app.py
  class App (line 331) | class App(EventDispatcher):
    method __init__ (line 464) | def __init__(self, **kwargs):
    method build (line 485) | def build(self):
    method build_config (line 497) | def build_config(self, config):
    method build_settings (line 513) | def build_settings(self, settings):
    method load_kv (line 532) | def load_kv(self, filename=None):
    method get_application_name (line 599) | def get_application_name(self):
    method get_application_icon (line 609) | def get_application_icon(self):
    method get_application_config (line 617) | def get_application_config(self, defaultpath='%(appdir)s/%(appname)s.i...
    method root_window (line 662) | def root_window(self):
    method load_config (line 669) | def load_config(self):
    method directory (line 723) | def directory(self):
    method user_data_dir (line 739) | def user_data_dir(self):
    method name (line 780) | def name(self):
    method run (line 792) | def run(self):
    method stop (line 827) | def stop(self, *largs):
    method on_start (line 840) | def on_start(self):
    method on_stop (line 847) | def on_stop(self):
    method on_pause (line 854) | def on_pause(self):
    method on_resume (line 869) | def on_resume(self):
    method get_running_app (line 884) | def get_running_app():
    method on_config_change (line 891) | def on_config_change(self, config, section, key, value):
    method open_settings (line 897) | def open_settings(self, *largs):
    method display_settings (line 918) | def display_settings(self, settings):
    method close_settings (line 942) | def close_settings(self, *largs):
    method create_settings (line 957) | def create_settings(self):
    method destroy_settings (line 988) | def destroy_settings(self):
    method _on_config_change (line 1012) | def _on_config_change(self, *largs):
    method _install_settings_keys (line 1015) | def _install_settings_keys(self, window):
    method _on_keyboard_settings (line 1018) | def _on_keyboard_settings(self, window, *largs):
    method on_title (line 1035) | def on_title(self, instance, title):
    method on_icon (line 1039) | def on_icon(self, instance, icon):

FILE: tickeys/kivy/atlas.py
  class Atlas (line 151) | class Atlas(EventDispatcher):
    method _get_filename (line 162) | def _get_filename(self):
    method __init__ (line 172) | def __init__(self, filename):
    method __getitem__ (line 177) | def __getitem__(self, key):
    method _load (line 180) | def _load(self):
    method create (line 214) | def create(outname, filenames, size, padding=2, use_path=False):

FILE: tickeys/kivy/base.py
  class ExceptionHandler (line 38) | class ExceptionHandler(object):
    method __init__ (line 52) | def __init__(self):
    method handle_exception (line 55) | def handle_exception(self, exception):
  class ExceptionManagerBase (line 62) | class ExceptionManagerBase:
    method __init__ (line 68) | def __init__(self):
    method add_handler (line 72) | def add_handler(self, cls):
    method remove_handler (line 77) | def remove_handler(self, cls):
    method handle_exception (line 82) | def handle_exception(self, inst):
  class EventLoopBase (line 95) | class EventLoopBase(EventDispatcher):
    method __init__ (line 102) | def __init__(self):
    method touches (line 115) | def touches(self):
    method ensure_window (line 120) | def ensure_window(self):
    method set_window (line 128) | def set_window(self, window):
    method add_input_provider (line 133) | def add_input_provider(self, provider, auto_remove=False):
    method remove_input_provider (line 141) | def remove_input_provider(self, provider):
    method add_event_listener (line 147) | def add_event_listener(self, listener):
    method remove_event_listener (line 153) | def remove_event_listener(self, listener):
    method start (line 159) | def start(self):
    method close (line 168) | def close(self):
    method stop (line 175) | def stop(self):
    method add_postproc_module (line 195) | def add_postproc_module(self, mod):
    method remove_postproc_module (line 201) | def remove_postproc_module(self, mod):
    method post_dispatch_input (line 206) | def post_dispatch_input(self, etype, me):
    method _dispatch_input (line 291) | def _dispatch_input(self, *ev):
    method dispatch_input (line 297) | def dispatch_input(self):
    method idle (line 317) | def idle(self):
    method run (line 355) | def run(self):
    method exit (line 361) | def exit(self):
    method on_stop (line 367) | def on_stop(self):
    method on_pause (line 372) | def on_pause(self):
    method on_start (line 377) | def on_start(self):
  function _run_mainloop (line 386) | def _run_mainloop():
  function runTouchApp (line 403) | def runTouchApp(widget=None, slave=False):
  function stopTouchApp (line 492) | def stopTouchApp():

FILE: tickeys/kivy/cache.py
  class Cache (line 34) | class Cache(object):
    method register (line 42) | def register(category, limit=None, timeout=None):
    method append (line 64) | def append(category, key, obj, timeout=None):
    method get (line 98) | def get(category, key, default=None):
    method get_timestamp (line 116) | def get_timestamp(category, key, default=None):
    method get_lastaccess (line 133) | def get_lastaccess(category, key, default=None):
    method remove (line 150) | def remove(category, key=None):
    method _purge_oldest (line 169) | def _purge_oldest(category, maxpurge=1):
    method _purge_by_timeout (line 189) | def _purge_by_timeout(dt):
    method print_usage (line 222) | def print_usage():

FILE: tickeys/kivy/clock.py
  class _ClockBase (line 231) | class _ClockBase(object):
    method __init__ (line 232) | def __init__(self):
    method usleep (line 235) | def usleep(self, microseconds):
    method usleep (line 252) | def usleep(self, microseconds):
    method usleep (line 266) | def usleep(self, microseconds):
  class _ClockBase (line 251) | class _ClockBase(object):
    method __init__ (line 232) | def __init__(self):
    method usleep (line 235) | def usleep(self, microseconds):
    method usleep (line 252) | def usleep(self, microseconds):
    method usleep (line 266) | def usleep(self, microseconds):
  class _ClockBase (line 265) | class _ClockBase(object):
    method __init__ (line 232) | def __init__(self):
    method usleep (line 235) | def usleep(self, microseconds):
    method usleep (line 252) | def usleep(self, microseconds):
    method usleep (line 266) | def usleep(self, microseconds):
  function _hash (line 270) | def _hash(cb):
  class ClockEvent (line 276) | class ClockEvent(object):
    method __init__ (line 287) | def __init__(self, clock, loop, callback, timeout, starttime, cid,
    method __call__ (line 301) | def __call__(self, *largs):
    method get_callback (line 313) | def get_callback(self):
    method is_triggered (line 323) | def is_triggered(self):
    method cancel (line 326) | def cancel(self):
    method release (line 336) | def release(self):
    method tick (line 340) | def tick(self, curtime, remove):
    method __repr__ (line 386) | def __repr__(self):
  class ClockBase (line 390) | class ClockBase(_ClockBase):
    method __init__ (line 401) | def __init__(self):
    method frametime (line 422) | def frametime(self):
    method frames (line 431) | def frames(self):
    method frames_displayed (line 440) | def frames_displayed(self):
    method tick (line 445) | def tick(self):
    method tick_draw (line 487) | def tick_draw(self):
    method get_fps (line 494) | def get_fps(self):
    method get_rfps (line 499) | def get_rfps(self):
    method get_time (line 508) | def get_time(self):
    method get_boottime (line 512) | def get_boottime(self):
    method create_trigger (line 516) | def create_trigger(self, callback, timeout=0):
    method schedule_once (line 531) | def schedule_once(self, callback, timeout=0):
    method schedule_interval (line 552) | def schedule_interval(self, callback, timeout):
    method unschedule (line 568) | def unschedule(self, callback, all=True):
    method _release_references (line 600) | def _release_references(self):
    method _process_events (line 609) | def _process_events(self):
    method _process_events_before_frame (line 617) | def _process_events_before_frame(self):
  function mainthread (line 648) | def mainthread(func):

FILE: tickeys/kivy/config.py
  class ConfigParser (line 290) | class ConfigParser(PythonConfigParser, object):
    method __init__ (line 311) | def __init__(self, name=''):
    method add_callback (line 318) | def add_callback(self, callback, section=None, key=None):
    method remove_callback (line 331) | def remove_callback(self, callback, section=None, key=None):
    method _do_callbacks (line 342) | def _do_callbacks(self, section, key, value):
    method read (line 350) | def read(self, filename):
    method set (line 389) | def set(self, section, option, value):
    method setall (line 404) | def setall(self, section, keyvalues):
    method get (line 410) | def get(self, section, option, **kwargs):
    method setdefaults (line 417) | def setdefaults(self, section, keyvalues):
    method setdefault (line 424) | def setdefault(self, section, option, value):
    method getdefault (line 431) | def getdefault(self, section, option, defaultvalue):
    method getdefaultint (line 440) | def getdefaultint(self, section, option, defaultvalue):
    method adddefaultsection (line 448) | def adddefaultsection(self, section):
    method write (line 455) | def write(self):
    method update_config (line 471) | def update_config(self, filename, overwrite=False):
    method _register_named_property (line 483) | def _register_named_property(name, widget_ref, *largs):
    method get_configparser (line 523) | def get_configparser(name):
    method name (line 543) | def name(self):
    method name (line 559) | def name(self, value):

FILE: tickeys/kivy/context.py
  class ProxyContext (line 27) | class ProxyContext(object):
    method __init__ (line 31) | def __init__(self, obj):
    method __getattribute__ (line 35) | def __getattribute__(self, name):
    method __delattr__ (line 38) | def __delattr__(self, name):
    method __setattr__ (line 41) | def __setattr__(self, name, value):
    method __bool__ (line 44) | def __bool__(self):
    method __str__ (line 47) | def __str__(self):
    method __repr__ (line 50) | def __repr__(self):
  class Context (line 54) | class Context(dict):
    method __init__ (line 56) | def __init__(self, init=False):
    method push (line 67) | def push(self):
    method pop (line 72) | def pop(self):
  function register_context (line 80) | def register_context(name, cls, *args, **kwargs):
  function get_current_context (line 94) | def get_current_context():

FILE: tickeys/kivy/core/__init__.py
  class CoreCriticalException (line 29) | class CoreCriticalException(Exception):
  function core_select_lib (line 33) | def core_select_lib(category, llist, create_instance=False, base='kivy.c...
  function core_register_libs (line 98) | def core_register_libs(category, libs, base='kivy.core'):

FILE: tickeys/kivy/core/audio/__init__.py
  class SoundLoader (line 46) | class SoundLoader:
    method register (line 53) | def register(classobj):
    method load (line 59) | def load(filename):
  class Sound (line 75) | class Sound(EventDispatcher):
    method _get_status (line 125) | def _get_status(self):
    method _get_filename (line 133) | def _get_filename(self):
    method on_source (line 143) | def on_source(self, instance, filename):
    method get_pos (line 149) | def get_pos(self):
    method _get_length (line 158) | def _get_length(self):
    method load (line 164) | def load(self):
    method unload (line 168) | def unload(self):
    method play (line 172) | def play(self):
    method stop (line 177) | def stop(self):
    method seek (line 182) | def seek(self, position):
    method on_play (line 186) | def on_play(self):
    method on_stop (line 189) | def on_stop(self):

FILE: tickeys/kivy/core/audio/audio_ffpyplayer.py
  function _log_callback (line 72) | def _log_callback(message, level):
  class SoundFFPy (line 78) | class SoundFFPy(Sound):
    method extensions (line 81) | def extensions():
    method __init__ (line 84) | def __init__(self, **kwargs):
    method __del__ (line 98) | def __del__(self):
    method _player_callback (line 103) | def _player_callback(self, selector, value):
    method load (line 114) | def load(self):
    method unload (line 131) | def unload(self):
    method play (line 138) | def play(self):
    method stop (line 149) | def stop(self):
    method seek (line 156) | def seek(self, position):
    method get_pos (line 161) | def get_pos(self):
    method on_volume (line 166) | def on_volume(self, instance, volume):
    method _get_length (line 170) | def _get_length(self):
    method _do_eos (line 175) | def _do_eos(self, *args):

FILE: tickeys/kivy/core/audio/audio_gi.py
  class SoundGi (line 25) | class SoundGi(Sound):
    method extensions (line 28) | def extensions():
    method __init__ (line 31) | def __init__(self, **kwargs):
    method __del__ (line 35) | def __del__(self):
    method _on_gst_message (line 39) | def _on_gst_message(self, bus, message):
    method play (line 54) | def play(self):
    method stop (line 61) | def stop(self):
    method load (line 67) | def load(self):
    method unload (line 91) | def unload(self):
    method seek (line 95) | def seek(self, position):
    method get_pos (line 101) | def get_pos(self):
    method on_volume (line 112) | def on_volume(self, instance, volume):
    method _get_length (line 116) | def _get_length(self):

FILE: tickeys/kivy/core/audio/audio_gstplayer.py
  function _on_gstplayer_message (line 28) | def _on_gstplayer_message(mtype, message):
  class SoundGstplayer (line 37) | class SoundGstplayer(Sound):
    method extensions (line 40) | def extensions():
    method __init__ (line 43) | def __init__(self, **kwargs):
    method _on_gst_eos_sync (line 47) | def _on_gst_eos_sync(self):
    method _on_gst_eos (line 50) | def _on_gst_eos(self, *dt):
    method load (line 57) | def load(self):
    method play (line 64) | def play(self):
    method stop (line 71) | def stop(self):
    method unload (line 75) | def unload(self):
    method seek (line 80) | def seek(self, position):
    method get_pos (line 83) | def get_pos(self):
    method _get_length (line 86) | def _get_length(self):
    method on_volume (line 89) | def on_volume(self, instance, volume):
    method _get_uri (line 92) | def _get_uri(self):

FILE: tickeys/kivy/core/audio/audio_pygame.py
  class SoundPygame (line 30) | class SoundPygame(Sound):
    method extensions (line 39) | def extensions():
    method __init__ (line 44) | def __init__(self, **kwargs):
    method _check_play (line 49) | def _check_play(self, dt):
    method play (line 62) | def play(self):
    method stop (line 72) | def stop(self):
    method load (line 81) | def load(self):
    method unload (line 87) | def unload(self):
    method seek (line 91) | def seek(self, position):
    method get_pos (line 97) | def get_pos(self):
    method on_volume (line 104) | def on_volume(self, instance, volume):
    method _get_length (line 108) | def _get_length(self):

FILE: tickeys/kivy/core/audio/audio_pygst.py
  class SoundPyGst (line 34) | class SoundPyGst(Sound):
    method extensions (line 37) | def extensions():
    method __init__ (line 40) | def __init__(self, **kwargs):
    method __del__ (line 44) | def __del__(self):
    method _on_gst_message (line 48) | def _on_gst_message(self, bus, message):
    method play (line 63) | def play(self):
    method stop (line 70) | def stop(self):
    method load (line 76) | def load(self):
    method unload (line 101) | def unload(self):
    method seek (line 105) | def seek(self, position):
    method get_pos (line 111) | def get_pos(self):
    method on_volume (line 121) | def on_volume(self, instance, volume):
    method _get_length (line 125) | def _get_length(self):

FILE: tickeys/kivy/core/camera/__init__.py
  class CameraBase (line 26) | class CameraBase(EventDispatcher):
    method __init__ (line 54) | def __init__(self, **kwargs):
    method _set_resolution (line 75) | def _set_resolution(self, res):
    method _get_resolution (line 79) | def _get_resolution(self):
    method _set_index (line 86) | def _set_index(self, x):
    method _get_index (line 92) | def _get_index(self):
    method _get_texture (line 99) | def _get_texture(self):
    method init_camera (line 104) | def init_camera(self):
    method start (line 108) | def start(self):
    method stop (line 112) | def stop(self):
    method _update (line 116) | def _update(self, dt):
    method _copy_to_gpu (line 120) | def _copy_to_gpu(self):
    method on_texture (line 129) | def on_texture(self):
    method on_load (line 132) | def on_load(self):

FILE: tickeys/kivy/core/camera/camera_gi.py
  class _MapInfo (line 30) | class _MapInfo(Structure):
  function _on_cameragi_unref (line 38) | def _on_cameragi_unref(obj):
  class CameraGi (line 43) | class CameraGi(CameraBase):
    method __init__ (line 57) | def __init__(self, **kwargs):
    method init_camera (line 67) | def init_camera(self):
    method _gst_new_sample (line 97) | def _gst_new_sample(self, *largs):
    method start (line 117) | def start(self):
    method stop (line 121) | def stop(self):
    method unload (line 125) | def unload(self):
    method _update (line 128) | def _update(self, dt):
  function camera_gi_clean (line 162) | def camera_gi_clean():

FILE: tickeys/kivy/core/camera/camera_opencv.py
  class Hg (line 22) | class Hg(object):
    method __getattr__ (line 32) | def __getattr__(self, attr):
  class CameraOpenCV (line 41) | class CameraOpenCV(CameraBase):
    method __init__ (line 45) | def __init__(self, **kwargs):
    method init_camera (line 49) | def init_camera(self):
    method _update (line 75) | def _update(self, dt):
    method start (line 96) | def start(self):
    method stop (line 101) | def stop(self):

FILE: tickeys/kivy/core/camera/camera_pygst.py
  class CameraPyGst (line 28) | class CameraPyGst(CameraBase):
    method __init__ (line 40) | def __init__(self, **kwargs):
    method init_camera (line 48) | def init_camera(self):
    method _gst_new_buffer (line 72) | def _gst_new_buffer(self, *largs):
    method start (line 87) | def start(self):
    method stop (line 91) | def stop(self):
    method _update (line 95) | def _update(self, dt):

FILE: tickeys/kivy/core/camera/camera_videocapture.py
  class CameraVideoCapture (line 20) | class CameraVideoCapture(CameraBase):
    method __init__ (line 24) | def __init__(self, **kwargs):
    method init_camera (line 29) | def init_camera(self):
    method _update (line 39) | def _update(self, dt):
    method start (line 53) | def start(self):
    method stop (line 58) | def stop(self):

FILE: tickeys/kivy/core/clipboard/__init__.py
  class ClipboardBase (line 34) | class ClipboardBase(object):
    method get (line 36) | def get(self, mimetype):
    method put (line 42) | def put(self, data, mimetype):
    method get_types (line 48) | def get_types(self):
    method _ensure_clipboard (line 53) | def _ensure_clipboard(self):
    method copy (line 71) | def copy(self, data=''):
    method paste (line 81) | def paste(self):
    method _copy (line 89) | def _copy(self, data):
    method _paste (line 100) | def _paste(self):

FILE: tickeys/kivy/core/clipboard/clipboard_android.py
  class ClipboardAndroid (line 21) | class ClipboardAndroid(ClipboardBase):
    method __init__ (line 23) | def __init__(self):
    method get (line 31) | def get(self, mimetype='text/plain'):
    method put (line 34) | def put(self, data, mimetype='text/plain'):
    method get_types (line 37) | def get_types(self):
    method _initialize_clipboard (line 41) | def _initialize_clipboard(self):
    method _get_clipboard (line 45) | def _get_clipboard(f):
    method _get (line 57) | def _get(self, mimetype='text/plain'):
    method _set (line 73) | def _set(self, data, mimetype):

FILE: tickeys/kivy/core/clipboard/clipboard_dbusklipper.py
  class ClipboardDbusKlipper (line 21) | class ClipboardDbusKlipper(ClipboardBase):
    method init (line 25) | def init(self):
    method get (line 31) | def get(self, mimetype='text/plain'):
    method put (line 35) | def put(self, data, mimetype='text/plain'):
    method get_types (line 39) | def get_types(self):

FILE: tickeys/kivy/core/clipboard/clipboard_dummy.py
  class ClipboardDummy (line 11) | class ClipboardDummy(ClipboardBase):
    method __init__ (line 13) | def __init__(self):
    method get (line 19) | def get(self, mimetype='text/plain'):
    method put (line 22) | def put(self, data, mimetype='text/plain'):
    method get_types (line 25) | def get_types(self):

FILE: tickeys/kivy/core/clipboard/clipboard_gtk3.py
  class ClipboardGtk3 (line 18) | class ClipboardGtk3(ClipboardBase):
    method init (line 22) | def init(self):
    method get (line 28) | def get(self, mimetype='text/plain;charset=utf-8'):
    method put (line 36) | def put(self, data, mimetype='text/plain;charset=utf-8'):
    method get_types (line 42) | def get_types(self):

FILE: tickeys/kivy/core/clipboard/clipboard_nspaste.py
  class ClipboardNSPaste (line 24) | class ClipboardNSPaste(ClipboardBase):
    method __init__ (line 26) | def __init__(self):
    method get (line 30) | def get(self, mimetype='text/plain'):
    method put (line 37) | def put(self, data, mimetype='text/plain'):
    method get_types (line 42) | def get_types(self):

FILE: tickeys/kivy/core/clipboard/clipboard_pygame.py
  class ClipboardPygame (line 21) | class ClipboardPygame(ClipboardBase):
    method init (line 30) | def init(self):
    method get (line 36) | def get(self, mimetype='text/plain'):
    method put (line 42) | def put(self, data, mimetype='text/plain'):
    method get_types (line 47) | def get_types(self):

FILE: tickeys/kivy/core/clipboard/clipboard_sdl2.py
  class ClipboardSDL2 (line 20) | class ClipboardSDL2(ClipboardBase):
    method get (line 22) | def get(self, mimetype):
    method _ensure_clipboard (line 25) | def _ensure_clipboard(self):
    method put (line 29) | def put(self, data=b'', mimetype='text/plain'):
    method get_types (line 32) | def get_types(self):

FILE: tickeys/kivy/core/clipboard/clipboard_winctypes.py
  class ClipboardWindows (line 21) | class ClipboardWindows(ClipboardBase):
    method get (line 23) | def get(self, mimetype='text/plain'):
    method put (line 34) | def put(self, text, mimetype='text/plain'):
    method get_types (line 46) | def get_types(self):

FILE: tickeys/kivy/core/clipboard/clipboard_xsel.py
  class ClipboardXsel (line 21) | class ClipboardXsel(ClipboardBase):
    method get (line 23) | def get(self, mimetype='text/plain'):
    method put (line 28) | def put(self, data, mimetype='text/plain'):
    method get_types (line 32) | def get_types(self):

FILE: tickeys/kivy/core/gl/__init__.py
  function msgbox (line 17) | def msgbox(message):
  function init_gl (line 35) | def init_gl():
  function print_gl_version (line 40) | def print_gl_version():

FILE: tickeys/kivy/core/image/__init__.py
  class ImageData (line 66) | class ImageData(object):
    method __init__ (line 76) | def __init__(self, width, height, fmt, data, source=None,
    method release_data (line 97) | def release_data(self):
    method width (line 104) | def width(self):
    method height (line 111) | def height(self):
    method data (line 118) | def data(self):
    method rowlength (line 125) | def rowlength(self):
    method size (line 134) | def size(self):
    method have_mipmap (line 142) | def have_mipmap(self):
    method __repr__ (line 145) | def __repr__(self):
    method add_mipmap (line 151) | def add_mipmap(self, level, width, height, data, rowlength):
    method get_mipmap (line 158) | def get_mipmap(self, level):
    method iterate_mipmaps (line 168) | def iterate_mipmaps(self):
  class ImageLoaderBase (line 181) | class ImageLoaderBase(object):
    method __init__ (line 187) | def __init__(self, filename, **kwargs):
    method load (line 200) | def load(self, filename):
    method can_save (line 205) | def can_save():
    method can_load_memory (line 211) | def can_load_memory():
    method save (line 217) | def save():
    method populate (line 220) | def populate(self):
    method width (line 257) | def width(self):
    method height (line 263) | def height(self):
    method size (line 269) | def size(self):
    method texture (line 275) | def texture(self):
    method textures (line 285) | def textures(self):
    method nocache (line 295) | def nocache(self):
  class ImageLoader (line 303) | class ImageLoader(object):
    method zip_loader (line 308) | def zip_loader(filename, **kwargs):
    method register (line 362) | def register(defcls):
    method load (line 366) | def load(filename, **kwargs):
  class Image (line 436) | class Image(EventDispatcher):
    method __init__ (line 470) | def __init__(self, arg, **kwargs):
    method remove_from_cache (line 515) | def remove_from_cache(self):
    method _anim (line 540) | def _anim(self, *largs):
    method anim_reset (line 551) | def anim_reset(self, allow_anim):
    method _get_anim_delay (line 580) | def _get_anim_delay(self):
    method _set_anim_delay (line 583) | def _set_anim_delay(self, x):
    method anim_available (line 600) | def anim_available(self):
    method anim_index (line 608) | def anim_index(self):
    method _img_iterate (line 615) | def _img_iterate(self, *largs):
    method on_texture (line 625) | def on_texture(self, *largs):
    method load (line 634) | def load(filename, **kwargs):
    method _get_image (line 646) | def _get_image(self):
    method _set_image (line 649) | def _set_image(self, image):
    method _get_filename (line 659) | def _get_filename(self):
    method _set_filename (line 662) | def _set_filename(self, value):
    method load_memory (line 713) | def load_memory(self, data, ext, filename='__inline__'):
    method size (line 734) | def size(self):
    method width (line 740) | def width(self):
    method height (line 746) | def height(self):
    method texture (line 752) | def texture(self):
    method nocache (line 760) | def nocache(self):
    method save (line 767) | def save(self, filename, flipped=False):
    method read_pixel (line 835) | def read_pixel(self, x, y):
  function load (line 877) | def load(filename):

FILE: tickeys/kivy/core/image/img_dds.py
  class ImageLoaderDDS (line 12) | class ImageLoaderDDS(ImageLoaderBase):
    method extensions (line 15) | def extensions():
    method load (line 18) | def load(self, filename):

FILE: tickeys/kivy/core/image/img_ffpyplayer.py
  function _log_callback (line 24) | def _log_callback(message, level):
  class ImageLoaderFFPy (line 33) | class ImageLoaderFFPy(ImageLoaderBase):
    method extensions (line 44) | def extensions():
    method load (line 52) | def load(self, filename):

FILE: tickeys/kivy/core/image/img_gif.py
  class ImageLoaderGIF (line 44) | class ImageLoaderGIF(ImageLoaderBase):
    method extensions (line 48) | def extensions():
    method load (line 52) | def load(self, filename):
  class Gif (line 147) | class Gif(object):
    method __init__ (line 167) | def __init__(self, data, debug):
    method pop (line 189) | def pop(self, data, length=1):
    method pops (line 199) | def pops(self, format, data):
    method print_info (line 204) | def print_info(self):
    method new_image (line 219) | def new_image(self, header=None):
  class ImageDescriptor (line 226) | class ImageDescriptor(object):
    method __init__ (line 229) | def __init__(self, parent, header=None):
    method setup_header (line 260) | def setup_header(self, header):
    method get_header (line 280) | def get_header(self):
  class GifDecoder (line 295) | class GifDecoder(Gif):
    method __init__ (line 298) | def __init__(self, data, debug=False):
    method fill (line 302) | def fill(self):
    method string_to_bits (line 416) | def string_to_bits(self, string):
    method readable (line 426) | def readable(bool_list):
    method bits_to_int (line 431) | def bits_to_int(self, bits):
    method get_color_table (line 441) | def get_color_table(self, size):
    method lzw_decode (line 457) | def lzw_decode(self, input, initial_codesize, color_table_size):
  function get_bits (line 552) | def get_bits(flags, reverse=False, bits=8):
  function pack_bits (line 567) | def pack_bits(bits):

FILE: tickeys/kivy/core/image/img_pil.py
  class ImageLoaderPIL (line 16) | class ImageLoaderPIL(ImageLoaderBase):
    method can_save (line 34) | def can_save():
    method can_load_memory (line 38) | def can_load_memory():
    method extensions (line 42) | def extensions():
    method _img_correct (line 52) | def _img_correct(self, _img_tmp):
    method _img_read (line 68) | def _img_read(self, im):
    method load (line 91) | def load(self, filename):
    method save (line 104) | def save(filename, width, height, fmt, pixels, flipped=False):

FILE: tickeys/kivy/core/image/img_pygame.py
  class ImageLoaderPygame (line 18) | class ImageLoaderPygame(ImageLoaderBase):
    method extensions (line 22) | def extensions():
    method can_save (line 34) | def can_save():
    method can_load_memory (line 38) | def can_load_memory():
    method load (line 41) | def load(self, filename):
    method save (line 98) | def save(filename, width, height, fmt, pixels, flipped):

FILE: tickeys/kivy/core/image/img_sdl2.py
  class ImageLoaderSDL2 (line 14) | class ImageLoaderSDL2(ImageLoaderBase):
    method _ensure_ext (line 17) | def _ensure_ext(self):
    method extensions (line 21) | def extensions():
    method can_save (line 27) | def can_save():
    method can_load_memory (line 31) | def can_load_memory():
    method load (line 34) | def load(self, filename):
    method save (line 54) | def save(filename, width, height, fmt, pixels, flipped):

FILE: tickeys/kivy/core/image/img_tex.py
  class ImageLoaderTex (line 13) | class ImageLoaderTex(ImageLoaderBase):
    method extensions (line 16) | def extensions():
    method load (line 19) | def load(self, filename):

FILE: tickeys/kivy/core/spelling/__init__.py
  class NoSuchLangError (line 32) | class NoSuchLangError(Exception):
  class NoLanguageSelectedError (line 39) | class NoLanguageSelectedError(Exception):
  class SpellingBase (line 47) | class SpellingBase(object):
    method __init__ (line 53) | def __init__(self, language=None):
    method select_language (line 79) | def select_language(self, language):
    method list_languages (line 93) | def list_languages(self):
    method check (line 101) | def check(self, word):
    method suggest (line 115) | def suggest(self, fragment):

FILE: tickeys/kivy/core/spelling/spelling_enchant.py
  class SpellingEnchant (line 12) | class SpellingEnchant(SpellingBase):
    method __init__ (line 17) | def __init__(self, language=None):
    method select_language (line 21) | def select_language(self, language):
    method list_languages (line 28) | def list_languages(self):
    method check (line 33) | def check(self, word):
    method suggest (line 38) | def suggest(self, fragment):

FILE: tickeys/kivy/core/spelling/spelling_osxappkit.py
  class SpellingOSXAppKit (line 21) | class SpellingOSXAppKit(SpellingBase):
    method __init__ (line 26) | def __init__(self, language=None):
    method select_language (line 30) | def select_language(self, language):
    method list_languages (line 36) | def list_languages(self):
    method check (line 39) | def check(self, word):
    method suggest (line 50) | def suggest(self, fragment):

FILE: tickeys/kivy/core/text/__init__.py
  class LabelBase (line 58) | class LabelBase(object):
    method __init__ (line 151) | def __init__(
    method register (line 195) | def register(name, fn_regular, fn_italic=None, fn_bold=None,
    method resolve_font_name (line 227) | def resolve_font_name(self):
    method get_system_fonts_dir (line 262) | def get_system_fonts_dir():
    method get_extents (line 296) | def get_extents(self, text):
    method get_cached_extents (line 301) | def get_cached_extents(self):
    method _render_begin (line 324) | def _render_begin(self):
    method _render_text (line 327) | def _render_text(self, text, x, y):
    method _render_end (line 330) | def _render_end(self):
    method shorten (line 333) | def shorten(self, text, margin=2):
    method _render_real (line 453) | def _render_real(self):
    method render (line 549) | def render(self, real=False):
    method _texture_refresh (line 604) | def _texture_refresh(self, *l):
    method _texture_fill (line 607) | def _texture_fill(self, texture):
    method refresh (line 611) | def refresh(self):
    method _get_text (line 641) | def _get_text(self):
    method _set_text (line 655) | def _set_text(self, text):
    method texture_1px (line 663) | def texture_1px(self):
    method size (line 671) | def size(self):
    method width (line 675) | def width(self):
    method height (line 679) | def height(self):
    method content_width (line 683) | def content_width(self):
    method content_height (line 691) | def content_height(self):
    method content_size (line 699) | def content_size(self):
    method fontid (line 706) | def fontid(self):
    method _get_text_size (line 711) | def _get_text_size(self):
    method _set_text_size (line 714) | def _set_text_size(self, x):

FILE: tickeys/kivy/core/text/markup.py
  class MarkupLabel (line 60) | class MarkupLabel(MarkupLabelBase):
    method __init__ (line 66) | def __init__(self, *largs, **kwargs):
    method refs (line 75) | def refs(self):
    method anchors (line 83) | def anchors(self):
    method markup (line 91) | def markup(self):
    method _push_style (line 102) | def _push_style(self, k):
    method _pop_style (line 107) | def _pop_style(self, k):
    method render (line 114) | def render(self, real=False):
    method _pre_render (line 123) | def _pre_render(self):
    method _real_render (line 369) | def _real_render(self):
    method shorten_post (line 456) | def shorten_post(self, lines, w, h, margin=2):

FILE: tickeys/kivy/core/text/text_pil.py
  class LabelPIL (line 20) | class LabelPIL(LabelBase):
    method _select_font (line 23) | def _select_font(self):
    method get_extents (line 37) | def get_extents(self, text):
    method get_cached_extents (line 42) | def get_cached_extents(self):
    method _render_begin (line 45) | def _render_begin(self):
    method _render_text (line 50) | def _render_text(self, text, x, y):
    method _render_end (line 55) | def _render_end(self):

FILE: tickeys/kivy/core/text/text_pygame.py
  class LabelPygame (line 27) | class LabelPygame(LabelBase):
    method _get_font_id (line 29) | def _get_font_id(self):
    method _get_font (line 40) | def _get_font(self):
    method get_ascent (line 78) | def get_ascent(self):
    method get_descent (line 81) | def get_descent(self):
    method get_extents (line 84) | def get_extents(self, text):
    method get_cached_extents (line 87) | def get_cached_extents(self):
    method _render_begin (line 90) | def _render_begin(self):
    method _render_text (line 94) | def _render_text(self, text, x, y):
    method _render_end (line 105) | def _render_end(self):

FILE: tickeys/kivy/core/text/text_sdl2.py
  class LabelSDL2 (line 16) | class LabelSDL2(LabelBase):
    method _get_font_id (line 18) | def _get_font_id(self):
    method get_extents (line 28) | def get_extents(self, text):
    method get_descent (line 36) | def get_descent(self):
    method get_ascent (line 39) | def get_ascent(self):
    method _render_begin (line 42) | def _render_begin(self):
    method _render_text (line 45) | def _render_text(self, text, x, y):
    method _render_end (line 48) | def _render_end(self):

FILE: tickeys/kivy/core/video/__init__.py
  class VideoBase (line 29) | class VideoBase(EventDispatcher):
    method __init__ (line 62) | def __init__(self, **kwargs):
    method __del__ (line 90) | def __del__(self):
    method on_eos (line 93) | def on_eos(self):
    method on_load (line 96) | def on_load(self):
    method on_frame (line 99) | def on_frame(self):
    method _get_filename (line 102) | def _get_filename(self):
    method _set_filename (line 105) | def _set_filename(self, filename):
    method _get_position (line 118) | def _get_position(self):
    method _set_position (line 121) | def _set_position(self, pos):
    method _get_volume (line 128) | def _get_volume(self):
    method _set_volume (line 131) | def _set_volume(self, volume):
    method _get_duration (line 138) | def _get_duration(self):
    method _get_texture (line 144) | def _get_texture(self):
    method _get_state (line 150) | def _get_state(self):
    method _do_eos (line 156) | def _do_eos(self, *args):
    method _update (line 171) | def _update(self, dt):
    method seek (line 176) | def seek(self, percent):
    method stop (line 180) | def stop(self):
    method pause (line 184) | def pause(self):
    method play (line 191) | def play(self):
    method load (line 195) | def load(self):
    method unload (line 199) | def unload(self):

FILE: tickeys/kivy/core/video/video_ffmpeg.py
  class VideoFFMpeg (line 27) | class VideoFFMpeg(VideoBase):
    method __init__ (line 29) | def __init__(self, **kwargs):
    method unload (line 34) | def unload(self):
    method load (line 41) | def load(self):
    method play (line 44) | def play(self):
    method stop (line 50) | def stop(self):
    method seek (line 53) | def seek(self, percent):
    method _do_eos (line 58) | def _do_eos(self):
    method _update (line 63) | def _update(self, dt):
    method _get_duration (line 92) | def _get_duration(self):
    method _get_position (line 97) | def _get_position(self):
    method _get_volume (line 102) | def _get_volume(self):
    method _set_volume (line 108) | def _set_volume(self, volume):

FILE: tickeys/kivy/core/video/video_ffpyplayer.py
  function _log_callback (line 75) | def _log_callback(message, level):
  class VideoFFPy (line 84) | class VideoFFPy(VideoBase):
    method __init__ (line 103) | def __init__(self, **kwargs):
    method __del__ (line 113) | def __del__(self):
    method _player_callback (line 118) | def _player_callback(self, selector, value):
    method _get_position (line 126) | def _get_position(self):
    method _set_position (line 131) | def _set_position(self, pos):
    method _get_volume (line 134) | def _get_volume(self):
    method _set_volume (line 139) | def _set_volume(self, volume):
    method _get_duration (line 144) | def _get_duration(self):
    method _do_eos (line 150) | def _do_eos(self):
    method _change_state (line 161) | def _change_state(self, state):
    method _redraw (line 164) | def _redraw(self, *args):
    method _next_frame_run (line 216) | def _next_frame_run(self):
    method seek (line 277) | def seek(self, percent):
    method stop (line 284) | def stop(self):
    method pause (line 287) | def pause(self):
    method play (line 292) | def play(self):
    method load (line 313) | def load(self):
    method unload (line 316) | def unload(self):

FILE: tickeys/kivy/core/video/video_gi.py
  class _MapInfo (line 45) | class _MapInfo(Structure):
  function _gst_new_buffer (line 53) | def _gst_new_buffer(obj, appsink):
  function _on_gst_message (line 62) | def _on_gst_message(bus, message):
  function _on_gst_eos (line 71) | def _on_gst_eos(obj, *largs):
  function _on_videogi_unref (line 78) | def _on_videogi_unref(obj):
  class VideoGi (line 83) | class VideoGi(VideoBase):
    method __init__ (line 87) | def __init__(self, **kwargs):
    method _gst_init (line 96) | def _gst_init(self):
    method _update_texture (line 120) | def _update_texture(self, sample):
    method _update (line 156) | def _update(self, dt):
    method unload (line 165) | def unload(self):
    method load (line 170) | def load(self):
    method stop (line 176) | def stop(self):
    method pause (line 180) | def pause(self):
    method play (line 184) | def play(self):
    method seek (line 188) | def seek(self, percent):
    method _get_uri (line 199) | def _get_uri(self):
    method _get_position (line 207) | def _get_position(self):
    method _get_duration (line 216) | def _get_duration(self):
    method _get_volume (line 225) | def _get_volume(self):
    method _set_volume (line 229) | def _set_volume(self, volume):
  function video_gi_clean (line 235) | def video_gi_clean():

FILE: tickeys/kivy/core/video/video_gstplayer.py
  function _on_gstplayer_buffer (line 32) | def _on_gstplayer_buffer(video, width, height, data):
  function _on_gstplayer_message (line 41) | def _on_gstplayer_message(mtype, message):
  class VideoGstplayer (line 50) | class VideoGstplayer(VideoBase):
    method __init__ (line 52) | def __init__(self, **kwargs):
    method _on_gst_eos_sync (line 58) | def _on_gst_eos_sync(self):
    method load (line 61) | def load(self):
    method unload (line 70) | def unload(self):
    method stop (line 78) | def stop(self):
    method pause (line 82) | def pause(self):
    method play (line 86) | def play(self):
    method seek (line 91) | def seek(self, percent):
    method _get_position (line 94) | def _get_position(self):
    method _get_duration (line 97) | def _get_duration(self):
    method _get_volume (line 100) | def _get_volume(self):
    method _set_volume (line 103) | def _set_volume(self, value):
    method _update (line 108) | def _update(self, dt):
    method _update_texture (line 117) | def _update_texture(self, buf):
    method _get_uri (line 131) | def _get_uri(self):

FILE: tickeys/kivy/core/video/video_null.py
  class VideoNull (line 9) | class VideoNull(VideoBase):

FILE: tickeys/kivy/core/video/video_pyglet.py
  class FakePygletContext (line 19) | class FakePygletContext:
  class VideoPyglet (line 30) | class VideoPyglet(VideoBase):
    method unload (line 34) | def unload(self):
    method load (line 39) | def load(self):
    method _update (line 60) | def _update(self, dt):
    method stop (line 72) | def stop(self):
    method play (line 76) | def play(self):
    method seek (line 80) | def seek(self, percent):
    method _get_position (line 86) | def _get_position(self):
    method _get_duration (line 90) | def _get_duration(self):
    method _get_volume (line 94) | def _get_volume(self):
    method _set_volume (line 99) | def _set_volume(self, volume):

FILE: tickeys/kivy/core/video/video_pygst.py
  function _gst_new_buffer (line 50) | def _gst_new_buffer(obj, appsink):
  function _on_gst_message (line 58) | def _on_gst_message(bus, message):
  function _on_gst_eos (line 67) | def _on_gst_eos(obj, *largs):
  class VideoPyGst (line 74) | class VideoPyGst(VideoBase):
    method __init__ (line 76) | def __init__(self, **kwargs):
    method _gst_init (line 83) | def _gst_init(self):
    method _update_texture (line 109) | def _update_texture(self, buf):
    method _update (line 125) | def _update(self, dt):
    method unload (line 134) | def unload(self):
    method load (line 139) | def load(self):
    method stop (line 145) | def stop(self):
    method pause (line 150) | def pause(self):
    method play (line 155) | def play(self):
    method seek (line 159) | def seek(self, percent):
    method _get_uri (line 170) | def _get_uri(self):
    method _get_position (line 178) | def _get_position(self):
    method _get_duration (line 185) | def _get_duration(self):
    method _get_volume (line 191) | def _get_volume(self):
    method _set_volume (line 195) | def _set_volume(self, volume):

FILE: tickeys/kivy/core/window/__init__.py
  class Keyboard (line 36) | class Keyboard(EventDispatcher):
    method __init__ (line 118) | def __init__(self, **kwargs):
    method on_key_down (line 133) | def on_key_down(self, keycode, text, modifiers):
    method on_key_up (line 136) | def on_key_up(self, keycode):
    method on_textinput (line 139) | def on_textinput(self, text):
    method release (line 142) | def release(self):
    method _on_window_textinput (line 149) | def _on_window_textinput(self, instance, text):
    method _on_window_key_down (line 152) | def _on_window_key_down(self, instance, keycode, scancode, text,
    method _on_window_key_up (line 160) | def _on_window_key_up(self, instance, keycode, *largs):
    method _on_vkeyboard_key_down (line 164) | def _on_vkeyboard_key_down(self, instance, keycode, text, modifiers):
    method _on_vkeyboard_key_up (line 170) | def _on_vkeyboard_key_up(self, instance, keycode, text, modifiers):
    method _on_vkeyboard_textinput (line 176) | def _on_vkeyboard_textinput(self, instance, text):
    method string_to_keycode (line 179) | def string_to_keycode(self, value):
    method keycode_to_string (line 186) | def keycode_to_string(self, value):
  class WindowBase (line 197) | class WindowBase(EventDispatcher):
    method _get_modifiers (line 300) | def _get_modifiers(self):
    method _get_size (line 307) | def _get_size(self):
    method _set_size (line 318) | def _set_size(self, size):
    method _get_clearcolor (line 336) | def _get_clearcolor(self):
    method _set_clearcolor (line 339) | def _set_clearcolor(self, value):
    method _get_width (line 367) | def _get_width(self):
    method _get_height (line 382) | def _get_height(self):
    method _get_center (line 399) | def _get_center(self):
    method _get_rotation (line 408) | def _get_rotation(self):
    method _set_rotation (line 411) | def _set_rotation(self, x):
    method _upd_kbd_height (line 450) | def _upd_kbd_height(self, *kargs):
    method _get_ios_kheight (line 453) | def _get_ios_kheight(self):
    method _get_android_kheight (line 456) | def _get_android_kheight(self):
    method _get_kheight (line 462) | def _get_kheight(self):
    method _set_system_size (line 479) | def _set_system_size(self, size):
    method _get_system_size (line 482) | def _get_system_size(self):
    method __self__ (line 521) | def __self__(self):
    method __new__ (line 539) | def __new__(cls, **kwargs):
    method __init__ (line 544) | def __init__(self, **kwargs):
    method _bind_create_window (line 633) | def _bind_create_window(self):
    method _unbind_create_window (line 639) | def _unbind_create_window(self):
    method toggle_fullscreen (line 645) | def toggle_fullscreen(self):
    method maximize (line 653) | def maximize(self):
    method minimize (line 669) | def minimize(self):
    method restore (line 685) | def restore(self):
    method hide (line 701) | def hide(self):
    method show (line 717) | def show(self):
    method close (line 733) | def close(self):
    method create_window (line 737) | def create_window(self, *largs):
    method on_flip (line 791) | def on_flip(self):
    method flip (line 795) | def flip(self):
    method _update_childsize (line 799) | def _update_childsize(self, instance, value):
    method add_widget (line 802) | def add_widget(self, widget, canvas=None):
    method remove_widget (line 816) | def remove_widget(self, widget):
    method clear (line 835) | def clear(self):
    method set_title (line 846) | def set_title(self, title):
    method set_icon (line 853) | def set_icon(self, filename):
    method to_widget (line 860) | def to_widget(self, x, y, initial=True, relative=False):
    method to_window (line 863) | def to_window(self, x, y, initial=True, relative=False):
    method _apply_transform (line 866) | def _apply_transform(self, m):
    method get_window_matrix (line 869) | def get_window_matrix(self, x=0, y=0):
    method get_root_window (line 874) | def get_root_window(self):
    method get_parent_window (line 877) | def get_parent_window(self):
    method get_parent_layout (line 880) | def get_parent_layout(self):
    method on_draw (line 883) | def on_draw(self):
    method on_motion (line 887) | def on_motion(self, etype, me):
    method on_touch_down (line 911) | def on_touch_down(self, touch):
    method on_touch_move (line 923) | def on_touch_move(self, touch):
    method on_touch_up (line 935) | def on_touch_up(self, touch):
    method on_resize (line 947) | def on_resize(self, width, height):
    method update_viewport (line 951) | def update_viewport(self):
    method update_childsize (line 996) | def update_childsize(self, childs=None):
    method screenshot (line 1022) | def screenshot(self, name='screenshot{:04d}.png'):
    method on_rotate (line 1037) | def on_rotate(self, rotation):
    method on_close (line 1042) | def on_close(self, *largs):
    method on_request_close (line 1047) | def on_request_close(self, *largs, **kwargs):
    method on_mouse_down (line 1060) | def on_mouse_down(self, x, y, button, modifiers):
    method on_mouse_move (line 1064) | def on_mouse_move(self, x, y, modifiers):
    method on_mouse_up (line 1068) | def on_mouse_up(self, x, y, button, modifiers):
    method on_joy_axis (line 1072) | def on_joy_axis(self, stickid, axisid, value):
    method on_joy_hat (line 1078) | def on_joy_hat(self, stickid, hatid, value):
    method on_joy_ball (line 1084) | def on_joy_ball(self, stickid, ballid, value):
    method on_joy_button_down (line 1090) | def on_joy_button_down(self, stickid, buttonid):
    method on_joy_button_up (line 1096) | def on_joy_button_up(self, stickid, buttonid):
    method on_keyboard (line 1102) | def on_keyboard(self, key, scancode=None, codepoint=None,
    method __exit (line 1128) | def __exit(section, name, value):
    method on_key_down (line 1134) | def on_key_down(self, key, scancode=None, codepoint=None,
    method on_key_up (line 1143) | def on_key_up(self, key, scancode=None, codepoint=None,
    method on_textinput (line 1153) | def on_textinput(self, text):
    method on_dropfile (line 1163) | def on_dropfile(self, filename):
    method dpi (line 1178) | def dpi(self):
    method configure_keyboards (line 1189) | def configure_keyboards(self):
    method set_vkeyboard_class (line 1250) | def set_vkeyboard_class(self, cls):
    method release_all_keyboards (line 1258) | def release_all_keyboards(self):
    method request_keyboard (line 1269) | def request_keyboard(self, callback, target, input_type='text'):
    method release_keyboard (line 1374) | def release_keyboard(self, target=None):

FILE: tickeys/kivy/core/window/window_egl_rpi.py
  class WindowEglRpi (line 15) | class WindowEglRpi(WindowBase):
    method create_window (line 17) | def create_window(self):
    method _create_window (line 28) | def _create_window(self, w, h):
    method _create_egl_context (line 37) | def _create_egl_context(self, win, flags):
    method close (line 65) | def close(self):
    method flip (line 68) | def flip(self):
    method _mainloop (line 71) | def _mainloop(self):
    method mainloop (line 74) | def mainloop(self):

FILE: tickeys/kivy/core/window/window_pygame.py
  class WindowPygame (line 35) | class WindowPygame(WindowBase):
    method create_window (line 37) | def create_window(self, *largs):
    method close (line 191) | def close(self):
    method on_title (line 195) | def on_title(self, instance, value):
    method set_icon (line 199) | def set_icon(self, filename):
    method _set_icon_standard (line 218) | def _set_icon_standard(self, filename):
    method _set_icon_win (line 230) | def _set_icon_win(self, filename):
    method screenshot (line 253) | def screenshot(self, *largs, **kwargs):
    method flip (line 272) | def flip(self):
    method toggle_fullscreen (line 277) | def toggle_fullscreen(self):
    method _mainloop (line 284) | def _mainloop(self):
    method mainloop (line 395) | def mainloop(self):
    method _pygame_set_mode (line 413) | def _pygame_set_mode(self, size=None):
    method _pygame_update_modifiers (line 421) | def _pygame_update_modifiers(self, mods=None):
    method request_keyboard (line 438) | def request_keyboard(self, callback, target, input_type='text'):
    method release_keyboard (line 445) | def release_keyboard(self, *largs):

FILE: tickeys/kivy/core/window/window_sdl2.py
  class SDL2MotionEvent (line 78) | class SDL2MotionEvent(MotionEvent):
    method depack (line 79) | def depack(self, args):
  class SDL2MotionEventProvider (line 87) | class SDL2MotionEventProvider(MotionEventProvider):
    method update (line 92) | def update(self, dispatch_fn):
  class WindowSDL (line 117) | class WindowSDL(WindowBase):
    method __init__ (line 119) | def __init__(self, **kwargs):
    method create_window (line 143) | def create_window(self, *largs):
    method close (line 215) | def close(self):
    method maximize (line 219) | def maximize(self):
    method minimize (line 225) | def minimize(self):
    method restore (line 231) | def restore(self):
    method hide (line 237) | def hide(self):
    method show (line 243) | def show(self):
    method toggle_fullscreen (line 250) | def toggle_fullscreen(self):
    method set_title (line 256) | def set_title(self, title):
    method set_icon (line 259) | def set_icon(self, filename):
    method screenshot (line 262) | def screenshot(self, *largs, **kwargs):
    method flip (line 274) | def flip(self):
    method _fix_mouse_pos (line 278) | def _fix_mouse_pos(self, x, y):
    method _mainloop (line 289) | def _mainloop(self):
    method _do_resize (line 480) | def _do_resize(self, dt):
    method do_pause (line 485) | def do_pause(self):
    method mainloop (line 518) | def mainloop(self):
    method _update_modifiers (line 538) | def _update_modifiers(self, mods=None, key=None):
    method request_keyboard (line 570) | def request_keyboard(self, callback, target, input_type='text'):
    method release_keyboard (line 577) | def release_keyboard(self, *largs):
    method _check_keyboard_shown (line 583) | def _check_keyboard_shown(self, dt):

FILE: tickeys/kivy/effects/dampedscroll.py
  class DampedScrollEffect (line 21) | class DampedScrollEffect(ScrollEffect):
    method update_velocity (line 58) | def update_velocity(self, dt):
    method on_value (line 93) | def on_value(self, *args):
    method on_overscroll (line 106) | def on_overscroll(self, *args):
    method apply_distance (line 109) | def apply_distance(self, distance):

FILE: tickeys/kivy/effects/kinetic.py
  class KineticEffect (line 48) | class KineticEffect(EventDispatcher):
    method __init__ (line 106) | def __init__(self, **kwargs):
    method apply_distance (line 112) | def apply_distance(self, distance):
    method start (line 117) | def start(self, val, t=None):
    method update (line 132) | def update(self, val, t=None):
    method stop (line 144) | def stop(self, val, t=None):
    method cancel (line 164) | def cancel(self):
    method update_velocity (line 172) | def update_velocity(self, dt):

FILE: tickeys/kivy/effects/opacityscroll.py
  class OpacityScrollEffect (line 16) | class OpacityScrollEffect(DampedScrollEffect):
    method on_overscroll (line 22) | def on_overscroll(self, *args):

FILE: tickeys/kivy/effects/scroll.py
  class ScrollEffect (line 27) | class ScrollEffect(KineticEffect):
    method reset (line 86) | def reset(self, pos):
    method on_value (line 96) | def on_value(self, *args):
    method start (line 110) | def start(self, val, t=None):
    method update (line 115) | def update(self, val, t=None):
    method stop (line 119) | def stop(self, val, t=None):

FILE: tickeys/kivy/ext/__init__.py
  function load (line 70) | def load(extname, version):
  function _is_valid_ext_name (line 150) | def _is_valid_ext_name(name):
  function unzip_extensions (line 161) | def unzip_extensions():

FILE: tickeys/kivy/extras/highlight.py
  class KivyLexer (line 11) | class KivyLexer(RegexLexer):

FILE: tickeys/kivy/factory.py
  class FactoryException (line 46) | class FactoryException(Exception):
  class FactoryBase (line 50) | class FactoryBase(object):
    method __init__ (line 52) | def __init__(self):
    method is_template (line 56) | def is_template(self, classname):
    method register (line 67) | def register(self, classname, cls=None, module=None, is_template=False,
    method unregister (line 102) | def unregister(self, *classnames):
    method unregister_from_filename (line 113) | def unregister_from_filename(self, filename):
    method __getattr__ (line 124) | def __getattr__(self, name):

FILE: tickeys/kivy/garden/__init__.py
  class GardenImporter (line 83) | class GardenImporter(object):
    method find_module (line 85) | def find_module(self, fullname, path):
    method load_module (line 89) | def load_module(self, fullname):
    method _load_module (line 102) | def _load_module(self, fullname, moddir):

FILE: tickeys/kivy/geometry.py
  function circumcircle (line 13) | def circumcircle(a, b, c):
  function minimum_bounding_circle (line 51) | def minimum_bounding_circle(points):

FILE: tickeys/kivy/gesture.py
  class GestureDatabase (line 46) | class GestureDatabase(object):
    method __init__ (line 49) | def __init__(self):
    method add_gesture (line 52) | def add_gesture(self, gesture):
    method find (line 56) | def find(self, gesture, minscore=0.9, rotation_invariant=True):
    method gesture_to_str (line 73) | def gesture_to_str(self, gesture):
    method str_to_gesture (line 81) | def str_to_gesture(self, data):
  class GesturePoint (line 89) | class GesturePoint:
    method __init__ (line 91) | def __init__(self, x, y):
    method scale (line 96) | def scale(self, factor):
    method __repr__ (line 102) | def __repr__(self):
  class GestureStroke (line 106) | class GestureStroke:
    method __init__ (line 109) | def __init__(self):
    method max_x (line 116) | def max_x(self):
    method min_x (line 122) | def min_x(self):
    method max_y (line 128) | def max_y(self):
    method min_y (line 134) | def min_y(self):
    method add_point (line 139) | def add_point(self, x, y):
    method scale_stroke (line 147) | def scale_stroke(self, scale_factor):
    method points_distance (line 154) | def points_distance(self, point1, point2):
    method stroke_length (line 163) | def stroke_length(self, point_list=None):
    method normalize_stroke (line 177) | def normalize_stroke(self, sample_points=32):
    method center_stroke (line 223) | def center_stroke(self, offset_x, offset_y):
  class Gesture (line 230) | class Gesture:
    method __init__ (line 241) | def __init__(self, tolerance=None):
    method _scale_gesture (line 255) | def _scale_gesture(self):
    method _center_gesture (line 275) | def _center_gesture(self):
    method add_stroke (line 298) | def add_stroke(self, point_list=None):
    method normalize (line 320) | def normalize(self, stroke_samples=32):
    method get_rigid_rotation (line 331) | def get_rigid_rotation(self, dstpts):
    method dot_product (line 347) | def dot_product(self, comparison_gesture):
    method rotate (line 363) | def rotate(self, angle):
    method get_score (line 374) | def get_score(self, comparison_gesture, rotation_invariant=True):
    method __eq__ (line 393) | def __eq__(self, comparison_gesture):
    method __ne__ (line 407) | def __ne__(self, comparison_gesture):
    method __lt__ (line 414) | def __lt__(self, comparison_gesture):
    method __gt__ (line 417) | def __gt__(self, comparison_gesture):
    method __le__ (line 420) | def __le__(self, comparison_gesture):
    method __ge__ (line 423) | def __ge__(self, comparison_gesture):

FILE: tickeys/kivy/input/factory.py
  class MotionEventFactory (line 11) | class MotionEventFactory:
    method register (line 22) | def register(name, classname):
    method list (line 27) | def list():
    method get (line 32) | def get(name):

FILE: tickeys/kivy/input/motionevent.py
  class EnhancedDictionary (line 95) | class EnhancedDictionary(dict):
    method __getattr__ (line 97) | def __getattr__(self, attr):
    method __setattr__ (line 103) | def __setattr__(self, attr, value):
  class MotionEventMetaclass (line 107) | class MotionEventMetaclass(type):
    method __new__ (line 109) | def __new__(mcs, name, bases, attrs):
  class MotionEvent (line 124) | class MotionEvent(MotionEventBase):
    method __init__ (line 159) | def __init__(self, device, id, args):
    method depack (line 288) | def depack(self, args):
    method grab (line 300) | def grab(self, class_instance, exclusive=False):
    method ungrab (line 331) | def ungrab(self, class_instance):
    method move (line 340) | def move(self, args):
    method scale_for_screen (line 352) | def scale_for_screen(self, w, h, p=None, rotation=0,
    method push (line 395) | def push(self, attrs=None):
    method pop (line 403) | def pop(self):
    method apply_transform_2d (line 410) | def apply_transform_2d(self, transform):
    method copy_to (line 420) | def copy_to(self, to):
    method distance (line 425) | def distance(self, other_touch):
    method update_time_end (line 430) | def update_time_end(self):
    method dpos (line 435) | def dpos(self):
    method opos (line 441) | def opos(self):
    method ppos (line 447) | def ppos(self):
    method spos (line 453) | def spos(self):
    method __str__ (line 458) | def __str__(self):
    method __repr__ (line 463) | def __repr__(self):
    method is_mouse_scrolling (line 477) | def is_mouse_scrolling(self, *args):

FILE: tickeys/kivy/input/postproc/calibration.py
  class InputPostprocCalibration (line 37) | class InputPostprocCalibration(object):
    method __init__ (line 57) | def __init__(self):
    method process (line 77) | def process(self, events):

FILE: tickeys/kivy/input/postproc/dejitter.py
  class InputPostprocDejitter (line 20) | class InputPostprocDejitter(object):
    method __init__ (line 38) | def __init__(self):
    method taxicab_distance (line 44) | def taxicab_distance(self, p, q):
    method process (line 48) | def process(self, events):

FILE: tickeys/kivy/input/postproc/doubletap.py
  class InputPostprocDoubleTap (line 15) | class InputPostprocDoubleTap(object):
    method __init__ (line 28) | def __init__(self):
    method find_double_tap (line 35) | def find_double_tap(self, ref):
    method process (line 69) | def process(self, events):

FILE: tickeys/kivy/input/postproc/ignorelist.py
  class InputPostprocIgnoreList (line 14) | class InputPostprocIgnoreList(object):
    method __init__ (line 26) | def __init__(self):
    method collide_ignore (line 29) | def collide_ignore(self, touch):
    method process (line 36) | def process(self, events):

FILE: tickeys/kivy/input/postproc/retaintouch.py
  class InputPostprocRetainTouch (line 15) | class InputPostprocRetainTouch(object):
    method __init__ (line 30) | def __init__(self):
    method process (line 36) | def process(self, events):

FILE: tickeys/kivy/input/postproc/tripletap.py
  class InputPostprocTripleTap (line 18) | class InputPostprocTripleTap(object):
    method __init__ (line 31) | def __init__(self):
    method find_triple_tap (line 38) | def find_triple_tap(self, ref):
    method process (line 74) | def process(self, events):

FILE: tickeys/kivy/input/provider.py
  class MotionEventProvider (line 15) | class MotionEventProvider(object):
    method __init__ (line 19) | def __init__(self, device, args):
    method start (line 24) | def start(self):
    method stop (line 31) | def stop(self):
    method update (line 36) | def update(self, dispatch_fn):

FILE: tickeys/kivy/input/providers/androidjoystick.py
  class AndroidMotionEvent (line 30) | class AndroidMotionEvent(MotionEvent):
    method depack (line 32) | def depack(self, args):
  class AndroidMotionEventProvider (line 42) | class AndroidMotionEventProvider(MotionEventProvider):
    method __init__ (line 44) | def __init__(self, device, args):
    method create_joystick (line 51) | def create_joystick(self, index):
    method start (line 61) | def start(self):
    method stop (line 67) | def stop(self):
    method update (line 70) | def update(self, dispatch_fn):

FILE: tickeys/kivy/input/providers/hidinput.py
  class HIDMotionEvent (line 56) | class HIDMotionEvent(MotionEvent):
    method depack (line 58) | def depack(self, args):
    method __str__ (line 73) | def __str__(self):
  class HIDInputMotionEventProvider (line 310) | class HIDInputMotionEventProvider(MotionEventProvider):
    method __init__ (line 317) | def __init__(self, device, args):
    method start (line 378) | def start(self):
    method _thread_run (line 393) | def _thread_run(self, **kwargs):
    method update (line 703) | def update(self, dispatch_fn):

FILE: tickeys/kivy/input/providers/leapfinger.py
  function normalize (line 20) | def normalize(value, a, b):
  class LeapFingerEvent (line 24) | class LeapFingerEvent(MotionEvent):
    method depack (line 26) | def depack(self, args):
  class LeapFingerEventProvider (line 39) | class LeapFingerEventProvider(MotionEventProvider):
    method start (line 43) | def start(self):
    method update (line 73) | def update(self, dispatch_fn):
    method process_frame (line 83) | def process_frame(self, frame):

FILE: tickeys/kivy/input/providers/linuxwacom.py
  class LinuxWacomMotionEvent (line 35) | class LinuxWacomMotionEvent(MotionEvent):
    method depack (line 37) | def depack(self, args):
    method __str__ (line 52) | def __str__(self):
  class LinuxWacomMotionEventProvider (line 131) | class LinuxWacomMotionEventProvider(MotionEventProvider):
    method __init__ (line 138) | def __init__(self, device, args):
    method start (line 191) | def start(self):
    method _thread_run (line 206) | def _thread_run(self, **kwargs):
    method update (line 382) | def update(self, dispatch_fn):

FILE: tickeys/kivy/input/providers/mactouch.py
  class MTPoint (line 38) | class MTPoint(ctypes.Structure):
  class MTVector (line 42) | class MTVector(ctypes.Structure):
  class MTData (line 46) | class MTData(ctypes.Structure):
  class MacMotionEvent (line 91) | class MacMotionEvent(MotionEvent):
    method depack (line 96) | def depack(self, args):
    method __str__ (line 105) | def __str__(self):
  class MacMotionEventProvider (line 112) | class MacMotionEventProvider(MotionEventProvider):
    method __init__ (line 114) | def __init__(self, *largs, **kwargs):
    method start (line 121) | def start(self):
    method update (line 143) | def update(self, dispatch_fn):
    method stop (line 152) | def stop(self):
    method _mts_callback (line 157) | def _mts_callback(device, data_ptr, n_fingers, timestamp, frame):

FILE: tickeys/kivy/input/providers/mouse.py
  class MouseMotionEvent (line 76) | class MouseMotionEvent(MotionEvent):
    method depack (line 78) | def depack(self, args):
    method update_graphics (line 95) | def update_graphics(self, win, create=False):
    method clear_graphics (line 115) | def clear_graphics(self, win):
  class MouseMotionEventProvider (line 122) | class MouseMotionEventProvider(MotionEventProvider):
    method __init__ (line 125) | def __init__(self, device, args):
    method start (line 151) | def start(self):
    method stop (line 160) | def stop(self):
    method test_activity (line 169) | def test_activity(self):
    method find_touch (line 184) | def find_touch(self, x, y):
    method create_touch (line 191) | def create_touch(self, rx, ry, is_double_tap, do_graphics, button):
    method remove_touch (line 206) | def remove_touch(self, cur):
    method on_mouse_motion (line 214) | def on_mouse_motion(self, win, x, y, modifiers):
    method on_mouse_press (line 229) | def on_mouse_press(self, win, x, y, button, modifiers):
    method on_mouse_release (line 248) | def on_mouse_release(self, win, x, y, button, modifiers):
    method update (line 267) | def update(self, dispatch_fn):

FILE: tickeys/kivy/input/providers/mtdev.py
  class MTDMotionEvent (line 45) | class MTDMotionEvent(MotionEvent):
    method depack (line 47) | def depack(self, args):
    method __str__ (line 62) | def __str__(self):
  class MTDMotionEventProvider (line 85) | class MTDMotionEventProvider(MotionEventProvider):
    method __init__ (line 94) | def __init__(self, device, args):
    method start (line 141) | def start(self):
    method _thread_run (line 156) | def _thread_run(self, **kwargs):
    method update (line 305) | def update(self, dispatch_fn):

FILE: tickeys/kivy/input/providers/probesysfs.py
  class Input (line 62) | class Input(object):
    method __init__ (line 64) | def __init__(self, path):
    method device (line 68) | def device(self):
    method name (line 73) | def name(self):
    method get_capabilities (line 77) | def get_capabilities(self):
    method has_capability (line 90) | def has_capability(self, capability):
  function getconf (line 94) | def getconf(var):
  function get_inputs (line 98) | def get_inputs(path):
  function read_line (line 105) | def read_line(path):
  class ProbeSysfsHardwareProbe (line 112) | class ProbeSysfsHardwareProbe(MotionEventProvider):
    method __new__ (line 114) | def __new__(self, device, args):
    method __init__ (line 120) | def __init__(self, device, args):
    method probe (line 157) | def probe(self):

FILE: tickeys/kivy/input/providers/tuio.py
  class TuioMotionEventProvider (line 51) | class TuioMotionEventProvider(MotionEventProvider):
    method __init__ (line 91) | def __init__(self, device, args):
    method register (line 115) | def register(oscpath, classname):
    method unregister (line 120) | def unregister(oscpath, classname):
    method create (line 126) | def create(oscpath, **kwargs):
    method start (line 132) | def start(self):
    method stop (line 139) | def stop(self):
    method update (line 143) | def update(self, dispatch_fn):
    method _osc_tuio_cb (line 158) | def _osc_tuio_cb(self, *incoming):
    method _update (line 163) | def _update(self, dispatch_fn, value):
  class TuioMotionEvent (line 202) | class TuioMotionEvent(MotionEvent):
    method __init__ (line 219) | def __init__(self, device, id, args):
  class Tuio2dCurMotionEvent (line 242) | class Tuio2dCurMotionEvent(TuioMotionEvent):
    method __init__ (line 245) | def __init__(self, device, id, args):
    method depack (line 248) | def depack(self, args):
  class Tuio2dObjMotionEvent (line 271) | class Tuio2dObjMotionEvent(TuioMotionEvent):
    method __init__ (line 275) | def __init__(self, device, id, args):
    method depack (line 278) | def depack(self, args):
  class Tuio2dBlbMotionEvent (line 303) | class Tuio2dBlbMotionEvent(TuioMotionEvent):
    method __init__ (line 310) | def __init__(self, device, id, args):
    method depack (line 313) | def depack(self, args):

FILE: tickeys/kivy/input/providers/wm_pen.py
  class WM_Pen (line 17) | class WM_Pen(MotionEvent):
    method depack (line 20) | def depack(self, args):
    method __str__ (line 25) | def __str__(self):
  class RECT (line 44) | class RECT(Structure):
  class WM_PenProvider (line 76) | class WM_PenProvider(MotionEventProvider):
    method _is_pen_message (line 78) | def _is_pen_message(self, msg):
    method _pen_handler (line 85) | def _pen_handler(self, msg, wParam, lParam):
    method _pen_wndProc (line 105) | def _pen_wndProc(self, hwnd, msg, wParam, lParam):
    method start (line 115) | def start(self):
    method update (line 129) | def update(self, dispatch_fn):
    method stop (line 147) | def stop(self):

FILE: tickeys/kivy/input/providers/wm_touch.py
  class WM_MotionEvent (line 19) | class WM_MotionEvent(MotionEvent):
    method depack (line 25) | def depack(self, args):
    method __str__ (line 36) | def __str__(self):
  class TOUCHINPUT (line 60) | class TOUCHINPUT(Structure):
    method size (line 73) | def size(self):
    method screen_x (line 76) | def screen_x(self):
    method screen_y (line 79) | def screen_y(self):
    method _event_type (line 82) | def _event_type(self):
  class RECT (line 91) | class RECT(Structure):
  class WM_MotionEventProvider (line 133) | class WM_MotionEventProvider(MotionEventProvider):
    method start (line 135) | def start(self):
    method update (line 152) | def update(self, dispatch_fn):
    method stop (line 186) | def stop(self):
    method _touch_wndProc (line 193) | def _touch_wndProc(self, hwnd, msg, wParam, lParam):
    method _touch_handler (line 211) | def _touch_handler(self, msg, wParam, lParam):
    method _mouse_handler (line 223) | def _mouse_handler(self, msg, wparam, lParam):

FILE: tickeys/kivy/input/recorder.py
  class RecorderMotionEvent (line 105) | class RecorderMotionEvent(MotionEvent):
    method depack (line 107) | def depack(self, args):
  class Recorder (line 113) | class Recorder(EventDispatcher):
    method __init__ (line 171) | def __init__(self, **kwargs):
    method on_motion (line 183) | def on_motion(self, window, etype, motionevent):
    method on_keyboard (line 196) | def on_keyboard(self, etype, window, key, *args, **kwargs):
    method release (line 208) | def release(self):
    method on_record (line 214) | def on_record(self, instance, value):
    method stop (line 228) | def stop(self):
    method start (line 231) | def start(self):
    method on_play (line 234) | def on_play(self, instance, value):
    method update (line 265) | def update(self, dispatch_fn):
  function start (line 316) | def start(win, ctx):
  function stop (line 320) | def stop(win, ctx):

FILE: tickeys/kivy/input/shape.py
  class Shape (line 11) | class Shape(object):
  class ShapeRect (line 16) | class ShapeRect(Shape):
    method __init__ (line 20) | def __init__(self):

FILE: tickeys/kivy/interactive.py
  function safeWait (line 165) | def safeWait(dt):
  function unwrap (line 171) | def unwrap(ob):
  class SafeMembrane (line 177) | class SafeMembrane(object):
    method __init__ (line 190) | def __init__(self, ob, *args, **kwargs):
    method safeIn (line 195) | def safeIn(self):
    method safeOut (line 201) | def safeOut(self):
    method isMethod (line 205) | def isMethod(self, fn):
    method __repr__ (line 213) | def __repr__(self):
    method __call__ (line 216) | def __call__(self, *args, **kw):
    method __getattribute__ (line 226) | def __getattribute__(self, attr, oga=object.__getattribute__):
    method __getattr__ (line 234) | def __getattr__(self, attr, oga=object.__getattribute__):
    method __setattr__ (line 238) | def __setattr__(self, attr, val, osa=object.__setattr__):
    method __delattr__ (line 248) | def __delattr__(self, attr, oda=object.__delattr__):
    method __bool__ (line 253) | def __bool__(self):
    method __getitem__ (line 256) | def __getitem__(self, arg):
    method __setitem__ (line 259) | def __setitem__(self, arg, val):
    method __delitem__ (line 265) | def __delitem__(self, arg):
    method __getslice__ (line 270) | def __getslice__(self, i, j):
    method __setslice__ (line 273) | def __setslice__(self, i, j, val):
    method __delslice__ (line 279) | def __delslice__(self, i, j):
    method __enter__ (line 284) | def __enter__(self, *args, **kwargs):
    method __exit__ (line 288) | def __exit__(self, *args, **kwargs):
  class InteractiveLauncher (line 293) | class InteractiveLauncher(SafeMembrane):
    method __init__ (line 301) | def __init__(self, app=None, *args, **kwargs):
    method run (line 316) | def run(self):
    method stop (line 322) | def stop(self):
    method __repr__ (line 327) | def __repr__(self):

FILE: tickeys/kivy/lang.py
  class ProxyApp (line 835) | class ProxyApp(object):
    method __init__ (line 841) | def __init__(self):
    method _ensure_app (line 845) | def _ensure_app(self):
    method __getattribute__ (line 856) | def __getattribute__(self, name):
    method __delattr__ (line 860) | def __delattr__(self, name):
    method __setattr__ (line 864) | def __setattr__(self, name, value):
    method __bool__ (line 868) | def __bool__(self):
    method __str__ (line 872) | def __str__(self):
    method __repr__ (line 876) | def __repr__(self):
  class ParserException (line 897) | class ParserException(Exception):
    method __init__ (line 901) | def __init__(self, context, line, message, cause=None):
  class BuilderException (line 924) | class BuilderException(ParserException):
  class ParserRuleProperty (line 930) | class ParserRuleProperty(object):
    method __init__ (line 937) | def __init__(self, ctx, line, name, value):
    method precompile (line 956) | def precompile(self):
    method __repr__ (line 998) | def __repr__(self):
  class ParserRule (line 1005) | class ParserRule(object):
    method __init__ (line 1013) | def __init__(self, ctx, line, name, level):
    method precompile (line 1047) | def precompile(self):
    method create_missing (line 1061) | def create_missing(self, widget):
    method _forbid_selectors (line 1075) | def _forbid_selectors(self):
    method _detect_selectors (line 1082) | def _detect_selectors(self):
    method _build_rule (line 1095) | def _build_rule(self):
    method _build_template (line 1141) | def _build_template(self):
    method __repr__ (line 1155) | def __repr__(self):
  class Parser (line 1159) | class Parser(object):
    method __init__ (line 1173) | def __init__(self, **kwargs):
    method execute_directives (line 1187) | def execute_directives(self):
    method parse (line 1265) | def parse(self, content):
    method strip_comments (line 1299) | def strip_comments(self, lines):
    method parse_level (line 1314) | def parse_level(self, level, lines, spaces=0):
  function get_proxy (line 1456) | def get_proxy(widget):
  function custom_callback (line 1463) | def custom_callback(__kvlang__, idmap, *largs, **kwargs):
  function call_fn (line 1468) | def call_fn(args, instance, v):
  function delayed_call_fn (line 1480) | def delayed_call_fn(args, instance, v):
  function update_intermediates (line 1494) | def update_intermediates(base, keys, bound, s, fn, args, instance, value):
  function create_handler (line 1585) | def create_handler(iself, element, key, value, rule, idmap, delayed=False):
  class ParserSelector (line 1657) | class ParserSelector(object):
    method __init__ (line 1659) | def __init__(self, key):
    method match (line 1662) | def match(self, widget):
    method __repr__ (line 1665) | def __repr__(self):
  class ParserSelectorId (line 1669) | class ParserSelectorId(ParserSelector):
    method match (line 1671) | def match(self, widget):
  class ParserSelectorClass (line 1676) | class ParserSelectorClass(ParserSelector):
    method match (line 1678) | def match(self, widget):
  class ParserSelectorName (line 1682) | class ParserSelectorName(ParserSelector):
    method get_bases (line 1686) | def get_bases(self, cls):
    method match (line 1696) | def match(self, widget):
  class BuilderBase (line 1706) | class BuilderBase(object):
    method __init__ (line 1716) | def __init__(self):
    method load_file (line 1724) | def load_file(self, filename, **kwargs):
    method unload_file (line 1751) | def unload_file(self, filename):
    method load_string (line 1776) | def load_string(self, string, **kwargs):
    method template (line 1833) | def template(self, *args, **ctx):
    method apply (line 1863) | def apply(self, widget):
    method _clear_matchcache (line 1874) | def _clear_matchcache(self):
    method _apply_rule (line 1877) | def _apply_rule(self, widget, rule, rootrule, template_ctx=None):
    method match (line 2051) | def match(self, widget):
    method sync (line 2067) | def sync(self):
    method unbind_widget (line 2090) | def unbind_widget(self, uid):
    method _build_canvas (line 2111) | def _build_canvas(self, canvas, widget, rule, rootrule):
  function match_rule (line 2149) | def match_rule(fn, index, rule):
  function dump_builder_stats (line 2169) | def dump_builder_stats():

FILE: tickeys/kivy/loader.py
  class ProxyImage (line 56) | class ProxyImage(Image):
    method __init__ (line 70) | def __init__(self, arg, **kwargs):
    method on_load (line 75) | def on_load(self):
  class LoaderBase (line 79) | class LoaderBase(object):
    method __init__ (line 87) | def __init__(self):
    method __del__ (line 102) | def __del__(self):
    method _set_num_workers (line 108) | def _set_num_workers(self, num):
    method _get_num_workers (line 113) | def _get_num_workers(self):
    method _set_max_upload_per_frame (line 133) | def _set_max_upload_per_frame(self, num):
    method _get_max_upload_per_frame (line 138) | def _get_max_upload_per_frame(self):
    method _get_loading_image (line 160) | def _get_loading_image(self):
    method _set_loading_image (line 166) | def _set_loading_image(self, image):
    method _get_error_image (line 182) | def _get_error_image(self):
    method _set_error_image (line 189) | def _set_error_image(self, image):
    method start (line 205) | def start(self):
    method run (line 209) | def run(self, *largs):
    method stop (line 213) | def stop(self):
    method pause (line 217) | def pause(self):
    method resume (line 224) | def resume(self):
    method _wait_for_resume (line 234) | def _wait_for_resume(self):
    method _load (line 240) | def _load(self, kwargs):
    method _load_local (line 273) | def _load_local(self, filename, kwargs):
    method _load_urllib (line 279) | def _load_urllib(self, filename, kwargs):
    method _update (line 365) | def _update(self, *largs):
    method image (line 401) | def image(self, filename, load_callback=None, post_callback=None,
  class _Worker (line 470) | class _Worker(Thread):
    method __init__ (line 473) | def __init__(self, pool, tasks):
    method run (line 480) | def run(self):
  class _ThreadPool (line 489) | class _ThreadPool(object):
    method __init__ (line 492) | def __init__(self, num_threads):
    method add_task (line 499) | def add_task(self, func, *args, **kargs):
    method stop (line 504) | def stop(self):
  class LoaderThreadPool (line 508) | class LoaderThreadPool(LoaderBase):
    method __init__ (line 509) | def __init__(self):
    method start (line 513) | def start(self):
    method stop (line 518) | def stop(self):
    method run (line 523) | def run(self, *largs):

FILE: tickeys/kivy/logger.py
  function formatter_message (line 78) | def formatter_message(message, use_color=True):
  class FileHandler (line 104) | class FileHandler(logging.Handler):
    method purge_logs (line 109) | def purge_logs(self, directory):
    method _configure (line 143) | def _configure(self, *largs, **kwargs):
    method _write_message (line 179) | def _write_message(self, record):
    method emit (line 192) | def emit(self, message):
  class LoggerHistory (line 221) | class LoggerHistory(logging.Handler):
    method emit (line 225) | def emit(self, message):
  class ColoredFormatter (line 229) | class ColoredFormatter(logging.Formatter):
    method __init__ (line 231) | def __init__(self, msg, use_color=True):
    method format (line 235) | def format(self, record):
  class ConsoleHandler (line 253) | class ConsoleHandler(logging.StreamHandler):
    method filter (line 255) | def filter(self, record):
  class LogFile (line 267) | class LogFile(object):
    method __init__ (line 269) | def __init__(self, channel, func):
    method write (line 275) | def write(self, s):
    method flush (line 285) | def flush(self):
  function logger_config_update (line 289) | def logger_config_update(section, key, value):

FILE: tickeys/kivy/metrics.py
  function pt (line 109) | def pt(value):
  function inch (line 115) | def inch(value):
  function cm (line 121) | def cm(value):
  function mm (line 127) | def mm(value):
  function dp (line 133) | def dp(value):
  function sp (line 139) | def sp(value):
  class MetricsBase (line 145) | class MetricsBase(object):
    method dpi (line 151) | def dpi(self):
    method dpi_rounded (line 173) | def dpi_rounded(self):
    method density (line 187) | def density(self):
    method fontscale (line 211) | def fontscale(self):

FILE: tickeys/kivy/modules/__init__.py
  class ModuleContext (line 102) | class ModuleContext:
    method __init__ (line 108) | def __init__(self):
    method __repr__ (line 111) | def __repr__(self):
  class ModuleBase (line 115) | class ModuleBase:
    method __init__ (line 119) | def __init__(self, **kwargs):
    method add_path (line 123) | def add_path(self, path):
    method list (line 140) | def list(self):
    method import_module (line 144) | def import_module(self, name):
    method activate_module (line 167) | def activate_module(self, name, win):
    method deactivate_module (line 188) | def deactivate_module(self, name, win):
    method register_window (line 201) | def register_window(self, win):
    method unregister_window (line 207) | def unregister_window(self, win):
    method update (line 213) | def update(self):
    method configure (line 228) | def configure(self):
    method _configure_module (line 238) | def _configure_module(self, name):
    method usage_list (line 266) | def usage_list(self):

FILE: tickeys/kivy/modules/_webdebugger.py
  class MissingOrderedDict (line 20) | class MissingOrderedDict(OrderedDict):
    method __missing__ (line 22) | def __missing__(self, key):
  function index (line 32) | def index():
  function metrics_json (line 37) | def metrics_json():
  function getfile (line 44) | def getfile(name):
  class FlaskThread (line 55) | class FlaskThread(threading.Thread):
    method run (line 57) | def run(self):
    method dump_metrics (line 61) | def dump_metrics(self, dt):
  function start (line 76) | def start(win, ctx):
  function stop (line 82) | def stop(win, ctx):

FILE: tickeys/kivy/modules/inspector.py
  class TreeViewProperty (line 177) | class TreeViewProperty(BoxLayout, TreeViewNode):
    method _get_widget (line 181) | def _get_widget(self):
  class Inspector (line 199) | class Inspector(FloatLayout):
    method __init__ (line 217) | def __init__(self, **kwargs):
    method on_touch_down (line 231) | def on_touch_down(self, touch):
    method on_touch_move (line 242) | def on_touch_move(self, touch):
    method on_touch_up (line 249) | def on_touch_up(self, touch):
    method on_window_children (line 255) | def on_window_children(self, win, children):
    method highlight_at (line 263) | def highlight_at(self, x, y):
    method highlight_widget (line 280) | def highlight_widget(self, widget, info=True, *largs):
    method update_widget_graphics (line 288) | def update_widget_graphics(self, *l):
    method toggle_position (line 320) | def toggle_position(self, button):
    method pick (line 347) | def pick(self, widget, x, y):
    method on_activated (line 360) | def on_activated(self, instance, activated):
    method animation_close (line 380) | def animation_close(self, instance, value):
    method show_widget_info (line 391) | def show_widget_info(self):
    method update_node_content (line 429) | def update_node_content(self, node, *l):
    method keyboard_shortcut (line 436) | def keyboard_shortcut(self, win, scancode, *largs):
    method show_property (line 451) | def show_property(self, instance, value, key=None, index=-1, *l):
    method save_property_numeric (line 536) | def save_property_numeric(self, widget, key, index, instance, value):
    method save_property_text (line 545) | def save_property_text(self, widget, key, index, instance, value):
    method save_property_boolean (line 554) | def save_property_boolean(self, widget, key, index, instance, ):
    method save_property_option (line 564) | def save_property_option(self, widget, key, instance, *l):
  function create_inspector (line 571) | def create_inspector(win, ctx, *l):
  function start (line 590) | def start(win, ctx):
  function stop (line 594) | def stop(win, ctx):

FILE: tickeys/kivy/modules/keybinding.py
  function _on_keyboard_handler (line 46) | def _on_keyboard_handler(instance, key, scancode, codepoint, modifiers):
  function start (line 59) | def start(win, ctx):
  function stop (line 63) | def stop(win, ctx):

FILE: tickeys/kivy/modules/monitor.py
  function update_fps (line 29) | def update_fps(ctx, *largs):
  function update_stats (line 35) | def update_stats(ctx, *largs):
  class StatsInput (line 44) | class StatsInput(object):
    method process (line 46) | def process(self, events):
  function start (line 54) | def start(win, ctx):
  function stop (line 79) | def stop(win, ctx):

FILE: tickeys/kivy/modules/recorder.py
  function replay (line 46) | def replay(recorder, *args):
  function on_recorder_key (line 53) | def on_recorder_key(recorder, window, key, *largs):
  function start (line 72) | def start(win, ctx):
  function stop (line 95) | def stop(win, ctx):

FILE: tickeys/kivy/modules/screen.py
  function start (line 59) | def start(win, ctx):
  function stop (line 63) | def stop(win, ctx):
  function apply_device (line 67) | def apply_device(device, scale, orientation):
  function usage (line 89) | def usage(device=None):
  function configure (line 112) | def configure(ctx):

FILE: tickeys/kivy/modules/touchring.py
  function _touch_down (line 57) | def _touch_down(win, touch):
  function _touch_move (line 75) | def _touch_move(win, touch):
  function _touch_up (line 82) | def _touch_up(win, touch):
  function _mouse_move (line 93) | def _mouse_move(win, pos, *args):
  function start (line 112) | def start(win, ctx):
  function stop (line 141) | def stop(win, ctx):

FILE: tickeys/kivy/multistroke.py
  class MultistrokeError (line 149) | class MultistrokeError(Exception):
  class Recognizer (line 157) | class Recognizer(EventDispatcher):
    method __init__ (line 180) | def __init__(self, **kwargs):
    method filter (line 185) | def filter(self, **kwargs):
    method add_gesture (line 350) | def add_gesture(self, name, strokes, **kwargs):
    method parse_gesture (line 364) | def parse_gesture(self, data):
    method export_gesture (line 382) | def export_gesture(self, filename=None, **kwargs):
    method import_gesture (line 420) | def import_gesture(self, data=None, filename=None, **kwargs):
    method transfer_gesture (line 437) | def transfer_gesture(self, tgt, **kwargs):
    method prepare_templates (line 450) | def prepare_templates(self, **kwargs):
    method recognize (line 468) | def recognize(self, strokes, goodscore=None, timeout=0, delay=0, **kwa...
    method _candidate (line 611) | def _candidate(self, strokes, **kwargs):
    method on_search_start (line 634) | def on_search_start(self, result):
    method on_search_complete (line 637) | def on_search_complete(self, result):
  class ProgressTracker (line 645) | class ProgressTracker(EventDispatcher):
    method __init__ (line 708) | def __init__(self, candidate, tasks, **kwargs):
    method progress (line 727) | def progress(self):
    method best (line 735) | def best(self):
    method stop (line 750) | def stop(self):
    method _add_result (line 755) | def _add_result(self, gesture, dist, tpl, res):
    method on_complete (line 781) | def on_complete(self):
    method on_progress (line 784) | def on_progress(self):
    method on_result (line 787) | def on_result(self, result):
  class MultistrokeGesture (line 795) | class MultistrokeGesture(object):
    method __init__ (line 853) | def __init__(self, name, strokes=None, **kwargs):
    method angle_similarity_threshold (line 872) | def angle_similarity_threshold(self):
    method add_stroke (line 875) | def add_stroke(self, stroke, permute=False):
    method get_distance (line 882) | def get_distance(self, cand, tpl, numpoints=None):
    method match_candidate (line 920) | def match_candidate(self, cand, **kwargs):
    method permute (line 987) | def permute(self):
    method _heap_permute (line 1029) | def _heap_permute(self, n):
    method _make_unistrokes (line 1047) | def _make_unistrokes(self):
  class UnistrokeTemplate (line 1073) | class UnistrokeTemplate(object):
    method __init__ (line 1098) | def __init__(self, name, points=None, **kwargs):
    method add_point (line 1109) | def add_point(self, p):
    method _get_db_key (line 1117) | def _get_db_key(self, key, numpoints=None):
    method get_start_unit_vector (line 1123) | def get_start_unit_vector(self, numpoints=None):
    method get_vector (line 1126) | def get_vector(self, numpoints=None):
    method get_points (line 1129) | def get_points(self, numpoints=None):
    method prepare (line 1132) | def prepare(self, numpoints=None):
  class Candidate (line 1169) | class Candidate(object):
    method __init__ (line 1192) | def __init__(self, strokes=None, numpoints=16, **kwargs):
    method add_stroke (line 1203) | def add_stroke(self, stroke):
    method _get_db_key (line 1210) | def _get_db_key(self, key, numpoints, orientation_sens):
    method get_start_unit_vector (line 1218) | def get_start_unit_vector(self, numpoints, orientation_sens):
    method get_protractor_vector (line 1226) | def get_protractor_vector(self, numpoints, orientation_sens):
    method get_angle_similarity (line 1231) | def get_angle_similarity(self, tpl, **kwargs):
    method prepare (line 1250) | def prepare(self, numpoints=None):
  function resample (line 1288) | def resample(points, n):
  function indicative_angle (line 1329) | def indicative_angle(points):
  function rotate_by (line 1334) | def rotate_by(points, radians):
  function scale_dim (line 1350) | def scale_dim(points, size, oneDratio):
  function translate_to (line 1377) | def translate_to(points, pt):
  function vectorize (line 1389) | def vectorize(points, use_bounded_rotation_invariance):
  function centroid (line 1420) | def centroid(points):
  function bounding_box (line 1435) | def bounding_box(points):
  function path_length (line 1454) | def path_length(points):
  function distance (line 1461) | def distance(p1, p2):
  function start_unit_vector (line 1467) | def start_unit_vector(points, index):

FILE: tickeys/kivy/network/urlrequest.py
  class UrlRequest (line 93) | class UrlRequest(Thread):
    method __init__ (line 152) | def __init__(self, url, on_success=None, on_redirect=None,
    method run (line 193) | def run(self):
    method _fetch_url (line 220) | def _fetch_url(self, url, body, headers, q):
    method get_connection_for_scheme (line 329) | def get_connection_for_scheme(self, scheme):
    method decode_result (line 343) | def decode_result(self, result, resp):
    method _dispatch_result (line 360) | def _dispatch_result(self, dt):
    method is_finished (line 436) | def is_finished(self):
    method result (line 443) | def result(self):
    method resp_headers (line 450) | def resp_headers(self):
    method resp_status (line 457) | def resp_status(self):
    method error (line 464) | def error(self):
    method chunk_size (line 471) | def chunk_size(self):
    method wait (line 477) | def wait(self, delay=0.5):
  function on_success (line 497) | def on_success(req, result):
  function on_error (line 501) | def on_error(req, error):

FILE: tickeys/kivy/parser.py
  class ColorException (line 17) | class ColorException(Exception):
  function parse_filename (line 21) | def parse_filename(filename):
  function color_error (line 32) | def color_error(text):
  function parse_color (line 38) | def parse_color(text):
  function parse_bool (line 91) | def parse_bool(text):
  function parse_string (line 101) | def parse_string(text):
  function parse_int2 (line 108) | def parse_int2(text):
  function parse_float4 (line 126) | def parse_float4(text):

FILE: tickeys/kivy/resources.py
  function resource_find (line 25) | def resource_find(filename):
  function resource_add_path (line 42) | def resource_add_path(path):
  function resource_remove_path (line 51) | def resource_remove_path(path):

FILE: tickeys/kivy/storage/__init__.py
  class AbstractStore (line 127) | class AbstractStore(EventDispatcher):
    method __init__ (line 131) | def __init__(self, **kwargs):
    method exists (line 135) | def exists(self, key):
    method async_exists (line 140) | def async_exists(self, callback, key):
    method get (line 154) | def get(self, key):
    method async_get (line 160) | def async_get(self, callback, key):
    method put (line 173) | def put(self, key, **values):
    method async_put (line 182) | def async_put(self, callback, key, **values):
    method delete (line 197) | def delete(self, key):
    method async_delete (line 205) | def async_delete(self, callback, key):
    method find (line 220) | def find(self, **filters):
    method async_find (line 238) | def async_find(self, callback, **filters):
    method keys (line 256) | def keys(self):
    method async_keys (line 261) | def async_keys(self, callback):
    method count (line 266) | def count(self):
    method async_count (line 271) | def async_count(self, callback):
    method clear (line 276) | def clear(self):
    method async_clear (line 281) | def async_clear(self, callback):
    method __setitem__ (line 290) | def __setitem__(self, key, values):
    method __getitem__ (line 295) | def __getitem__(self, key):
    method __delitem__ (line 298) | def __delitem__(self, key):
    method __contains__ (line 301) | def __contains__(self, key):
    method __len__ (line 304) | def __len__(self):
    method __iter__ (line 307) | def __iter__(self):
    method store_load (line 315) | def store_load(self):
    method store_sync (line 318) | def store_sync(self):
    method store_get (line 321) | def store_get(self, key):
    method store_put (line 324) | def store_put(self, key, value):
    method store_exists (line 327) | def store_exists(self, key):
    method store_delete (line 330) | def store_delete(self, key):
    method store_find (line 333) | def store_find(self, filters):
    method store_keys (line 336) | def store_keys(self):
    method store_count (line 339) | def store_count(self):
    method store_clear (line 342) | def store_clear(self):
    method store_get_async (line 346) | def store_get_async(self, key, callback):
    method store_put_async (line 353) | def store_put_async(self, key, value, callback):
    method store_exists_async (line 360) | def store_exists_async(self, key, callback):
    method store_delete_async (line 367) | def store_delete_async(self, key, callback):
    method store_find_async (line 374) | def store_find_async(self, filters, callback):
    method store_count_async (line 379) | def store_count_async(self, callback):
    method store_keys_async (line 386) | def store_keys_async(self, callback):
    method store_clear_async (line 393) | def store_clear_async(self, callback):
    method _schedule (line 401) | def _schedule(self, cb, **kwargs):

FILE: tickeys/kivy/storage/dictstore.py
  class DictStore (line 20) | class DictStore(AbstractStore):
    method __init__ (line 24) | def __init__(self, filename, data=None, **kwargs):
    method store_load (line 35) | def store_load(self):
    method store_sync (line 45) | def store_sync(self):
    method store_exists (line 56) | def store_exists(self, key):
    method store_get (line 59) | def store_get(self, key):
    method store_put (line 62) | def store_put(self, key, value):
    method store_delete (line 67) | def store_delete(self, key):
    method store_find (line 72) | def store_find(self, filters):
    method store_count (line 85) | def store_count(self):
    method store_keys (line 88) | def store_keys(self):

FILE: tickeys/kivy/storage/jsonstore.py
  class JsonStore (line 17) | class JsonStore(AbstractStore):
    method __init__ (line 21) | def __init__(self, filename, **kwargs):
    method store_load (line 27) | def store_load(self):
    method store_sync (line 36) | def store_sync(self):
    method store_exists (line 43) | def store_exists(self, key):
    method store_get (line 46) | def store_get(self, key):
    method store_put (line 49) | def store_put(self, key, value):
    method store_delete (line 54) | def store_delete(self, key):
    method store_find (line 59) | def store_find(self, filters):
    method store_count (line 72) | def store_count(self):
    method store_keys (line 75) | def store_keys(self):

FILE: tickeys/kivy/storage/redisstore.py
  class RedisStore (line 40) | class RedisStore(AbstractStore):
    method __init__ (line 47) | def __init__(self, redis_params, **kwargs):
    method store_load (line 52) | def store_load(self):
    method store_sync (line 55) | def store_sync(self):
    method store_exists (line 58) | def store_exists(self, key):
    method store_get (line 63) | def store_get(self, key):
    method store_put (line 72) | def store_put(self, key, values):
    method store_delete (line 81) | def store_delete(self, key):
    method store_keys (line 87) | def store_keys(self):
    method store_find (line 91) | def store_find(self, filters):

FILE: tickeys/kivy/support.py
  function install_gobject_iteration (line 13) | def install_gobject_iteration():
  function _android_ask_redraw (line 53) | def _android_ask_redraw(*largs):
  function install_android (line 64) | def install_android():
  function install_twisted_reactor (line 144) | def install_twisted_reactor(**kwargs):
  function uninstall_twisted_reactor (line 241) | def uninstall_twisted_reactor():

FILE: tickeys/kivy/tools/benchmark.py
  class FakeMotionEvent (line 36) | class FakeMotionEvent(MotionEvent):
  class bench_widget_creation (line 40) | class bench_widget_creation:
    method run (line 43) | def run(self):
  class bench_widget_creation_with_root (line 49) | class bench_widget_creation_with_root:
    method run (line 52) | def run(self):
  class bench_widget_draw (line 58) | class bench_widget_draw:
    method __init__ (line 61) | def __init__(self):
    method run (line 68) | def run(self):
  class bench_widget_dispatch (line 72) | class bench_widget_dispatch:
    method __init__ (line 75) | def __init__(self):
    method run (line 84) | def run(self):
  class bench_label_creation (line 91) | class bench_label_creation:
    method __init__ (line 94) | def __init__(self):
    method run (line 101) | def run(self):
  class bench_button_creation (line 107) | class bench_button_creation:
    method __init__ (line 110) | def __init__(self):
    method run (line 117) | def run(self):
  class bench_label_creation_with_tick (line 123) | class bench_label_creation_with_tick:
    method __init__ (line 126) | def __init__(self):
    method run (line 133) | def run(self):
  class bench_button_creation_with_tick (line 141) | class bench_button_creation_with_tick:
    method __init__ (line 144) | def __init__(self):
    method run (line 151) | def run(self):
  function log (line 164) | def log(s, newline=True):

FILE: tickeys/kivy/tools/extensions/make-kivyext.py
  function prompt (line 119) | def prompt(name, default=None):
  function prompt_bool (line 130) | def prompt_bool(name, default=False):
  function prompt_choices (line 141) | def prompt_choices(name, choices):
  function guess_package (line 154) | def guess_package(name):
  class Extension (line 160) | class Extension(object):
    method __init__ (line 162) | def __init__(self, name, shortname, author, email, output_folder):
    method make_folder (line 169) | def make_folder(self):
    method create_files (line 174) | def create_files(self):
  function main (line 195) | def main():

FILE: tickeys/kivy/tools/generate-icons.py
  class Converter (line 17) | class Converter(object):
    method run (line 56) | def run(self):
    method convert_to (line 90) | def convert_to(self, source, icon_fn, size):
    method ensure_quality (line 94) | def ensure_quality(self, image, force=False):
    method iterate (line 111) | def iterate(self):

FILE: tickeys/kivy/tools/packaging/factory.py
  class FactoryBuild (line 22) | class FactoryBuild(Command):
    method initialize_options (line 26) | def initialize_options(self):
    method finalize_options (line 29) | def finalize_options(self):
    method run (line 32) | def run(self):

FILE: tickeys/kivy/tools/packaging/pyinstaller_hooks/__init__.py
  function install_hooks (line 7) | def install_hooks(sym, hookspath=None):

FILE: tickeys/kivy/tools/packaging/pyinstaller_hooks/hook-kivy.py
  function get_modules (line 18) | def get_modules():

FILE: tickeys/kivy/tools/packaging/pyinstaller_hooks/rt-hook-kivy.py
  function getResource (line 38) | def getResource(identifier, *args, **kwargs):

FILE: tickeys/kivy/tools/report.py
  function title (line 23) | def title(t):
  function send_report (line 34) | def send_report(dict_report):
  function testimport (line 131) | def testimport(libname):

FILE: tickeys/kivy/tools/stub-gl-debug.py
  function replace (line 146) | def replace(s):

FILE: tickeys/kivy/tools/texturecompress.py
  class Tool (line 41) | class Tool(object):
    method __init__ (line 42) | def __init__(self, options):
    method tex_fn (line 49) | def tex_fn(self):
    method compress (line 53) | def compress(self):
    method nearest_pow2 (line 56) | def nearest_pow2(self, v):
    method runcmd (line 66) | def runcmd(self, cmd):
    method write_tex (line 70) | def write_tex(self, data, fmt, image_size, texture_size, mipmap=False,
    method run (line 92) | def run():
  class Etc1Tool (line 114) | class Etc1Tool(Tool):
    method __init__ (line 115) | def __init__(self, options):
    method locate_etc1tool (line 120) | def locate_etc1tool(self):
    method compress (line 139) | def compress(self):
  class PvrtcTool (line 166) | class PvrtcTool(Tool):
    method __init__ (line 167) | def __init__(self, options):
    method locate_texturetool (line 172) | def locate_texturetool(self):
    method compress (line 192) | def compress(self):

FILE: tickeys/kivy/uix/abstractview.py
  class AbstractView (line 25) | class AbstractView(FloatLayout):

FILE: tickeys/kivy/uix/accordion.py
  class AccordionException (line 97) | class AccordionException(Exception):
  class AccordionItem (line 103) | class AccordionItem(FloatLayout):
    method __init__ (line 256) | def __init__(self, **kwargs):
    method add_widget (line 265) | def add_widget(self, widget):
    method remove_widget (line 270) | def remove_widget(self, widget):
    method on_collapse (line 275) | def on_collapse(self, instance, value):
    method on_collapse_alpha (line 291) | def on_collapse_alpha(self, instance, value):
    method on_touch_down (line 294) | def on_touch_down(self, touch):
    method _update_title (line 305) | def _update_title(self, dt):
  class Accordion (line 318) | class Accordion(Widget):
    method __init__ (line 358) | def __init__(self, **kwargs):
    method add_widget (line 368) | def add_widget(self, widget, *largs):
    method select (line 376) | def select(self, instance):
    method _do_layout (line 384) | def _do_layout(self, dt):
  function toggle_layout (line 453) | def toggle_layout(*l):
  function select_2nd_item (line 459) | def select_2nd_item(*l):
  function update_min_space (line 467) | def update_min_space(instance, value):

FILE: tickeys/kivy/uix/actionbar.py
  class ActionBarException (line 54) | class ActionBarException(Exception):
  class ActionItem (line 60) | class ActionItem(object):
  class ActionButton (line 115) | class ActionButton(Button, ActionItem):
  class ActionPrevious (line 139) | class ActionPrevious(ActionButton):
    method __init__ (line 191) | def __init__(self, **kwargs):
  class ActionToggleButton (line 197) | class ActionToggleButton(ActionItem, ToggleButton):
  class ActionCheck (line 207) | class ActionCheck(ActionItem, CheckBox):
  class ActionSeparator (line 213) | class ActionSeparator(ActionItem, Widget):
  class ActionDropDown (line 226) | class ActionDropDown(DropDown):
  class ActionGroup (line 232) | class ActionGroup(ActionItem, Spinner):
    method __init__ (line 268) | def __init__(self, **kwargs):
    method add_widget (line 274) | def add_widget(self, item):
    method show_group (line 284) | def show_group(self):
    method _build_dropdown (line 290) | def _build_dropdown(self, *largs):
    method _update_dropdown (line 298) | def _update_dropdown(self, *largs):
    method _toggle_dropdown (line 301) | def _toggle_dropdown(self, *largs):
    method clear_widgets (line 318) | def clear_widgets(self):
  class ActionOverflow (line 322) | class ActionOverflow(ActionGroup):
    method add_widget (line 334) | def add_widget(self, action_item, index=0):
    method show_default_items (line 350) | def show_default_items(self, parent):
  class ActionView (line 358) | class ActionView(BoxLayout):
    method __init__ (line 398) | def __init__(self, **kwargs):
    method on_action_previous (line 407) | def on_action_previous(self, instance, value):
    method add_widget (line 410) | def add_widget(self, action_item, index=0):
    method on_use_separator (line 435) | def on_use_separator(self, instance, value):
    method _clear_all (line 440) | def _clear_all(self):
    method _layout_all (line 448) | def _layout_all(self):
    method _layout_group (line 472) | def _layout_group(self):
    method _layout_random (line 489) | def _layout_random(self):
    method on_width (line 556) | def on_width(self, width, *args):
  class ContextualActionView (line 587) | class ContextualActionView(ActionView):
  class ActionBar (line 594) | class ActionBar(BoxLayout):
    method __init__ (line 631) | def __init__(self, **kwargs):
    method add_widget (line 636) | def add_widget(self, view):
    method on_previous (line 653) | def on_previous(self, *args):
    method _pop_contextual_action_view (line 656) | def _pop_contextual_action_view(self):
  class MainWindow (line 710) | class MainWindow(FloatLayout):

FILE: tickeys/kivy/uix/anchorlayout.py
  class AnchorLayout (line 34) | class AnchorLayout(Layout):
    method __init__ (line 67) | def __init__(self, **kwargs):
    method do_layout (line 78) | def do_layout(self, *largs):

FILE: tickeys/kivy/uix/behaviors.py
  class ButtonBehavior (line 55) | class ButtonBehavior(object):
    method __init__ (line 102) | def __init__(self, **kwargs):
    method _do_press (line 110) | def _do_press(self):
    method _do_release (line 113) | def _do_release(self, *args):
    method cancel_event (line 116) | def cancel_event(self, *args):
    method on_touch_down (line 121) | def on_touch_down(self, touch):
    method on_touch_move (line 138) | def on_touch_move(self, touch):
    method on_touch_up (line 145) | def on_touch_up(self, touch):
    method on_press (line 166) | def on_press(self):
    method on_release (line 169) | def on_release(self):
    method trigger_action (line 172) | def trigger_action(self, duration=0.1):
  class ToggleButtonBehavior (line 195) | class ToggleButtonBehavior(ButtonBehavior):
    method __init__ (line 222) | def __init__(self, **kwargs):
    method on_group (line 226) | def on_group(self, *largs):
    method _release_group (line 240) | def _release_group(self, current):
    method _do_press (line 252) | def _do_press(self):
    method _do_release (line 259) | def _do_release(self, *args):
    method _clear_groups (line 263) | def _clear_groups(wk):
    method get_widgets (line 272) | def get_widgets(groupname):
  class DragBehavior (line 297) | class DragBehavior(object):
    method __init__ (line 381) | def __init__(self, **kwargs):
    method _get_uid (line 385) | def _get_uid(self, prefix='sv'):
    method on_touch_down (line 388) | def on_touch_down(self, touch):
    method on_touch_move (line 411) | def on_touch_move(self, touch):
    method on_touch_up (line 435) | def on_touch_up(self, touch):
    method _do_touch_up (line 451) | def _do_touch_up(self, touch, *largs):
    method _change_touch_mode (line 463) | def _change_touch_mode(self, *largs):
  class FocusBehavior (line 477) | class FocusBehavior(object):
    method _set_keyboard (line 541) | def _set_keyboard(self, value):
    method _get_keyboard (line 554) | def _get_keyboard(self):
    method _set_on_focus_next (line 644) | def _set_on_focus_next(self, instance, value):
    method _set_on_focus_previous (line 690) | def _set_on_focus_previous(self, instance, value):
    method __init__ (line 768) | def __init__(self, **kwargs):
    method _on_focusable (line 779) | def _on_focusable(self, instance, value):
    method _on_focus (line 783) | def _on_focus(self, instance, value, *largs):
    method _ensure_keyboard (line 790) | def _ensure_keyboard(self):
    method _bind_keyboard (line 800) | def _bind_keyboard(self):
    method _unbind_keyboard (line 817) | def _unbind_keyboard(self):
    method keyboard_on_textinput (line 831) | def keyboard_on_textinput(self, window, text):
    method _keyboard_released (line 834) | def _keyboard_released(self):
    method on_touch_down (line 837) | def on_touch_down(self, touch):
    method _handle_post_on_touch_up (line 848) | def _handle_post_on_touch_up(touch):
    method _get_focus_next (line 860) | def _get_focus_next(self, focus_dir):
    method keyboard_on_key_down (line 889) | def keyboard_on_key_down(self, window, keycode, text, modifiers):
    method keyboard_on_key_up (line 917) | def keyboard_on_key_up(self, window, keycode):
    method show_keyboard (line 936) | def show_keyboard(self):
    method hide_keyboard (line 943) | def hide_keyboard(self):
  class CompoundSelectionBehavior (line 951) | class CompoundSelectionBehavior(object):
    method __init__ (line 1105) | def __init__(self, **kwargs):
    method select_with_touch (line 1116) | def select_with_touch(self, node, touch=None):
    method select_with_key_down (line 1168) | def select_with_key_down(self, keyboard, scancode, codepoint, modifiers,
    method select_with_key_up (line 1223) | def select_with_key_up(self, keyboard, scancode, **kwargs):
    method _update_counts (line 1246) | def _update_counts(self, *largs):
    method _reslove_last_node (line 1256) | def _reslove_last_node(self):
    method _select_range (line 1278) | def _select_range(self, multiselect, keep_anchor, node, idx):
    method clear_selection (line 1324) | def clear_selection(self):
    method get_selectable_nodes (line 1335) | def get_selectable_nodes(self):
    method goto_node (line 1370) | def goto_node(self, key, last_node, last_node_idx):
    method select_node (line 1424) | def select_node(self, node):
    method deselect_node (line 1453) | def deselect_node(self, node):

FILE: tickeys/kivy/uix/boxlayout.py
  class BoxLayout (line 68) | class BoxLayout(Layout):
    method __init__ (line 101) | def __init__(self, **kwargs):
    method do_layout (line 112) | def do_layout(self, *largs):
    method add_widget (line 209) | def add_widget(self, widget, index=0):
    method remove_widget (line 214) | def remove_widget(self, widget):

FILE: tickeys/kivy/uix/bubble.py
  class BubbleButton (line 75) | class BubbleButton(Button):
  class BubbleContent (line 86) | class BubbleContent(GridLayout):
  class Bubble (line 90) | class Bubble(GridLayout):
    method __init__ (line 175) | def __init__(self, **kwargs):
    method add_widget (line 191) | def add_widget(self, *l):
    method remove_widget (line 201) | def remove_widget(self, *l):
    method clear_widgets (line 211) | def clear_widgets(self, **kwargs):
    method on_show_arrow (line 220) | def on_show_arrow(self, instance, value):
    method on_parent (line 223) | def on_parent(self, instance, value):
    method on_pos (line 226) | def on_pos(self, instance, pos):
    method on_background_image (line 245) | def on_background_image(self, *l):
    method on_background_color (line 248) | def on_background_color(self, *l):
    method on_orientation (line 253) | def on_orientation(self, *l):
    method on_arrow_image (line 264) | def on_arrow_image(self, *l):
    method on_arrow_pos (line 267) | def on_arrow_pos(self, *l):
    method _update_arrow (line 371) | def _update_arrow(self, *dt):

FILE: tickeys/kivy/uix/button.py
  class Button (line 43) | class Button(ButtonBehavior, Label):

FILE: tickeys/kivy/uix/camera.py
  class Camera (line 36) | class Camera(Image):
    method __init__ (line 82) | def __init__(self, **kwargs):
    method on_tex (line 91) | def on_tex(self, *l):
    method _on_index (line 94) | def _on_index(self, *largs):
    method _camera_loaded (line 107) | def _camera_loaded(self, *largs):
    method on_play (line 111) | def on_play(self, instance, value):

FILE: tickeys/kivy/uix/carousel.py
  class Carousel (line 52) | class Carousel(StencilView):
    method _get_slides_container (line 64) | def _get_slides_container(self):
    method _get_index (line 118) | def _get_index(self):
    method _set_index (line 123) | def _set_index(self, value):
    method _prev_slide (line 135) | def _prev_slide(self):
    method _curr_slide (line 164) | def _curr_slide(self):
    method _next_slide (line 177) | def _next_slide(self):
    method __init__ (line 240) | def __init__(self, **kwargs):
    method load_slide (line 246) | def load_slide(self, slide):
    method load_previous (line 264) | def load_previous(self):
    method load_next (line 271) | def load_next(self, mode='next'):
    method get_slide_container (line 289) | def get_slide_container(self, slide):
    method _insert_visible_slides (line 292) | def _insert_visible_slides(self, _next_slide=None, _prev_slide=None):
    method _position_visible_slides (line 324) | def _position_visible_slides(self, *args):
    method on_size (line 384) | def on_size(self, *args):
    method on_pos (line 390) | def on_pos(self, *args):
    method on_index (line 393) | def on_index(self, *args):
    method on_slides (line 398) | def on_slides(self, *args):
    method on__offset (line 404) | def on__offset(self, *args):
    method _start_animation (line 437) | def _start_animation(self, *args, **kwargs):
    method _get_uid (line 482) | def _get_uid(self, prefix='sv'):
    method on_touch_down (line 485) | def on_touch_down(self, touch):
    method on_touch_move (line 504) | def on_touch_move(self, touch):
    method on_touch_up (line 529) | def on_touch_up(self, touch):
    method _do_touch_up (line 548) | def _do_touch_up(self, touch, *largs):
    method _change_touch_mode (line 560) | def _change_touch_mode(self, *largs):
    method add_widget (line 573) | def add_widget(self, widget, index=0):
    method remove_widget (line 582) | def remove_widget(self, widget, *args, **kwargs):
    method clear_widgets (line 593) | def clear_widgets(self):
  class Example1 (line 602) | class Example1(App):
    method build (line 604) | def build(self):

FILE: tickeys/kivy/uix/checkbox.py
  class CheckBox (line 38) | class CheckBox(ToggleButtonBehavior, Widget):
    method on_state (line 145) | def on_state(self, instance, value):
    method _toggle_active (line 151) | def _toggle_active(self):
    method on_active (line 154) | def on_active(self, instance, value):

FILE: tickeys/kivy/uix/codeinput.py
  class CodeInput (line 54) | class CodeInput(TextInput):
    method __init__ (line 87) | def __init__(self, **kwargs):
    method on_style_name (line 112) | def on_style_name(self, *args):
    method on_style (line 115) | def on_style(self, *args):
    method _create_line_label (line 119) | def _create_line_label(self, text, hint=False):
    method _get_line_options (line 147) | def _get_line_options(self):
    method _get_text_width (line 154) | def _get_text_width(self, text, tab_width, _label_cached):
    method _get_bbcode (line 166) | def _get_bbcode(self, ntext):
    method _cursor_offset (line 184) | def _cursor_offset(self):
    method on_lexer (line 198) | def on_lexer(self, instance, value):
    method on_foreground_color (line 201) | def on_foreground_color(self, instance, text_color):
  class CodeInputTest (line 215) | class CodeInputTest(App):
    method build (line 216) | def build(self):

FILE: tickeys/kivy/uix/colorpicker.py
  function distance (line 49) | def distance(pt1, pt2):
  function polar_to_rect (line 53) | def polar_to_rect(origin, r, theta):
  function rect_to_polar (line 57) | def rect_to_polar(origin, x, y):
  class ColorWheel (line 75) | class ColorWheel(Widget):
    method __init__ (line 134) | def __init__(self, **kwargs):
    method on__origin (line 141) | def on__origin(self, instance, value):
    method on__radius (line 144) | def on__radius(self, instance, value):
    method init_wheel (line 147) | def init_wheel(self, dt):
    method recolor_wheel (line 171) | def recolor_wheel(self):
    method change_alpha (line 177) | def change_alpha(self, val):
    method inertial_incr_sv_idx (line 181) | def inertial_incr_sv_idx(self, dt):
    method inertial_decr_sv_idx (line 194) | def inertial_decr_sv_idx(self, dt):
    method on_touch_down (line 206) | def on_touch_down(self, touch):
    method on_touch_move (line 224) | def on_touch_move(self, touch):
    method on_touch_up (line 242) | def on_touch_up(self, touch):
    method on__hsv (line 282) | def on__hsv(self, instance, value):
    method _get_touch_r (line 290) | def _get_touch_r(self, pos):
  class _ColorArc (line 294) | class _ColorArc(InstructionGroup):
    method __init__ (line 295) | def __init__(self, r_min, r_max, theta_min, theta_max,
    method __str__ (line 309) | def __str__(self):
    method get_mesh (line 314) | def get_mesh(self):
    method change_color (line 350) | def change_color(self, color=None, color_delta=None, sv=None, a=None):
  class ColorPicker (line 364) | class ColorPicker(RelativeLayout):
    method _get_hex (line 389) | def _get_hex(self):
    method _set_hex (line 392) | def _set_hex(self, value):
    method on_color (line 412) | def on_color(self, instance, value):
    method on_hsv (line 418) | def on_hsv(self, instance, value):
    method _trigger_update_clr (line 424) | def _trigger_update_clr(self, mode, clr_idx, text):
    method _update_clr (line 429) | def _update_clr(self, dt):
    method _update_hex (line 440) | def _update_hex(self, dt):
    method _trigger_update_hex (line 445) | def _trigger_update_hex(self, text):
    method __init__ (line 450) | def __init__(self, **kwargs):
  class ColorPickerApp (line 458) | class ColorPickerApp(App):
    method build (line 459) | def build(self):

FILE: tickeys/kivy/uix/dropdown.py
  class DropDownException (line 105) | class DropDownException(Exception):
  class DropDown (line 111) | class DropDown(ScrollView):
    method __init__ (line 174) | def __init__(self, **kwargs):
    method on_key_down (line 191) | def on_key_down(self, instance, key, scancode, codepoint, modifiers):
    method on_container (line 196) | def on_container(self, instance, value):
    method open (line 200) | def open(self, widget):
    method dismiss (line 224) | def dismiss(self, *largs):
    method on_dismiss (line 235) | def on_dismiss(self):
    method select (line 238) | def select(self, data):
    method on_select (line 246) | def on_select(self, data):
    method _container_minimum_size (line 249) | def _container_minimum_size(self, instance, size):
    method add_widget (line 257) | def add_widget(self, *largs):
    method remove_widget (line 262) | def remove_widget(self, *largs):
    method clear_widgets (line 267) | def clear_widgets(self):
    method on_touch_down (line 272) | def on_touch_down(self, touch):
    method on_touch_up (line 282) | def on_touch_up(self, touch):
    method _reposition (line 290) | def _reposition(self, *largs):
  function show_dropdown (line 337) | def show_dropdown(button, *largs):
  function touch_move (line 346) | def touch_move(instance, touch):

FILE: tickeys/kivy/uix/effectwidget.py
  class EffectBase (line 347) | class EffectBase(EventDispatcher):
    method __init__ (line 379) | def __init__(self, *args, **kwargs):
    method set_fbo_shader (line 385) | def set_fbo_shader(self, *args):
    method _load_from_source (line 397) | def _load_from_source(self, *args):
  class AdvancedEffectBase (line 410) | class AdvancedEffectBase(EffectBase):
    method __init__ (line 435) | def __init__(self, *args, **kwargs):
    method _update_uniforms (line 439) | def _update_uniforms(self, *args):
    method set_fbo_shader (line 445) | def set_fbo_shader(self, *args):
  class MonochromeEffect (line 450) | class MonochromeEffect(EffectBase):
    method __init__ (line 452) | def __init__(self, *args, **kwargs):
  class InvertEffect (line 457) | class InvertEffect(EffectBase):
    method __init__ (line 459) | def __init__(self, *args, **kwargs):
  class ScanlinesEffect (line 464) | class ScanlinesEffect(EffectBase):
    method __init__ (line 466) | def __init__(self, *args, **kwargs):
  class ChannelMixEffect (line 471) | class ChannelMixEffect(EffectBase):
    method __init__ (line 482) | def __init__(self, *args, **kwargs):
    method on_order (line 486) | def on_order(self, *args):
    method do_glsl (line 489) | def do_glsl(self):
  class PixelateEffect (line 494) | class PixelateEffect(EffectBase):
    method __init__ (line 507) | def __init__(self, *args, **kwargs):
    method on_pixel_size (line 511) | def on_pixel_size(self, *args):
    method do_glsl (line 514) | def do_glsl(self):
  class HorizontalBlurEffect (line 518) | class HorizontalBlurEffect(EffectBase):
    method __init__ (line 529) | def __init__(self, *args, **kwargs):
    method on_size (line 533) | def on_size(self, *args):
    method do_glsl (line 536) | def do_glsl(self):
  class VerticalBlurEffect (line 540) | class VerticalBlurEffect(EffectBase):
    method __init__ (line 551) | def __init__(self, *args, **kwargs):
    method on_size (line 555) | def on_size(self, *args):
    method do_glsl (line 558) | def do_glsl(self):
  class FXAAEffect (line 562) | class FXAAEffect(EffectBase):
    method __init__ (line 564) | def __init__(self, *args, **kwargs):
  class EffectFbo (line 569) | class EffectFbo(Fbo):
    method __init__ (line 573) | def __init__(self, *args, **kwargs):
    method set_fs (line 577) | def set_fs(self, value):
  class EffectWidget (line 590) | class EffectWidget(RelativeLayout):
    method __init__ (line 635) | def __init__(self, **kwargs):
    method _refresh_background_color (line 666) | def _refresh_background_color(self, *args):
    method _update_glsl (line 669) | def _update_glsl(self, *largs):
    method refresh_fbo_setup (line 681) | def refresh_fbo_setup(self, *args):
    method add_widget (line 731) | def add_widget(self, widget):
    method remove_widget (line 738) | def remove_widget(self, widget):
    method clear_widgets (line 745) | def clear_widgets(self, children=None):

FILE: tickeys/kivy/uix/filechooser.py
  function alphanumeric_folders_first (line 75) | def alphanumeric_folders_first(files, filesystem):
  class FileSystemAbstract (line 80) | class FileSystemAbstract(object):
    method listdir (line 87) | def listdir(self, fn):
    method getsize (line 92) | def getsize(self, fn):
    method is_hidden (line 97) | def is_hidden(self, fn):
    method is_dir (line 102) | def is_dir(self, fn):
  class FileSystemLocal (line 108) | class FileSystemLocal(FileSystemAbstract):
    method listdir (line 114) | def listdir(self, fn):
    method getsize (line 117) | def getsize(self, fn):
    method is_hidden (line 120) | def is_hidden(self, fn):
    method is_dir (line 135) | def is_dir(self, fn):
  class FileChooserProgressBase (line 139) | class FileChooserProgressBase(FloatLayout):
    method cancel (line 158) | def cancel(self, *largs):
    method on_touch_down (line 164) | def on_touch_down(self, touch):
    method on_touch_move (line 169) | def on_touch_move(self, touch):
    method on_touch_up (line 174) | def on_touch_up(self, touch):
  class FileChooserProgress (line 180) | class FileChooserProgress(FileChooserProgressBase):
  class FileChooserLayout (line 184) | class FileChooserLayout(FloatLayout):
    method on_entry_added (line 202) | def on_entry_added(self, node, parent=None):
    method on_entries_cleared (line 205) | def on_entries_cleared(self):
    method on_subentry_to_entry (line 208) | def on_subentry_to_entry(self, subentry, entry):
    method on_remove_subentry (line 211) | def on_remove_subentry(self, subentry, entry):
    method on_submit (line 214) | def on_submit(self, selected, touch=None):
  class FileChooserListLayout (line 218) | class FileChooserListLayout(FileChooserLayout):
    method __init__ (line 226) | def __init__(self, **kwargs):
    method scroll_to_top (line 230) | def scroll_to_top(self, *args):
  class FileChooserIconLayout (line 234) | class FileChooserIconLayout(FileChooserLayout):
    method __init__ (line 243) | def __init__(self, **kwargs):
    method scroll_to_top (line 247) | def scroll_to_top(self, *args):
  class FileChooserController (line 251) | class FileChooserController(FloatLayout):
    method __init__ (line 453) | def __init__(self, **kwargs):
    method on_touch_down (line 467) | def on_touch_down(self, touch):
    method on_touch_up (line 475) | def on_touch_up(self, touch):
    method _update_item_selection (line 483) | def _update_item_selection(self, *args):
    method _save_previous_path (line 487) | def _save_previous_path(self, instance, value):
    method _trigger_update (line 491) | def _trigger_update(self, *args):
    method on_entry_added (line 495) | def on_entry_added(self, node, parent=None):
    method on_entries_cleared (line 499) | def on_entries_cleared(self):
    method on_subentry_to_entry (line 503) | def on_subentry_to_entry(self, subentry, entry):
    method on_remove_subentry (line 507) | def on_remove_subentry(self, subentry, entry):
    method on_submit (line 511) | def on_submit(self, selected, touch=None):
    method entry_touched (line 515) | def entry_touched(self, entry, touch):
    method entry_released (line 545) | def entry_released(self, entry, touch):
    method open_entry (line 564) | def open_entry(self, entry):
    method _apply_filters (line 579) | def _apply_filters(self, files):
    method get_nice_size (line 593) | def get_nice_size(self, fn):
    method _update_files (line 609) | def _update_files(self, *args, **kwargs):
    method _get_file_paths (line 629) | def _get_file_paths(self, items):
    method _create_files_entries (line 632) | def _create_files_entries(self, *args):
    method cancel (line 679) | def cancel(self, *largs):
    method _show_progress (line 694) | def _show_progress(self):
    method _hide_progress (line 704) | def _hide_progress(self):
    method _generate_file_entries (line 709) | def _generate_file_entries(self, *args, **kwargs):
    method _create_entry_widget (line 750) | def _create_entry_widget(self, ctx):
    method _add_files (line 755) | def _add_files(self, path, parent=None):
    method entry_subselect (line 794) | def entry_subselect(self, entry):
    method close_subselection (line 799) | def close_subselection(self, entry):
  class FileChooserListView (line 804) | class FileChooserListView(FileChooserController):
  class FileChooserIconView (line 812) | class FileChooserIconView(FileChooserController):
  class FileChooser (line 820) | class FileChooser(FileChooserController):
    method get_view_list (line 836) | def get_view_list(self):
    method get_view_mode (line 848) | def get_view_mode(self):
    method set_view_mode (line 851) | def set_view_mode(self, mode):
    method _views (line 865) | def _views(self):
    method __init__ (line 868) | def __init__(self, **kwargs):
    method add_widget (line 878) | def add_widget(self, widget, **kwargs):
    method rebuild_views (line 894) | def rebuild_views(self):
    method update_view (line 902) | def update_view(self, *args):
    method _create_entry_widget (line 918) | def _create_entry_widget(self, ctx):
    method _get_file_paths (line 922) | def _get_file_paths(self, items):
    method _update_item_selection (line 927) | def _update_item_selection(self, *args):
    method on_entry_added (line 933) | def on_entry_added(self, node, parent=None):
    method on_entries_cleared (line 939) | def on_entries_cleared(self):
    method on_subentry_to_entry (line 943) | def on_subentry_to_entry(self, subentry, entry):
    method on_remove_subentry (line 947) | def on_remove_subentry(self, subentry, entry):
    method on_submit (line 951) | def on_submit(self, selected, touch=None):
  class FileChooserApp (line 988) | class FileChooserApp(App):
    method build (line 990) | def build(self):

FILE: tickeys/kivy/uix/floatlayout.py
  class FloatLayout (line 60) | class FloatLayout(Layout):
    method __init__ (line 64) | def __init__(self, **kwargs):
    method do_layout (line 74) | def do_layout(self, *largs, **kwargs):
    method add_widget (line 110) | def add_widget(self, widget, index=0):
    method remove_widget (line 118) | def remove_widget(self, widget):

FILE: tickeys/kivy/uix/gesturesurface.py
  class GestureContainer (line 32) | class GestureContainer(EventDispatcher):
    method __init__ (line 100) | def __init__(self, touch, **kwargs):
    method get_vectors (line 129) | def get_vectors(self, **kwargs):
    method handles (line 149) | def handles(self, touch):
    method accept_stroke (line 155) | def accept_stroke(self, count=1):
    method update_bbox (line 161) | def update_bbox(self, touch):
    method add_stroke (line 177) | def add_stroke(self, touch, line):
    method complete_stroke (line 185) | def complete_stroke(self):
    method single_points_test (line 192) | def single_points_test(self):
  class GestureSurface (line 201) | class GestureSurface(FloatLayout):
    method __init__ (line 321) | def __init__(self, **kwargs):
    method on_touch_down (line 335) | def on_touch_down(self, touch):
    method on_touch_move (line 363) | def on_touch_move(self, touch):
    method on_touch_up (line 395) | def on_touch_up(self, touch):
    method init_gesture (line 414) | def init_gesture(self, touch):
    method init_stroke (line 440) | def init_stroke(self, g, touch):
    method get_gesture (line 464) | def get_gesture(self, touch):
    method find_colliding_gesture (line 471) | def find_colliding_gesture(self, touch):
    method merge_gestures (line 488) | def merge_gestures(self, g, other):
    method _update_canvas_bbox (line 535) | def _update_canvas_bbox(self, g):
    method _complete_dispatcher (line 549) | def _complete_dispatcher(self, dt):
    method _cleanup (line 594) | def _cleanup(self, dt):
    method on_gesture_start (line 608) | def on_gesture_start(self, *l):
    method on_gesture_extend (line 611) | def on_gesture_extend(self, *l):
    method on_gesture_merge (line 614) | def on_gesture_merge(self, *l):
    method on_gesture_complete (line 617) | def on_gesture_complete(self, *l):
    method on_gesture_discard (line 620) | def on_gesture_discard(self, *l):
    method on_gesture_cleanup (line 623) | def on_gesture_cleanup(self, *l):

FILE: tickeys/kivy/uix/gridlayout.py
  function nmax (line 99) | def nmax(*args):
  class GridLayoutException (line 107) | class GridLayoutException(Exception):
  class GridLayout (line 113) | class GridLayout(Layout):
    method __init__ (line 246) | def __init__(self, **kwargs):
    method get_max_widgets (line 264) | def get_max_widgets(self):
    method on_children (line 273) | def on_children(self, instance, value):
    method update_minimum_size (line 281) | def update_minimum_size(self, *largs):
    method do_layout (line 364) | def do_layout(self, *largs):

FILE: tickeys/kivy/uix/image.py
  class Image (line 64) | class Image(Widget):
    method get_image_ratio (line 96) | def get_image_ratio(self):
    method get_norm_image_size (line 193) | def get_norm_image_size(self):
    method __init__ (line 231) | def __init__(self, **kwargs):
    method texture_update (line 240) | def texture_update(self, *largs):
    method on_anim_delay (line 264) | def on_anim_delay(self, instance, value):
    method on_texture (line 272) | def on_texture(self, instance, value):
    method _on_tex_change (line 276) | def _on_tex_change(self, *largs):
    method reload (line 286) | def reload(self):
    method on_nocache (line 305) | def on_nocache(self, *args):
  class AsyncImage (line 311) | class AsyncImage(Image):
    method __init__ (line 323) | def __init__(self, **kwargs):
    method _load_source (line 333) | def _load_source(self, *args):
    method _on_source_load (line 350) | def _on_source_load(self, value):
    method is_uri (line 356) | def is_uri(self, filename):
    method _on_tex_change (line 360) | def _on_tex_change(self, *largs):
    method texture_update (line 364) | def texture_update(self, *largs):

FILE: tickeys/kivy/uix/label.py
  class Label (line 168) | class Label(Widget):
    method __init__ (line 185) | def __init__(self, **kwargs):
    method _create_label (line 202) | def _create_label(self):
    method _trigger_texture_update (line 219) | def _trigger_texture_update(self, name=None, source=None, value=None):
    method texture_update (line 234) | def texture_update(self, *largs):
    method on_touch_down (line 273) | def on_touch_down(self, touch):
    method on_ref_press (line 290) | def on_ref_press(self, ref):

FILE: tickeys/kivy/uix/layout.py
  class Layout (line 57) | class Layout(Widget):
    method __init__ (line 62) | def __init__(self, **kwargs):
    method do_layout (line 68) | def do_layout(self, *largs):
    method add_widget (line 77) | def add_widget(self, widget, index=0):
    method remove_widget (line 83) | def remove_widget(self, widget):

FILE: tickeys/kivy/uix/listview.py
  class SelectableView (line 548) | class SelectableView(object):
    method __init__ (line 573) | def __init__(self, **kwargs):
    method select (line 576) | def select(self, *args):
    method deselect (line 582) | def deselect(self, *args):
  class ListItemReprMixin (line 589) | class ListItemReprMixin(Label):
    method __repr__ (line 591) | def __repr__(self):
    method __repr__ (line 596) | def __repr__(self):
  class ListItemButton (line 600) | class ListItemButton(ListItemReprMixin, SelectableView, Button):
    method __init__ (line 619) | def __init__(self, **kwargs):
    method select (line 625) | def select(self, *args):
    method deselect (line 630) | def deselect(self, *args):
    method select_from_composite (line 635) | def select_from_composite(self, *args):
    method deselect_from_composite (line 638) | def deselect_from_composite(self, *args):
  class ListItemLabel (line 645) | class ListItemLabel(ListItemReprMixin, SelectableView, Label):
    method __init__ (line 652) | def __init__(self, **kwargs):
    method select (line 655) | def select(self, *args):
    method deselect (line 660) | def deselect(self, *args):
    method select_from_composite (line 665) | def select_from_composite(self, *args):
    method deselect_from_composite (line 668) | def deselect_from_composite(self, *args):
  class CompositeListItem (line 672) | class CompositeListItem(SelectableView, BoxLayout):
    method __init__ (line 707) | def __init__(self, **kwargs):
    method select (line 749) | def select(self, *args):
    method deselect (line 752) | def deselect(self, *args):
    method select_from_child (line 755) | def select_from_child(self, child, *args):
    method deselect_from_child (line 760) | def deselect_from_child(self, child, *args):
    method __repr__ (line 765) | def __repr__(self):
  class ListView (line 787) | class ListView(AbstractView, EventDispatcher):
    method __init__ (line 871) | def __init__(self, **kwargs):
    method item_strings_changed (line 917) | def item_strings_changed(self, *args):
    method _scroll (line 920) | def _scroll(self, scroll_y):
    method _spopulate (line 947) | def _spopulate(self, *args):
    method _reset_spopulate (line 950) | def _reset_spopulate(self, *args):
    method populate (line 959) | def populate(self, istart=None, iend=None):
    method scroll_to (line 1016) | def scroll_to(self, index=0):
    method on_scroll_complete (line 1023) | def on_scroll_complete(self, *args):

FILE: tickeys/kivy/uix/modalview.py
  class ModalView (line 84) | class ModalView(AnchorLayout):
    method __init__ (line 150) | def __init__(self, **kwargs):
    method _search_window (line 154) | def _search_window(self):
    method open (line 166) | def open(self, *largs):
    method _update_center (line 191) | def _update_center(self, *args):
    method dismiss (line 199) | def dismiss(self, *largs, **kwargs):
    method on_size (line 226) | def on_size(self, instance, value):
    method _align_center (line 229) | def _align_center(self, *l):
    method on_touch_down (line 237) | def on_touch_down(self, touch):
    method on_touch_move (line 245) | def on_touch_move(self, touch):
    method on_touch_up (line 249) | def on_touch_up(self, touch):
    method on__anim_alpha (line 253) | def on__anim_alpha(self, instance, value):
    method _real_remove_widget (line 257) | def _real_remove_widget(self):
    method on_open (line 266) | def on_open(self):
    method on_dismiss (line 269) | def on_dismiss(self):
    method _handle_keyboard (line 272) | def _handle_keyboard(self, window, key, *largs):
  function open_view (line 292) | def open_view(btn):

FILE: tickeys/kivy/uix/pagelayout.py
  class PageLayout (line 39) | class PageLayout(Layout):
    method __init__ (line 66) | def __init__(self, **kwargs):
    method do_layout (line 77) | def do_layout(self, *largs):
    method on_touch_down (line 114) | def on_touch_down(self, touch):
    method on_touch_move (line 130) | def on_touch_move(self, touch):
    method on_touch_up (line 184) | def on_touch_up(self, touch):

FILE: tickeys/kivy/uix/popup.py
  class PopupException (line 86) | class PopupException(Exception):
  class Popup (line 94) | class Popup(ModalView):
    method add_widget (line 178) | def add_widget(self, widget):
    method on_content (line 187) | def on_content(self, instance, value):
    method on__container (line 192) | def on__container(self, instance, value):
    method on_touch_down (line 198) | def on_touch_down(self, touch):

FILE: tickeys/kivy/uix/progressbar.py
  class ProgressBar (line 32) | class ProgressBar(Widget):
    method __init__ (line 38) | def __init__(self, **kwargs):
    method _get_value (line 42) | def _get_value(self):
    method _set_value (line 45) | def _set_value(self, value):
    method get_norm_value (line 62) | def get_norm_value(self):
    method set_norm_value (line 68) | def set_norm_value(self, value):

FILE: tickeys/kivy/uix/relativelayout.py
  class RelativeLayout (line 250) | class RelativeLayout(FloatLayout):
    method __init__ (line 254) | def __init__(self, **kw):
    method do_layout (line 259) | def do_layout(self, *args):
    method to_parent (line 262) | def to_parent(self, x, y, **k):
    method to_local (line 265) | def to_local(self, x, y, **k):
    method _apply_transform (line 268) | def _apply_transform(self, m):
    method on_touch_down (line 272) | def on_touch_down(self, touch):
    method on_touch_move (line 280) | def on_touch_move(self, touch):
    method on_touch_up (line 288) | def on_touch_up(self, touch):

FILE: tickeys/kivy/uix/rst.py
  class role_doc (line 89) | class role_doc(nodes.Inline, nodes.TextElement):
  class role_video (line 92) | class role_video(nodes.General, nodes.TextElement):
  class VideoDirective (line 95) | class VideoDirective(Directive):
    method run (line 103) | def run(self):
  class RstVideoPlayer (line 389) | class RstVideoPlayer(VideoPlayer):
  class RstDocument (line 393) | class RstDocument(ScrollView):
    method _get_bgc (line 456) | def _get_bgc(self):
    method _set_bgc (line 459) | def _set_bgc(self, value):
    method __init__ (line 521) | def __init__(self, **kwargs):
    method on_source (line 528) | def on_source(self, instance, value):
    method on_text (line 537) | def on_text(self, instance, value):
    method render (line 540) | def render(self):
    method resolve_path (line 545) | def resolve_path(self, filename):
    method preload (line 553) | def preload(self, filename, encoding='utf-8', errors='strict'):
    method _load_from_source (line 571) | def _load_from_source(self):
    method _load_from_text (line 577) | def _load_from_text(self, *largs):
    method on_ref_press (line 599) | def on_ref_press(self, node, ref):
    method goto (line 602) | def goto(self, ref, *largs):
    method add_anchors (line 669) | def add_anchors(self, node):
  class RstTitle (line 673) | class RstTitle(Label):
  class RstParagraph (line 680) | class RstParagraph(Label):
  class RstTerm (line 689) | class RstTerm(AnchorLayout):
  class RstBlockQuote (line 696) | class RstBlockQuote(GridLayout):
  class RstLiteralBlock (line 700) | class RstLiteralBlock(GridLayout):
  class RstList (line 704) | class RstList(GridLayout):
  class RstListItem (line 708) | class RstListItem(GridLayout):
  class RstListBullet (line 712) | class RstListBullet(Label):
  class RstSystemMessage (line 717) | class RstSystemMessage(GridLayout):
  class RstWarning (line 721) | class RstWarning(GridLayout):
  class RstNote (line 725) | class RstNote(GridLayout):
  class RstImage (line 729) | class RstImage(Image):
  class RstAsyncImage (line 733) | class RstAsyncImage(AsyncImage):
  class RstDefinitionList (line 737) | class RstDefinitionList(GridLayout):
  class RstDefinition (line 742) | class RstDefinition(GridLayout):
  class RstFieldList (line 747) | class RstFieldList(GridLayout):
  class RstFieldName (line 751) | class RstFieldName(Label):
  class RstFieldBody (line 756) | class RstFieldBody(GridLayout):
  class RstGridLayout (line 760) | class RstGridLayout(GridLayout):
  class RstTable (line 764) | class RstTable(GridLayout):
  class RstEntry (line 768) | class RstEntry(GridLayout):
  class RstTransition (line 772) | class RstTransition(Widget):
  class RstEmptySpace (line 776) | class RstEmptySpace(Widget):
  class RstDefinitionSpace (line 780) | class RstDefinitionSpace(Widget):
  class _ToctreeVisitor (line 785) | class _ToctreeVisitor(nodes.NodeVisitor):
    method __init__ (line 787) | def __init__(self, *largs):
    method push (line 793) | def push(self, tree):
    method pop (line 797) | def pop(self):
    method dispatch_visit (line 800) | def dispatch_visit(self, node):
    method dispatch_departure (line 818) | def dispatch_departure(self, node):
  class _Visitor (line 826) | class _Visitor(nodes.NodeVisitor):
    method __init__ (line 828) | def __init__(self, root, *largs):
    method push (line 840) | def push(self, widget):
    method pop (line 844) | def pop(self):
    method dispatch_visit (line 847) | def dispatch_visit(self, node):
    method dispatch_departure (line 1032) | def dispatch_departure(self, node):
    method set_text (line 1166) | def set_text(self, node, parent):
    method colorize (line 1178) | def colorize(self, text, name):

FILE: tickeys/kivy/uix/sandbox.py
  function sandbox (line 36) | def sandbox(f):
  class SandboxExceptionManager (line 45) | class SandboxExceptionManager(ExceptionManagerBase):
    method __init__ (line 47) | def __init__(self, sandbox):
    method handle_exception (line 51) | def handle_exception(self, e):
  class SandboxContent (line 57) | class SandboxContent(RelativeLayout):
  class Sandbox (line 61) | class Sandbox(FloatLayout):
    method __init__ (line 66) | def __init__(self, **kwargs):
    method __enter__ (line 83) | def __enter__(self):
    method __exit__ (line 86) | def __exit__(self, _type, value, traceback):
    method on_context_created (line 91) | def on_context_created(self):
    method on_exception (line 97) | def on_exception(self, exception, _traceback=None):
    method add_widget (line 113) | def add_widget(self, *args, **kwargs):
    method remove_widget (line 117) | def remove_widget(self, *args, **kwargs):
    method clear_widgets (line 121) | def clear_widgets(self, *args, **kwargs):
    method on_size (line 125) | def on_size(self, *args):
    method on_pos (line 130) | def on_pos(self, *args):
    method _clock_sandbox (line 135) | def _clock_sandbox(self, dt):
    method _clock_sandbox_draw (line 141) | def _clock_sandbox_draw(self, dt):
    method _call_draw (line 146) | def _call_draw(self, dt):
  class TestButton (line 153) | class TestButton(Button):
    method on_touch_up (line 155) | def on_touch_up(self, touch):
    method on_touch_down (line 159) | def on_touch_down(self, touch):

FILE: tickeys/kivy/uix/scatter.py
  class Scatter (line 101) | class Scatter(Widget):
    method _get_do_translation (line 142) | def _get_do_translation(self):
    method _set_do_translation (line 145) | def _set_do_translation(self, value):
    method _get_bbox (line 228) | def _get_bbox(self):
    method _get_rotation (line 251) | def _get_rotation(self):
    method _set_rotation (line 257) | def _set_rotation(self, rotation):
    method _get_scale (line 270) | def _get_scale(self):
    method _set_scale (line 287) | def _set_scale(self, scale):
    method _get_center (line 299) | def _get_center(self):
    method _set_center (line 303) | def _set_center(self, center):
    method _get_pos (line 311) | def _get_pos(self):
    method _set_pos (line 314) | def _set_pos(self, pos):
    method _get_x (line 323) | def _get_x(self):
    method _set_x (line 326) | def _set_x(self, x):
    method _get_y (line 333) | def _get_y(self):
    method _set_y (line 336) | def _set_y(self, y):
    method get_right (line 343) | def get_right(self):
    method set_right (line 346) | def set_right(self, value):
    method get_top (line 351) | def get_top(self):
    method set_top (line 354) | def set_top(self, value):
    method get_center_x (line 359) | def get_center_x(self):
    method set_center_x (line 362) | def set_center_x(self, value):
    method get_center_y (line 366) | def get_center_y(self):
    method set_center_y (line 369) | def set_center_y(self, value):
    method __init__ (line 373) | def __init__(self, **kwargs):
    method on_transform (line 378) | def on_transform(self, instance, value):
    method collide_point (line 381) | def collide_point(self, x, y):
    method to_parent (line 385) | def to_parent(self, x, y, **k):
    method to_local (line 389) | def to_local(self, x, y, **k):
    method _apply_transform (line 393) | def _apply_transform(self, m):
    method apply_transform (line 397) | def apply_transform(self, trans, post_multiply=False, anchor=(0, 0)):
    method transform_with_touch (line 429) | def transform_with_touch(self, touch):
    method _bring_to_front (line 486) | def _bring_to_front(self, touch):
    method on_touch_down (line 496) | def on_touch_down(self, touch):
    method on_touch_move (line 538) | def on_touch_move(self, touch):
    method on_transform_with_touch (line 559) | def on_transform_with_touch(self, touch):
    method on_bring_to_front (line 573) | def on_bring_to_front(self, touch):
    method on_touch_up (line 585) | def on_touch_up(self, touch):
  class ScatterPlane (line 607) | class ScatterPlane(Scatter):
    method __init__ (line 612) | def __init__(self, **kwargs):
    method collide_point (line 616) | def collide_point(self, x, y):

FILE: tickeys/kivy/uix/scatterlayout.py
  class ScatterLayout (line 56) | class ScatterLayout(Scatter):
    method __init__ (line 62) | def __init__(self, **kw):
    method update_size (line 70) | def update_size(self, instance, size):
    method add_widget (line 73) | def add_widget(self, *l):
    method remove_widget (line 76) | def remove_widget(self, *l):
    method clear_widgets (line 79) | def clear_widgets(self):
  class ScatterPlaneLayout (line 83) | class ScatterPlaneLayout(ScatterPlane):
    method __init__ (line 92) | def __init__(self, **kwargs):
    method collide_point (line 96) | def collide_point(self, x, y):

FILE: tickeys/kivy/uix/screenmanager.py
  class ScreenManagerException (line 203) | class ScreenManagerException(Exception):
  class Screen (line 209) | class Screen(RelativeLayout):
    method on_pre_enter (line 277) | def on_pre_enter(self, *args):
    method on_enter (line 280) | def on_enter(self, *args):
    method on_pre_leave (line 283) | def on_pre_leave(self, *args):
    method on_leave (line 286) | def on_leave(self, *args):
    method __repr__ (line 289) | def __repr__(self):
  class TransitionBase (line 293) | class TransitionBase(EventDispatcher):
    method start (line 355) | def start(self, manager):
    method stop (line 378) | def stop(self):
    method add_screen (line 388) | def add_screen(self, screen):
    method remove_screen (line 393) | def remove_screen(self, screen):
    method on_complete (line 398) | def on_complete(self):
    method on_progress (line 401) | def on_progress(self, progression):
    method _on_progress (line 404) | def _on_progress(self, *l):
    method _on_complete (line 410) | def _on_complete(self, *l):
  class ShaderTransition (line 418) | class ShaderTransition(TransitionBase):
    method make_screen_fbo (line 465) | def make_screen_fbo(self, screen):
    method on_progress (line 478) | def on_progress(self, progress):
    method on_complete (line 481) | def on_complete(self):
    method _remove_out_canvas (line 485) | def _remove_out_canvas(self, *args):
    method add_screen (line 491) | def add_screen(self, screen):
    method remove_screen (line 521) | def remove_screen(self, screen):
    method stop (line 528) | def stop(self):
  class NoTransition (line 533) | class NoTransition(TransitionBase):
    method on_complete (line 542) | def on_complete(self):
  class SlideTransition (line 548) | class SlideTransition(TransitionBase):
    method on_progress (line 560) | def on_progress(self, progression):
    method on_complete (line 586) | def on_complete(self):
  class SwapTransition (line 592) | class SwapTransition(TransitionBase):
    method add_screen (line 597) | def add_screen(self, screen):
    method on_complete (line 600) | def on_complete(self):
    method on_progress (line 607) | def on_progress(self, progression):
  class WipeTransition (line 635) | class WipeTransition(ShaderTransition):
  class FadeTransition (line 654) | class FadeTransition(ShaderTransition):
  class FallOutTransition (line 673) | class FallOutTransition(ShaderTransition):
  class RiseInTransition (line 730) | class RiseInTransition(ShaderTransition):
  class ScreenManager (line 785) | class ScreenManager(FloatLayout):
    method _get_screen_names (line 848) | def _get_screen_names(self):
    method __init__ (line 861) | def __init__(self, **kwargs):
    method _screen_name_changed (line 865) | def _screen_name_changed(self, screen, name):
    method add_widget (line 870) | def add_widget(self, screen):
    method remove_widget (line 888) | def remove_widget(self, *l):
    method real_add_widget (line 905) | def real_add_widget(self, *l):
    method real_remove_widget (line 911) | def real_remove_widget(self, *l):
    method on_current (line 914) | def on_current(self, instance, value):
    method get_screen (line 936) | def get_screen(self, name):
    method has_screen (line 948) | def has_screen(self, name):
    method __next__ (line 955) | def __next__(self):
    method next (line 968) | def next(self):
    method previous (line 972) | def previous(self):
    method switch_to (line 985) | def switch_to(self, screen, **options):
    method _generate_screen_name (line 1050) | def _generate_screen_name(self):
    method _update_pos (line 1058) | def _update_pos(self, instance, value):
    method on_touch_down (line 1066) | def on_touch_down(self, touch):
    method on_touch_move (line 1071) | def on_touch_move(self, touch):
    method on_touch_up (line 1076) | def on_touch_up(self, touch):
  class TestApp (line 1104) | class TestApp(App):
    method change_view (line 1106) | def change_view(self, *l):
    method remove_screen (line 1112) | def remove_screen(self, *l):
    method build (line 1115) | def build(self):

FILE: tickeys/kivy/uix/scrollview.py
  class ScrollView (line 135) | class ScrollView(StencilView):
    method _get_do_scroll (line 230) | def _get_do_scroll(self):
    method _set_do_scroll (line 233) | def _set_do_scroll(self, value):
    method _get_vbar (line 246) | def _get_vbar(self):
    method _get_hbar (line 273) | def _get_hbar(self):
    method _set_viewport_size (line 423) | def _set_viewport_size(self, instance, value):
    method on__viewport (line 426) | def on__viewport(self, instance, value):
    method __init__ (line 433) | def __init__(self, **kwargs):
    method on_effect_x (line 477) | def on_effect_x(self, instance, value):
    method on_effect_y (line 482) | def on_effect_y(self, instance, value):
    method on_effect_cls (line 487) | def on_effect_cls(self, instance, cls):
    method _update_effect_widget (line 495) | def _update_effect_widget(self, *args):
    method _update_effect_x_bounds (line 501) | def _update_effect_x_bounds(self, *args):
    method _update_effect_y_bounds (line 508) | def _update_effect_y_bounds(self, *args):
    method _update_effect_bounds (line 515) | def _update_effect_bounds(self, *args):
    method _update_effect_x (line 523) | def _update_effect_x(self, *args):
    method _update_effect_y (line 534) | def _update_effect_y(self, *args):
    method to_local (line 545) | def to_local(self, x, y, **k):
    method to_parent (line 549) | def to_parent(self, x, y, **k):
    method _apply_transform (line 553) | def _apply_transform(self, m):
    method simulate_touch_down (line 558) | def simulate_touch_down(self, touch):
    method on_touch_down (line 566) | def on_touch_down(self, touch):
    method on_scroll_start (line 572) | def on_scroll_start(self, touch, check_children=True):
    method on_touch_move (line 675) | def on_touch_move(self, touch):
    method on_scroll_move (line 693) | def on_scroll_move(self, touch):
    method on_touch_up (line 776) | def on_touch_up(self, touch):
    method on_scroll_stop (line 790) | def on_scroll_stop(self, touch, check_children=True):
    method convert_distance_to_scroll (line 832) | def convert_distance_to_scroll(self, dx, dy):
    method update_from_scroll (line 854) | def update_from_scroll(self, *largs):
    method _bind_inactive_bar_color (line 898) | def _bind_inactive_bar_color(self, *l):
    method _change_bar_color (line 904) | def _change_bar_color(self, inst, value):
    method add_widget (line 910) | def add_widget(self, widget, index=0):
    method remove_widget (line 921) | def remove_widget(self, widget):
    method _get_uid (line 929) | def _get_uid(self, prefix='sv'):
    method _change_touch_mode (line 932) | def _change_touch_mode(self, *largs):
    method _do_touch_up (line 973) | def _do_touch_up(self, touch, *largs):
  class ScrollViewApp (line 1000) | class ScrollViewApp(App):
    method build (line 1002) | def build(self):

FILE: tickeys/kivy/uix/selectableview.py
  class SelectableView (line 4) | class SelectableView(object):
    method __init__ (line 22) | def __init__(self, **kwargs):
    method select (line 25) | def select(self, *args):
    method deselect (line 31) | def deselect(self, *args):

FILE: tickeys/kivy/uix/settings.py
  class SettingSpacer (line 188) | class SettingSpacer(Widget):
  class SettingItem (line 193) | class SettingItem(FloatLayout):
    method __init__ (line 282) | def __init__(self, **kwargs):
    method add_widget (line 286) | def add_widget(self, *largs):
    method on_touch_down (line 291) | def on_touch_down(self, touch):
    method on_touch_up (line 300) | def on_touch_up(self, touch):
    method on_release (line 308) | def on_release(self):
    method on_value (line 311) | def on_value(self, instance, value):
  class SettingBoolean (line 321) | class SettingBoolean(SettingItem):
  class SettingString (line 343) | class SettingString(SettingItem):
    method on_panel (line 366) | def on_panel(self, instance, value):
    method _dismiss (line 371) | def _dismiss(self, *largs):
    method _validate (line 378) | def _validate(self, instance):
    method _create_popup (line 383) | def _create_popup(self, instance):
  class SettingPath (line 418) | class SettingPath(SettingItem):
    method on_panel (line 443) | def on_panel(self, instance, value):
    method _dismiss (line 448) | def _dismiss(self, *largs):
    method _validate (line 455) | def _validate(self, instance):
    method _create_popup (line 464) | def _create_popup(self, instance):
  class SettingNumeric (line 496) | class SettingNumeric(SettingString):
    method _validate (line 504) | def _validate(self, instance):
  class SettingOptions (line 518) | class SettingOptions(SettingItem):
    method on_panel (line 540) | def on_panel(self, instance, value):
    method _set_option (line 545) | def _set_option(self, instance):
    method _create_popup (line 549) | def _create_popup(self, instance):
  class SettingTitle (line 577) | class SettingTitle(Label):
  class SettingsPanel (line 584) | class SettingsPanel(GridLayout):
    method __init__ (line 604) | def __init__(self, **kwargs):
    method on_config (line 608) | def on_config(self, instance, value):
    method get_value (line 615) | def get_value(self, section, key):
    method set_value (line 628) | def set_value(self, section, key, value):
  class InterfaceWithSidebar (line 642) | class InterfaceWithSidebar(BoxLayout):
    method __init__ (line 676) | def __init__(self, *args, **kwargs):
    method add_panel (line 681) | def add_panel(self, panel, name, uid):
    method on_close (line 700) | def on_close(self, *args):
  class InterfaceWithSpinner (line 704) | class InterfaceWithSpinner(BoxLayout):
    method __init__ (line 732) | def __init__(self, *args, **kwargs):
    method add_panel (line 737) | def add_panel(self, panel, name, uid):
    method on_close (line 757) | def on_close(self, *args):
  class ContentPanel (line 761) | class ContentPanel(ScrollView):
    method add_panel (line 802) | def add_panel(self, panel, name, uid):
    method on_current_uid (line 821) | def on_current_uid(self, *args):
    method add_widget (line 839) | def add_widget(self, widget):
    method remove_widget (line 845) | def remove_widget(self, widget):
  class Settings (line 849) | class Settings(BoxLayout):
    method __init__ (line 893) | def __init__(self, *args, **kargs):
    method on_touch_down (line 904) | def on_touch_down(self, touch):
    method register_type (line 909) | def register_type(self, tp, cls):
    method on_close (line 914) | def on_close(self, *args):
    method add_interface (line 917) | def add_interface(self):
    method on_config_change (line 931) | def on_config_change(self, config, section, key, value):
    method add_json_panel (line 934) | def add_json_panel(self, title, config, filename=None, data=None):
    method create_json_panel (line 946) | def create_json_panel(self, title, config, filename=None, data=None):
    method add_kivy_panel (line 988) | def add_kivy_panel(self):
  class SettingsWithSidebar (line 1004) | class SettingsWithSidebar(Settings):
  class SettingsWithSpinner (line 1012) | class SettingsWithSpinner(Settings):
    method __init__ (line 1017) | def __init__(self, *args, **kwargs):
  class SettingsWithTabbedPanel (line 1022) | class SettingsWithTabbedPanel(Settings):
    method __init__ (line 1029) | def __init__(self, *args, **kwargs):
    method on_close (line 1033) | def on_close(self, *args):
  class SettingsWithNoMenu (line 1037) | class SettingsWithNoMenu(Settings):
    method __init__ (line 1052) | def __init__(self, *args, **kwargs):
  class InterfaceWithNoMenu (line 1057) | class InterfaceWithNoMenu(ContentPanel):
    method add_widget (line 1066) | def add_widget(self, widget):
  class InterfaceWithTabbedPanel (line 1073) | class InterfaceWithTabbedPanel(FloatLayout):
    method __init__ (line 1087) | def __init__(self, *args, **kwargs):
    method add_panel (line 1091) | def add_panel(self, panel, name, uid):
    method on_close (line 1101) | def on_close(self, *args):
  class MenuSpinner (line 1105) | class MenuSpinner(BoxLayout):
    method add_item (line 1121) | def add_item(self, name, uid):
    method on_spinner_text (line 1133) | def on_spinner_text(self, *args):
  class MenuSidebar (line 1138) | class MenuSidebar(FloatLayout):
    method add_item (line 1172) | def add_item(self, name, uid):
    method on_selected_uid (line 1190) | def on_selected_uid(self, *args):
  class SettingSidebarLabel (line 1200) | class SettingSidebarLabel(Label):
    method on_touch_down (line 1206) | def on_touch_down(self, touch):
  class SettingsApp (line 1216) | class SettingsApp(App):
    method build (line 1218) | def build(self):

FILE: tickeys/kivy/uix/slider.py
  class Slider (line 29) | class Slider(Widget):
    method on_min (line 105) | def on_min(self, *largs):
    method on_max (line 108) | def on_max(self, *largs):
    method get_norm_value (line 111) | def get_norm_value(self):
    method set_norm_value (line 118) | def set_norm_value(self, value):
    method get_value_pos (line 157) | def get_value_pos(self):
    method set_value_pos (line 167) | def set_value_pos(self, pos):
    method on_touch_down (line 191) | def on_touch_down(self, touch):
    method on_touch_move (line 214) | def on_touch_move(self, touch):
    method on_touch_up (line 219) | def on_touch_up(self, touch):
  class SliderApp (line 227) | class SliderApp(App):
    method build (line 228) | def build(self):

FILE: tickeys/kivy/uix/spinner.py
  class SpinnerOption (line 48) | class SpinnerOption(Button):
  class Spinner (line 55) | class Spinner(Button):
    method __init__ (line 106) | def __init__(self, **kwargs):
    method _build_dropdown (line 116) | def _build_dropdown(self, *largs):
    method _update_dropdown (line 130) | def _update_dropdown(self, *largs):
    method _toggle_dropdown (line 141) | def _toggle_dropdown(self, *largs):
    method _close_dropdown (line 144) | def _close_dropdown(self, *largs):
    method _on_dropdown_select (line 147) | def _on_dropdown_select(self, instance, data, *largs):
    method on_is_open (line 151) | def on_is_open(self, instance, value):

FILE: tickeys/kivy/uix/splitter.py
  class SplitterStrip (line 54) | class SplitterStrip(Button):
  class Splitter (line 61) | class Splitter(BoxLayout):
    method __init__ (line 176) | def __init__(self, **kwargs):
    method on_sizable_from (line 184) | def on_sizable_from(self, instance, sizable_from):
    method add_widget (line 229) | def add_widget(self, widget, index=0):
    method remove_widget (line 245) | def remove_widget(self, widget, *largs):
    method clear_widgets (line 250) | def clear_widgets(self):
    method strip_down (line 253) | def strip_down(self, instance, touch):
    method on_press (line 259) | def on_press(self):
    method _rebind_parent (line 262) | def _rebind_parent(self, instance, new_parent):
    method rescale_parent_proportion (line 270) | def rescale_parent_proportion(self, *args):
    method _do_size (line 280) | def _do_size(self, instance, value):
    method strip_move (line 286) | def strip_move(self, instance, touch):
    method strip_up (line 335) | def strip_up(self, instance, touch):
    method on_release (line 362) | def on_release(self):
  class SplitterApp (line 371) | class SplitterApp(App):
    method build (line 373) | def build(self):

FILE: tickeys/kivy/uix/stacklayout.py
  class StackLayout (line 39) | class StackLayout(Layout):
    method __init__ (line 126) | def __init__(self, **kwargs):
    method do_layout (line 136) | def do_layout(self, *largs):

FILE: tickeys/kivy/uix/stencilview.py
  class StencilView (line 34) | class StencilView(Widget):

FILE: tickeys/kivy/uix/switch.py
  class Switch (line 45) | class Switch(Widget):
    method on_touch_down (line 79) | def on_touch_down(self, touch):
    method on_touch_move (line 89) | def on_touch_move(self, touch):
    method on_touch_up (line 95) | def on_touch_up(self, touch):

FILE: tickeys/kivy/uix/tabbedpanel.py
  class TabbedPanelException (line 140) | class TabbedPanelException(Exception):
  class TabbedPanelHeader (line 146) | class TabbedPanelHeader(ToggleButton):
    method on_touch_down (line 162) | def on_touch_down(self, touch):
    method on_release (line 171) | def on_release(self, *largs):
  class TabbedPanelItem (line 182) | class TabbedPanelItem(TabbedPanelHeader):
    method add_widget (line 199) | def add_widget(self, widget, index=0):
    method remove_widget (line 207) | def remove_widget(self, widget):
  class TabbedPanelStrip (line 216) | class TabbedPanelStrip(GridLayout):
  class StripLayout (line 229) | class StripLayout(GridLayout):
  class TabbedPanelContent (line 254) | class TabbedPanelContent(FloatLayout):
  class TabbedPanel (line 260) | class TabbedPanel(GridLayout):
    method get_current_tab (line 322) | def get_current_tab(self):
    method get_tab_list (line 394) | def get_tab_list(self):
    method get_def_tab (line 417) | def get_def_tab(self):
    method set_def_tab (line 420) | def set_def_tab(self, new_tab):
    method get_def_tab_content (line 446) | def get_def_tab_content(self):
    method set_def_tab_content (line 449) | def set_def_tab_content(self, *l):
    method __init__ (line 459) | def __init__(self, **kwargs):
    method switch_to (line 484) | def switch_to(self, header):
    method clear_tabs (line 500) | def clear_tabs(self, *l):
    method add_widget (line 509) | def add_widget(self, widget, index=0):
    method remove_widget (line 529) | def remove_widget(self, widget):
    method clear_widgets (line 551) | def clear_widgets(self, **kwargs):
    method on_strip_image (line 560) | def on_strip_image(self, instance, value):
    method on_strip_border (line 565) | def on_strip_border(self, instance, value):
    method on_do_default_tab (line 570) | def on_do_default_tab(self, instance, value):
    method on_default_tab_text (line 581) | def on_default_tab_text(self, *args):
    method on_tab_width (line 584) | def on_tab_width(self, *l):
    method on_tab_height (line 588) | def on_tab_height(self, *l):
    method on_tab_pos (line 592) | def on_tab_pos(self, *l):
    method _setup_default_tab (line 596) | def _setup_default_tab(self):
    method _switch_to_first_tab (line 635) | def _switch_to_first_tab(self, *l):
    method _load_default_tab_content (line 642) | def _load_default_tab_content(self, dt):
    method _reposition_tabs (line 646) | def _reposition_tabs(self, *l):
    method _update_tabs (line 650) | def _update_tabs(self, *l):
    method _update_tab_width (line 779) | def _update_tab_width(self, *l):
    method _update_top (line 799) | def _update_top(self, *args):
    method _updt_top (line 805) | def _updt_top(self, sctr, top, scrl_v_width, *args):
    method _update_scrollview (line 811) | def _update_scrollview(self, scrl_v, *l):

FILE: tickeys/kivy/uix/textinput.py
  function _textinput_clear_cache (line 201) | def _textinput_clear_cache(*l):
  class Selector (line 216) | class Selector(ButtonBehavior, Image):
    method __init__ (line 223) | def __init__(self, **kwargs):
    method update_transform (line 236) | def update_transform(self, cb):
    method transform_touch (line 243) | def transform_touch(self, touch):
    method on_window_touch_down (line 248) | def on_window_touch_down(self, win, touch):
  class TextInputCutCopyPaste (line 263) | class TextInputCutCopyPaste(Bubble):
    method __init__ (line 278) | def __init__(self, **kwargs):
    method update_transform (line 292) | def update_transform(self, cb):
    method transform_touch (line 299) | def transform_touch(self, touch):
    method on_touch_down (line 304) | def on_touch_down(self, touch):
    method on_textinput (line 314) | def on_textinput(self, instance, value):
    method _check_parent (line 319) | def _check_parent(self, dt):
    method on_parent (line 332) | def on_parent(self, instance, value):
    method do (line 354) | def do(self, action):
    method hide (line 374) | def hide(self):
  class TextInput (line 384) | class TextInput(FocusBehavior, Widget):
    method __init__ (line 441) | def __init__(self, **kwargs):
    method on_text_validate (line 517) | def on_text_validate(self):
    method cursor_index (line 520) | def cursor_index(self, cursor=None):
    method cursor_offset (line 543) | def cursor_offset(self):
    method get_cursor_from_index (line 556) | def get_cursor_from_index(self, index):
    method select_text (line 575) | def select_text(self, start, end):
    method select_all (line 596) | def select_all(self):
    method _auto_indent (line 605) | def _auto_indent(self, substring):
    method insert_text (line 616) | def insert_text(self, substring, from_undo=False):
    method _get_line_from_cursor (line 679) | def _get_line_from_cursor(self, start, new_text):
    method _set_unredo_insert (line 697) | def _set_unredo_insert(self, ci, sci, substring, from_undo):
    method reset_undo (line 706) | def reset_undo(self):
    method do_redo (line 714) | def do_redo(self):
    method do_undo (line 748) | def do_undo(self):
    method do_backspace (line 780) | def do_backspace(self, from_undo=False, mode='bkspc'):
    method _set_undo_redo_bkspc (line 828) | def _set_undo_redo_bkspc(self, ol_index, new_index, substring, from_un...
    method do_cursor_movement (line 838) | def do_cursor_movement(self, action):
    method get_cursor_from_xy (line 887) | def get_cursor_from_xy(self, x, y):
    method cancel_selection (line 916) | def cancel_selection(self):
    method delete_selection (line 925) | def delete_selection(self, from_undo=False):
    method _set_unredo_delsel (line 958) | def _set_unredo_delsel(self, a, b, substring, from_undo):
    method _update_selection (line 969) | def _update_selection(self, finished=False):
    method long_touch (line 996) | def long_touch(self, dt):
    method on_double_tap (line 1002) | def on_double_tap(self):
    method on_triple_tap (line 1018) | def on_triple_tap(self):
    method on_quad_touch (line 1032) | def on_quad_touch(self):
    method on_touch_down (line 1040) | def on_touch_down(self, touch):
    method on_touch_move (line 1096) | def on_touch_move(self, touch):
    method on_touch_up (line 1110) | def on_touch_up(self, touch):
    method _handle_pressed (line 1147) | def _handle_pressed(self, instance):
    method _handle_released (line 1153) | def _handle_released(self, instance):
    method _handle_move (line 1164) | def _handle_move(self, instance, touch):
    method _position_handles (line 1201) | def _position_handles(self, *args, **kwargs):
    method _hide_handles (line 1238) | def _hide_handles(self, win=None):
    method _show_handles (line 1246) | def _show_handles(self, dt):
    method _show_cut_copy_paste (line 1289) | def _show_cut_copy_paste(self, pos, win, parent_changed=False,
    method _hide_cut_copy_paste (line 1360) | def _hide_cut_copy_paste(self, win=None):
    method _reload_remove_observer (line 1372) | def _reload_remove_observer(wr):
    method _on_textinput_focused (line 1377) | def _on_textinput_focused(self, instance, value, *largs):
    method _ensure_clipboard (line 1395) | def _ensure_clipboard(self):
    method cut (line 1400) | def cut(self):
    method _cut (line 1408) | def _cut(self, data):
    method copy (line 1413) | def copy(self, data=''):
    method paste (line 1427) | def paste(self):
    method _get_text_width (line 1440) | def _get_text_width(self, text, tab_width, _label_cached):
    method _do_blink_cursor (line 1462) | def _do_blink_cursor(self, dt):
    method on_cursor (line 1468) | def on_cursor(self, instance, value):
    method _delete_line (line 1474) | def _delete_line(self, idx):
    method _set_line_text (line 1482) | def _set_line_text(self, line_num, text):
    method _trigger_refresh_line_options (line 1487) | def _trigger_refresh_line_options(self, *largs):
    method _refresh_line_options (line 1491) | def _refresh_line_options(self, *largs):
    method _trigger_refresh_text (line 1498) | def _trigger_refresh_text(self, *largs):
    method _update_text_options (line 1505) | def _update_text_options(self, *largs):
    method _refresh_text_from_trigger (line 1509) | def _refresh_text_from_trigger(self, dt, *largs):
    method _refresh_text_from_property (line 1512) | def _refresh_text_from_property(self, *largs):
    method _refresh_text (line 1515) | def _refresh_text(self, text, *largs):
    method _insert_lines (line 1569) | def _insert_lines(self, start, finish, len_lines, _lines_flags,
    method _trigger_update_graphics (line 1605) | def _trigger_update_graphics(self, *largs):
    method _update_graphics (line 1609) | def _update_graphics(self, *largs):
    method _update_graphics_selection (line 1710) | def _update_graphics_selection(self):
    method _draw_selection (line 1754) | def _draw_selection(self, *largs):
    method on_size (line 1784) | def on_size(self, instance, value):
    method _get_cursor_pos (line 1791) | def _get_cursor_pos(self):
    method _get_line_options (line 1809) | def _get_line_options(self):
    method _create_line_label (line 1823) | def _create_line_label(self, text, hint=False):
    method _tokenize (line 1871) | def _tokenize(self, text):
    method _split_smart (line 1886) | def _split_smart(self, text):
    method _key_down (line 1934) | def _key_down(self, key, repeat=False):
    method _key_up (line 1976) | def _key_up(self, key, repeat=False):
    method keyboard_on_key_down (line 1982) | def keyboard_on_key_down(self, window, keycode, text, modifiers):
    method keyboard_on_key_up (line 2099) | def keyboard_on_key_up(self, window, keycode):
    method keyboard_on_textinput (line 2106) | def keyboard_on_textinput(self, window, text):
    method on_hint_text (line 2111) | def on_hint_text(self, instance, value):
    method _refresh_hint_text (line 2114) | def _refresh_hint_text(self):
    method _get_cursor (line 2188) | def _get_cursor(self):
    method _set_cursor (line 2191) | def _set_cursor(self, pos):
    method _get_cursor_col (line 2243) | def _get_cursor_col(self):
    method _get_cursor_row (line 2253) | def _get_cursor_row(self):
    method on_padding_x (line 2316) | def on_padding_x(self, instance, value):
    method on_padding_y (line 2332) | def on_padding_y(self, instance, value):
    method on_suggestion_text (line 2494) | def on_suggestion_text(self, instance, value):
    method get_sel_from (line 2519) | def get_sel_from(self):
    method get_sel_to (line 2531) | def get_sel_to(self):
    method on_selection_text (line 2550) | def on_selection_text(self, instance, value):
    method _get_text (line 2554) | def _get_text(self, encode=True):
    method _set_text (line 2569) | def _set_text(self, text):
    method _get_min_height (line 2660) | def _get_min_height(self):
    method on_handle_image_middle (line 2711) | def on_handle_image_middle(self, instance, value):
    method on_handle_image_left (line 2725) | def on_handle_image_left(self, instance, value):
    method on_handle_image_right (line 2740) | def on_handle_image_right(self, instance, value):
  class TextInputApp (line 2761) | class TextInputApp(App):
    method build (line 2763) | def build(self):

FILE: tickeys/kivy/uix/togglebutton.py
  class ToggleButton (line 30) | class ToggleButton(ToggleButtonBehavior, Button):

FILE: tickeys/kivy/uix/treeview.py
  class TreeViewException (line 118) | class TreeViewException(Exception):
  class TreeViewNode (line 124) | class TreeViewNode(object):
    method __init__ (line 128) | def __init__(self, **kwargs):
  class TreeViewLabel (line 244) | class TreeViewLabel(Label, TreeViewNode):
  class TreeView (line 253) | class TreeView(Widget):
    method __init__ (line 265) | def __init__(self, **kwargs):
    method add_node (line 279) | def add_node(self, node, parent=None):
    method remove_node (line 308) | def remove_node(self, node):
    method on_node_expand (line 333) | def on_node_expand(self, node):
    method on_node_collapse (line 336) | def on_node_collapse(self, node):
    method select_node (line 339) | def select_node(self, node):
    method toggle_node (line 349) | def toggle_node(self, node):
    method get_node_at_pos (line 361) | def get_node_at_pos(self, pos):
    method iterate_open_nodes (line 370) | def iterate_open_nodes(self, node=None):
    method iterate_all_nodes (line 396) | def iterate_all_nodes(self, node=None):
    method on_load_func (line 412) | def on_load_func(self, instance, value):
    method _do_initial_load (line 416) | def _do_initial_load(self, *largs):
    method _do_node_load (line 421) | def _do_node_load(self, node):
    method on_root_options (line 430) | def on_root_options(self, instance, value):
    method _do_layout (line 436) | def _do_layout(self, *largs):
    method _do_open_node (line 453) | def _do_open_node(self, node):
    method _do_layout_node (line 465) | def _do_layout_node(self, node, level, y):
    method on_touch_down (line 481) | def on_touch_down(self, touch):
    method get_selected_node (line 562) | def get_selected_node(self):
    method get_root (line 573) | def get_root(self):
  class TestApp (line 622) | class TestApp(App):
    method build (line 624) | def build(self):

FILE: tickeys/kivy/uix/video.py
  class Video (line 37) | class Video(Image):
    method __init__ (line 130) | def __init__(self, **kwargs):
    method seek (line 140) | def seek(self, percent):
    method _trigger_video_load (line 154) | def _trigger_video_load(self, *largs):
    method _do_video_load (line 158) | def _do_video_load(self, *largs):
    method on_play (line 181) | def on_play(self, instance, value):
    method on_state (line 185) | def on_state(self, instance, value):
    method _on_video_frame (line 202) | def _on_video_frame(self, *largs):
    method _on_eos (line 211) | def _on_eos(self, *largs):
    method _on_load (line 216) | def _on_load(self, *largs):
    method on_volume (line 220) | def on_volume(self, instance, value):
    method unload (line 224) | def unload(self):
  class VideoApp (line 242) | class VideoApp(App):
    method build (line 243) | def build(self):
    method replay (line 248) | def replay(self, *args):

FILE: tickeys/kivy/uix/videoplayer.py
  class VideoPlayerVolume (line 98) | class VideoPlayerVolume(Image):
    method on_touch_down (line 101) | def on_touch_down(self, touch):
    method on_touch_move (line 109) | def on_touch_move(self, touch):
    method on_touch_up (line 120) | def on_touch_up(self, touch):
  class VideoPlayerPlayPause (line 132) | class VideoPlayerPlayPause(Image):
    method on_touch_down (line 135) | def on_touch_down(self, touch):
  class VideoPlayerStop (line 145) | class VideoPlayerStop(Image):
    method on_touch_down (line 148) | def on_touch_down(self, touch):
  class VideoPlayerProgressBar (line 155) | class VideoPlayerProgressBar(ProgressBar):
    method __init__ (line 160) | def __init__(self, **kwargs):
    method on_video (line 170) | def on_video(self, instance, value):
    method on_touch_down (line 174) | def on_touch_down(self, touch):
    method on_touch_move (line 182) | def on_touch_move(self, touch):
    method on_touch_up (line 188) | def on_touch_up(self, touch):
    method _update_seek (line 198) | def _update_seek(self, x):
    method _show_bubble (line 204) | def _show_bubble(self):
    method _hide_bubble (line 208) | def _hide_bubble(self):
    method on_alpha (line 212) | def on_alpha(self, instance, value):
    method _update_bubble (line 216) | def _update_bubble(self, *l):
    method _showhide_bubble (line 232) | def _showhide_bubble(self, instance, value):
  class VideoPlayerPreview (line 239) | class VideoPlayerPreview(FloatLayout):
    method on_touch_down (line 244) | def on_touch_down(self, touch):
  class VideoPlayerAnnotation (line 251) | class VideoPlayerAnnotation(Label):
    method on_annotation (line 277) | def on_annotation(self, instance, ann):
  class VideoPlayer (line 282) | class VideoPlayer(GridLayout):
    method __init__ (line 480) | def __init__(self, **kwargs):
    method _trigger_video_load (line 492) | def _trigger_video_load(self, *largs):
    method on_source (line 496) | def on_source(self, instance, value):
    method on_image_overlay_play (line 506) | def on_image_overlay_play(self, instance, value):
    method on_image_loading (line 509) | def on_image_loading(self, instance, value):
    method _load_thumbnail (line 512) | def _load_thumbnail(self):
    method _load_annotations (line 524) | def _load_annotations(self):
    method on_state (line 540) | def on_state(self, instance, value):
    method _set_state (line 544) | def _set_state(self, instance, value):
    method _do_video_load (line 547) | def _do_video_load(self, *largs):
    method on_play (line 557) | def on_play(self, instance, value):
    method on_volume (line 561) | def on_volume(self, instance, value):
    method on_position (line 566) | def on_position(self, instance, value):
    method seek (line 579) | def seek(self, percent):
    method _play_started (line 591) | def _play_started(self, instance, value):
    method on_touch_down (line 595) | def on_touch_down(self, touch):
    method on_fullscreen (line 603) | def on_fullscreen(self, instance, value):

FILE: tickeys/kivy/uix/vkeyboard.py
  class VKeyboard (line 135) | class VKeyboard(Scatter):
    method __init__ (line 328) | def __init__(self, **kwargs):
    method on_disabled (line 373) | def on_disabled(self, intance, value):
    method _update_layout_mode (line 376) | def _update_layout_mode(self, *l):
    method _load_layout (line 386) | def _load_layout(self, *largs):
    method _load_layouts (line 411) | def _load_layouts(self, *largs):
    method _load_layout_fn (line 419) | def _load_layout_fn(self, fn, name):
    method setup_mode (line 428) | def setup_mode(self, *largs):
    method setup_mode_dock (line 443) | def setup_mode_dock(self, *largs):
    method _update_dock_mode (line 463) | def _update_dock_mode(self, win, *largs):
    method setup_mode_free (line 468) | def setup_mode_free(self):
    method change_layout (line 515) | def change_layout(self):
    method refresh (line 519) | def refresh(self, force=False):
    method refresh_active_keys_layer (line 529) | def refresh_active_keys_layer(self):
    method refresh_keys_hint (line 544) | def refresh_keys_hint(self):
    method refresh_keys (line 582) | def refresh_keys(self):
    method draw_keys (line 614) | def draw_keys(self):
    method on_key_down (line 661) | def on_key_down(self, *largs):
    method on_key_up (line 664) | def on_key_up(self, *largs):
    method on_textinput (line 667) | def on_textinput(self, *largs):
    method get_key_at_pos (line 670) | def get_key_at_pos(self, x, y):
    method collide_margin (line 707) | def collide_margin(self, x, y):
    method process_key_on (line 719) | def process_key_on(self, touch):
    method process_key_up (line 763) | def process_key_up(self, touch):
    method _get_modifiers (line 790) | def _get_modifiers(self):
    method _start_repeat_key (line 798) | def _start_repeat_key(self, *kwargs):
    method _repeat_key (line 801) | def _repeat_key(self, *kwargs):
    method on_touch_down (line 804) | def on_touch_down(self, touch):
    method on_touch_up (line 824) | def on_touch_up(self, touch):

FILE: tickeys/kivy/uix/widget.py
  function _widget_destructor (line 191) | def _widget_destructor(uid, r):
  class WidgetException (line 199) | class WidgetException(Exception):
  class WidgetMetaclass (line 205) | class WidgetMetaclass(type):
    method __init__ (line 212) | def __init__(mcs, name, bases, attrs):
  class Widget (line 221) | class Widget(WidgetBase):
    method __init__ (line 253) | def __init__(self, **kwargs):
    method proxy_re
Condensed preview — 537 files, each showing path, character count, and a content snippet. Download the .json file or copy for the full structured content (5,070K chars).
[
  {
    "path": ".gitignore",
    "chars": 682,
    "preview": "# Byte-compiled / optimized / DLL files\n__pycache__/\n*.py[cod]\n\n\n# Distribution / packaging\n.Python\nenv/\nbuild/\ndevelop-"
  },
  {
    "path": "AUTHOURS",
    "chars": 15,
    "preview": "Huang Xiongbiao"
  },
  {
    "path": "Changelog",
    "chars": 1126,
    "preview": "2016-08-18 version 0.2.6\n1.启动不再需要root权限\n2.更换键盘和音效实现\n3.更加人性化\n\n2016-08-02 version 0.2.5\n1.修复小键盘的123不能响应热键的问题\n2.修复隐藏按钮的一个交互"
  },
  {
    "path": "LICENSE",
    "chars": 1083,
    "preview": "The MIT License (MIT)\n\nCopyright (c) 2015 Xiongbiao Huang\n\nPermission is hereby granted, free of charge, to any person o"
  },
  {
    "path": "MANIFEST.in",
    "chars": 304,
    "preview": "recursive-include tickeys/Resources/data *\nrecursive-include tickeys/Resources/fonts *\nrecursive-include tickeys/locale "
  },
  {
    "path": "README.md",
    "chars": 1086,
    "preview": "# Tickeys-linux\n\nInstant audio feedback when typing. For Linux.\n\n![Tickeys Icon](http://img.blog.csdn.net/20150802103616"
  },
  {
    "path": "README_en_US.md",
    "chars": 4496,
    "preview": "[Downlod 32 bit version tickeys_0.2.5_i386.deb:http://pan.baidu.com/s/1c2BN3Pm](http://pan.baidu.com/s/1c2BN3Pm)\n\n[Downl"
  },
  {
    "path": "README_zh_CN.md",
    "chars": 5167,
    "preview": "[下载32位tickeys_0.2.5_i386.deb:http://pan.baidu.com/s/1c2BN3Pm](http://pan.baidu.com/s/1c2BN3Pm)\n\n[下载64位tickeys_0.2.5_amd6"
  },
  {
    "path": "build.sh",
    "chars": 34,
    "preview": "#!/bin/bash\npyinstaller build.spec"
  },
  {
    "path": "build32.sh",
    "chars": 36,
    "preview": "#!/bin/bash\npyinstaller build32.spec"
  },
  {
    "path": "deb.sh",
    "chars": 51,
    "preview": "#!/bin/bash\nsh build.sh\ncd dist\nsudo sh make_deb.sh"
  },
  {
    "path": "deb32.sh",
    "chars": 55,
    "preview": "#!/bin/bash\nsh build32.sh\ncd dist\nsudo sh make_deb32.sh"
  },
  {
    "path": "setup.py",
    "chars": 1353,
    "preview": "from setuptools import setup, find_packages\nfrom tickeys import __version__, __author__, __email__\n\nrequirements = [\n   "
  },
  {
    "path": "tickeys/CLI.py",
    "chars": 3062,
    "preview": "#!/usr/bin/env python\n# coding: utf-8\nimport cmd\nfrom keyboardHandler import KeyboardHandler\nfrom __init__ import __vers"
  },
  {
    "path": "tickeys/GUI.py",
    "chars": 9422,
    "preview": "#!/usr/bin/env python\n# coding: utf-8\nfrom kivy.app import App\nfrom kivy.uix.spinner import Spinner\nfrom kivy.uix.boxlay"
  },
  {
    "path": "tickeys/Resources/data/bubble/license.txt",
    "chars": 2266,
    "preview": "Sound pack downloaded from Freesound.org\n----------------------------------------\n\nThis pack of sounds contains sounds b"
  },
  {
    "path": "tickeys/Resources/data/drum/_readme_and_license.txt",
    "chars": 1515,
    "preview": "Sound pack downloaded from Freesound.org\n----------------------------------------\n\nThis pack of sounds contains sounds b"
  },
  {
    "path": "tickeys/Resources/data/mechanical/license.txt",
    "chars": 1303,
    "preview": "Sound pack downloaded from Freesound.org\n----------------------------------------\n\nThis pack of sounds contains sounds b"
  },
  {
    "path": "tickeys/Resources/data/schemes.json",
    "chars": 1639,
    "preview": "[\n\t{\n\t\t\"name\":\"bubble\",\n\t\t\"display_name\":\"冒泡\",\n\t\t\"files\":[\"1.wav\",\"2.wav\",\"3.wav\",\"4.wav\",\"5.wav\",\"6.wav\",\"7.wav\",\"8.wav"
  },
  {
    "path": "tickeys/__init__.py",
    "chars": 149,
    "preview": "__author__ = 'Huang Xiongbiao'\n__email__ = 'billo@qq.com'\n__version__ = '0.2.6'\ndebug_mode = False\n\nfrom run import main"
  },
  {
    "path": "tickeys/build.py",
    "chars": 946,
    "preview": "import shutil\nimport os\nfrom cx_Freeze import setup, Executable\nfrom __init__ import __version__\n\nexecutable_filename = "
  },
  {
    "path": "tickeys/config.py",
    "chars": 1985,
    "preview": "import ConfigParser\nimport os\nfrom logger import logger\n\n\nclass Configer():\n    \"\"\"docstring for Configer\"\"\"\n    def __i"
  },
  {
    "path": "tickeys/keyboardHandler.py",
    "chars": 2127,
    "preview": "#!/usr/bin/env python\n# coding: utf-8\nimport threading\nfrom soundPlayer import SoundPlayer\nfrom logger import logger\nfro"
  },
  {
    "path": "tickeys/kivy/__init__.py",
    "chars": 14245,
    "preview": "'''\nKivy framework\n==============\n\nKivy is an open source library for developing multi-touch applications. It is\ncomplet"
  },
  {
    "path": "tickeys/kivy/_event.pxd",
    "chars": 2241,
    "preview": "from cpython.ref cimport PyObject\n\ncdef class ObjectWithUid(object):\n    cdef readonly int uid\n\n\ncdef class Observable(O"
  },
  {
    "path": "tickeys/kivy/adapters/__init__.py",
    "chars": 2826,
    "preview": "'''\nAdapters\n========\n\n.. versionadded:: 1.5.0\n\nAn adapter is a mediating controller-type class that processes and prese"
  },
  {
    "path": "tickeys/kivy/adapters/adapter.py",
    "chars": 5525,
    "preview": "'''\nAdapter\n=======\n\n.. versionadded:: 1.5\n\n.. warning::\n\n    This code is still experimental, and its API is subject to"
  },
  {
    "path": "tickeys/kivy/adapters/args_converters.py",
    "chars": 2057,
    "preview": "'''\nList Item View Argument Converters\n==================================\n\n.. versionadded:: 1.5\n\n\nThe default list item"
  },
  {
    "path": "tickeys/kivy/adapters/dictadapter.py",
    "chars": 5944,
    "preview": "'''\nDictAdapter\n===========\n\n.. versionadded:: 1.5\n\n.. warning::\n\n    This code is still experimental, and its API is su"
  },
  {
    "path": "tickeys/kivy/adapters/listadapter.py",
    "chars": 17943,
    "preview": "'''\nListAdapter\n=================\n\n.. versionadded:: 1.5\n\n.. warning::\n\n    This code is still experimental, and its API"
  },
  {
    "path": "tickeys/kivy/adapters/models.py",
    "chars": 2061,
    "preview": "'''\nSelectableDataItem\n==================\n\n.. versionadded:: 1.5\n\n.. warning::\n\n    This code is still experimental, and"
  },
  {
    "path": "tickeys/kivy/adapters/simplelistadapter.py",
    "chars": 2247,
    "preview": "'''\nSimpleListAdapter\n=================\n\n.. versionadded:: 1.5\n\n.. warning::\n\n    This code is still experimental, and i"
  },
  {
    "path": "tickeys/kivy/animation.py",
    "chars": 23299,
    "preview": "'''\nAnimation\n=========\n\n:class:`Animation` and :class:`AnimationTransition` are used to animate\n:class:`~kivy.uix.widge"
  },
  {
    "path": "tickeys/kivy/app.py",
    "chars": 36273,
    "preview": "'''\nApplication\n===========\n\nThe :class:`App` class is the base for creating Kivy applications.\nThink of it as your main"
  },
  {
    "path": "tickeys/kivy/atlas.py",
    "chars": 15245,
    "preview": "'''\nAtlas\n=====\n\n.. versionadded:: 1.1.0\n\nAtlas manages texture atlases: packing multiple textures into\none. With it, yo"
  },
  {
    "path": "tickeys/kivy/base.py",
    "chars": 15676,
    "preview": "# pylint: disable=W0611\n'''\nKivy Base\n=========\n\nThis module contains core Kivy functionality and is not intended for en"
  },
  {
    "path": "tickeys/kivy/cache.py",
    "chars": 7975,
    "preview": "'''\nCache manager\n=============\n\nThe cache manager can be used to store python objects attached to a unique\nkey. The cac"
  },
  {
    "path": "tickeys/kivy/clock.py",
    "chars": 22618,
    "preview": "'''\nClock object\n============\n\nThe :class:`Clock` object allows you to schedule a function call in the\nfuture; once or r"
  },
  {
    "path": "tickeys/kivy/compat.py",
    "chars": 929,
    "preview": "'''\nCompatibility module for Python 2.7 and > 3.3\n=============================================\n'''\n\n__all__ = ('PY2', '"
  },
  {
    "path": "tickeys/kivy/config.py",
    "chars": 30003,
    "preview": "'''\nConfiguration object\n====================\n\nThe :class:`Config` object is an instance of a modified Python ConfigPars"
  },
  {
    "path": "tickeys/kivy/context.py",
    "chars": 2525,
    "preview": "'''\nContext\n=======\n\n.. versionadded:: 1.8.0\n\n.. warning::\n\n    This is experimental and subject to change as long as th"
  },
  {
    "path": "tickeys/kivy/core/__init__.py",
    "chars": 4953,
    "preview": "'''\nCore Abstraction\n================\n\nThis module defines the abstraction layers for our core providers and their\nimple"
  },
  {
    "path": "tickeys/kivy/core/audio/__init__.py",
    "chars": 5679,
    "preview": "'''\nAudio\n=====\n\nLoad an audio sound and play it with::\n\n    from kivy.core.audio import SoundLoader\n\n    sound = SoundL"
  },
  {
    "path": "tickeys/kivy/core/audio/audio_ffpyplayer.py",
    "chars": 5984,
    "preview": "'''\nFFmpeg based audio player\n=========================\n\nTo use, you need to install ffpyplyaer and have a compiled ffmp"
  },
  {
    "path": "tickeys/kivy/core/audio/audio_gi.py",
    "chars": 4209,
    "preview": "'''\nAudio Gi\n========\n\nImplementation of Sound with Gi. Gi is both compatible with Python 2 and 3.\n'''\n\nfrom gi.reposito"
  },
  {
    "path": "tickeys/kivy/core/audio/audio_gstplayer.py",
    "chars": 2636,
    "preview": "'''\nAudio Gstplayer\n===============\n\n.. versionadded:: 1.8.0\n\nImplementation of a VideoBase with Kivy :class:`~kivy.lib."
  },
  {
    "path": "tickeys/kivy/core/audio/audio_pygame.py",
    "chars": 3200,
    "preview": "'''\nAudioPygame: implementation of Sound with Pygame\n'''\n\n__all__ = ('SoundPygame', )\n\nfrom kivy.clock import Clock\nfrom"
  },
  {
    "path": "tickeys/kivy/core/audio/audio_pygst.py",
    "chars": 4153,
    "preview": "'''\nAudio Gstreamer\n===============\n\nImplementation of Sound with GStreamer\n'''\n\ntry:\n    import gi  # NOQA\nexcept Impor"
  },
  {
    "path": "tickeys/kivy/core/camera/__init__.py",
    "chars": 4426,
    "preview": "'''\nCamera\n======\n\nCore class for acquiring the camera and converting its input into a\n:class:`~kivy.graphics.texture.Te"
  },
  {
    "path": "tickeys/kivy/core/camera/camera_gi.py",
    "chars": 5757,
    "preview": "'''\nGi Camera\n=========\n\nImplement CameraBase with Gi / Gstreamer, working on both Python 2 and 3\n'''\n\n__all__ = ('Camer"
  },
  {
    "path": "tickeys/kivy/core/camera/camera_opencv.py",
    "chars": 3099,
    "preview": "'''\nOpenCV Camera: Implement CameraBase with OpenCV\n'''\n\n#\n# TODO: make usage of thread or multiprocess\n#\n\n__all__ = ('C"
  },
  {
    "path": "tickeys/kivy/core/camera/camera_pygst.py",
    "chars": 3483,
    "preview": "'''\nGStreamer Camera\n================\n\nImplement CameraBase with GStreamer, based on PyGST\n'''\n\n__all__ = ('CameraPyGst'"
  },
  {
    "path": "tickeys/kivy/core/camera/camera_videocapture.py",
    "chars": 1676,
    "preview": "'''\nVideoCapture Camera: Implement CameraBase with VideoCapture\n'''\n\n#\n# TODO: make usage of thread or multiprocess\n#\n\n_"
  },
  {
    "path": "tickeys/kivy/core/clipboard/__init__.py",
    "chars": 4611,
    "preview": "'''\nClipboard\n=========\n\nCore class for accessing the Clipboard. If we are not able to access the\nsystem clipboard, a fa"
  },
  {
    "path": "tickeys/kivy/core/clipboard/clipboard_android.py",
    "chars": 2675,
    "preview": "'''\nClipboard Android\n=================\n\nAndroid implementation of Clipboard provider, using Pyjnius.\n'''\n\n__all__ = ('C"
  },
  {
    "path": "tickeys/kivy/core/clipboard/clipboard_dbusklipper.py",
    "chars": 1013,
    "preview": "'''\nClipboard Dbus: an implementation of the Clipboard using dbus and klipper.\n'''\n\n__all__ = ('ClipboardDbusKlipper', )"
  },
  {
    "path": "tickeys/kivy/core/clipboard/clipboard_dummy.py",
    "chars": 635,
    "preview": "'''\nClipboard Dummy: an internal implementation that does not use the system\nclipboard.\n'''\n\n__all__ = ('ClipboardDummy'"
  },
  {
    "path": "tickeys/kivy/core/clipboard/clipboard_gtk3.py",
    "chars": 1167,
    "preview": "'''\nClipboard Gtk3: an implementation of the Clipboard using Gtk3.\n'''\n\n__all__ = ('ClipboardGtk3',)\n\nfrom kivy.utils im"
  },
  {
    "path": "tickeys/kivy/core/clipboard/clipboard_nspaste.py",
    "chars": 1218,
    "preview": "'''\nClipboard OsX: implementation of clipboard using Appkit\n'''\n\n__all__ = ('ClipboardNSPaste', )\n\nfrom kivy.core.clipbo"
  },
  {
    "path": "tickeys/kivy/core/clipboard/clipboard_pygame.py",
    "chars": 1446,
    "preview": "'''\nClipboard Pygame: an implementation of the Clipboard using pygame.scrap.\n'''\n\n__all__ = ('ClipboardPygame', )\n\nfrom "
  },
  {
    "path": "tickeys/kivy/core/clipboard/clipboard_sdl2.py",
    "chars": 854,
    "preview": "'''\nClipboard SDL2: an implementation of the Clipboard using sdl2.\n'''\n\n__all__ = ('ClipboardSDL2', )\n\nfrom kivy.utils i"
  },
  {
    "path": "tickeys/kivy/core/clipboard/clipboard_winctypes.py",
    "chars": 1363,
    "preview": "'''\nClipboard windows: an implementation of the Clipboard using ctypes.\n'''\n\n__all__ = ('ClipboardWindows', )\n\nfrom kivy"
  },
  {
    "path": "tickeys/kivy/core/clipboard/clipboard_xsel.py",
    "chars": 822,
    "preview": "'''\nClipboard xsel: an implementation of the Clipboard using xsel command line tool.\n'''\n\n__all__ = ('ClipboardXsel', )\n"
  },
  {
    "path": "tickeys/kivy/core/gl/__init__.py",
    "chars": 2824,
    "preview": "# pylint: disable=W0611\n'''\nOpenGL\n======\n\nSelect and use the best OpenGL library available. Depending on your system, t"
  },
  {
    "path": "tickeys/kivy/core/image/__init__.py",
    "chars": 28948,
    "preview": "'''\nImage\n=====\n\nCore classes for loading images and converting them to a\n:class:`~kivy.graphics.texture.Texture`. The r"
  },
  {
    "path": "tickeys/kivy/core/image/img_dds.py",
    "chars": 1048,
    "preview": "'''\nDDS: DDS image loader\n'''\n\n__all__ = ('ImageLoaderDDS', )\n\nfrom kivy.lib.ddsfile import DDSFile\nfrom kivy.logger imp"
  },
  {
    "path": "tickeys/kivy/core/image/img_ffpyplayer.py",
    "chars": 2599,
    "preview": "'''\nFFPyPlayer: FFmpeg based image loader\n'''\n\n__all__ = ('ImageLoaderFFPy', )\n\nimport ffpyplayer\nfrom ffpyplayer.pic im"
  },
  {
    "path": "tickeys/kivy/core/image/img_gif.py",
    "chars": 19741,
    "preview": "#-*- coding: utf-8 -*-\n#\n#    this program is free software; you can redistribute it and/or modify\n#    it under the ter"
  },
  {
    "path": "tickeys/kivy/core/image/img_pil.py",
    "chars": 3535,
    "preview": "'''\nPIL: PIL image loader\n'''\n\n__all__ = ('ImageLoaderPIL', )\n\ntry:\n    from PIL import Image as PILImage\nexcept:\n    im"
  },
  {
    "path": "tickeys/kivy/core/image/img_pygame.py",
    "chars": 3261,
    "preview": "'''\nPygame: Pygame image loader\n'''\n\n__all__ = ('ImageLoaderPygame', )\n\nfrom kivy.compat import PY2\nfrom kivy.logger imp"
  },
  {
    "path": "tickeys/kivy/core/image/img_sdl2.py",
    "chars": 1571,
    "preview": "'''\nSDL2 image loader\n=================\n'''\n\n__all__ = ('ImageLoaderSDL2', )\n\nfrom kivy.compat import PY2\nfrom kivy.logg"
  },
  {
    "path": "tickeys/kivy/core/image/img_tex.py",
    "chars": 1548,
    "preview": "'''\nTex: Compressed texture\n'''\n\n__all__ = ('ImageLoaderTex', )\n\nimport json\nfrom struct import unpack\nfrom kivy.logger "
  },
  {
    "path": "tickeys/kivy/core/spelling/__init__.py",
    "chars": 4637,
    "preview": "'''\nSpelling\n========\n\nProvides abstracted access to a range of spellchecking backends as well as\nword suggestions. The "
  },
  {
    "path": "tickeys/kivy/core/spelling/spelling_enchant.py",
    "chars": 1329,
    "preview": "'''\nEnchant Spelling: Implements spelling backend based on enchant.\n'''\n\n\nimport enchant\n\nfrom kivy.core.spelling import"
  },
  {
    "path": "tickeys/kivy/core/spelling/spelling_osxappkit.py",
    "chars": 2441,
    "preview": "'''\nAppKit Spelling: Implements spelling backend based on OSX's spellchecking\n                 features provided by the "
  },
  {
    "path": "tickeys/kivy/core/text/__init__.py",
    "chars": 27225,
    "preview": "'''\nText\n====\n\nAn abstraction of text creation. Depending of the selected backend, the\naccuracy of text rendering may va"
  },
  {
    "path": "tickeys/kivy/core/text/markup.py",
    "chars": 31300,
    "preview": "'''\nText Markup\n===========\n\n.. versionadded:: 1.1.0\n\nWe provide a simple text-markup for inline text styling. The synta"
  },
  {
    "path": "tickeys/kivy/core/text/text_layout.pxd",
    "chars": 315,
    "preview": "\n\ncdef class LayoutWord:\n    cdef public object text\n    cdef public int lw, lh\n    cdef public dict options\n\n\ncdef clas"
  },
  {
    "path": "tickeys/kivy/core/text/text_pil.py",
    "chars": 1686,
    "preview": "'''\nText PIL: Draw text with PIL\n'''\n\n__all__ = ('LabelPIL', )\n\ntry:\n    from PIL import Image, ImageFont, ImageDraw\nexc"
  },
  {
    "path": "tickeys/kivy/core/text/text_pygame.py",
    "chars": 3492,
    "preview": "'''\nText Pygame: Draw text with pygame\n'''\n\n__all__ = ('LabelPygame', )\n\nfrom kivy.compat import PY2\nfrom kivy.core.text"
  },
  {
    "path": "tickeys/kivy/core/text/text_sdl2.py",
    "chars": 1288,
    "preview": "'''\nSDL2 text provider\n==================\n\nBased on SDL2 + SDL2_ttf\n'''\n\n__all__ = ('LabelSDL2', )\n\nfrom kivy.compat imp"
  },
  {
    "path": "tickeys/kivy/core/video/__init__.py",
    "chars": 6049,
    "preview": "'''\nVideo\n=====\n\nCore class for reading video files and managing the\n:class:`kivy.graphics.texture.Texture` video.\n\n.. v"
  },
  {
    "path": "tickeys/kivy/core/video/video_ffmpeg.py",
    "chars": 2787,
    "preview": "'''\nFFmpeg video abstraction\n========================\n\n.. versionadded:: 1.0.8\n\nThis abstraction requires ffmpeg python "
  },
  {
    "path": "tickeys/kivy/core/video/video_ffpyplayer.py",
    "chars": 10744,
    "preview": "'''\nFFmpeg based video abstraction\n==============================\n\nTo use, you need to install ffpyplyaer and have a com"
  },
  {
    "path": "tickeys/kivy/core/video/video_gi.py",
    "chars": 7511,
    "preview": "'''\nVideo GI\n========\n\nImplementation of VideoBase with using pygi / gstreamer. Pygi is both\ncompatible with Python 2 an"
  },
  {
    "path": "tickeys/kivy/core/video/video_gstplayer.py",
    "chars": 3855,
    "preview": "'''\nVideo Gstplayer\n===============\n\n.. versionadded:: 1.8.0\n\nImplementation of a VideoBase with Kivy :class:`~kivy.lib."
  },
  {
    "path": "tickeys/kivy/core/video/video_null.py",
    "chars": 224,
    "preview": "\n'''\nVideoNull: empty implementation of VideoBase for the no provider case\n'''\n\nfrom kivy.core.video import VideoBase\n\n\n"
  },
  {
    "path": "tickeys/kivy/core/video/video_pyglet.py",
    "chars": 2994,
    "preview": "\n'''\nVideoPyglet: implementation of VideoBase with Pyglet\n'''\n\nimport pyglet\n\nfrom kivy.core.video import VideoBase\n\n\n#h"
  },
  {
    "path": "tickeys/kivy/core/video/video_pygst.py",
    "chars": 6019,
    "preview": "'''\nVideo PyGst\n===========\n\nImplementation of a VideoBase using PyGST. This module is compatible only with\nPython 2.\n''"
  },
  {
    "path": "tickeys/kivy/core/window/__init__.py",
    "chars": 49106,
    "preview": "# pylint: disable=W0611\n# coding: utf-8\n'''\nWindow\n======\n\nCore class for creating the default Kivy window. Kivy support"
  },
  {
    "path": "tickeys/kivy/core/window/window_egl_rpi.py",
    "chars": 2762,
    "preview": "'''\nEGL Rpi Window: EGL Window provider, specialized for the Pi\n\nInspired by: rpi_vid_core + JF002 rpi kivy  repo\n'''\n\n_"
  },
  {
    "path": "tickeys/kivy/core/window/window_pygame.py",
    "chars": 17178,
    "preview": "'''\nWindow Pygame: windowing provider based on Pygame\n'''\n\n__all__ = ('WindowPygame', )\n\n# fail early if possible\nimport"
  },
  {
    "path": "tickeys/kivy/core/window/window_sdl2.py",
    "chars": 20510,
    "preview": "# found a way to include it more easily.\n'''\nSDL2 Window\n===========\n\nWindowing provider directly based on our own wrapp"
  },
  {
    "path": "tickeys/kivy/data/glsl/default.fs",
    "chars": 94,
    "preview": "$HEADER$\nvoid main (void){\n    gl_FragColor = frag_color * texture2D(texture0, tex_coord0);\n}\n"
  },
  {
    "path": "tickeys/kivy/data/glsl/default.vs",
    "chars": 190,
    "preview": "$HEADER$\nvoid main (void) {\n  frag_color = color * vec4(1.0, 1.0, 1.0, opacity);\n  tex_coord0 = vTexCoords0;\n  gl_Positi"
  },
  {
    "path": "tickeys/kivy/data/glsl/header.fs",
    "chars": 195,
    "preview": "#ifdef GL_ES\n    precision highp float;\n#endif\n\n/* Outputs from the vertex shader */\nvarying vec4 frag_color;\nvarying ve"
  },
  {
    "path": "tickeys/kivy/data/glsl/header.vs",
    "chars": 370,
    "preview": "#ifdef GL_ES\n    precision highp float;\n#endif\n\n/* Outputs to the fragment shader */\nvarying vec4 frag_color;\nvarying ve"
  },
  {
    "path": "tickeys/kivy/data/images/defaulttheme.atlas",
    "chars": 3526,
    "preview": "{\"defaulttheme-0.png\": {\"progressbar_background\": [391, 227, 24, 24], \"tab_btn_disabled\": [264, 137, 32, 32], \"tab_btn_p"
  },
  {
    "path": "tickeys/kivy/data/keyboards/azerty.json",
    "chars": 3547,
    "preview": "{\n    \"title\" : \"Azerty\",\n    \"description\" : \"A French keyboard without international keys\",\n    \"cols\" : 15,\n\t\"rows\": "
  },
  {
    "path": "tickeys/kivy/data/keyboards/de_CH.json",
    "chars": 4953,
    "preview": "{\n    \"title\": \"de_CH\",\n    \"description\": \"A Swiss German keyboard, touch optimized (no shift+caps lock)\",\n\t\"cols\": 15,"
  },
  {
    "path": "tickeys/kivy/data/keyboards/en_US.json",
    "chars": 4949,
    "preview": "{\n    \"title\": \"en_US\",\n    \"description\": \"A US Keyboard, touch optimized (no shift+caps lock)\",\n\t\"cols\": 15,\n    \"rows"
  },
  {
    "path": "tickeys/kivy/data/keyboards/fr_CH.json",
    "chars": 4953,
    "preview": "{\n    \"title\": \"fr_CH\",\n    \"description\": \"A Swiss French keyboard, touch optimized (no shift+caps lock)\",\n\t\"cols\": 15,"
  },
  {
    "path": "tickeys/kivy/data/keyboards/qwerty.json",
    "chars": 3319,
    "preview": "{\n    \"title\": \"Qwerty\",\n    \"description\": \"A classical US Keyboard\",\n\t\"cols\": 15,\n    \"rows\": 5,\n    \"normal_1\": [\n   "
  },
  {
    "path": "tickeys/kivy/data/keyboards/qwertz.json",
    "chars": 3309,
    "preview": "{\n    \"title\": \"Qwerty\",\n    \"description\": \"A german Keyboard\",\n\t\"cols\": 15,\n    \"rows\": 5,\n    \"normal_1\": [\n        ["
  },
  {
    "path": "tickeys/kivy/data/settings_kivy.json",
    "chars": 2603,
    "preview": "[\n\t{\n\t\t\"type\": \"title\",\n\t\t\"title\": \"Windows\"\n\t},\n\t{\n\t\t\"type\": \"bool\",\n\t\t\"title\": \"Fullscreen\",\n\t\t\"desc\": \"Set the window"
  },
  {
    "path": "tickeys/kivy/data/style.kv",
    "chars": 39633,
    "preview": "#:kivy 1.0\n\n<Label>:\n    canvas:\n        Color:\n            rgba: self.disabled_color if self.disabled else (self.color "
  },
  {
    "path": "tickeys/kivy/effects/__init__.py",
    "chars": 924,
    "preview": "'''\nEffects\n=======\n\n.. versionadded:: 1.7.0\n\nEverything starts with the :class:`~kinetic.KineticEffect`, the base class"
  },
  {
    "path": "tickeys/kivy/effects/dampedscroll.py",
    "chars": 3492,
    "preview": "'''\nDamped scroll effect\n====================\n\n.. versionadded:: 1.7.0\n\nThis damped scroll effect will use the\n:attr:`~k"
  },
  {
    "path": "tickeys/kivy/effects/kinetic.py",
    "chars": 5519,
    "preview": "'''\nKinetic effect\n==============\n\n.. versionadded:: 1.7.0\n\nThe :class:`KineticEffect` is the base class that is used to"
  },
  {
    "path": "tickeys/kivy/effects/opacityscroll.py",
    "chars": 838,
    "preview": "'''\nOpacity scroll effect\n=====================\n\nBased on the :class:`~kivy.effects.damped.DampedScrollEffect`, this one"
  },
  {
    "path": "tickeys/kivy/effects/scroll.py",
    "chars": 4069,
    "preview": "'''\nScroll effect\n=============\n\n.. versionadded:: 1.7.0\n\nBased on the :class:`~kivy.effects.kinetic` effect, the :class"
  },
  {
    "path": "tickeys/kivy/event.py",
    "chars": 555,
    "preview": "# This is a \"jumping\" module, required for python-for-android project\n# Because we are putting all the module into the s"
  },
  {
    "path": "tickeys/kivy/ext/__init__.py",
    "chars": 12523,
    "preview": "'''\nExtension Support\n=================\n\nSometimes your application requires functionality that is beyond the scope of\nw"
  },
  {
    "path": "tickeys/kivy/extras/__init__.py",
    "chars": 1,
    "preview": "\n"
  },
  {
    "path": "tickeys/kivy/extras/highlight.py",
    "chars": 1880,
    "preview": "'''Pygments lexer for kv language\n'''\nfrom pygments.lexer import RegexLexer, bygroups, using\nfrom pygments.lexers.agile "
  },
  {
    "path": "tickeys/kivy/factory.py",
    "chars": 5771,
    "preview": "'''\nFactory object\n==============\n\nThe factory can be used to automatically register any class or module\nand instantiate"
  },
  {
    "path": "tickeys/kivy/factory_registers.py",
    "chars": 8491,
    "preview": "# Auto-generated file by setup.py build_factory\n\nfrom kivy.factory import Factory\n\nr = Factory.register\nr('Adapter', mod"
  },
  {
    "path": "tickeys/kivy/garden/__init__.py",
    "chars": 3061,
    "preview": "'''\nGarden\n======\n\n.. versionadded:: 1.7.0\n\n.. versionchanged:: 1.8.0\n\nGarden is a project to centralize addons for Kivy"
  },
  {
    "path": "tickeys/kivy/geometry.py",
    "chars": 3795,
    "preview": "'''\nGeometry utilities\n==================\n\nThis module contains some helper functions for geometric calculations.\n'''\n\n_"
  },
  {
    "path": "tickeys/kivy/gesture.py",
    "chars": 14632,
    "preview": "'''\nGesture recognition\n===================\n\nThis class allows you to easily create new\ngestures and compare them::\n\n   "
  },
  {
    "path": "tickeys/kivy/graphics/__init__.py",
    "chars": 5141,
    "preview": "'''\nGraphics\n========\n\nThis package assembles many low level functions used for drawing. The whole\ngraphics package is c"
  },
  {
    "path": "tickeys/kivy/graphics/buffer.pxd",
    "chars": 529,
    "preview": "cdef class Buffer:\n    cdef void *data\n    cdef int *l_free\n    cdef int i_free\n    cdef long block_size\n    cdef long b"
  },
  {
    "path": "tickeys/kivy/graphics/c_opengl.pxd",
    "chars": 20573,
    "preview": "include \"config.pxi\"\n\ncdef extern from \"gl_redirect.h\":\n\n    ctypedef void               GLvoid\n    ctypedef char       "
  },
  {
    "path": "tickeys/kivy/graphics/c_opengl_debug.pxd",
    "chars": 12112,
    "preview": "ctypedef void               GLvoid\nctypedef char               GLchar\nctypedef unsigned int       GLenum\nctypedef unsign"
  },
  {
    "path": "tickeys/kivy/graphics/common.pxi",
    "chars": 823,
    "preview": "#\n# Common definition\n#\n\nDEF PI2 = 1.5707963267948966\nDEF PI = 3.1415926535897931\n\ncdef extern from *:\n    ctypedef char"
  },
  {
    "path": "tickeys/kivy/graphics/compiler.pxd",
    "chars": 166,
    "preview": "cdef class GraphicsCompiler\n\nfrom instructions cimport InstructionGroup\n\ncdef class GraphicsCompiler:\n    cdef Instructi"
  },
  {
    "path": "tickeys/kivy/graphics/config.h",
    "chars": 392,
    "preview": "// Autogenerated file for Kivy C configuration\n#define __PY3 0\n#define __USE_RPI 0\n#define __USE_OPENGL_ES2 1\n#define __"
  },
  {
    "path": "tickeys/kivy/graphics/config.pxi",
    "chars": 304,
    "preview": "# Autogenerated file for Kivy Cython configuration\nDEF PY3 = 0\nDEF USE_RPI = 0\nDEF USE_OPENGL_ES2 = 1\nDEF USE_OPENGL_DEB"
  },
  {
    "path": "tickeys/kivy/graphics/context.pxd",
    "chars": 1089,
    "preview": "from kivy.graphics.instructions cimport Instruction, Canvas\nfrom kivy.graphics.texture cimport Texture\nfrom kivy.graphic"
  },
  {
    "path": "tickeys/kivy/graphics/context_instructions.pxd",
    "chars": 1955,
    "preview": "cdef class LineWidth\ncdef class Color\ncdef class BindTexture\n\nfrom transformation cimport Matrix\nfrom instructions cimpo"
  },
  {
    "path": "tickeys/kivy/graphics/fbo.pxd",
    "chars": 853,
    "preview": "from c_opengl cimport *\nfrom instructions cimport RenderContext, Canvas\nfrom texture cimport Texture\n\ncdef class Fbo(Ren"
  },
  {
    "path": "tickeys/kivy/graphics/img_tools.pxi",
    "chars": 2465,
    "preview": "from kivy.graphics.opengl_utils cimport (gl_has_texture_native_format,\n    gl_has_texture_conversion)\ncimport cython\nfro"
  },
  {
    "path": "tickeys/kivy/graphics/instructions.pxd",
    "chars": 3563,
    "preview": "include \"config.pxi\"\n\ncdef class Instruction\ncdef class InstructionGroup\ncdef class ContextInstruction\ncdef class Vertex"
  },
  {
    "path": "tickeys/kivy/graphics/opcodes.pxi",
    "chars": 305,
    "preview": "cdef int GI_NOOP         = 1 << 0\ncdef int GI_IGNORE       = 1 << 1\ncdef int GI_NEEDS_UPDATE = 1 << 2\ncdef int GI_GROUP "
  },
  {
    "path": "tickeys/kivy/graphics/opengl_utils.pxd",
    "chars": 405,
    "preview": "cpdef list gl_get_extensions()\ncpdef int gl_has_extension(name)\ncpdef gl_register_get_size(int constid, int size)\ncpdef "
  },
  {
    "path": "tickeys/kivy/graphics/opengl_utils_def.pxi",
    "chars": 471,
    "preview": "# c definition\ncdef int c_GLCAP_BGRA = 0x0001\ncdef int c_GLCAP_NPOT = 0x0002\ncdef int c_GLCAP_S3TC = 0x0003\ncdef int c_G"
  },
  {
    "path": "tickeys/kivy/graphics/shader.pxd",
    "chars": 1455,
    "preview": "from c_opengl cimport GLuint\nfrom transformation cimport Matrix\nfrom vertex cimport VertexFormat\n\ncdef class ShaderSourc"
  },
  {
    "path": "tickeys/kivy/graphics/stencil_instructions.pxd",
    "chars": 367,
    "preview": "from kivy.graphics.instructions cimport Instruction\n\ncdef class StencilPush(Instruction):\n    cdef int apply(self) excep"
  },
  {
    "path": "tickeys/kivy/graphics/svg.pxd",
    "chars": 2294,
    "preview": "cdef class Matrix\ncdef class Svg\n\nfrom cython cimport view\nfrom kivy.graphics.instructions cimport RenderContext\nfrom ki"
  },
  {
    "path": "tickeys/kivy/graphics/tesselator.pxd",
    "chars": 305,
    "preview": "cdef class Tesselator:\n    cdef void *tess\n    cdef int element_type\n    cdef int polysize\n    cdef void add_contour_dat"
  },
  {
    "path": "tickeys/kivy/graphics/texture.pxd",
    "chars": 1182,
    "preview": "from c_opengl cimport GLuint\n\ncdef class Texture:\n    cdef object __weakref__\n    cdef unsigned int flags\n\n    cdef obje"
  },
  {
    "path": "tickeys/kivy/graphics/transformation.pxd",
    "chars": 1188,
    "preview": "ctypedef double matrix_t[16]\n\ncdef class Matrix:\n    cdef matrix_t mat\n\n    cpdef Matrix identity(self)\n\n    cpdef Matri"
  },
  {
    "path": "tickeys/kivy/graphics/vbo.pxd",
    "chars": 1530,
    "preview": "from buffer cimport Buffer\nfrom c_opengl cimport GLuint\nfrom vertex cimport vertex_t, vertex_attr_t, VertexFormat\n\ncdef "
  },
  {
    "path": "tickeys/kivy/graphics/vertex.pxd",
    "chars": 408,
    "preview": "from c_opengl cimport GLuint\n\ncdef struct vertex_t:\n    float x, y\n    float s0, t0\n\nctypedef struct vertex_attr_t:\n    "
  },
  {
    "path": "tickeys/kivy/graphics/vertex_instructions.pxd",
    "chars": 712,
    "preview": "from kivy.graphics.instructions cimport VertexInstruction\nfrom kivy.graphics.vertex cimport VertexFormat\n\n\ncdef class Be"
  },
  {
    "path": "tickeys/kivy/graphics/vertex_instructions_line.pxi",
    "chars": 50812,
    "preview": "DEF LINE_CAP_NONE = 0\nDEF LINE_CAP_SQUARE = 1\nDEF LINE_CAP_ROUND = 2\n\nDEF LINE_JOINT_NONE = 0\nDEF LINE_JOINT_MITER = 1\nD"
  },
  {
    "path": "tickeys/kivy/input/__init__.py",
    "chars": 1148,
    "preview": "# pylint: disable=W0611\n'''\nInput management\n================\n\nOur input system is wide and simple at the same time. We "
  },
  {
    "path": "tickeys/kivy/input/factory.py",
    "chars": 972,
    "preview": "'''\nMotion Event Factory\n====================\n\nFactory of :class:`~kivy.input.motionevent.MotionEvent` providers.\n'''\n\n_"
  },
  {
    "path": "tickeys/kivy/input/motionevent.py",
    "chars": 16135,
    "preview": "'''\n.. _motionevent:\n\nMotion Event\n============\n\nThe :class:`MotionEvent` is the base class used for every touch and non"
  },
  {
    "path": "tickeys/kivy/input/postproc/__init__.py",
    "chars": 1039,
    "preview": "'''\nInput Postprocessing\n====================\n\n'''\n\n__all__ = ('kivy_postproc_modules', )\n\nimport os\nfrom kivy.input.pos"
  },
  {
    "path": "tickeys/kivy/input/postproc/calibration.py",
    "chars": 3137,
    "preview": "'''\nCalibration\n===========\n\n.. versionadded:: 1.9.0\n\nRecalibrate input device to a specific range / offset.\n\nLet's say "
  },
  {
    "path": "tickeys/kivy/input/postproc/dejitter.py",
    "chars": 2547,
    "preview": "'''\nDejitter\n========\n\nPrevent blob jittering.\n\nA problem that is often faced (esp. in optical MT setups) is that of\njit"
  },
  {
    "path": "tickeys/kivy/input/postproc/doubletap.py",
    "chars": 3345,
    "preview": "'''\nDouble Tap\n==========\n\nSearch touch for a double tap\n'''\n\n__all__ = ('InputPostprocDoubleTap', )\n\nfrom time import t"
  },
  {
    "path": "tickeys/kivy/input/postproc/ignorelist.py",
    "chars": 1365,
    "preview": "'''\nIgnore list\n===========\n\nIgnore touch on some areas of the screen\n'''\n\n__all__ = ('InputPostprocIgnoreList', )\n\nfrom"
  },
  {
    "path": "tickeys/kivy/input/postproc/retaintouch.py",
    "chars": 3224,
    "preview": "'''\nRetain Touch\n============\n\nReuse touch to counter lost finger behavior\n'''\n\n__all__ = ('InputPostprocRetainTouch', )"
  },
  {
    "path": "tickeys/kivy/input/postproc/tripletap.py",
    "chars": 3512,
    "preview": "'''\nTriple Tap\n==========\n\n.. versionadded:: 1.7.0\n\nSearch touch for a triple tap\n'''\n\n__all__ = ('InputPostprocTripleTa"
  },
  {
    "path": "tickeys/kivy/input/provider.py",
    "chars": 1080,
    "preview": "'''\nMotion Event Provider\n=====================\n\nAbstract class for the implemention of a\n:class:`~kivy.input.motioneven"
  },
  {
    "path": "tickeys/kivy/input/providers/__init__.py",
    "chars": 1879,
    "preview": "# pylint: disable=W0611\n'''\nProviders\n=========\n\n'''\n\nimport os\n\nfrom kivy.utils import platform as core_platform\nfrom k"
  },
  {
    "path": "tickeys/kivy/input/providers/androidjoystick.py",
    "chars": 3682,
    "preview": "# pylint: disable=W0611\n'''\nAndroid Joystick Input Provider\n===============================\n\nThis module is based on the"
  },
  {
    "path": "tickeys/kivy/input/providers/hidinput.py",
    "chars": 26197,
    "preview": "# coding utf-8\n'''\nNative support for HID input from the linux kernel\n=================================================="
  },
  {
    "path": "tickeys/kivy/input/providers/leapfinger.py",
    "chars": 3235,
    "preview": "'''\nLeap Motion - finger only\n=========================\n'''\n\n__all__ = ('LeapFingerEventProvider', 'LeapFingerEvent')\n\ni"
  },
  {
    "path": "tickeys/kivy/input/providers/linuxwacom.py",
    "chars": 14837,
    "preview": "'''\nNative support of Wacom tablet from linuxwacom driver\n=====================================================\n\nTo conf"
  },
  {
    "path": "tickeys/kivy/input/providers/mactouch.py",
    "chars": 7202,
    "preview": "'''\nNative support of MultitouchSupport framework for MacBook (MaxOSX platform)\n========================================"
  },
  {
    "path": "tickeys/kivy/input/providers/mouse.py",
    "chars": 9957,
    "preview": "'''\nMouse provider implementation\n=============================\n\nOn linux systems, the mouse provider can be annoying wh"
  },
  {
    "path": "tickeys/kivy/input/providers/mtdev.py",
    "chars": 12325,
    "preview": "'''\nNative support for Multitouch devices on Linux, using libmtdev.\n===================================================="
  },
  {
    "path": "tickeys/kivy/input/providers/probesysfs.py",
    "chars": 7245,
    "preview": "'''\nAuto Create Input Provider Config Entry for Available MT Hardware (linux only).\n===================================="
  },
  {
    "path": "tickeys/kivy/input/providers/tuio.py",
    "chars": 12049,
    "preview": "'''\nTUIO Input Provider\n===================\n\nTUIO is the de facto standard network protocol for the transmission of\ntouc"
  },
  {
    "path": "tickeys/kivy/input/providers/wm_common.py",
    "chars": 1439,
    "preview": "'''\nCommon definitions for a Windows provider\n=========================================\n\nThis file provides common defin"
  },
  {
    "path": "tickeys/kivy/input/providers/wm_pen.py",
    "chars": 5488,
    "preview": "'''\nSupport for WM_PEN messages (Windows platform)\n==============================================\n'''\n\n__all__ = ('WM_Pe"
  },
  {
    "path": "tickeys/kivy/input/providers/wm_touch.py",
    "chars": 8830,
    "preview": "'''\nSupport for WM_TOUCH messages (Windows platform)\n================================================\n'''\n\n__all__ = ('W"
  },
  {
    "path": "tickeys/kivy/input/recorder.py",
    "chars": 10129,
    "preview": "'''\nInput recorder\n==============\n\n.. versionadded:: 1.1.0\n\n.. warning::\n\n    This part of Kivy is still experimental an"
  },
  {
    "path": "tickeys/kivy/input/shape.py",
    "chars": 537,
    "preview": "'''\nMotion Event Shape\n==================\n\nRepresent the shape of the :class:`~kivy.input.motionevent.MotionEvent`\n'''\n\n"
  },
  {
    "path": "tickeys/kivy/interactive.py",
    "chars": 10117,
    "preview": "'''\nInteractive launcher\n====================\n\n.. versionadded:: 1.3.0\n\nThe :class:`InteractiveLauncher` provides a user"
  },
  {
    "path": "tickeys/kivy/lang.py",
    "chars": 75857,
    "preview": "'''Kivy Language\n=============\n\nThe Kivy language is a language dedicated to describing user interface and\ninteractions."
  },
  {
    "path": "tickeys/kivy/loader.py",
    "chars": 17181,
    "preview": "'''\nAsynchronous data loader\n========================\n\nThis is the Asynchronous Loader. You can use it to load an image\n"
  },
  {
    "path": "tickeys/kivy/logger.py",
    "chars": 9264,
    "preview": "'''\nLogger object\n=============\n\nDifferents logging levels are available : trace, debug, info, warning, error\nand critic"
  },
  {
    "path": "tickeys/kivy/metrics.py",
    "chars": 7239,
    "preview": "'''\nMetrics\n=======\n\n.. versionadded:: 1.5.0\n\nA screen is defined by its physical size, density and resolution. These\nfa"
  },
  {
    "path": "tickeys/kivy/modules/__init__.py",
    "chars": 8732,
    "preview": "'''\nModules\n=======\n\nModules are classes that can be loaded when a Kivy application is starting. The\nloading of modules "
  },
  {
    "path": "tickeys/kivy/modules/_webdebugger.py",
    "chars": 205671,
    "preview": "# -*- coding: utf-8 -*-\n\nimport threading\nimport json\nfrom gc import get_objects, garbage\nfrom kivy.clock import Clock\nf"
  },
  {
    "path": "tickeys/kivy/modules/inspector.py",
    "chars": 20039,
    "preview": "'''\nInspector\n=========\n\n.. versionadded:: 1.0.9\n\n.. warning::\n\n    This module is highly experimental, use it with care"
  },
  {
    "path": "tickeys/kivy/modules/keybinding.py",
    "chars": 1699,
    "preview": "'''Keybinding\n==========\n\nThis module forces the mapping of some keys to functions:\n\n* F11: Rotate the Window through 0,"
  },
  {
    "path": "tickeys/kivy/modules/monitor.py",
    "chars": 2106,
    "preview": "'''\nMonitor module\n==============\n\nThe Monitor module is a toolbar that shows the activity of your current\napplication :"
  },
  {
    "path": "tickeys/kivy/modules/recorder.py",
    "chars": 2417,
    "preview": "'''\nRecorder module\n===============\n\n.. versionadded:: 1.1.0\n\nCreate an instance of :class:`~kivy.input.recorder.Recorde"
  },
  {
    "path": "tickeys/kivy/modules/screen.py",
    "chars": 4279,
    "preview": "'''Screen\n======\n\nThis module changes some environement and configuration variables\nto match the density / dpi / screens"
  },
  {
    "path": "tickeys/kivy/modules/touchring.py",
    "chars": 4483,
    "preview": "'''\nTouchring\n=========\n\nShows rings around every touch on the surface / screen. You can use this module\nto check that y"
  },
  {
    "path": "tickeys/kivy/modules/webdebugger.py",
    "chars": 577,
    "preview": "# -*- coding: utf-8 -*-\n'''\nWeb Debugger\n============\n\n.. versionadded:: 1.2.0\n\n.. warning::\n\n    This module is highly "
  },
  {
    "path": "tickeys/kivy/multistroke.py",
    "chars": 55456,
    "preview": "'''\nMultistroke gesture recognizer\n==============================\n\n.. versionadded::\n    1.9.0\n\n.. warning::\n\n    This i"
  },
  {
    "path": "tickeys/kivy/network/__init__.py",
    "chars": 164,
    "preview": "'''\nNetwork support\n===============\n\nKivy currently supports basic, asynchronous network requests.\nPlease refer to :clas"
  },
  {
    "path": "tickeys/kivy/network/urlrequest.py",
    "chars": 17627,
    "preview": "'''\nUrl Request\n===========\n\n.. versionadded:: 1.0.8\n\nYou can use the :class:`UrlRequest` to make asynchronous requests "
  },
  {
    "path": "tickeys/kivy/parser.py",
    "chars": 4494,
    "preview": "'''\nParser utilities\n================\n\nHelper functions used for CSS parsing.\n'''\n\n__all__ = ('parse_color', 'parse_int'"
  },
  {
    "path": "tickeys/kivy/properties.pxd",
    "chars": 3170,
    "preview": "from kivy._event cimport EventDispatcher, EventObservers\n\ncdef class PropertyStorage:\n    cdef object value\n    cdef Eve"
  },
  {
    "path": "tickeys/kivy/resources.py",
    "chars": 1556,
    "preview": "'''\nResources management\n====================\n\nResource management can be a pain if you have multiple paths and projects"
  },
  {
    "path": "tickeys/kivy/setupconfig.py",
    "chars": 301,
    "preview": "# Autogenerated file for Kivy configuration\nPY3 = 0\nCYTHON_MIN = '0.20'\nCYTHON_MAX = '0.23'\nCYTHON_BAD = ''\nUSE_RPI = 0\n"
  },
  {
    "path": "tickeys/kivy/storage/__init__.py",
    "chars": 11613,
    "preview": "'''\nStorage\n=======\n\n.. versionadded:: 1.7.0\n\n.. warning::\n\n    This module is still experimental, and the API is subjec"
  },
  {
    "path": "tickeys/kivy/storage/dictstore.py",
    "chars": 2284,
    "preview": "'''\nDictionary store\n=================\n\nUse a Python dictionary as a store.\n'''\n\n__all__ = ('DictStore', )\n\ntry:\n    imp"
  },
  {
    "path": "tickeys/kivy/storage/jsonstore.py",
    "chars": 1972,
    "preview": "'''\nJSON store\n==========\n\nCan be used to save/load key-value pairs from a json file.\n'''\n\n__all__ = ('JsonStore', )\n\n\nf"
  },
  {
    "path": "tickeys/kivy/storage/redisstore.py",
    "chars": 2845,
    "preview": "'''\nRedis Store\n===========\n\nStore implementation using Redis. You must have redis-py installed.\n\nUsage example::\n\n    f"
  },
  {
    "path": "tickeys/kivy/support.py",
    "chars": 8423,
    "preview": "'''\nSupport\n=======\n\nActivate other frameworks/toolkits inside the kivy event loop.\n\n'''\n\n__all__ = ('install_gobject_it"
  },
  {
    "path": "tickeys/kivy/tools/__init__.py",
    "chars": 0,
    "preview": ""
  },
  {
    "path": "tickeys/kivy/tools/benchmark.py",
    "chars": 6808,
    "preview": "'''\nBenchmark\n=========\n\n'''\n\nfrom __future__ import print_function\n\nbenchmark_version = '1'\n\nimport os\nimport sys\nimpor"
  }
]

// ... and 337 more files (download for full content)

About this extraction

This page contains the full source code of the BillBillBillBill/Tickeys-linux GitHub repository, extracted and formatted as plain text for AI agents and large language models (LLMs). The extraction includes 537 files (4.6 MB), approximately 1.2M tokens, and a symbol index with 5983 extracted functions, classes, methods, constants, and types. Use this with OpenClaw, Claude, ChatGPT, Cursor, Windsurf, or any other AI tool that accepts text input. You can copy the full output to your clipboard or download it as a .txt file.

Extracted by GitExtract — free GitHub repo to text converter for AI. Built by Nikandr Surkov.

Copied to clipboard!