Giter VIP home page Giter VIP logo

warpd's Introduction

What

A modal keyboard driven interface for mouse manipulation.

Demo

Hint Mode Alt-Meta-x

Grid Mode Alt-Meta-g

Normal Mode Alt-Meta-c

Dependencies

X

The usual array of X libraries:

  • libxi
  • libxinerama
  • libxft
  • libxfixes
  • libxtst
  • libx11

Wayland (sway/wlroots only (no gnome support))

  • libwayland-client
  • cairo
  • xkbcommon

Note: The wayland port has several limitations due to the nature of Wayland's architecture.

See the LIMITATIONS section of the man page for more details.

MacOS:

  • The standard Xcode command line developer tools.

Installation

Make sure you have the appropriate dependencies for your system:

E.g

debian/ubuntu:

git clone https://github.com/rvaiya/warpd.git
cd warpd
sudo apt-get install \
	libxi-dev \
	libxinerama-dev \
	libxft-dev \
	libxfixes-dev \
	libxtst-dev \
	libx11-dev \
	libcairo2-dev \
	libxkbcommon-dev \
	libwayland-dev &&
make && sudo make install

By default warpd will build a single binary for both X and wayland. An X or Wayland only binary can be generated by setting either DISABLE_WAYLAND or DISABLE_X at compile time.

macos:

curl -L https://github.com/rvaiya/warpd/releases/download/v1.3.5/warpd-1.3.5-osx.tar.gz |  sudo tar xzvfC - / && launchctl load /Library/LaunchAgents/com.warpd.warpd.plist

Uninstallation:

sudo rm /usr/local/bin/warpd /usr/local/share/man/man1/warpd.1.gz /Library/LaunchAgents/com.warpd.warpd.plist

or (from source)

# Install the xcode command line tools if you
# don't already have them.
xcode-select --install

make && sudo make install && launchctl load /Library/LaunchAgents/com.warpd.warpd.plist

Uninstallation:

sudo make uninstall

Note: On initialization you may be prompted to add the warpd binary to your accessibility settings. If you are upgrading it may also be necessary to run sudo tccutil reset Accessibility (this will remove all applications from your accessibility settings). The service is now also managed by a launchd service (see below) and should not be explicitly started by the user.

Note 2: Some programs (e.g iTerm) have a 'secure input mode' that may need to be disabled in order for warpd to work properly.

The service can be disabled with

launchctl unload /Library/LaunchAgents/com.warpd.warpd.plist

Quickstart

  1. Run warpd

Hint Mode

  1. Press A-M-x (alt+meta+x) to generate a list of hints
  2. Enter the key sequence associated with the desired target to warp the pointer to that location and enter normal mode.
  3. Use the normal mode movement keys to select the final desination (see Normal Mode).

Grid Mode

  1. Press A-M-g (meta is the command key) to activate the warping process.
  2. Use u,i,j,k to repeatedly navigate to different quadrants.
  3. Press m to left click, , to middle click or . to right click.
  4. See Normal Mode

Normal Mode

  1. Press A-M-c to activate normal mode.
  2. Use the normal movement keys (default hjkl) to adjust the cursor.
  3. Press m to left click, , to middle click or . to right click.
  4. Press escape to quit.

A drag movement can be simulated from any of the above modes by focusing on the source and then pressing the drag_key (default v) which will cause normal mode to be activated for selection of the drag target.

A more comprehensive description can be found in the man page (along with a list of options).

Wayland

Note: Wayland does not permit clients to globally bind hotkeys. These must be bound within the compositor using warpd's oneshot flags.

E.g

On sway:

# warpd hotkeys

bindsym Mod4+Mod1+x exec warpd --hint
bindsym Mod4+Mod1+c exec warpd --normal
bindsym Mod4+Mod1+g exec warpd --grid

Using sxhkd:

# warpd hotkeys

Alt + super + x
  exec warpd --hint

Alt + super + c
  warpd --normal

Alt + super + g
  warpd --grid

Packages:

warpd is currently available on the following distributions:

Arch

Available in the AUR: warpd, warpd-wayland, warpd-git maintained by Matheus Fillipe.

If you are interesting in adding warpd to your distribution's repository please contact me.

Limitations/Bugs

  • Programs which use Xinput and or Xtest for keyboard may not work correctly (e.g synergy). If a specific program which you feel should be working does not please file an issue.

  • The hack used for pointer hiding on OSX doesn't work on some programs (e.g iTerm). The original cursor will consequently be visible in such cases, though functionality should be otherwise unaffected.

  • Wayland support has several limitations (see CAVEATS in the man page).

Contributions

A special thanks to

  • Pete Fein - For encouragement and early adoption.
  • Matheus Fillipe - For the original border radius patch as well as numerous bug reports and feature requests.
  • The Kaleidoscope/Vimperator projects - For inspiration.
  • Drew Devault - For making the Wayland ecosystem inhabitable.

warpd's People

Contributors

aelliott2000 avatar alanxoc3 avatar claystan404 avatar enedil avatar enzime avatar herrsimon avatar jakenvac avatar marshdeer avatar matheusfillipe avatar meain avatar rvaiya avatar snoitallicso avatar wearpants avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

warpd's Issues

pointer goes outside the screen

image
top side and left seems to work fine, but when I try $(S-4) it goes outside the screen same with bottom, on a single monitor

great project btw
for some reason I think triangle would better than circle(because Idk if this is a me problem but when try to point at something only the top left part of the circle shows some action(click), it makes sense normal mouse pointer is slightly tilted to same direction) is there a way to change the cursor

Rounded corners for hints mode

Don't ask me why this feature but I think it would look nice. I fooled around with it a bit (first time ever using X11 libs so might be the shittiest way) and came up with this relevant part of the code:

src/hint_drw.c

void drawRoundEdgedRectangle(Pixmap *shape_mask, GC *shapeGC, unsigned int x, unsigned int y, unsigned int w, unsigned int h, unsigned int r)
{
	XFillArc(dpy, *shape_mask, *shapeGC, x,y, 2*r,2*r, 64*90*1,64*90);
	XFillArc(dpy, *shape_mask, *shapeGC, x+w-2*r,y, 2*r,2*r, 64*90*0,64*90);
	XFillArc(dpy, *shape_mask, *shapeGC, x+w-2*r,y+h-2*r, 2*r,2*r, 64*90*3,64*90);
	XFillArc(dpy, *shape_mask, *shapeGC, x,y+h-2*r, 2*r,2*r, 64*90*2,64*90);

	XFillRectangle(dpy, *shape_mask, *shapeGC, x+r,y, w-2*r, h);
	XFillRectangle(dpy, *shape_mask, *shapeGC, x,y+r, w, h-2*r);
}

void hint_drw_filter(size_t *indices, size_t nindices)
{
	if(!nindices) {
		XUnmapWindow(dpy, win);
		return;
	}

	size_t i, n = 0;
	static XRectangle recs[MAX_HINTS];
	GC shapeGC ;
	XGCValues	xgcv;
	Pixmap shape_mask;
	XWindowAttributes info;
	XGetWindowAttributes(dpy, DefaultRootWindow(dpy), &info);
	shape_mask = XCreatePixmap (dpy, win,
				    info.width, info.height, 1);
	shapeGC = XCreateGC (dpy, shape_mask, 0, &xgcv);
	XSetForeground (dpy, shapeGC, 0);
	XSetForeground (dpy, shapeGC, 1);

	unsigned int fallback_border_radius = 10;
	for (i = 0; i < nindices; i++) {
		struct hint *h = &hints[indices[i]];
		if (border_radius == 0){
			// This is still much faster
			recs[n].x = h->x;
			recs[n].y = h->y;
			recs[n].width = h->w;
			recs[n++].height = h->h;
		}
		else if (h->w < border_radius || h->h < border_radius )
			drawRoundEdgedRectangle(&shape_mask, &shapeGC, h->x, h->y, h->w, h->h, fallback_border_radius);
		else
			drawRoundEdgedRectangle(&shape_mask, &shapeGC, h->x, h->y, h->w, h->h, border_radius);
	}

	if (border_radius == 0){
		XShapeCombineRectangles(dpy, win,
					ShapeBounding,
					0,0,
					recs, n,
					ShapeSet,
					Unsorted);
	}
	else {
		XShapeCombineMask (dpy, win, 
					 ShapeBounding, 0,0, shape_mask, ShapeSet);
		XShapeCombineMask (dpy, win, 
					 ShapeClip, 0,0, shape_mask, ShapeSet);
	}
	XFreePixmap (dpy, shape_mask);

	XMapRaised(dpy, win);
	XCopyArea(dpy, backing_pixmap, win, gc, 0, 0, winw, winh, 0, 0);
	XFlush(dpy);
}

And it looks like this:
image

The way I have it now makes border_radius a global in hint_drw.c and I already have it on the .warprc as hint_border_radius. However it increased the lag to load hints mode, not enough to bother me on my machine though, but I think is too many draw calls.

I now this is a minor thing but the future has rounded edges! I know this is a very useless feature If you want to kill some time consider this I could submit a PR or maybe you have a totally better and different idea for this.

Distinct button keys for "oneshot" and "stay active" clicks

Following from 7564ece, it'd be nice to have different buttons for "oneshot" and "stay active" modes - when entering a warpd mode, I sometimes don't know if I'm going to want oneshot or active mode ahead of time, and only decide when I press the button (or maybe I'll want a series of clicks, and then want to click-and-exit on the last one). Separate keysyms for these two behaviors would be really nice.

Feature Request: Option to use native X grabs for activation

Using xinput based grabbing logic interferes with other input oriented programs (e.g synergy) as observed in #17. Unfortunately this is necessary in order to facilitate usage with toolkits using standard X grabs. It may be desirable to add an option to use standard X grabs in order to allow compatibility with such programs at the expense of compatibility with other programs (provided the user is aware of the tradeoff).

[Question] Transparency in picom

How should I go about making the transparency works on a tilling window manager
or milimalistic DE that uses picom as its compositor? Should it work by
default? Well in my case it isn't (it was working on KDE).

I tried adding picom rules for wm_class = warpd and warp but they didn't work,
as far as I understand this is just drawing fancy shaped windows (using this
for one year and i have no idea lol). So it should have a window class right?
Or title? Or name? How can I make this work.

unindented scroll [Question]

In a scrollable page pressing H/L (high/low) triggers scroll in select mode(v)
Is this intended or a bug? I was expecting to select till the top of the screen like how it works in normal mode but it looks like it scrolls to the top of the page

config

normal_size: 10
normal_beginning: S-i
normal_end: S-a
scroll_down_key: A-n
scroll_up_key: A-e
scroll_right_key: A-i
scroll_left_key: A-m
movement_increment: 10

Feature request: outline color for normal & grid mode

I use an e-ink grayscale monitor, and it's sometimes hard to visually see the Square or grid depending on the color of whatever is on the screen. For example, #FF000 often appears the same as black (the monitor's rendering algorithm is somewhat adaptive but not amazing).

It'd be nice to be able to specify an outline color and size that gets drawn as a border to the Square or grid lines (similar to the white border on the Black OS X native cursor)

Drag mode issues

Entering Drag mode from grid mode doesn't seem to work correctly - I'm trying to using it to select text, and it seems to enter normal mode instead (ie, nothing is selected). If I hit the drag mode toggle in this state, it still doesn't work (ie nothing is selected).

Also a regression from pre-OS X: hitting button one wh
config.txt
en in drag mode would previously exit the mode but now sends a click.

Feature Request: Horizontal scroll

Would it be possible to add horizontal scroll? Some applications bind this to shift + scroll wheel, but mostly for notebooks there is touchpad action/gesture to horizontally scroll that works in most applications. Would it be possible to emulate that?

Once again thanks a lot for this great project! I've been using it all the time.

100% cpu usage with compositors.

Kudos for the great work so far! This is my favorite small project!

Everything is working fine when using a twm. Everything works fine when having the compositor disabled. If i launch warp with the compositor enabled it starts using 100% of the cpu. I actually see "warp -d" and "/usr/lib/Xorg using 100% cpu.

But I found a trick. Disabling the compositor, launching warp and re-enabling the compositor seems to help but is kinda random sometimes.

I am having this issue inside KDE. I know having this working on a DE isn't the main point here but... would be just nice and why not.
If you need any help for testing I'll be here!

Windows Support?

It would be super nice if this was available on Windows too :)

activation no longer working - how to xtrace?

so something changed in my DE, and warp is no longer activating (confirmed by building older versions). This problem happens under xfce started via lightdm & startx, or fluxbox started under lightdm - but things work ok with fluxbox started by startx.

Happy to try to xtrace it but I'm not entirely sure which command to run, and the output is pretty incomprehensible to me.

Shouldn't let its shortcuts propagate to windows

I've been facing this issue more now, I don't know how i didn't notice it before. Whenever I click on something like a text box using warpd and then hit esc to exit it, sometimes it will also unfocus the text box depending on the application. I've also notice this on another keybindings that warpd is passing by its shortcuts instead of fully consuming them and not letting the focused window receive them.

Would that be easy to fix? Or maybe I am just missing something. Some other X applications do that, like dunst before they removed shortcuts from it. They do not let their shortcuts propagate. Well I hope that is understandable.

linker error

Can't seem to find the X11 & Xfixes symbols... all the .so's exist where they should and symbols are exported. This is on Ubuntu 19.10. Sorry I couldn't figure this out on my own, it's been years since I debugged something like this.

Using built-in specs.
COLLECT_GCC=gcc
COLLECT_LTO_WRAPPER=/usr/lib/gcc/x86_64-linux-gnu/9/lto-wrapper
OFFLOAD_TARGET_NAMES=nvptx-none:hsa
OFFLOAD_TARGET_DEFAULT=1
Target: x86_64-linux-gnu
Configured with: ../src/configure -v --with-pkgversion='Ubuntu 9.2.1-9ubuntu2' --with-bugurl=file:///usr/share/doc/gcc-9/README.Bugs --enable-languages=c,ada,c++,go,brig,d,fortran,objc,obj-c++,gm2 --prefix=/usr --with-gcc-major-version-only --program-suffix=-9 --program-prefix=x86_64-linux-gnu- --enable-shared --enable-linker-build-id --libexecdir=/usr/lib --without-included-gettext --enable-threads=posix --libdir=/usr/lib --enable-nls --enable-bootstrap --enable-clocale=gnu --enable-libstdcxx-debug --enable-libstdcxx-time=yes --with-default-libstdcxx-abi=new --enable-gnu-unique-object --disable-vtable-verify --enable-plugin --enable-default-pie --with-system-zlib --with-target-system-zlib=auto --enable-multiarch --disable-werror --with-arch-32=i686 --with-abi=m64 --with-multilib-list=m32,m64,mx32 --enable-multilib --with-tune=generic --enable-offload-targets=nvptx-none,hsa --without-cuda-driver --enable-checking=release --build=x86_64-linux-gnu --host=x86_64-linux-gnu --target=x86_64-linux-gnu
Thread model: posix
gcc version 9.2.1 20191008 (Ubuntu 9.2.1-9ubuntu2) 
COLLECT_GCC_OPTIONS='-v' '-o' 'bin/warp' '-mtune=generic' '-march=x86-64'
 /usr/lib/gcc/x86_64-linux-gnu/9/cc1 -quiet -v -imultiarch x86_64-linux-gnu warp.c -quiet -dumpbase warp.c -mtune=generic -march=x86-64 -auxbase warp -version -fasynchronous-unwind-tables -fstack-protector-strong -Wformat -Wformat-security -fstack-clash-protection -fcf-protection -o /tmp/cctEUf7x.s
GNU C17 (Ubuntu 9.2.1-9ubuntu2) version 9.2.1 20191008 (x86_64-linux-gnu)
	compiled by GNU C version 9.2.1 20191008, GMP version 6.1.2, MPFR version 4.0.2, MPC version 1.1.0, isl version isl-0.21-GMP

GGC heuristics: --param ggc-min-expand=100 --param ggc-min-heapsize=131072
ignoring nonexistent directory "/usr/local/include/x86_64-linux-gnu"
ignoring nonexistent directory "/usr/lib/gcc/x86_64-linux-gnu/9/../../../../x86_64-linux-gnu/include"
#include "..." search starts here:
#include <...> search starts here:
 /usr/lib/gcc/x86_64-linux-gnu/9/include
 /usr/local/include
 /usr/lib/gcc/x86_64-linux-gnu/9/include-fixed
 /usr/include/x86_64-linux-gnu
 /usr/include
End of search list.
GNU C17 (Ubuntu 9.2.1-9ubuntu2) version 9.2.1 20191008 (x86_64-linux-gnu)
	compiled by GNU C version 9.2.1 20191008, GMP version 6.1.2, MPFR version 4.0.2, MPC version 1.1.0, isl version isl-0.21-GMP

GGC heuristics: --param ggc-min-expand=100 --param ggc-min-heapsize=131072
Compiler executable checksum: dd54e5384b34908287640134d9f8a49c
warp.c: In function ‘check_lock_file’:
warp.c:429:8: warning: implicit declaration of function ‘flock’ [-Wimplicit-function-declaration]
  429 |     if(flock(fd, LOCK_EX | LOCK_NB)) {
      |        ^~~~~
warp.c: In function ‘main’:
warp.c:457:13: warning: ‘XKeycodeToKeysym’ is deprecated [-Wdeprecated-declarations]
  457 |             KeySym sym = XKeycodeToKeysym(dpy, ev.xkey.keycode, 0);
      |             ^~~~~~
In file included from warp.c:25:
/usr/include/X11/Xlib.h:1687:15: note: declared here
 1687 | extern KeySym XKeycodeToKeysym(
      |               ^~~~~~~~~~~~~~~~
COLLECT_GCC_OPTIONS='-v' '-o' 'bin/warp' '-mtune=generic' '-march=x86-64'
 as -v --64 -o /tmp/ccyaHs0u.o /tmp/cctEUf7x.s
GNU assembler version 2.33 (x86_64-linux-gnu) using BFD version (GNU Binutils for Ubuntu) 2.33
COMPILER_PATH=/usr/lib/gcc/x86_64-linux-gnu/9/:/usr/lib/gcc/x86_64-linux-gnu/9/:/usr/lib/gcc/x86_64-linux-gnu/:/usr/lib/gcc/x86_64-linux-gnu/9/:/usr/lib/gcc/x86_64-linux-gnu/
LIBRARY_PATH=/usr/lib/gcc/x86_64-linux-gnu/9/:/usr/lib/gcc/x86_64-linux-gnu/9/../../../x86_64-linux-gnu/:/usr/lib/gcc/x86_64-linux-gnu/9/../../../../lib/:/lib/x86_64-linux-gnu/:/lib/../lib/:/usr/lib/x86_64-linux-gnu/:/usr/lib/../lib/:/usr/lib/gcc/x86_64-linux-gnu/9/../../../:/lib/:/usr/lib/
COLLECT_GCC_OPTIONS='-v' '-o' 'bin/warp' '-mtune=generic' '-march=x86-64'
 /usr/lib/gcc/x86_64-linux-gnu/9/collect2 -plugin /usr/lib/gcc/x86_64-linux-gnu/9/liblto_plugin.so -plugin-opt=/usr/lib/gcc/x86_64-linux-gnu/9/lto-wrapper -plugin-opt=-fresolution=/tmp/ccRF41Lw.res -plugin-opt=-pass-through=-lgcc -plugin-opt=-pass-through=-lgcc_s -plugin-opt=-pass-through=-lc -plugin-opt=-pass-through=-lgcc -plugin-opt=-pass-through=-lgcc_s --build-id --eh-frame-hdr -m elf_x86_64 --hash-style=gnu --as-needed -dynamic-linker /lib64/ld-linux-x86-64.so.2 -pie -z now -z relro -o bin/warp /usr/lib/gcc/x86_64-linux-gnu/9/../../../x86_64-linux-gnu/Scrt1.o /usr/lib/gcc/x86_64-linux-gnu/9/../../../x86_64-linux-gnu/crti.o /usr/lib/gcc/x86_64-linux-gnu/9/crtbeginS.o -L/usr/lib/gcc/x86_64-linux-gnu/9 -L/usr/lib/gcc/x86_64-linux-gnu/9/../../../x86_64-linux-gnu -L/usr/lib/gcc/x86_64-linux-gnu/9/../../../../lib -L/lib/x86_64-linux-gnu -L/lib/../lib -L/usr/lib/x86_64-linux-gnu -L/usr/lib/../lib -L/usr/lib/gcc/x86_64-linux-gnu/9/../../.. -lXfixes -lXtst -lX11 /tmp/ccyaHs0u.o -lgcc --push-state --as-needed -lgcc_s --pop-state -lc -lgcc --push-state --as-needed -lgcc_s --pop-state /usr/lib/gcc/x86_64-linux-gnu/9/crtendS.o /usr/lib/gcc/x86_64-linux-gnu/9/../../../x86_64-linux-gnu/crtn.o
/usr/bin/ld: /tmp/ccyaHs0u.o: in function `set_cursor_visibility':
warp.c:(.text+0x5a): undefined reference to `XFixesShowCursor'
/usr/bin/ld: warp.c:(.text+0x96): undefined reference to `XFixesHideCursor'
/usr/bin/ld: warp.c:(.text+0xa5): undefined reference to `XFlush'
/usr/bin/ld: /tmp/ccyaHs0u.o: in function `color':
warp.c:(.text+0x122): undefined reference to `XDefaultColormap'
/usr/bin/ld: warp.c:(.text+0x13b): undefined reference to `XAllocColor'
/usr/bin/ld: /tmp/ccyaHs0u.o: in function `create_win':
warp.c:(.text+0x1ff): undefined reference to `XCreateSimpleWindow'
/usr/bin/ld: warp.c:(.text+0x29b): undefined reference to `XChangeWindowAttributes'
/usr/bin/ld: warp.c:(.text+0x2b4): undefined reference to `XMapWindow'
/usr/bin/ld: /tmp/ccyaHs0u.o: in function `draw':
warp.c:(.text+0x406): undefined reference to `XUnmapWindow'
/usr/bin/ld: warp.c:(.text+0x41f): undefined reference to `XUnmapWindow'
/usr/bin/ld: warp.c:(.text+0x438): undefined reference to `XUnmapWindow'
/usr/bin/ld: warp.c:(.text+0x451): undefined reference to `XUnmapWindow'
/usr/bin/ld: warp.c:(.text+0x46a): undefined reference to `XUnmapWindow'
/usr/bin/ld: /tmp/ccyaHs0u.o:warp.c:(.text+0x49c): more undefined references to `XUnmapWindow' follow
/usr/bin/ld: /tmp/ccyaHs0u.o: in function `draw':
warp.c:(.text+0x4c5): undefined reference to `XFlush'
/usr/bin/ld: warp.c:(.text+0x50c): undefined reference to `XMoveWindow'
/usr/bin/ld: warp.c:(.text+0x52c): undefined reference to `XResizeWindow'
/usr/bin/ld: warp.c:(.text+0x54e): undefined reference to `XMoveWindow'
/usr/bin/ld: warp.c:(.text+0x57b): undefined reference to `XResizeWindow'
/usr/bin/ld: warp.c:(.text+0x5a0): undefined reference to `XMoveWindow'
/usr/bin/ld: warp.c:(.text+0x5cd): undefined reference to `XResizeWindow'
/usr/bin/ld: warp.c:(.text+0x5ef): undefined reference to `XMoveWindow'
/usr/bin/ld: warp.c:(.text+0x61e): undefined reference to `XResizeWindow'
/usr/bin/ld: warp.c:(.text+0x647): undefined reference to `XMoveWindow'
/usr/bin/ld: warp.c:(.text+0x676): undefined reference to `XResizeWindow'
/usr/bin/ld: warp.c:(.text+0x69f): undefined reference to `XMoveWindow'
/usr/bin/ld: warp.c:(.text+0x6ce): undefined reference to `XResizeWindow'
/usr/bin/ld: warp.c:(.text+0x6e7): undefined reference to `XMapRaised'
/usr/bin/ld: warp.c:(.text+0x700): undefined reference to `XMapRaised'
/usr/bin/ld: warp.c:(.text+0x719): undefined reference to `XMapRaised'
/usr/bin/ld: warp.c:(.text+0x732): undefined reference to `XMapRaised'
/usr/bin/ld: warp.c:(.text+0x7bd): undefined reference to `XMoveWindow'
/usr/bin/ld: warp.c:(.text+0x7fa): undefined reference to `XResizeWindow'
/usr/bin/ld: warp.c:(.text+0x823): undefined reference to `XMapRaised'
/usr/bin/ld: warp.c:(.text+0x894): undefined reference to `XMoveWindow'
/usr/bin/ld: warp.c:(.text+0x8df): undefined reference to `XResizeWindow'
/usr/bin/ld: warp.c:(.text+0x914): undefined reference to `XMapRaised'
/usr/bin/ld: warp.c:(.text+0x943): undefined reference to `XMapRaised'
/usr/bin/ld: warp.c:(.text+0x9a4): undefined reference to `XWarpPointer'
/usr/bin/ld: warp.c:(.text+0x9b7): undefined reference to `XFlush'
/usr/bin/ld: /tmp/ccyaHs0u.o: in function `click':
warp.c:(.text+0x9e8): undefined reference to `XTestFakeButtonEvent'
/usr/bin/ld: warp.c:(.text+0xa04): undefined reference to `XTestFakeButtonEvent'
/usr/bin/ld: warp.c:(.text+0xa13): undefined reference to `XFlush'
/usr/bin/ld: /tmp/ccyaHs0u.o: in function `parse_key':
warp.c:(.text+0xc80): undefined reference to `XStringToKeysym'
/usr/bin/ld: warp.c:(.text+0xd12): undefined reference to `XKeysymToKeycode'
/usr/bin/ld: /tmp/ccyaHs0u.o: in function `reset':
warp.c:(.text+0x111e): undefined reference to `XGetWindowAttributes'
/usr/bin/ld: warp.c:(.text+0x116b): undefined reference to `XGrabKeyboard'
/usr/bin/ld: /tmp/ccyaHs0u.o: in function `grab_key':
warp.c:(.text+0x1300): undefined reference to `XGrabKey'
/usr/bin/ld: /tmp/ccyaHs0u.o: in function `main':
warp.c:(.text+0x1447): undefined reference to `XOpenDisplay'
/usr/bin/ld: warp.c:(.text+0x1502): undefined reference to `XNextEvent'
/usr/bin/ld: warp.c:(.text+0x1529): undefined reference to `XKeycodeToKeysym'
/usr/bin/ld: warp.c:(.text+0x1587): undefined reference to `XUngrabKeyboard'
collect2: error: ld returned 1 exit status

Crash: crashing Xorg when input device is disabled with xinput

I want to disable my laptop's built in keyboard and I used to do so with: xinput disable 6 (or whatever is the device's id) . The problem is that when the keyboard is disabled if I try to use warpd (from my other usb connected keyboard) Xorg suddenly crashes.
Here is a bit of the syslog while the crash.
syslog.txt

I was always able to reproduce this. (Arch Linux)

Regression: no mouse square in Center of grid

IIRC, before OS X support , grid mode would draw the normal mode mouse square in the Center of the grid - this was really helpful to see where the click would occur without zooming the grid in all the way

Be able to trigger shortcuts again wihout having to press the full key combination again

Here I am to annoy you again :P Before 65e8cd6 if I am right it was possible to trigger the shortcuts fro scrolling just by releasing and pressing only one of the keys of the key combination. I am not sure if this affects the scroll only but is the one that most annoys me.

Let me explain better. Let's say I have scroll_down_key: A-a on my warprc. Then i launch warpd and scroll on a long page with Alt + a, but then I release the a key only, the page stops scrolling as expected, but then If i press a again (and I was holding alt all this time) the page won't scroll even though I am pressing alt+A. I will have to release and press Alt and a for the key combination to work again.

In another words: Hold Alt, hold A for a while, then release A only. The scroll stops as expected, but then holding A again doesn't trigger the scroll anymore.

I know that for those cases I could be just using normal mode and scrolling with a single key. I just got used with the shortcut way though :P.

Feature Request: Some more ideas!

First of all thanks a lot, I love this project so much and the scroll functionality and the hints customization is just like I dreamed! You did a really great job.

Here are some ideas that I am still missing. Sorry if I am just saying something that is already implemented but I didn't find yet

  1. Use multiple control keys in shortcuts. e.g. I really need something like M-A-w M-A-s for the scroll because the rest is taken :P. Just alt+character is kinda taken by most qt applications and useful for keyboard navigation on those. Maybe the default should even change to something like that but the point is having multiple hold keys on any those shortcuts.

  2. Faster and slower movements in the "visual mode" of the discrete mode (dragging). Like S-j (S + any of hjkl) for faster up movement and so on. Could be someone like w and b in vim too but like jumping faster, but would be nice to have it up and down too. So we would have the movement_increment option and the fast_movement_increment for the discrete mode.

  3. Multiple shortcuts for the same function. This is the least important but like for the discrete_beginning I sometimes use S-backslash (which is the pipe simbol '|') but also 0, and both are the vim default shortcuts. Would it be hard to have something like: discrete_beginning: S-backslash, S-6?

That is all, I can throw my mouse in the trashcan already if 1 and 2 happens :P.

Config options for grid width & cursor size

It'd be helpful to make these config options:

#define CURSOR_WIDTH 15
#define BORDER_WIDTH 5
#define GRID_LINE_WIDTH 2

Would like to try making them smaller - sometimes I can't tell exactly where I'm clicking, and the borders/grid get smushed up when zoomed all the way in

Using same keysym for activation & warping causes problems

If I have a config that uses the same base keysym for activation & warping, the program treats it as if I had warped already when it starts:

grid_keys: Tab,space,Up,Right
activation_key: A-space

In other words, it acts as if I pressed A-space space when I press A-space

Missing LICENSE

I see you have no LICENSE file for this project. The default is copyright.

I would suggest releasing the code under the GPL-3.0-or-later or AGPL-3.0-or-later license so that others are encouraged to contribute changes back to your project.

Synergy + Warp causes Xorg to crash

Already happened three times under KDE plasma only. I am not sure if its just warp's fault but when i launch it sometimes Xorg is crasing, right after the hints are displayed (yes when I launch it using hints mode).

It really makes all my applications crash the Xorg to restart.
This is a full crash report but probably only the Xorg part might interest you: 00EM9N6.txt\

I was a few comits behind and I report if this happens on the version I just got now.

Any idea why this might have happened? I am on Xorg 1.20-8-2 and KDE 5.19, and also happened on KDE 5.18.5. The problem is that this happens kinda randomly :/

capslock as modifier?

Is it possible to use capslock as a modifier-key in key-combinations?

Currently I use keyd to do the very common and widespread capslock to meta mapping but as warpd seems to work on evdev level as well, bindings with a meta prefix (such as M-f) do not work in warpd unless the physical meta key is used. Unless I'm doing something wrong, would it be possible to add support in warpd for using capslock as another modifier key, for example by treating it as a regular shift key?

Use case: I would like to use keys on the homerow for clicking and add meta for oneshot clicks.

Repeated mousekeys cause drawing problems

Holding down the warp key or directional mousekey causes the grid and dot to disappear; it'll reappear after releasing and pressing again. Works fine if slowly tapping.

alternative keymap support?

Hi,

since my recently found keymap nirvana through keyd, I naturally looked through your projects and started using warpd as well, thanks again for making both programs! Since I'm using Dvorak, I had to alter the source code by hand so that the hint chars actually match this layout (which is of course a very ugly solution). It would be much nicer to make warpd agnostic of the currently active X keymap, in the sense that the hint-chars drawn on screen are matched with the X keysyms associated to the keys. If that would require substantial coding, how about introducing a simple translation table between drawn hint-chars and actual keys (which one would have to edit by hand)?

Feature: Consider xmodmap remaps

I use xmodmap to remap the Caps_Lock to Esc, which is a usual thing for vim users I guess. In hints mode it just ends when I hit my remapped Caps_Lock, but I guess that would happen for any other invalid key. In discrete mode it doesn't work though, even thought is remapped, I have to hit the original Esc key. Also if I try and use Caps_Lock as my exit key in ~/.warprc it doesn't work because it expects the key that was remapped to be Caps_Lock which is my Alt__Right.

I guess that is because warpd is doing things on a different level but what I don't get is that warpd seems to detect the key that was remapped to Caps_Lock but not the one that was remapped to be Esc instead. I am leaving both the original Esc and Caps_Lock acting as Esc, could that be why?

temporary speed change

Hello again!

When navigating, dynamic control of cursor speed would be useful, i.e. keys which increase or decrease the cursor_speed value while being pressed.

From an implementation point of view, it would probably be much simpler to just introduce "fast" and "slow" variants of the cursor movement commands, i.e. cursor_speed, 'cursor_speed_slow, cursor_speed_fast` and the same for left, right, up, down.

Feature Request: run it once (instead of daemon mode) with a geometry command line option?

Thanks for this software. I find it really useful.

Could it be possible to use it as a regular command instead of a daemon mode? This would provide an easy method to provide xinerama support (see below).

There are a lot of keybinding "daemons" (xbindkeys, the ones given by window managers, etc) out there, and so I would prefer to use warpd in the already running daemon, instead of running a specific one for warpd. I see this as a particular case of the well known unix philosophy.

Moreover, it would be great if the command line accepts an option to select the mode (hints, normal, etc) and a command line option to specify the geometry rectangle (in your current code you assume that this rectangle is the full screen). As far as I know there is a standard way to refer to the geometry rectangle: "860x540+20+0" refers to the rectangle with width 860 and height 540 and with left-upper corner at (20,0), etc

Being able to specify the geometry rectangle would solve the xinerama issue in an obvious way, because we could use the keybinding daemon to use different commands to launch warpd depending on which screen we are currently focused.

Config option for colors

I was just gonna edit the hardcoded values in source, but seems like a config option would be nice - the default red & green is confusing for me - I use a high-visibility red pointer theme, so it's weird when red now means where the cursor isn't (also these are the colors affected by the most common form of color blindness).

Feature request: Add wayland support

Warpd looks really useful to me when used in combination with a tiling window manager. However, I use sway so would need wayland support.

Thanks for the cool project!

Oneshot hint mode, no normal mode activation

I'm loving the hint mode for fast warps, but it auto-switches to normal mode every time forcing me to press escape.
Thought something like a hint_oneshot_activation_key would be useful for other trackpoint users like me.

Feature reuqest: cross platform

Is it possitble to make this project to cross-platform?

I really love this project, so I'm thinking about making this project as an cross-platform using python.

Since this project has really adorable features, and some of them could be hard to implement in cross platform, I think starting with implementing hinting could be helpful

Do you have any thought about that?

clicking broken

as of 2346350 clicks don't work. config file attached

grid_keys: Return,Tab,space,Left,Up,Right,Home,Down,End
activation_key: C-S-e
up: a
right: t
left: e
down: o
button1: i
button2: z
button3: g
nr: 3
nc: 3
grid_col: 990000
grid_mouse_col: ee0000
grid_line_width: 3
grid_pointer_size: 12

passthrough of unbound key events

It would be nice if warpd would passthrough (on a press/release level) unbound key events while active, unless this creates unwanted side effects I didn't consider. The icing on the cake would be to keep modifier state when activated, so that for example an activation via C-j would only send the release events for j and control when these keys are physically released. In this case, warpd should of course be aware that control is currently held so that bindings work as expected.

My use case is as follows: At work I'm regularly forced to use gui applications and then switch between two gui windows to copy/paste text, select some ui element etc. The window switching is done via a key combination, as is magnification, and I also interact with the application via keyboard shortcuts.
I frequently also use a trackpoint, so that pointer movement is actually a mixture of warpd and physical trackpoint usage. The explicit activation/deactivation of warpd is quite cumbersome here.

To be even more explicit: I regularly have to copy parts of text from separate ui text fields into respective text fields in another ui window and then press a function key. Here I started switching from pure trackpoint usage to a combination of hint and drag mode, which is actually more efficient. What slows me down substantially is the explicit activation/deactivation of warpd in order to switch to the other window (they are too large to be shown side to side), paste, press the F-key and switch again. Oh, of course we don't have to argue about the bad design of the gui application in question and the horrible workflow it creates. I already tried to do so many times in vain...

Buggy interaction with OS X native Sticky Keys

I use sticky keys (generic modifier oneshot and/or lock, basically) on OS X and it interact strangely with warpd – with a sticky key active that's used by my warpd config, warpd will behave correctly and the stickiness is cleared, but OSX's visual indicator of the sticky status stays around even though it is no longer active.

I've also encountered situations in which all input (Including mouse and keystrokes) become non-responsive (Sometimes to the point of requiring a hard reboot). I can provoke this with a sticky lock that is part of a warpd activation key (ie, C–S –. as warpd config, lock control, then press Shift + .)

You can enable sticky keys in System preferences - Accessibility – keyboard. I can provide more details or a screen capture if it helps.

Feature Request: Keep history of clicks in discrete mode as hints for hints mode

Hi.. It is me again.... Sorry but I just love annoying you :P

Sorry for annoying you so much but you have to agree this one is at least to keep in mind. Most boring software with lots of point and click are usually receiving clicks in the same screen positions. What if we could keep track of the last clicked positions, I mean the number of positions to save could be configurable or so, and then we display a different hint over the other hints for those positions. I mean the last clicked position if the user used discrete mode, meaning the default hints did not work. I really think this is a way to improve the usage of this a lot!

Another thing would be maybe have in discrete mode the vim "m" command... I mean bookmark a position during runtime, so you can define the hints like single letter hints or whatever, for those bookmarks (maybe q like recording a macro in vim but who cares by the defaults anyway). Also in the future could there be a menu or a gui to load profiles of those bookmarked positions at runtime...... But yeah I am daydreaming a bit far from what we have now. But I think this is a cool direction this could evolve to.

Change to Hints mode within Normal mode.

Is it possible to change directly to hints mode within normal mode? I kinda miss the hints mode after pressing v for selecting/dragging in hints mode. Would be kinda nice to be able to switch from normal to hints with the shortcut directly.

Right now it is possible to change from hints mode to normal with the assigned keybinding for normal but the contrary is not possible.

Thanks a lot for the great project! Keep up the good work!

FATAL: Failed to grab keyboard

I am not sure what happened but I can't quite use warpd anymore :(

$ warpd -f
rescan_devices: detected keyboard: Power Button (6)
rescan_devices: detected keyboard: Video Bus (7)
rescan_devices: detected keyboard: Video Bus (8)
rescan_devices: detected keyboard: Power Button (9)
rescan_devices: detected keyboard: Sleep Button (10)
rescan_devices: detected keyboard: USB OPTICAL MOUSE  Keyboard (13)
rescan_devices: detected keyboard: BY Tech Usb Gaming Keyboard (15)
rescan_devices: detected keyboard: BY Tech Usb Gaming Keyboard System Control (16)
rescan_devices: detected keyboard: BY Tech Usb Gaming Keyboard (18)
rescan_devices: detected keyboard: Integrated Webcam: Integrated W (20)
rescan_devices: detected keyboard: Intel HID events (23)
rescan_devices: detected keyboard: Intel HID 5 button array (24)
rescan_devices: detected keyboard: Dell WMI hotkeys (25)
rescan_devices: detected keyboard: USB OPTICAL MOUSE  Consumer Control (27)
rescan_devices: detected keyboard: BY Tech Usb Gaming Keyboard Consumer Control (28)
rescan_devices: detected keyboard: Corsair Raptor HS40 (11)
rescan_devices: detected keyboard: AT Translated Set 2 keyboard (26)
main_loop: Waiting for activation key
main_loop: Processing activation key M-x.
input_grab_keyboard: Grabbing keyboard
FATAL: Failed to grab keyboard

I tried to bypass this on ~ line 340 of inputs.c by ignoring this error just to see what would happen and of course that was a terrible idea :P :

main_loop: Waiting for activation key
main_loop: Processing activation key M-x.
input_grab_keyboard: Grabbing keyboard
input_grab_keyboard: Done
hint_mode: Entering main hint loop
input_ungrab_keyboard: Ungrabbing keyboard
input_ungrab_keyboard: Waiting for neutral keyboard state.
input_ungrab_keyboard: Done
input_ungrab_keyboard: Attempting to perform ungrab on all grabbed devices.
input_ungrab_keyboard: Ungrabbing 6

input_ungrab_keyboard: Done
input_ungrab_keyboard: Ungrabbing 7

input_ungrab_keyboard: Done
input_ungrab_keyboard: Ungrabbing 8

input_ungrab_keyboard: Done
input_ungrab_keyboard: Ungrabbing 9

input_ungrab_keyboard: Done
input_ungrab_keyboard: Ungrabbing 10

input_ungrab_keyboard: Done
input_ungrab_keyboard: Ungrabbing 13

input_ungrab_keyboard: Done
input_ungrab_keyboard: Ungrabbing 15

input_ungrab_keyboard: Done
input_ungrab_keyboard: Ungrabbing 16

input_ungrab_keyboard: Done
input_ungrab_keyboard: Ungrabbing 18

input_ungrab_keyboard: Done
input_ungrab_keyboard: Ungrabbing 20

input_ungrab_keyboard: Done
input_ungrab_keyboard: Ungrabbing 23

input_ungrab_keyboard: Done
input_ungrab_keyboard: Ungrabbing 24

input_ungrab_keyboard: Done
input_ungrab_keyboard: Ungrabbing 25

input_ungrab_keyboard: Done
input_ungrab_keyboard: Ungrabbing 27

input_ungrab_keyboard: Done
input_ungrab_keyboard: Ungrabbing 28

input_ungrab_keyboard: Done
input_ungrab_keyboard: Ungrabbing 11

input_ungrab_keyboard: Done
input_ungrab_keyboard: Attempting to perform ungrab on all grabbed devices.
input_ungrab_keyboard: Ungrabbing 6

input_ungrab_keyboard: Done
input_ungrab_keyboard: Ungrabbing 7

input_ungrab_keyboard: Done
input_ungrab_keyboard: Ungrabbing 8

input_ungrab_keyboard: Done
input_ungrab_keyboard: Ungrabbing 9

input_ungrab_keyboard: Done
input_ungrab_keyboard: Ungrabbing 10

input_ungrab_keyboard: Done
input_ungrab_keyboard: Ungrabbing 13

input_ungrab_keyboard: Done
input_ungrab_keyboard: Ungrabbing 15

input_ungrab_keyboard: Done
input_ungrab_keyboard: Ungrabbing 16

input_ungrab_keyboard: Done
input_ungrab_keyboard: Ungrabbing 18

input_ungrab_keyboard: Done
input_ungrab_keyboard: Ungrabbing 20

input_ungrab_keyboard: Done
input_ungrab_keyboard: Ungrabbing 23

input_ungrab_keyboard: Done
input_ungrab_keyboard: Ungrabbing 24

input_ungrab_keyboard: Done
input_ungrab_keyboard: Ungrabbing 25

input_ungrab_keyboard: Done
input_ungrab_keyboard: Ungrabbing 27

input_ungrab_keyboard: Done
input_ungrab_keyboard: Ungrabbing 28

input_ungrab_keyboard: Done
input_ungrab_keyboard: Ungrabbing 11

input_ungrab_keyboard: Done
^CReceived termination signal, cleaning up...
input_ungrab_keyboard: Ungrabbing keyboard
input_ungrab_keyboard: Attempting to perform ungrab on all grabbed devices.
input_ungrab_keyboard: Ungrabbing 6

input_ungrab_keyboard: Done
input_ungrab_keyboard: Ungrabbing 7

input_ungrab_keyboard: Done
input_ungrab_keyboard: Ungrabbing 8

My actual cursor then disappears and only returns if I kill warpd. (Which I guess is expected). But warpd works, I can use any mode if that exit(-1) is commented out of inputs.c but then it will fail to ungrab. That is on 65e8cd6.

I also tried 0dff1f0, which was working before and now I get on it:

$ warpd -f
rescan_devices: detected keyboard: Power Button (6)
rescan_devices: detected keyboard: Video Bus (7)
rescan_devices: detected keyboard: Video Bus (8)
rescan_devices: detected keyboard: Power Button (9)
rescan_devices: detected keyboard: Sleep Button (10)
rescan_devices: detected keyboard: USB OPTICAL MOUSE  Keyboard (13)
rescan_devices: detected keyboard: BY Tech Usb Gaming Keyboard (15)
rescan_devices: detected keyboard: BY Tech Usb Gaming Keyboard System Control (16)
rescan_devices: detected keyboard: BY Tech Usb Gaming Keyboard (18)
rescan_devices: detected keyboard: Integrated Webcam: Integrated W (20)
rescan_devices: detected keyboard: Intel HID events (23)
rescan_devices: detected keyboard: Intel HID 5 button array (24)
rescan_devices: detected keyboard: Dell WMI hotkeys (25)
rescan_devices: detected keyboard: USB OPTICAL MOUSE  Consumer Control (27)
rescan_devices: detected keyboard: BY Tech Usb Gaming Keyboard Consumer Control (28)
rescan_devices: detected keyboard: Corsair Raptor HS40 (11)
rescan_devices: detected keyboard: AT Translated Set 2 keyboard (26)
main: Built from commit: 0dff1f0736c5b7c202ef977fc72ed3a290b777d8

main: Waiting for activation key
X Error of failed request:  BadAccess (attempt to access private resource denied)
  Major opcode of failed request:  33 (X_GrabKey)
  Serial number of failed request:  514
  Current serial number in output stream:  519

And that also happens on 08ed81a... So something surelly changed on my system but I am not sure what....

Problems with 2ecfa9a (window masking and hiding)

So here is a few problems introduced by 2ecfa9a.
First it broke conky when using own_window_type = 'override' which basically means "don't use the window manager to decide placement and stuff". This way when conky and warpd are running ad the same time conky runs but doesn't show up unless when warp appears and you can see that warp is masking out conky:
image
No idea if it might affect something else or if this is conky's fault maybe, but own_window_type = 'override' is the only way to get it to work on my WM.

Another problem/thing Is that warpd is now animated! But why is that? Well is just picom's transition. This introduces a huge delay btw, looks kinda cool still.
Peek 2021-07-30 03-18

Before this last commit warpd wasn't seen as a window so this effect didn't exist. I think it would be time to let warpd's window have a wm_class property at least so that we can set those compositor rules to it. I haven't been able to spot warpd with xprop or wmctrl -l so i guess it has none? No idea how this works on this low level honestly.

I've tried messing with XSetWMProperties but couldn't really get warpd to have a window class, name or any attribute so far.

clicks not registering

I need to hit the mouse click key many times before it's detected - feels like some sort of race condition? XFCE on Ubuntu 19.10

Interaction with real mouse buttons

I'm using warp with a pair of Twiddlers which have the world's worst 8 directional joystick for a pointer (hence my interest in this program). The mouse buttons are fine though - it'd be nice if I could use those directly, but at present warp both ignores them and blocks them from functioning.

I could see making warp aware of real mouse movement as well, but that's probably a pain in the butt and not really necessary for my use case, as I'm hoping to stop using the Twiddler's physical joysticks entirely (they're really terrible)

Allow for one-key access

Use case: A user who can only press one key (a switch it's called) would like to access the whole screen/control a mouse. There are methods - MacOS has a switch scanning method built in but an alternative would be useful.

Generally the idea is you need to have a time parameter - a n ms scan rate - which highlights each "item" at a fixed rate. The user could change this. Then as it highlights each block sequentially the user selects with their one key the block they want. So it cycles through each item - you can group each item either in a block of items or in a row-column type approach. Take a look at https://acecentre.org.uk/resources/switch-access-technology - for some of the techniques

NB: It would require an additional modal on each selection of an item for what the user wants to do - left, right click etc.

NB: this whole grid approach is originally from Dragon: https://www.youtube.com/watch?v=T-WRJgpM2Gs

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.