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 0000000..faf2283 Binary files /dev/null and b/logo.png differ