Commit Graph

398 Commits

Author SHA1 Message Date
emersion
ddac792b61
backend/wayland: only set one pointer listener 2018-04-29 14:30:13 +01:00
emersion
9f8a7c8fc4
backend/wayland: create one virtual pointer per output 2018-04-29 14:30:13 +01:00
emersion
57c36ddcb3
backend/wayland: add proper error handling to wlr_wl_backend_create 2018-04-28 12:38:03 +01:00
Drew DeVault
fecb971518
Merge pull request #902 from emersion/various-memory-leaks
Various memory leaks
2018-04-26 11:34:49 +02:00
emersion
cd9f25711c
backend: destroy renderer when destroying backend 2018-04-25 23:53:43 +01:00
emersion
625a7a48dc
Don't use the wlr_ prefix for static functions 2018-04-25 23:51:00 +01:00
emersion
71ca45e2c0
Make sure we don't use others' prefixes 2018-04-25 23:24:58 +01:00
emersion
b0d99f5c67
Remove wlr_ prefix from local symbols 2018-04-25 23:00:46 +01:00
emersion
eaed6bd03b
render/egl: add wlr_egl_destroy_surface 2018-04-24 23:44:43 +01:00
emersion
d2ebbd103c
backend: remove wlr_backend_get_egl 2018-04-08 11:00:56 -04:00
emersion
33a2eb4b77
Untie wlr_backend from wlr_renderer 2018-03-31 18:49:43 -04:00
emersion
f37e8c5b6e
backend/wayland: cleanup input transform code 2018-03-30 23:51:20 -04:00
Drew DeVault
3813121fef Fix wayland output absolute input handling 2018-03-28 14:04:23 -04:00
Drew DeVault
a35a5786b0 Remove width_mm from wlr_pointer events 2018-03-28 10:46:50 -04:00
emersion
c63d94483b
Redesign wlr_texture
- Textures are now immutable (apart from those created from raw
  pixels), no more invalid textures
- Move all wl_drm stuff in wlr_renderer
- Most of wlr_texture fields are now private
- Remove some duplicated DMA-BUF code in the DRM backend
- Add more assertions
- Stride is now always given as bytes rather than pixels
- Drop wl_shm functions

Fun fact: this patch has been written 10,000 meters up in the air.
2018-03-24 23:48:32 -04:00
emersion
a854c2f246
Merge branch 'master' into gles2-renderer-redesign 2018-03-23 00:55:55 +01:00
Drew DeVault
ef3769851f
Merge pull request #740 from emersion/egl-debug
render/egl: use EGL_KHR_debug
2018-03-22 18:54:21 -04:00
Dominique Martinet
d5e14ab247 wayland backend: fix use-after free on output destroy
==12021==ERROR: AddressSanitizer: heap-use-after-free on address 0x617000015698 at pc 0x7f1a9abe1c09 bp 0x7ffe9068f6b0 sp 0x7ffe9068f6a0
WRITE of size 4 at 0x617000015698 thread T0
    #0 0x7f1a9abe1c08 in pointer_handle_leave ../backend/wayland/wl_seat.c:40
    #1 0x7f1a96ae7d1d in ffi_call_unix64 (/lib64/libffi.so.6+0x5d1d)
    #2 0x7f1a96ae768e in ffi_call (/lib64/libffi.so.6+0x568e)
    #3 0x7f1a988e0d8a  (/lib64/libwayland-client.so.0+0x8d8a)
    #4 0x7f1a988dd927  (/lib64/libwayland-client.so.0+0x5927)
    #5 0x7f1a988debe3 in wl_display_dispatch_queue_pending (/lib64/libwayland-client.so.0+0x6be3)
    #6 0x7f1a9abdd6d6 in dispatch_events ../backend/wayland/backend.c:28
    #7 0x7f1a9a968c11 in wl_event_loop_dispatch (/lib64/libwayland-server.so.0+0x9c11)
    #8 0x7f1a9a967449 in wl_display_run (/lib64/libwayland-server.so.0+0x8449)
    #9 0x418dff in main ../rootston/main.c:81
    #10 0x7f1a99b5ef29 in __libc_start_main (/lib64/libc.so.6+0x20f29)
    #11 0x4057c9 in _start (/home/shared/wayland/wlroots/build/rootston/rootston+0x4057c9)

0x617000015698 is located 664 bytes inside of 696-byte region [0x617000015400,0x6170000156b8)
freed by thread T0 here:
    #0 0x7f1a9af754b8 in __interceptor_free (/lib64/libasan.so.4+0xde4b8)
    #1 0x7f1a9abe01ee in wlr_wl_output_destroy ../backend/wayland/output.c:194
    #2 0x7f1a9ac12918 in wlr_output_destroy ../types/wlr_output.c:299
    #3 0x7f1a9abe061b in xdg_toplevel_handle_close ../backend/wayland/output.c:255
    #4 0x7f1a96ae7d1d in ffi_call_unix64 (/lib64/libffi.so.6+0x5d1d)
    #5 0x7f1a96ae768e in ffi_call (/lib64/libffi.so.6+0x568e)
    #6 0x7f1a988e0d8a  (/lib64/libwayland-client.so.0+0x8d8a)
    #7 0x7f1a988dd927  (/lib64/libwayland-client.so.0+0x5927)
    #8 0x7f1a988debe3 in wl_display_dispatch_queue_pending (/lib64/libwayland-client.so.0+0x6be3)
    #9 0x7f1a9abdd6d6 in dispatch_events ../backend/wayland/backend.c:28
    #10 0x7f1a9a968c11 in wl_event_loop_dispatch (/lib64/libwayland-server.so.0+0x9c11)
    #11 0x7f1a9a967449 in wl_display_run (/lib64/libwayland-server.so.0+0x8449)
    #12 0x418dff in main ../rootston/main.c:81
    #13 0x7f1a99b5ef29 in __libc_start_main (/lib64/libc.so.6+0x20f29)
    #14 0x4057c9 in _start (/home/shared/wayland/wlroots/build/rootston/rootston+0x4057c9)

previously allocated by thread T0 here:
    #0 0x7f1a9af75a38 in __interceptor_calloc (/lib64/libasan.so.4+0xdea38)
    #1 0x7f1a9abe0703 in wlr_wl_output_create ../backend/wayland/output.c:272
    #2 0x7f1a9abdd8eb in wlr_wl_backend_start ../backend/wayland/backend.c:55
    #3 0x7f1a9abbeb49 in wlr_backend_start ../backend/backend.c:28
    #4 0x7f1a9abd8ce1 in multi_backend_start ../backend/multi/backend.c:24
    #5 0x7f1a9abbeb49 in wlr_backend_start ../backend/backend.c:28
    #6 0x418c32 in main ../rootston/main.c:58
    #7 0x7f1a99b5ef29 in __libc_start_main (/lib64/libc.so.6+0x20f29)
    #8 0x4057c9 in _start (/home/shared/wayland/wlroots/build/rootston/rootston+0x4057c9)
2018-03-22 21:27:49 +01:00
emersion
b1f93bc5cc
render/egl: use EGL_KHR_debug 2018-03-21 10:42:43 +01:00
emersion
3581573bdc
render/gles2: make wlr_renderer_begin take viewport size
This allows raw GL calls outside wlr_renderer to be removed.
2018-03-21 07:37:09 +01:00
emersion
11e5f0bac8
backend/wayland: fix uninitialized wlr_event_keyboard_key::update_state 2018-02-23 09:40:31 +01:00
Drew DeVault
1d9be89e2d
Revert "ELF Visibility" 2018-02-19 18:01:27 -05:00
Scott Anderson
86269052eb Explicitly export EFL symbols 2018-02-19 14:26:40 +13:00
emersion
c2e1474010
Reformat all #include directives 2018-02-12 21:29:23 +01:00
emersion
36ead80cd1
Make wlr_signal_emit_safe private 2018-02-12 19:52:47 +01:00
emersion
10ecf871f2
Remove wlr_backend.events.{output_remove,device_remove} 2018-02-12 10:36:43 +01:00
emersion
5e58d46cc1
Add wlr_signal_emit_safe 2018-02-12 09:12:31 +01:00
emersion
bf6d245400
Swap buffers with damage 2018-02-09 22:54:14 +01:00
emersion
babdd6ccf7
backend: fix use-after-free when destroying backends
The backend destroy signal is emitted before the output_remove
signal is. When the destroy signal is emitted listeners remove
their output_remove listener, so the output_remove signal is never
received and listeners have an invalid output pointer.

The correct way to solve this would be to remove the output_remove
signal completely and use the wlr_output.events.destroy signal
instead. This isn't yet possible because wl_signal_emit is unsafe
and listeners cannot be removed in listeners.
2018-01-30 19:45:57 +01:00
emersion
704130cc11
output: fix performance issues with wlr_output_schedule_frame 2018-01-30 14:45:02 +01:00
emersion
51c22d39a4
Merge remote-tracking branch 'upstream/master' into output-damage 2018-01-29 23:24:09 +01:00
emersion
8d58ed502b
output: add wlr_output_schedule_frame 2018-01-26 22:39:23 +01:00
emersion
ece2c1e4e2
Damage tracking for transformed outputs 2018-01-26 22:11:09 +01:00
emersion
4fa90b0511
Backport screenshooter fixes from the renderer redesign v1
This backports some changes to #319 to fix the screenshooter data
format. This also adds wlr_backend_get_renderer which will be
useful to support multiple renderers.
2018-01-23 22:06:54 +01:00
emersion
59c53e8333
Merge remote-tracking branch 'upstream/master' into output-damage 2018-01-21 22:18:06 +01:00
Johannes Schramm
dcc743047b style: include brackets for if/while/for, even if it's a single statement 2018-01-21 16:28:21 +01:00
emersion
0365b587f0
output: add damage tracking via buffer age 2018-01-21 00:06:35 +01:00
emersion
6fa0a91ee2
backend/wayland: fix segfault in wlr_wl_output_destroy 2018-01-18 13:06:57 +01:00
Drew DeVault
b331c5c2c5
Merge pull request #549 from emersion/output-enabled
Add wlr_output::enabled
2018-01-15 20:53:13 -05:00
Markus Ongyerth
c00e9d1416 adds remote argument to wayland backend create
Add a remote display name argument to wlr_wl_backend_create.
If NULL is passed to the wayland backend at all times, creating a
wayland backend *after* the compositor was started up, would require
changing the WAYLAND_DISPLAY environment variable.
2018-01-13 21:20:15 +01:00
emersion
771263380c
Add wlr_output::enabled 2018-01-04 12:46:15 +01:00
emersion
1e6566e6cd
Fixes for multiple outputs
* Fixes output positions in screenshots
* Fixes Wayland backend pointer events when output layout doesn't start at (0, 0)
2017-12-28 15:09:57 +01:00
Dominique Martinet
169bc9fa10 wl backend: add wlr_input_device_is_wl 2017-12-19 20:20:32 +01:00
Dominique Martinet
dabfe159de wl backend: add wlr_output_is_wl 2017-12-19 20:13:49 +01:00
emersion
b99d1f4fcc
Refactor wlr_egl_init to accept config_attribs 2017-12-17 23:51:04 +01:00
emersion
0256de0002
Add full refresh rate support to custom modes 2017-12-17 18:02:55 +01:00
emersion
51bbcc0fbf
Fix rootston input on HiDPI outputs in wayland backend 2017-12-15 16:28:04 +01:00
emersion
51db087210
Introduce fractional scaling 2017-12-15 01:00:03 +01:00
Drew DeVault
23fb663ea4
Merge pull request #453 from emersion/surface-transform
Add surface transforms support
2017-12-14 14:43:04 -05:00
emersion
466e86b7b2
Merge branch 'master' into surface-transform 2017-12-14 20:31:18 +01:00
emersion
75ef7860bb
Merge branch 'master' into display-destroy 2017-12-14 20:29:30 +01:00
emersion
a1302cc4a5
Fix pointer events with multiple outputs in wayland backend 2017-12-13 22:32:22 +01:00
emersion
257559d890
Remove output instead of terminating display when a wayland backend view closed 2017-12-13 21:48:59 +01:00
emersion
3b4b8953d9
Update output layout when scale or transform changes 2017-12-12 21:58:00 +01:00
emersion
c67a5824b8
Merge branch 'master' into display-destroy 2017-12-11 16:14:03 +01:00
emersion
529675b7b0
Add wlr_output_set_custom_mode 2017-12-11 12:14:23 +01:00
emersion
18eb1eee3f
Listen to display destroy in xwayland, rename wlr_egl_free 2017-12-08 00:59:37 +01:00
emersion
9d43adaafa
Listen to display destroy in backends 2017-12-07 23:44:59 +01:00
emersion
6a69b4419f
Make wlr_output_transform_* functions public, refactoring 2017-12-01 09:15:33 +01:00
Moritz
cef6d75491 Moved os-compatibility and added header
* Moved os-compatibility.c to util
* Added header under util
* Removed static since it isn't needed (i think so)
* Adjusted meson.build to include lib_wlr

Improved some codestyle

* Added guard to os-compatibility.h
* Fixed typo in include statment

Adjusted Guard

* Changed guard to _WLR_UTIL_OS_COMPATIBILITY
2017-11-30 18:01:13 +01:00
Scott Anderson
87ea76e037 Remove unneeded linux include 2017-11-27 12:15:38 +13:00
emersion
7d847efe40
Terminate local display on remote X11 server error 2017-11-16 09:38:24 +01:00
emersion
73c48f2f35
Terminate local display on remote Wayland display error 2017-11-16 09:33:47 +01:00
Drew DeVault
66587eb430 Merge remote-tracking branch 'origin/master' into hidpi 2017-11-09 08:36:27 -05:00
emersion
1cee782fec
Fix pointer axis delta in Wayland backend 2017-11-05 13:00:27 +01:00
Drew DeVault
2f6cfe4057 Fix software cursors on scaled outputs
There was an issue where it would only work within the boundaries of the
unscaled resolution.
2017-11-04 11:47:34 -04:00
Dominique Martinet
43cd3c7aea Indentation fix
Some space sneaked in. tabtabtab.
2017-11-01 20:14:52 +01:00
emersion
60c018c017
Fix hidden software cursors, fix cursor transformations on DRM backend 2017-11-01 14:25:41 +01:00
emersion
0beae99188
Apply output transformation to pointer events in Wayland backend 2017-11-01 11:00:27 +01:00
emersion
ec22fe7134
Make wlr_output_interface.enable optional 2017-10-31 15:19:55 +01:00
emersion
95566c6bdf
Transform cursor hotspot, fix wayland cursor hotspot 2017-10-31 12:30:56 +01:00
Tony Crisci
875a5b446f remove time usec 2017-10-30 15:43:06 -04:00
Tony Crisci
a224e74fad refactor input time_sec to time_msec 2017-10-30 06:40:06 -04:00
emersion
eea532911a
Send output current mode when changed 2017-10-23 21:03:00 +02:00
Drew DeVault
16f35ecbea Merge branch 'master' into heghe/wl_list 2017-10-21 22:03:48 -04:00
Scott Anderson
822a9f65a4 Add pointer to backend inside wlr_output 2017-10-22 10:36:07 +13:00
Scott Anderson
9b984253e2 Move egl.h to render/egl.h 2017-10-22 10:36:07 +13:00
Heghedus Razvan
d3f0878d71 Replace list_t with wl_list in wlr_wl_backend
Now wlr_backend->outputs is a list of wlr_wl_backend_output instead of
wlr_output.

Signed-off-by: Heghedus Razvan <heghedus.razvan@gmail.com>
2017-10-20 19:44:59 +03:00
emersion
8c5a110d4c
Fix hidden cursor on wayland backend 2017-10-18 19:14:16 +02:00
Drew DeVault
62371a9974 Merge pull request #257 from emersion/fix-client-cursors
[WIP] Fix client cursors
2017-10-17 09:22:43 -04:00
emersion
19860c03f7
Better handling of hidden cursors in wayland backend, add TODOs 2017-10-12 13:25:29 +02:00
emersion
92daa790bb
Allow to update the cursor hotspot without its pixels 2017-10-12 09:40:51 +02:00
Greg V
a5fe9aa736 Add FreeBSD compatibility 2017-10-11 00:07:21 +03:00
emersion
9b83caa658
Add wlr_output_set_cursor_surface 2017-10-08 21:21:06 +02:00
Drew DeVault
08ccc7f653 Merge pull request #221 from versusvoid/wayland-xkb_state_update_mask
Use xkb_state_update_mask() with Wayland backend
2017-10-06 15:16:10 -04:00
Versus Void
568b270cdf Use xkb_state_update_mask() with Wayland backend
Fix #158
2017-10-06 22:02:29 +00:00
Versus Void
641d08ce7e Transform hotspot with cursor
Fix #188
2017-10-06 09:07:08 +03:00
Scott Anderson
517ba0bc16 Change egl_get_config to always use visual id 2017-09-29 16:15:09 +13:00
Drew DeVault
61e451ea1b Move keyboard logic to wlr_{keyboard,seat} 2017-09-24 14:12:56 -04:00
Drew DeVault
0699aa62d8 Initial pass on roots_input 2017-09-23 10:13:05 -04:00
Drew DeVault
b6d7c3ed8e Initialize display, backend; add frame handling 2017-09-23 00:30:39 -04:00
Drew DeVault
9fa822c666 Fix minor typos 2017-09-17 18:29:52 -04:00
Tony Crisci
98f4cdfccb implement wlr_cursor_map_input_to_output 2017-08-26 08:32:11 -04:00
Dominique Martinet
062d923b0a wayland backend: wl_event_source_remove on destroy 2017-08-19 09:31:06 +02:00
Dominique Martinet
58efb8f90a wayland backend: remove explicit scale = 1
This is now set correctly in the wlr_output init
2017-08-19 07:38:45 +02:00
Dominique Martinet
e2e149784b wayland backend: fix xdg-shell for weston
- xdg toplevel configure can be called with 0 width/height,
in that case we are free to do as we like (so do nothing)
 - need a display roundtrip after everything is setup but before
we start attaching buffers to the surface
2017-08-17 10:36:43 +02:00
Dominique Martinet
3377e5e4f2 wayland backend: fix xdg-shell for gnome
Calling wl_surface_commit after setting up the xdg_toplevel is
apparently good enough for them.

Still missing something for weston.
2017-08-17 10:24:27 +02:00
Dominique Martinet
fb05923eaa wayland backend: Fix shell title/app_id to wlroots 2017-08-17 10:24:27 +02:00
Dominique Martinet
4f3d21c3ff wayland output: add error handling for xdg shell
Note that this does not go on to the next backend, because
attempt_wl_backend does not check if we have any output created.

We cannot test simply because (right now) a run of our examples will go
in this function twice, the first of which will (rightly?) return no
display but needs to return backend creation success.
2017-08-17 10:24:27 +02:00
Dominique Martinet
577d2f6fcd wayland backend: switch to xdg shell
Closes #72 and #96.
2017-08-17 10:24:27 +02:00
Calvin Lee
901c14c409 Prevent alloc errors from crashing in list_t
This commit changes the `list_t` api so that alloc errors can be
detected and worked around. Also fixes errors not found in 5cc7342
2017-08-16 09:23:21 +02:00
Drew DeVault
27c13d621d Merge pull request #88 from 4e554c4c/alloc_crashing
Prevent alloc errors from crashing
2017-08-15 12:21:58 -04:00
Drew DeVault
d2e796edb7 Merge pull request #86 from nyorain/master
Fix style issues
2017-08-15 07:18:22 -04:00
Calvin Lee
5cc7342606 Prevent alloc errors from crashing
Resolves #76
2017-08-15 08:04:57 +02:00
nyorain
d7dcbbc175 Add wayland backend cursor support 2017-08-14 18:02:05 -04:00
nyorain
f998bb8299 Fix style issues 2017-08-14 17:09:56 +02:00
Dominique Martinet
e922e62924 wayland input_device_destroy: add missing braces 2017-08-14 16:30:10 +02:00
Dominique Martinet
4bbf718e7d impl->destroy cleanup:
- remove trivial destroy() function
 - make sure we check impl and impl->destroy before calling
 - always call free if not implemented
2017-08-14 16:22:31 +02:00
Dominique Martinet
53e7bebd23 Refactor out wlr_pointer_state 2017-08-14 16:22:31 +02:00
Dominique Martinet
0a3246ad97 Refactor out wlr_keyboard_state 2017-08-14 16:22:31 +02:00
Dominique Martinet
e6ad67911b Refactor out wlr_input_device_state 2017-08-14 16:22:31 +02:00
Drew DeVault
41e735242d Remove wlr_output_state, update backends 2017-08-13 11:38:03 -04:00
Drew DeVault
4386816889 wlr_backend_init -> wlr_backend_start
Also renames create to init. We'll use create for anything that
allocates and init for anything that takes a pointer and initializes it.
2017-08-13 10:19:57 -04:00
Dominique Martinet
f2e2794365 wayland backend: do not watch wayland fd for writable
Wayland fd is always writable and will busy-loop.
The dispatch function gets called with 0-mask when we need to flush
display anyway, so this saves CPU at no visible impact.
2017-08-13 07:53:33 +02:00
Drew DeVault
81cd90297d Refactor out wlr_backend_state from wl/multi 2017-08-12 11:43:36 -04:00
Dominique Martinet
3ea878b76e wayland backend: free seatName 2017-08-12 01:19:45 +02:00
Dominique Martinet
8427749dd0 wayland backend: emit signal for input/output removal 2017-08-12 01:16:12 +02:00
Drew DeVault
c24351681f Refactor EGL handling 2017-08-10 22:15:37 -04:00
Drew DeVault
4aaf76cb66 wlr_output_update_matrix during wl backend init 2017-08-10 13:27:14 -04:00
nyorain
67369173aa Implement drm (egl) buffer attaching 2017-08-10 10:59:58 +02:00
Drew DeVault
97f6e9b69a Remove excessive logging in wayland backend 2017-06-28 16:35:18 -04:00
Drew DeVault
97213cc00e Add new interfaces to wayland backend 2017-06-26 18:23:38 -04:00
Drew DeVault
168f0955ab Add wl_output globals for wlr_outputs 2017-06-22 14:27:35 -04:00
nyorain
4ca872c914 Improve wayland backend pointer error logging 2017-06-22 18:04:13 +02:00
nyorain
dbde1f7340 Store wayland backend axis source 2017-06-22 17:58:53 +02:00
nyorain
272030652a Implement absolute motion events for wayland 2017-06-22 17:55:00 +02:00
nyorain
d26a9ba968 Fix pointer motion coords 2017-06-22 17:12:09 +02:00
nyorain
c1520077b6 Implement wayland backend input events 2017-06-22 16:53:48 +02:00
nyorain
0b8e6cccc8 Add wayland input listener skeletons 2017-06-22 15:41:59 +02:00
Drew DeVault
f4453d104d Reorganize wlr-common 2017-06-21 12:10:07 -04:00
Drew DeVault
fd91244e83 Update everyone to use new headers 2017-06-21 10:27:45 -04:00
Drew DeVault
c2d0090ad7 Support multiple wl backend outputs 2017-06-20 18:22:21 -04:00
Drew DeVault
b2bf5b23b9 Implement output_transform for wl backend 2017-06-20 18:02:00 -04:00
Drew DeVault
b9d36c8149 Add dynamic output resizing for Wayland backend
This allows outputs to:
- Not support modesetting
- Resize themselves
2017-06-20 17:51:45 -04:00
Drew DeVault
c9d5a0b2fb Clean up Wayland backend GL context and such 2017-06-20 15:29:27 -04:00
nyorain
51f35e7af0 Cleanup some leaks/incorrect destructions 2017-06-20 19:01:20 +02:00
nyorain
500e9184f1 Fix egl workaround; Test with weston 2017-06-20 18:44:11 +02:00
nyorain
50ce35e9da Implement wayland backend output 2017-06-20 18:27:05 +02:00
nyorain
e22626ef6a Adapt codestyle 2017-06-19 22:39:20 +02:00
nyorain
792d535225 Rework wayland backend output implementation 2017-06-19 22:36:40 +02:00
nyorain
10526de444 Fix furhter wayland backend issues 2017-06-19 19:40:58 +02:00
nyorain
8fbf1ca3ff Continue wayland backend update
Update wayland backend to new api.
Start to use the input interfaces.
Compiling now, not tested.
2017-06-19 19:05:10 +02:00
nyorain
904739c405 Start to fix wayland backend
Starts to update the wayland backend to the new backend api.
Not yet updated to libinput branch (not yet compiling).
2017-06-19 17:46:50 +02:00
Drew DeVault
1aed987301 Add free functions for allocated resources 2017-04-25 21:26:29 -04:00
Drew DeVault
1e8970b4a9 Flesh out wl_seat and fix some bugs 2017-04-25 19:33:13 -04:00
Drew DeVault
5ca9d612f4 Flesh out wayland backend registry 2017-04-25 19:19:21 -04:00
Drew DeVault
de01e654ce Flesh out wayland backend somewhat, add example 2017-04-25 15:06:58 -04:00
Drew DeVault
52e6ed54cb Initial commit 2017-04-25 11:32:52 -04:00