commit f0398bf6ec8fe694b495433e124b5943fa66df0d
parent 979777afad4a71cac739f0340bdd4244b844e391
Author: Michael Savage <mikejsavage@gmail.com>
Date:   Thu,  6 Sep 2018 11:52:28 +0300
Macros and intervals on Windows
Diffstat:
4 files changed, 124 insertions(+), 37 deletions(-)
diff --git a/src/main.cc b/src/main.cc
@@ -1,8 +1,10 @@
 #include "script.h"
 #include "input.h"
 #include "ui.h"
+#include "platform_network.h"
 
 int main() {
+	net_init();
 	ui_init();
 	input_init();
 	script_init();
@@ -12,6 +14,7 @@ int main() {
 	script_term();
 	input_term();
 	ui_term();
+	net_term();
 
 	return 0;
 }
diff --git a/src/script.cc b/src/script.cc
@@ -45,6 +45,9 @@ void script_handleInput( const char * buffer, int len ) {
 }
 
 void script_doMacro( const char * key, int len, bool shift, bool ctrl, bool alt ) {
+	// printf( "macro %s%s%s%.*s\n", shift ? "s" : "", ctrl ? "c" : "", alt ? "a" : "", len, key );
+	// fflush( stdout );
+
 	assert( macroHandlerIdx != LUA_NOREF );
 
 	lua_rawgeti( lua, LUA_REGISTRYINDEX, macroHandlerIdx );
diff --git a/src/textbox.cc b/src/textbox.cc
@@ -71,8 +71,6 @@ void textbox_scroll( TextBox * tb, int offset ) {
 	else {
 		tb->scroll_offset = min( tb->scroll_offset + offset, tb->num_lines - 1 );
 	}
-
-	textbox_draw( tb );
 }
 
 static size_t num_rows( size_t h ) {
diff --git a/src/win32.cc b/src/win32.cc
@@ -317,9 +317,6 @@ void ui_draw_char( int left, int top, char c, Colour colour, bool bold, bool for
 	TextOutA( UI.hdc, left, top + SPACING, &c, 1 );
 }
 
-void ui_dirty( int left, int top, int width, int height ) {
-}
-
 typedef struct {
 	char c;
 
@@ -360,8 +357,6 @@ void ui_draw_status() {
 		int y = UI.height - ( PADDING * 3 ) - Style.font.height * 2 - SPACING;
 		ui_draw_char( x, y, sc.c, sc.fg, sc.bold );
 	}
-
-	ui_dirty( 0, UI.height - ( PADDING * 4 ) - ( Style.font.height * 2 ), UI.width, Style.font.height + ( PADDING * 2 ) );
 }
 
 void draw_input() {
@@ -378,8 +373,6 @@ void draw_input() {
 	if( input.cursor_pos < input.len ) {
 		ui_draw_char( PADDING + input.cursor_pos * Style.font.width, top - SPACING, input.buf[ input.cursor_pos ], COLOUR_BG, false );
 	}
-
-	ui_dirty( PADDING, UI.height - ( PADDING + Style.font.height ), UI.width - PADDING * 2, Style.font.height );
 }
 
 void ui_draw() {
@@ -393,8 +386,6 @@ void ui_draw() {
 
 	int spacerY = ( 2 * PADDING ) + ( Style.font.height + SPACING ) * CHAT_ROWS;
 	ui_fill_rect( 0, spacerY, UI.width, 1, COLOUR_STATUSBG, false );
-
-	ui_dirty( 0, 0, UI.width, UI.height );
 }
 
 void ui_handleXEvents() { }
@@ -527,11 +518,7 @@ LRESULT CALLBACK WndProc( HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam ) {
 			break;
 
 		case WM_TIMER: {
-			// SelectObject( dc, c % 2 == 0 ? font : bold_font );
-			// char buf[ 64 ];
-			// int l = snprintf( buf, sizeof( buf ), "timer %d", c );
-			// TextOutA( dc, 10, 40, buf, l );
-			// c++;
+			script_fire_intervals();
 		} break;
 
 		case WM_CHAR: {
@@ -542,37 +529,111 @@ LRESULT CALLBACK WndProc( HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam ) {
 			}
 		} break;
 
-		case WM_KEYDOWN: {
+		case WM_KEYDOWN:
+		case WM_SYSKEYDOWN: {
+			#define ADD_MACRO( key, name ) \
+				case key: \
+					  script_doMacro( name, sizeof( name ) - 1, shift, ctrl, alt ); \
+					break
+
+			bool shift = ( GetKeyState( VK_SHIFT ) & 0x8000 ) != 0;
+			bool ctrl = ( GetKeyState( VK_CONTROL ) & 0x8000 ) != 0;
+			bool alt = ( GetKeyState( VK_MENU ) & 0x8000 ) != 0;
+
 			switch( wParam ) {
 				case VK_BACK:
 					input_backspace();
+					ui_draw();
 					break;
 
 				case VK_DELETE:
 					input_delete();
+					ui_draw();
 					break;
 
 				case VK_RETURN:
 					input_return();
+					ui_draw();
 					break;
 
 				case VK_LEFT:
 					input_left();
+					ui_draw();
 					break;
 
 				case VK_RIGHT:
 					input_right();
+					ui_draw();
 					break;
 
 				case VK_UP:
 					input_up();
+					ui_draw();
 					break;
 
 				case VK_DOWN:
 					input_down();
+					ui_draw();
 					break;
+
+				case VK_PRIOR:
+					if( shift )
+						textbox_scroll( &UI.main_text, 1 );
+					else
+						textbox_page_up( &UI.main_text );
+					textbox_draw( &UI.main_text );
+					break;
+
+				case VK_NEXT:
+					if( shift )
+						textbox_scroll( &UI.main_text, -1 );
+					else
+						textbox_page_down( &UI.main_text );
+					textbox_draw( &UI.main_text );
+					break;
+
+				ADD_MACRO( VK_NUMPAD0, "kp0" );
+				ADD_MACRO( VK_NUMPAD1, "kp1" );
+				ADD_MACRO( VK_NUMPAD2, "kp2" );
+				ADD_MACRO( VK_NUMPAD3, "kp3" );
+				ADD_MACRO( VK_NUMPAD4, "kp4" );
+				ADD_MACRO( VK_NUMPAD5, "kp5" );
+				ADD_MACRO( VK_NUMPAD6, "kp6" );
+				ADD_MACRO( VK_NUMPAD7, "kp7" );
+				ADD_MACRO( VK_NUMPAD8, "kp8" );
+				ADD_MACRO( VK_NUMPAD9, "kp9" );
+
+				ADD_MACRO( VK_MULTIPLY, "kp*" );
+				ADD_MACRO( VK_DIVIDE, "kp/" );
+				ADD_MACRO( VK_SUBTRACT, "kp-" );
+				ADD_MACRO( VK_ADD, "kp+" );
+				ADD_MACRO( VK_DECIMAL, "kp." );
+
+				ADD_MACRO( VK_F1, "f1" );
+				ADD_MACRO( VK_F2, "f2" );
+				ADD_MACRO( VK_F3, "f3" );
+				ADD_MACRO( VK_F4, "f4" );
+				ADD_MACRO( VK_F5, "f5" );
+				ADD_MACRO( VK_F6, "f6" );
+				ADD_MACRO( VK_F7, "f7" );
+				ADD_MACRO( VK_F8, "f8" );
+				ADD_MACRO( VK_F9, "f9" );
+				ADD_MACRO( VK_F10, "f10" );
+				ADD_MACRO( VK_F11, "f11" );
+				ADD_MACRO( VK_F12, "f12" );
+
+				default: {
+					char c = MapVirtualKeyA( wParam, MAPVK_VK_TO_CHAR );
+					if( c == 0 )
+						break;
+					c = tolower( c );
+					if( ctrl || alt ) {
+						script_doMacro( &c, 1, shift, ctrl, alt );
+					}
+				} break;
 			}
-			ui_draw();
+
+			#undef ADD_MACRO
 		} break;
 
 		case 12345: {
@@ -609,9 +670,41 @@ LRESULT CALLBACK WndProc( HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam ) {
 	return 0;
 }
 
-int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow ) {
-	net_init();
+static bool is_macro( const MSG * msg ) {
+	if( msg->message != WM_KEYDOWN && msg->message != WM_KEYUP
+	    && msg->message != WM_SYSKEYDOWN && msg->message != WM_SYSKEYUP )
+		return false;
+
+	WPARAM macro_vks[] = {
+		VK_NUMPAD0,
+		VK_NUMPAD1,
+		VK_NUMPAD2,
+		VK_NUMPAD3,
+		VK_NUMPAD4,
+		VK_NUMPAD5,
+		VK_NUMPAD6,
+		VK_NUMPAD7,
+		VK_NUMPAD8,
+		VK_NUMPAD9,
+		VK_MULTIPLY,
+		VK_DIVIDE,
+		VK_SUBTRACT,
+		VK_ADD,
+		VK_DECIMAL,
+	};
+
+	for( WPARAM vk : macro_vks ) {
+		if( msg->wParam == vk )
+			return true;
+	}
+
+	bool ctrl = ( GetKeyState( VK_CONTROL ) & 0x8000 ) != 0;
+	bool alt = ( GetKeyState( VK_MENU ) & 0x8000 ) != 0;
 
+	return ctrl || alt;
+}
+
+int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow ) {
 	for( Socket & s : sockets ) {
 		s.in_use = false;
 	}
@@ -657,32 +750,22 @@ int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLin
 	UpdateWindow( UI.hwnd );
 	SetTimer( UI.hwnd, 1, 500, NULL );
 
+	net_init();
 	input_init();
 	script_init();
 
-	// NetAddress addr;
-	// dns_first( "mikejsavage.co.uk", &addr );
-	// TCPSocket sock;
-	// bool ok = net_new_tcp( &sock, addr, NET_BLOCKING );
-	// if( !ok ) return 1;
-	// printf( "%lld\n", sock.fd );
-        //
-	// WSAAsyncSelect( sock.fd, UI.hwnd, 12345, FD_READ | FD_CLOSE );
-        //
-	// const char buf[] = "GET / HTTP/1.1\r\n"
-	// 	"Host: mikejsavage.co.uk\r\n"
-	// 	"Connection: close\r\n"
-	// 	"\r\n\r\n";
-	// if( !net_send( sock, buf, strlen( buf ) ) )
-	// 	FATAL( "net_send" );
-
 	MSG msg;
 	while( GetMessage( &msg, NULL, 0, 0 ) > 0 ) {
-		TranslateMessage( &msg );
+		if( !is_macro( &msg ) )
+			TranslateMessage( &msg );
 		DispatchMessage( &msg );
 	}
 
+	script_term();
+	input_term();
 	net_term();
 
+	// TODO: clean up UI stuff
+
 	return 0;
 }