xW: show a connect dialog when run without args
This commit is contained in:
		
							parent
							
								
									efb25b8aae
								
							
						
					
					
						commit
						3e37efd9cd
					
				| @ -10,3 +10,8 @@ | |||||||
| #define ID_GOTO_ACTIVITY       15 | #define ID_GOTO_ACTIVITY       15 | ||||||
| #define ID_TOGGLE_UNIMPORTANT  16 | #define ID_TOGGLE_UNIMPORTANT  16 | ||||||
| #define ID_DISPLAY_FULL_LOG    17 | #define ID_DISPLAY_FULL_LOG    17 | ||||||
|  | 
 | ||||||
|  | #define IDD_CONNECT            20 | ||||||
|  | #define IDC_STATIC             21 | ||||||
|  | #define IDC_HOST               22 | ||||||
|  | #define IDC_PORT               23 | ||||||
|  | |||||||
							
								
								
									
										70
									
								
								xW/xW.cpp
									
									
									
									
									
								
							
							
						
						
									
										70
									
								
								xW/xW.cpp
									
									
									
									
									
								
							| @ -113,6 +113,9 @@ struct { | |||||||
| 
 | 
 | ||||||
| 	// Networking:
 | 	// Networking:
 | ||||||
| 
 | 
 | ||||||
|  | 	std::wstring host;                  ///< Host as given by user
 | ||||||
|  | 	std::wstring port;                  ///< Port/service as given by user
 | ||||||
|  | 
 | ||||||
| 	addrinfoW *addresses;               ///< GetAddrInfo() result
 | 	addrinfoW *addresses;               ///< GetAddrInfo() result
 | ||||||
| 	addrinfoW *addresses_iterator;      ///< Currently processed address
 | 	addrinfoW *addresses_iterator;      ///< Currently processed address
 | ||||||
| 	SOCKET socket;                      ///< Relay socket
 | 	SOCKET socket;                      ///< Relay socket
 | ||||||
| @ -153,6 +156,15 @@ format_error_message(int err) | |||||||
| 	return copy; | 	return copy; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | static std::wstring | ||||||
|  | window_get_text(HWND hWnd) | ||||||
|  | { | ||||||
|  | 	int length = GetWindowTextLength(hWnd); | ||||||
|  | 	std::wstring buffer(length, {}); | ||||||
|  | 	GetWindowText(hWnd, buffer.data(), length + 1); | ||||||
|  | 	return buffer; | ||||||
|  | } | ||||||
|  | 
 | ||||||
| // --- Networking --------------------------------------------------------------
 | // --- Networking --------------------------------------------------------------
 | ||||||
| 
 | 
 | ||||||
| static bool | static bool | ||||||
| @ -411,10 +423,7 @@ refresh_status() | |||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	// Buffer scrolling would cause a ton of flickering redraws.
 | 	// Buffer scrolling would cause a ton of flickering redraws.
 | ||||||
| 	int length = GetWindowTextLength(g.hwndStatus); | 	if (window_get_text(g.hwndStatus) != status) | ||||||
| 	std::wstring buffer(length, {}); |  | ||||||
| 	GetWindowText(g.hwndStatus, buffer.data(), length + 1); |  | ||||||
| 	if (buffer != status) |  | ||||||
| 		SetWindowText(g.hwndStatus, status.c_str()); | 		SetWindowText(g.hwndStatus, status.c_str()); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| @ -811,8 +820,6 @@ relay_process_callbacks(uint32_t command_seq, | |||||||
| 	} | 	} | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| static std::wstring input_get_contents(); |  | ||||||
| 
 |  | ||||||
| static void | static void | ||||||
| relay_process_message(const Relay::EventMessage &m) | relay_process_message(const Relay::EventMessage &m) | ||||||
| { | { | ||||||
| @ -941,7 +948,7 @@ relay_process_message(const Relay::EventMessage &m) | |||||||
| 			old->new_unimportant_messages = 0; | 			old->new_unimportant_messages = 0; | ||||||
| 			old->highlighted = false; | 			old->highlighted = false; | ||||||
| 
 | 
 | ||||||
| 			old->input = input_get_contents(); | 			old->input = window_get_text(g.hwndInput); | ||||||
| 			SendMessage(g.hwndInput, EM_GETSEL, | 			SendMessage(g.hwndInput, EM_GETSEL, | ||||||
| 				(WPARAM) &old->input_start, (LPARAM) &old->input_end); | 				(WPARAM) &old->input_start, (LPARAM) &old->input_end); | ||||||
| 
 | 
 | ||||||
| @ -1183,15 +1190,6 @@ relay_process_socket_events(std::wstring &error) | |||||||
| 
 | 
 | ||||||
| // --- Input line --------------------------------------------------------------
 | // --- Input line --------------------------------------------------------------
 | ||||||
| 
 | 
 | ||||||
| static std::wstring |  | ||||||
| input_get_contents() |  | ||||||
| { |  | ||||||
| 	int length = GetWindowTextLength(g.hwndInput); |  | ||||||
| 	std::wstring buffer(length, {}); |  | ||||||
| 	GetWindowText(g.hwndInput, buffer.data(), length + 1); |  | ||||||
| 	return buffer; |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| static void | static void | ||||||
| input_set_contents(const std::wstring &input) | input_set_contents(const std::wstring &input) | ||||||
| { | { | ||||||
| @ -1209,7 +1207,7 @@ input_submit() | |||||||
| 
 | 
 | ||||||
| 	auto input = new Relay::CommandData_BufferInput(); | 	auto input = new Relay::CommandData_BufferInput(); | ||||||
| 	input->buffer_name = b->buffer_name; | 	input->buffer_name = b->buffer_name; | ||||||
| 	input->text = input_get_contents(); | 	input->text = window_get_text(g.hwndInput); | ||||||
| 
 | 
 | ||||||
| 	// Buffer::history[Buffer::history.size()] is virtual,
 | 	// Buffer::history[Buffer::history.size()] is virtual,
 | ||||||
| 	// and is represented either by edit contents when it's currently
 | 	// and is represented either by edit contents when it's currently
 | ||||||
| @ -1233,7 +1231,7 @@ input_stamp() | |||||||
| { | { | ||||||
| 	DWORD start = {}, end = {}; | 	DWORD start = {}, end = {}; | ||||||
| 	SendMessage(g.hwndInput, EM_GETSEL, (WPARAM) &start, (LPARAM) &end); | 	SendMessage(g.hwndInput, EM_GETSEL, (WPARAM) &start, (LPARAM) &end); | ||||||
| 	return {start, end, input_get_contents()}; | 	return {start, end, window_get_text(g.hwndInput)}; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| static void | static void | ||||||
| @ -1340,7 +1338,7 @@ input_proc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam, | |||||||
| 			if (b->history_at < 1) | 			if (b->history_at < 1) | ||||||
| 				break; | 				break; | ||||||
| 			if (b->history_at == b->history.size()) | 			if (b->history_at == b->history.size()) | ||||||
| 				b->input = input_get_contents(); | 				b->input = window_get_text(g.hwndInput); | ||||||
| 			input_set_contents(b->history.at(--b->history_at)); | 			input_set_contents(b->history.at(--b->history_at)); | ||||||
| 			return 0; | 			return 0; | ||||||
| 		} | 		} | ||||||
| @ -1705,6 +1703,26 @@ window_proc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam) | |||||||
| 	return DefWindowProc(hWnd, uMsg, wParam, lParam); | 	return DefWindowProc(hWnd, uMsg, wParam, lParam); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | static INT_PTR CALLBACK | ||||||
|  | connect_proc( | ||||||
|  | 	HWND hDlg, UINT uMsg, WPARAM wParam, [[maybe_unused]] LPARAM lParam) | ||||||
|  | { | ||||||
|  | 	switch (uMsg) { | ||||||
|  | 	case WM_INITDIALOG: | ||||||
|  | 		return TRUE; | ||||||
|  | 	case WM_COMMAND: | ||||||
|  | 		switch (LOWORD(wParam)) { | ||||||
|  | 		case IDOK: | ||||||
|  | 		case IDCANCEL: | ||||||
|  | 			g.host = window_get_text(GetDlgItem(hDlg, IDC_HOST)); | ||||||
|  | 			g.port = window_get_text(GetDlgItem(hDlg, IDC_PORT)); | ||||||
|  | 			EndDialog(hDlg, LOWORD(wParam)); | ||||||
|  | 			return TRUE; | ||||||
|  | 		} | ||||||
|  | 	} | ||||||
|  | 	return FALSE; | ||||||
|  | } | ||||||
|  | 
 | ||||||
| static void | static void | ||||||
| get_font() | get_font() | ||||||
| { | { | ||||||
| @ -1883,11 +1901,14 @@ wWinMain(HINSTANCE hInstance, [[maybe_unused]] HINSTANCE hPrevInstance, | |||||||
| 
 | 
 | ||||||
| 	int argc = 0; | 	int argc = 0; | ||||||
| 	LPWSTR *argv = CommandLineToArgvW(pCmdLine, &argc); | 	LPWSTR *argv = CommandLineToArgvW(pCmdLine, &argc); | ||||||
| 	if (argc < 2) { | 	if (argc >= 2) { | ||||||
| 		show_error_message( | 		g.host = argv[0]; | ||||||
| 			L"You must pass the relay address and port on the command line."); | 		g.port = argv[1]; | ||||||
| 		return 1; | 	} else if (DialogBox(hInstance, MAKEINTRESOURCE(IDD_CONNECT), | ||||||
|  | 			g.hwndMain, connect_proc) != IDOK) { | ||||||
|  | 		return 0; | ||||||
| 	} | 	} | ||||||
|  | 	LocalFree(argv); | ||||||
| 
 | 
 | ||||||
| 	// We have a few suboptimal asynchronous options:
 | 	// We have a few suboptimal asynchronous options:
 | ||||||
| 	// a) WSAAsyncGetHostByName() requires us to distinguish hostnames
 | 	// a) WSAAsyncGetHostByName() requires us to distinguish hostnames
 | ||||||
| @ -1898,8 +1919,7 @@ wWinMain(HINSTANCE hInstance, [[maybe_unused]] HINSTANCE hPrevInstance, | |||||||
| 	hints.ai_family = AF_UNSPEC; | 	hints.ai_family = AF_UNSPEC; | ||||||
| 	hints.ai_socktype = SOCK_STREAM; | 	hints.ai_socktype = SOCK_STREAM; | ||||||
| 	hints.ai_protocol = IPPROTO_TCP; | 	hints.ai_protocol = IPPROTO_TCP; | ||||||
| 	err = GetAddrInfo(argv[0], argv[1], &hints, &g.addresses); | 	err = GetAddrInfo(g.host.c_str(), g.port.c_str(), &hints, &g.addresses); | ||||||
| 	LocalFree(argv); |  | ||||||
| 	if (err) { | 	if (err) { | ||||||
| 		show_error_message(format_error_message(err).c_str()); | 		show_error_message(format_error_message(err).c_str()); | ||||||
| 		return 1; | 		return 1; | ||||||
|  | |||||||
							
								
								
									
										21
									
								
								xW/xW.rc
									
									
									
									
									
								
							
							
						
						
									
										21
									
								
								xW/xW.rc
									
									
									
									
									
								
							| @ -31,6 +31,27 @@ BEGIN | |||||||
| #endif | #endif | ||||||
| END | END | ||||||
| 
 | 
 | ||||||
|  | // https://devblogs.microsoft.com/oldnewthing/20050204-00/?p=36523 | ||||||
|  | // https://devblogs.microsoft.com/oldnewthing/20050207-00/?p=36513 | ||||||
|  | // | ||||||
|  | // Note that this is still not the right font to use in newest Windows, | ||||||
|  | // that would be 9pt Segoe UI, as described in: | ||||||
|  | // https://learn.microsoft.com/en-us/windows/win32/uxguide/vis-fonts | ||||||
|  | // or even better yet, NONCLIENTMETRICS::lfMessageFont. | ||||||
|  | IDD_CONNECT DIALOGEX 0, 0, 150, 64 | ||||||
|  | STYLE DS_SHELLFONT | DS_MODALFRAME | DS_CENTER \ | ||||||
|  | 	| WS_POPUP | WS_CAPTION | WS_SYSMENU | ||||||
|  | CAPTION "Connect to Relay" | ||||||
|  | FONT 8, "MS Shell Dlg", 400 /*FW_NORMAL*/, 0 /*FALSE*/, 0x1 /*DEFAULT_CHARSET*/ | ||||||
|  | BEGIN | ||||||
|  | 	LTEXT "&Host:", IDC_STATIC, 7, 10, 18, 8 | ||||||
|  | 	EDITTEXT IDC_HOST, 39, 7, 104, 14, ES_AUTOHSCROLL | ||||||
|  | 	LTEXT "&Port:", IDC_STATIC, 7, 28, 18, 8 | ||||||
|  | 	EDITTEXT IDC_PORT, 39, 25, 104, 14, ES_AUTOHSCROLL | ||||||
|  | 	DEFPUSHBUTTON "&Connect", IDOK, 39, 43, 50, 14 | ||||||
|  | 	PUSHBUTTON "E&xit", IDCANCEL, 93, 43, 50, 14 | ||||||
|  | END | ||||||
|  | 
 | ||||||
| VS_VERSION_INFO VERSIONINFO | VS_VERSION_INFO VERSIONINFO | ||||||
| FILEVERSION     PROJECT_MAJOR, PROJECT_MINOR, PROJECT_PATCH, PROJECT_TWEAK | FILEVERSION     PROJECT_MAJOR, PROJECT_MINOR, PROJECT_PATCH, PROJECT_TWEAK | ||||||
| PRODUCTVERSION  PROJECT_MAJOR, PROJECT_MINOR, PROJECT_PATCH, PROJECT_TWEAK | PRODUCTVERSION  PROJECT_MAJOR, PROJECT_MINOR, PROJECT_PATCH, PROJECT_TWEAK | ||||||
|  | |||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user