From b9b549afcdb19d3f9ab45a51f3891672f5312684 Mon Sep 17 00:00:00 2001 From: NishiOwO Date: Fri, 19 Dec 2025 08:52:48 +0900 Subject: [PATCH] wip --- CMakeLists.txt | 11 ++++-- client/gl.c | 8 +++++ client/main.c | 48 ++++++++++++++++++++++--- client/ui.c | 78 +++++++++++++++++++++++++++++++++++++++++ external/milsko | 2 +- include/af_client.h | 12 +++++++ include/af_common.h | 2 ++ include/af_config.h.in | 6 ++++ logo.png | Bin 0 -> 4796 bytes 9 files changed, 160 insertions(+), 7 deletions(-) create mode 100644 client/gl.c create mode 100644 client/ui.c create mode 100644 include/af_config.h.in create mode 100644 logo.png diff --git a/CMakeLists.txt b/CMakeLists.txt index 8552046..75385de 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -15,8 +15,8 @@ file(GLOB CLIENT_SRC client/*.c) add_executable(af_server ${SERVER_SRC}) add_executable(af_client ${CLIENT_SRC}) -target_include_directories(af_server PRIVATE include) -target_include_directories(af_client PRIVATE include) +target_include_directories(af_server PRIVATE include ${CMAKE_CURRENT_BINARY_DIR}) +target_include_directories(af_client PRIVATE include ${CMAKE_CURRENT_BINARY_DIR}) target_compile_definitions(af_server PRIVATE AF_SERVER) target_compile_definitions(af_client PRIVATE AF_CLIENT) @@ -24,9 +24,16 @@ target_compile_definitions(af_client PRIVATE AF_CLIENT) target_link_libraries(af_server PRIVATE fishsoup) target_link_libraries(af_client PRIVATE fishsoup Mw glad) +configure_file(include/af_config.h.in af_config.h) + install( TARGETS af_server af_client RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR} LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR} ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR} ) + +install( + FILES logo.png + DESTINATION ${CMAKE_INSTALL_DATAROOTDIR}/assaultfish +) diff --git a/client/gl.c b/client/gl.c new file mode 100644 index 0000000..4c48876 --- /dev/null +++ b/client/gl.c @@ -0,0 +1,8 @@ +#include + +void gl_init(void){ +} + +void gl_render(void){ + glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); +} diff --git a/client/main.c b/client/main.c index 1ebae01..1b937b0 100644 --- a/client/main.c +++ b/client/main.c @@ -2,6 +2,13 @@ MwWidget root, window, opengl; +static const MwRect sizes[] ={ + {0, 0, 640, 480}, + {0, 0, 800, 600}, + {0, 0, 1024, 768}, + {0, 0, 1280, 1024}, +}; + static void resize(MwWidget handle, void* user, void* client) { int ww = MwGetInteger(window, MwNwidth); int wh = MwGetInteger(window, MwNheight); @@ -15,7 +22,7 @@ static void resize(MwWidget handle, void* user, void* client) { } static void tick(MwWidget handle, void* user, void* client) { - glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); + gl_render(); MwOpenGLSwapBuffer(opengl); } @@ -24,18 +31,48 @@ static void* gl_load(const char* name) { return MwOpenGLGetProcAddress(opengl, name); } -int main() { +int main(int argc, char** argv) { + MwSizeHints sh; + MwRect rc; + int i; + MwLibraryInit(); root = MwVaCreateWidget(NULL, "root", NULL, 0, 0, 0, 0, MwNwaitMS, 15, NULL); - window = MwVaCreateWidget(MwWindowClass, "main", root, MwDEFAULT, MwDEFAULT, 800, 600, + window = MwVaCreateWidget(MwWindowClass, "main", root, 0, 0, 640, 480, MwNtitle, "AssaultFish", NULL); - opengl = MwCreateWidget(MwOpenGLClass, "opengl", window, 0, 0, 800, 600); + MwGetScreenSize(window, &rc); + + for(i = sizeof(sizes) / sizeof(sizes[0]) - 1; i >= 0; i--){ + if(sizes[i].width < rc.width && sizes[i].height < rc.height){ + sh.min_width = sh.max_width = sizes[i].width; + sh.min_height = sh.max_height = sizes[i].height; + break; + } + } + + for(i = 1; i < argc; i++){ + if(strcmp(argv[i], "--width") == 0 && (i + 1) < argc){ + sh.min_width = sh.max_width = atoi(argv[i + 1]); + }else if(strcmp(argv[i], "--height") == 0 && (i + 1) < argc){ + sh.min_height = sh.max_height = atoi(argv[i + 1]); + } + } + + MwVaApply(window, + MwNsizeHints, &sh, + MwNx, (rc.width - sh.max_width) / 2, + MwNy, (rc.height - sh.max_height) / 2, + MwNwidth, sh.max_width, + MwNheight, sh.max_height, + NULL); + + opengl = MwCreateWidget(MwOpenGLClass, "opengl", window, 0, 0, sh.max_width, sh.max_height); MwOpenGLMakeCurrent(opengl); @@ -43,6 +80,9 @@ int main() { resize(window, NULL, NULL); + gl_init(); + ui_init(); + MwAddUserHandler(window, MwNresizeHandler, resize, NULL); MwAddUserHandler(root, MwNtickHandler, tick, NULL); diff --git a/client/ui.c b/client/ui.c new file mode 100644 index 0000000..1d30fd1 --- /dev/null +++ b/client/ui.c @@ -0,0 +1,78 @@ +#include + +MwWidget ui_notice(int width, int height){ + if(width == 0 && height == 0){ + width = 400; + height = 300; + } + + return MwVaCreateWidget(MwFrameClass, "notice", window, (MwGetInteger(window, MwNwidth) - width) / 2, (MwGetInteger(window, MwNheight) - height) / 2, width, height, + MwNhasBorder, 1, + MwNinverted, 0, + NULL); +} + +void ui_notice_destroy(MwWidget widget){ + MwDestroyWidget(widget); +} + +static void ui_login(void){ + MwWidget wnd = ui_notice(0, 0); + int bw = MwDefaultBorderWidth(wnd); + MwWidget join = MwVaCreateWidget(MwButtonClass, "join", wnd, MwGetInteger(wnd, MwNwidth) - bw - 10 - 96, MwGetInteger(wnd, MwNheight) - bw - 10 - 24, 96, 24, + MwNtext, "Join", + NULL); + MwWidget box = MwVaCreateWidget(MwBoxClass, "box", wnd, bw, bw, MwGetInteger(wnd, MwNwidth) - bw * 2, MwGetInteger(wnd, MwNheight) - bw * 2 - 10 - 24, + MwNorientation, MwVERTICAL, + MwNmargin, 10, + MwNpadding, 10, + NULL); + MwWidget icon = MwVaCreateWidget(MwImageClass, "icon", box, 0, 0, 0, 0, + MwNfillArea, 0, + MwNfixedSize, 100, + NULL); + MwWidget entrybox[3]; + MwLLPixmap px = MwLoadImage(wnd, DATAROOTDIR "/assaultfish/logo.png"); + const char* labels[3] = { + "Username", + "Hostname", + "Port" + }; + const char* entries[3] = { + "JohnDoe", + "127.0.0.1", + "", + }; + int i; + char buf[16]; + + sprintf(buf, "%d", AF_DEFAULT_PORT); + + entries[2] = buf; + + for(i = 0; i < 3; i++){ + entrybox[i] = MwVaCreateWidget(MwBoxClass, "entrybox", box, 0, 0, 0, 0, + MwNfixedSize, 24, + MwNmargin, 10, + NULL); + MwVaCreateWidget(MwLabelClass, "label", entrybox[i], 0, 0, 0, 0, + MwNfixedSize, 100, + MwNtext, labels[i], + MwNalignment, MwALIGNMENT_END, + NULL); + MwVaCreateWidget(MwEntryClass, "entry", entrybox[i], 0, 0, 0, 0, + MwNtext, entries[i], + NULL); + } + + MwVaApply(icon, + MwNpixmap, px, + NULL); + +} + +void ui_init(void){ + MwToggleDarkTheme(root, 1); + + ui_login(); +} diff --git a/external/milsko b/external/milsko index 7574969..bfa0a58 160000 --- a/external/milsko +++ b/external/milsko @@ -1 +1 @@ -Subproject commit 75749697ba25330127fdca110fda9098d65719e3 +Subproject commit bfa0a5811ec066be64f756e88f8ba1ee4553e5a7 diff --git a/include/af_client.h b/include/af_client.h index b5310d4..253178a 100644 --- a/include/af_client.h +++ b/include/af_client.h @@ -5,4 +5,16 @@ #include #include +/* main.c */ +extern MwWidget root, window, opengl; + +/* gl.c */ +void gl_init(void); +void gl_render(void); + +/* ui.c */ +MwWidget ui_notice(int width, int height); +void ui_notice_destroy(MwWidget widget); +void ui_init(void); + #endif diff --git a/include/af_common.h b/include/af_common.h index 0c52f46..02f38cc 100644 --- a/include/af_common.h +++ b/include/af_common.h @@ -7,6 +7,8 @@ #include +#include + #ifdef AF_SERVER #include #endif diff --git a/include/af_config.h.in b/include/af_config.h.in new file mode 100644 index 0000000..fbfb5e6 --- /dev/null +++ b/include/af_config.h.in @@ -0,0 +1,6 @@ +#ifndef __AF_CONFIG_H__ +#define __AF_CONFIG_H__ + +#define DATAROOTDIR "@CMAKE_INSTALL_FULL_DATAROOTDIR@" + +#endif diff --git a/logo.png b/logo.png new file mode 100644 index 0000000000000000000000000000000000000000..faf228392f31b4321daabf4d9ad8cf0a6f811cd3 GIT binary patch literal 4796 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 W^ai&#nNaBf0000