summary refs log tree commit diff homepage
diff options
context:
space:
mode:
authorJune McEnroe <june@causal.agency>2021-09-28 13:13:55 -0400
committerJune McEnroe <june@causal.agency>2021-09-28 13:13:55 -0400
commitdf7953c97fe6b6e4628d80c3d1535575ebcb76cd (patch)
treef4dd8e8138beff52e284f61daac3bff9cb1c2224
parentAdd direct game selection tip to menu (diff)
downloadplay-df7953c97fe6b6e4628d80c3d1535575ebcb76cd.tar.gz
play-df7953c97fe6b6e4628d80c3d1535575ebcb76cd.zip
Add mouse support to freecell
Works much like WEP FreeCell.
-rw-r--r--freecell.c35
1 files changed, 32 insertions, 3 deletions
diff --git a/freecell.c b/freecell.c
index 872009a..9185870 100644
--- a/freecell.c
+++ b/freecell.c
@@ -216,7 +216,8 @@ static void curse(void) {
 	initscr();
 	cbreak();
 	noecho();
-	keypad(stdscr, false);
+	keypad(stdscr, true);
+	mousemask(BUTTON1_CLICKED | BUTTON1_DOUBLE_CLICKED, NULL);
 	struct termios term;
 	tcgetattr(STDOUT_FILENO, &term);
 	term.c_iflag &= ~IXON;
@@ -266,10 +267,13 @@ enum {
 	CardHeight = 1,
 	CellX = Padding,
 	CellY = 2*CardHeight,
-	FoundationX = CellX + 4*(CardWidth+Padding),
+	CellWidth = 4*(CardWidth+Padding),
+	FoundationX = CellX + CellWidth,
 	FoundationY = CellY,
+	FoundationWidth = 4*(CardWidth+Padding),
 	TableauX = CellX,
 	TableauY = CellY + 2*CardHeight,
+	TableauWidth = 8*(CardWidth+Padding),
 };
 
 static uint game;
@@ -319,8 +323,32 @@ static void draw(void) {
 
 static bool quit;
 static void input(void) {
-	char ch = getch();
+	MEVENT m;
+	int ch = getch();
 	uint stack = Stacks;
+
+	if (ch == KEY_MOUSE && getmouse(&m) == OK) {
+		if (m.y == CellY && m.x >= CellX && m.x < CellX+CellWidth) {
+			stack = Cell + (m.x-CellX) / (CardWidth+Padding);
+		} else if (
+			m.y == FoundationY &&
+			m.x >= FoundationX && m.x < FoundationX+FoundationWidth
+		) {
+			stack = Foundation+3 - (m.x-FoundationX) / (CardWidth+Padding);
+		} else if (
+			m.y >= TableauY && m.x >= TableauX && m.x < TableauX+TableauWidth
+		) {
+			stack = Tableau + (m.x-TableauX) / (CardWidth+Padding);
+		} else {
+			srcStack = Stacks;
+		}
+		if (m.bstate == BUTTON1_DOUBLE_CLICKED) {
+			srcStack = stack;
+		} else if (stack == srcStack) {
+			srcStack = stack = Stacks;
+		}
+	}
+
 	switch (tolower(ch)) {
 		break; case 'Q'^'@': quit = true;
 		break; case '\33': srcStack = Stacks;
@@ -384,5 +412,6 @@ uint playFreeCell(void) {
 		draw();
 		input();
 	}
+	mousemask(0, NULL);
 	return win();
 }
tests for make test. Signed-off-by: Jason A. Donenfeld <Jason@zx2c4.com> 2014-01-19cache: use sendfile() instead of a pair of read() + write()Sebastian Andrzej Siewior sendfile() does the same job and avoids to copy the content into userland and back. One has to define NO_SENDFILE in case the OS (kernel / libc) does not supported. It is disabled by default on non-linux environemnts. According to the glibc, sendfile64() was added in Linux 2.4 (so it has been there for a while) but after browsing over the mapage of FreeBSD's I noticed that the prototype is little different. Signed-off-by: Sebastian Andrzej Siewior <sebastian@breakpoint.cc> 2014-01-19README: document pkg-config for luajitJason A. Donenfeld Signed-off-by: Jason A. Donenfeld <Jason@zx2c4.com> 2014-01-17makefile: bump versionJason A. Donenfeld Signed-off-by: Jason A. Donenfeld <Jason@zx2c4.com> 2014-01-17mailmap: source before lighttpdJason A. Donenfeld Signed-off-by: Jason A. Donenfeld <Jason@zx2c4.com> 2014-01-17ui-shared: do not allow negative minutesJason A. Donenfeld Do to timestamp differences, sometimes cgit would should "-0 min", which doesn't make any sense. Signed-off-by: Jason A. Donenfeld <Jason@zx2c4.com> 2014-01-17auth: document tweakables in lua scriptJason A. Donenfeld Signed-off-by: Jason A. Donenfeld <Jason@zx2c4.com> 2014-01-17repolist: make owner clickable to searchJason A. Donenfeld Signed-off-by: Jason A. Donenfeld <Jason@zx2c4.com> 2014-01-17ui-shared: move about tab all the way to the leftJason A. Donenfeld There were no objections (at the time of committing this): http://lists.zx2c4.com/pipermail/cgit/2013-May/001393.html http://lists.zx2c4.com/pipermail/cgit/2014-January/001904.html Signed-off-by: Jason A. Donenfeld <Jason@zx2c4.com> 2014-01-17filter: don't forget to reap the auth filterJason A. Donenfeld Signed-off-by: Jason A. Donenfeld <Jason@zx2c4.com> 2014-01-17cgit.c: free tmp variableJason A. Donenfeld Signed-off-by: Jason A. Donenfeld <Jason@zx2c4.com> 2014-01-17Switch to exclusively using global ctxLukas Fleischer Drop the context parameter from the following functions (and all static helpers used by them) and use the global context instead: * cgit_print_http_headers() * cgit_print_docstart() * cgit_print_pageheader() Remove context parameter from all commands Drop the context parameter from the following functions (and all static helpers used by them) and use the global context instead: * cgit_get_cmd() * All cgit command functions. * cgit_clone_info() * cgit_clone_objects() * cgit_clone_head() * cgit_print_plain() * cgit_show_stats() In initialization routines, use the global context variable instead of passing a pointer around locally. Remove callback data parameter for cache slots This is no longer needed since the context is always read from the global context variable. Signed-off-by: Lukas Fleischer <cgit@cryptocrack.de> 2014-01-16auth: have cgit calculate login addressJason A. Donenfeld This way we're sure to use virtual root, or any other strangeness encountered. Signed-off-by: Jason A. Donenfeld <Jason@zx2c4.com> 2014-01-16auth: lua string comparisons are time invariantJason A. Donenfeld By default, strings are compared by hash, so we can remove this comment. Signed-off-by: Jason A. Donenfeld <Jason@zx2c4.com> 2014-01-16authentication: use hidden form instead of refererJason A. Donenfeld This also gives us some CSRF protection. Note that we make use of the hmac to protect the redirect value. Signed-off-by: Jason A. Donenfeld <Jason@zx2c4.com> 2014-01-16auth: add basic authentication filter frameworkJason A. Donenfeld This leverages the new lua support. See filters/simple-authentication.lua for explaination of how this works. There is also additional documentation in cgitrc.5.txt. Though this is a cookie-based approach, cgit's caching mechanism is preserved for authenticated pages. Very plugable and extendable depending on user needs. The sample script uses an HMAC-SHA1 based cookie to store the currently logged in user, with an expiration date. Signed-off-by: Jason A. Donenfeld <Jason@zx2c4.com> 2014-01-16t0111: Additions and fixesLukas Fleischer * Rename the capitalize-* filters to dump.* since they also dump the arguments. * Add full argument validation to the email filters. Signed-off-by: Lukas Fleischer <cgit@cryptocrack.de> 2014-01-16parsing.c: Remove leading space from committerLukas Fleischer