diff --git a/bridge.rc b/bridge.rc index 0130092..54f7fc9 100644 --- a/bridge.rc +++ b/bridge.rc @@ -2,8 +2,7 @@ #include #include -#define VER_VERSION 1,1,0,0 -#define VER_VERSION_STR "1.1\0" +#include "resource.h" VS_VERSION_INFO VERSIONINFO FILEVERSION VER_VERSION @@ -33,6 +32,22 @@ BEGIN END END +IDR_MAINMENU MENU +BEGIN + POPUP "&View" + BEGIN + MENUITEM "&Log", IDM_VIEW_LOG + END + POPUP "&Help" + BEGIN + MENUITEM "&Documentation", IDM_HELP_DOCUMENTATION + MENUITEM "&License", IDM_HELP_LICENSE + MENUITEM "&About", IDM_HELP_ABOUT + END +END + +IDR_LICENSE_TXT RCDATA "LICENSE" + IDI_ICON_128 ICON "bridge.ico" CREATEPROCESS_MANIFEST_RESOURCE_ID RT_MANIFEST bridge.manifest diff --git a/docs/usage.md b/docs/usage.md index cd63fe2..fa31e95 100644 --- a/docs/usage.md +++ b/docs/usage.md @@ -11,7 +11,10 @@ ## Commands - `--help` Show help message - - This will show the help message + - This will show the help message + +- `--version` Show version + - This will show the version of the program - `--install` Install the service - This will copy the binary to `C:\windows\bridge.exe` and register it as a service diff --git a/gui.c b/gui.c index 8d7d9a0..6d4ebb2 100644 --- a/gui.c +++ b/gui.c @@ -4,6 +4,8 @@ #include #include +#include "resource.h" + /** * The entire code could be better written, but at least it works. * @@ -31,7 +33,7 @@ VOID HandleStartButton(BOOL Silent) SetWindowText(item, "Do you want to start, install or remove the bridge?"); RedrawWindow(item, NULL, NULL, RDW_ERASE | RDW_INVALIDATE | RDW_FRAME | RDW_ALLCHILDREN); item = GetDlgItem(hwnd, /* Start Button */ 1); - Button_SetText(item, "Start"); + Button_SetText(item, "&Start"); EnableWindow(item, FALSE); RedrawWindow(item, NULL, NULL, RDW_ERASE | RDW_INVALIDATE | RDW_FRAME | RDW_ALLCHILDREN); @@ -66,7 +68,7 @@ VOID HandleStartButton(BOOL Silent) NULL, 0, NULL); HWND item = GetDlgItem(hwnd, /* Start Button */ 1); - Button_SetText(item, "Stop"); + Button_SetText(item, "&Stop"); item = GetDlgItem(hwnd, 4); SetWindowText(item, "Bridge is running..."); IsAlreadyRunning = TRUE; @@ -122,6 +124,44 @@ VOID HandleRemoveButton() ExitProcess(0); } +void ShowLicenseDialog() +{ + HMODULE hModule = GetModuleHandle(NULL); + HRSRC hRes = FindResource(hModule, MAKEINTRESOURCE(IDR_LICENSE_TXT), RT_RCDATA); + if (!hRes) + { + MessageBox(NULL, "Resource not found", "Error", MB_OK | MB_ICONERROR); + return; + } + + HGLOBAL hResData = LoadResource(NULL, hRes); + if (!hResData) + { + MessageBox(NULL, "Resource failed to load", "Error", MB_OK | MB_ICONERROR); + return; + } + + DWORD resSize = SizeofResource(NULL, hRes); + void *pRes = LockResource(hResData); + if (!pRes) + { + MessageBox(NULL, "Resource failed to lock", "Error", MB_OK | MB_ICONERROR); + return; + } + + char *licenseText = (char *)malloc(resSize + 1); + if (!licenseText) + { + MessageBox(NULL, "Memory allocation failed", "Error", MB_OK | MB_ICONERROR); + return; + } + + memcpy(licenseText, pRes, resSize); + licenseText[resSize] = '\0'; + MessageBoxA(hwnd, licenseText, "About", MB_OK); + free(licenseText); +} + LRESULT CALLBACK WndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam) { switch (msg) @@ -139,6 +179,26 @@ LRESULT CALLBACK WndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam) case 3: HandleRemoveButton(); break; + case IDM_VIEW_LOG: + ShellExecute(NULL, "open", "C:\\windows\\notepad.exe", "C:\\windows\\logs\\bridge.log", NULL, SW_SHOW); + break; + case IDM_HELP_DOCUMENTATION: + ShellExecute(NULL, "open", "https://enderice2.github.io/rpc-bridge/index.html", NULL, NULL, SW_SHOWNORMAL); + break; + case IDM_HELP_LICENSE: + ShowLicenseDialog(); + break; + case IDM_HELP_ABOUT: + { + char msg[256]; + sprintf(msg, "rpc-bridge v%s\n\n" + "Simple bridge that allows you to use Discord Rich Presence with Wine games/software.\n\n" + "Created by EnderIce2\n\n" + "Licensed under the MIT License", + VER_VERSION_STR); + MessageBox(NULL, msg, "About", MB_OK); + break; + } default: break; } @@ -165,9 +225,9 @@ LRESULT CALLBACK WndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam) VOID SetButtonStyles(INT *btnStartStyle, INT *btnRemoveStyle, INT *btnInstallStyle) { - *btnStartStyle = WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON; - *btnRemoveStyle = WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON; - *btnInstallStyle = WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON; + *btnStartStyle = WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON | WS_TABSTOP; + *btnRemoveStyle = WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON | WS_TABSTOP; + *btnInstallStyle = WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON | WS_TABSTOP; // if (!IsLinux) // { @@ -241,21 +301,24 @@ int WINAPI __WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, 0, 15, 400, 25, hwnd, (HMENU)4, hInstance, NULL); - HWND hbtn1 = CreateWindow("BUTTON", "Start", + HWND hbtn1 = CreateWindow("BUTTON", "&Start", btnStartStyle, 40, 60, 100, 30, hwnd, (HMENU)1, hInstance, NULL); - HWND hbtn2 = CreateWindow("BUTTON", "Install", + HWND hbtn2 = CreateWindow("BUTTON", "&Install", btnInstallStyle, 150, 60, 100, 30, hwnd, (HMENU)2, hInstance, NULL); - HWND hbtn3 = CreateWindow("BUTTON", "Remove", + HWND hbtn3 = CreateWindow("BUTTON", "&Remove", btnRemoveStyle, 260, 60, 100, 30, hwnd, (HMENU)3, hInstance, NULL); + HMENU hMenu = LoadMenu(hInstance, MAKEINTRESOURCE(IDR_MAINMENU)); + SetMenu(hwnd, hMenu); + HDC hDC = GetDC(hwnd); int nHeight = -MulDiv(11, GetDeviceCaps(hDC, LOGPIXELSY), 72); @@ -276,8 +339,11 @@ int WINAPI __WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, MSG msg; while (GetMessage(&msg, NULL, 0, 0) > 0) { - TranslateMessage(&msg); - DispatchMessage(&msg); + if (!IsDialogMessage(hwnd, &msg)) + { + TranslateMessage(&msg); + DispatchMessage(&msg); + } } return msg.wParam; } diff --git a/main.c b/main.c index 3b46a77..92d4d7d 100644 --- a/main.c +++ b/main.c @@ -3,6 +3,8 @@ #include #include +#include "resource.h" + FILE *g_logFile = NULL; BOOL RunningAsService = FALSE; @@ -77,7 +79,6 @@ void DetectWine() } IsLinux = strcmp(__sysname, "Linux") == 0; - printf("Running on %s\n", __sysname); } void print(char const *fmt, ...) @@ -270,32 +271,40 @@ void HandleArguments(int argc, char *argv[]) CreateBridge(); ExitProcess(0); } + else if (strcmp(argv[1], "--version") == 0) + { + printf("%s\n", VER_VERSION_STR); + ExitProcess(0); + } else if (strcmp(argv[1], "--help") == 0) { - printf("Usage:\n"); - printf(" %s [args]\n\n", argv[0]); - - printf("Arguments:\n"); - printf(" --help Show this help\n\n"); - - printf(" --install Install service\n"); - printf(" This will copy the binary to C:\\windows\\bridge.exe and register it as a service\n\n"); - - printf(" --uninstall Uninstall service\n"); - printf(" This will remove the service and delete C:\\windows\\bridge.exe\n\n"); - - printf(" --steam Reserved for Steam\n"); - printf(" This will start the service and exit (used with bridge.sh)\n\n"); - - printf(" --no-service Do not run as service\n"); - printf(" (only for --steam)\n\n"); - - printf(" --service Reserved for service\n\n"); - - printf(" --rpc Set RPC_PATH environment variable\n"); - printf(" This is used to specify the directory where 'discord-ipc-0' is located\n\n"); - - printf("Note: If no arguments are provided, the GUI will be shown instead\n"); + printf("Usage:\n" + " %s [args]\n" + "\n" + "Arguments:\n" + " --help Show this help\n" + "\n" + " --version Show version\n" + "\n" + " --install Install service\n" + " This will copy the binary to C:\\windows\\bridge.exe and register it as a service\n" + "\n" + " --uninstall Uninstall service\n" + " This will remove the service and delete C:\\windows\\bridge.exe\n" + "\n" + " --steam Reserved for Steam\n" + " This will start the service and exit (used with bridge.sh)\n" + "\n" + " --no-service Do not run as service\n" + " (only for --steam)\n" + "\n" + " --service Reserved for service\n" + "\n" + " --rpc Set RPC_PATH environment variable\n" + " This is used to specify the directory where 'discord-ipc-0' is located\n" + "\n" + "Note: If no arguments are provided, the GUI will be shown instead\n", + argv[0]); ExitProcess(0); } } diff --git a/resource.h b/resource.h new file mode 100644 index 0000000..2a72412 --- /dev/null +++ b/resource.h @@ -0,0 +1,9 @@ +#define IDR_MAINMENU 101 +#define IDR_LICENSE_TXT 102 +#define IDM_HELP_DOCUMENTATION 40001 +#define IDM_HELP_LICENSE 40002 +#define IDM_HELP_ABOUT 40003 +#define IDM_VIEW_LOG 40004 + +#define VER_VERSION 1, 1, 0, 0 +#define VER_VERSION_STR "1.1\0"