diff --git a/mdm/CMakeLists.txt b/mdm/CMakeLists.txt index 7ff4ebe..0df3de2 100644 --- a/mdm/CMakeLists.txt +++ b/mdm/CMakeLists.txt @@ -1,9 +1,9 @@ include(MDEBase) include(MDEPkgConfig) -setup_project(mdm ${CMAKE_INSTALL_SBINDIR}) +mde_setup_project(mdm ${CMAKE_INSTALL_SBINDIR}) -pkg_config_add(mdm x11) -pkg_config_add(mdm inih) +mde_pkg_config_add(mdm x11) +mde_pkg_config_add(mdm inih) target_link_libraries( mdm diff --git a/milkwm/CMakeLists.txt b/milkwm/CMakeLists.txt index 69d697a..50c370f 100644 --- a/milkwm/CMakeLists.txt +++ b/milkwm/CMakeLists.txt @@ -1,9 +1,9 @@ include(MDEBase) include(MDEPkgConfig) -setup_project(milkwm ${CMAKE_INSTALL_BINDIR}) +mde_setup_project(milkwm ${CMAKE_INSTALL_BINDIR}) -pkg_config_add(milkwm x11) -pkg_config_add(milkwm libconfig) +mde_pkg_config_add(milkwm x11) +mde_pkg_config_add(milkwm libconfig) target_link_libraries( milkwm diff --git a/milkwm/xserver.c b/milkwm/xserver.c index b3d54e3..3530909 100644 --- a/milkwm/xserver.c +++ b/milkwm/xserver.c @@ -441,6 +441,11 @@ void loop_x(void) { XWindowAttributes xwa; if(!XGetWindowAttributes(xdisplay, ev.xmaprequest.window, &xwa)) continue; + /* ?? ? ? ???? ?? ? ? */ + if(xwa.override_redirect) { + XMapWindow(xdisplay, ev.xmaprequest.window); + continue; + } for(i = 0; i < arrlen(windows); i++) { if(windows[i].frame->lowlevel->x11.window == ev.xmaprequest.window) break; @@ -468,7 +473,6 @@ void loop_x(void) { XGrabServer(xdisplay); if(!XReparentWindow(xdisplay, windows[i].client, wm_get_inside(windows[i].frame)->lowlevel->x11.window, wm_content_x(), wm_content_y())) { - XUngrabServer(xdisplay); wm_destroy(windows[i].frame); arrdel(windows, i); continue; diff --git a/mpanel/CMakeLists.txt b/mpanel/CMakeLists.txt index 8e1c41b..9de3605 100644 --- a/mpanel/CMakeLists.txt +++ b/mpanel/CMakeLists.txt @@ -1,5 +1,8 @@ include(MDEBase) -setup_project(mpanel ${CMAKE_INSTALL_BINDIR}) +include(MDEPkgConfig) +mde_setup_project(mpanel ${CMAKE_INSTALL_BINDIR}) + +mde_pkg_config_add(mpanel libconfig) if(${CMAKE_SYSTEM_NAME} STREQUAL Linux) target_link_libraries( @@ -8,3 +11,13 @@ if(${CMAKE_SYSTEM_NAME} STREQUAL Linux) dl ) endif() + +add_subdirectory(separator) + +include(GNUInstallDirs) +configure_file(mpanelrc.in mpanelrc) + +install( + FILES ${CMAKE_CURRENT_BINARY_DIR}/mpanelrc + DESTINATION ${CMAKE_INSTALL_DATAROOTDIR}/examples/mpanel +) diff --git a/mpanel/main.c b/mpanel/main.c index 237c8ce..d58bab8 100644 --- a/mpanel/main.c +++ b/mpanel/main.c @@ -1 +1,53 @@ -int main() {} +#define _MILSKO +#include "mpanel.h" + +MwWidget window, box; + +static int first = 1; + +static void resize(MwWidget handle, void* user, void* client) { + int bw = MwDefaultBorderWidth(window) + 2; + ; + MwVaApply(box, + MwNx, bw, + MwNy, bw, + MwNwidth, MwGetInteger(window, MwNwidth) - bw * 2, + MwNheight, MwGetInteger(window, MwNheight) - bw * 2, + NULL); + + if(first && MwGetInteger(window, MwNheight) > 32) { + first = 0; + + load_modules(); + } +} + +int main() { + MwRect rc; + + MwLibraryInit(); + + window = MwVaCreateWidget(MwWindowClass, "window", NULL, MwDEFAULT, MwDEFAULT, 0, 0, + MwNtitle, "mpanel", + MwNhasBorder, 1, + MwNinverted, 0, + NULL); + + box = MwCreateWidget(MwBoxClass, "box", window, 0, 0, 0, 0); + + MwAddUserHandler(window, MwNresizeHandler, resize, NULL); + + MwGetScreenSize(window, &rc); + + MwLLBeginStateChange(window->lowlevel); + MwVaApply(window, + MwNx, 0, + MwNy, rc.height - 46, + MwNwidth, rc.width, + MwNheight, 46, + NULL); + MwLLMakeToolWindow(window->lowlevel); + MwLLEndStateChange(window->lowlevel); + + MwLoop(window); +} diff --git a/mpanel/module.c b/mpanel/module.c new file mode 100644 index 0000000..b33811b --- /dev/null +++ b/mpanel/module.c @@ -0,0 +1,54 @@ +#include "mpanel.h" + +static void read_config(config_t* cfg, const char* path) { + if(!config_read_file(cfg, path)) { + fprintf(stderr, "MPanel config error: file %s at line %d: %s\n", path, config_error_line(cfg), config_error_text(cfg)); + } +} + +void load_modules(void) { + config_t cfg; + config_setting_t* s; + char* conf = MDEDirectoryConfigPath(); + char* dir = MwDirectoryJoin(conf, "mpanel"); + char* path = MwDirectoryJoin(dir, "mpanelrc"); + + free(dir); + free(conf); + + config_init(&cfg); + config_clear(&cfg); + read_config(&cfg, SYSCONFDIR "/mpanel/mpanelrc"); + read_config(&cfg, path); + + free(path); + + if((s = config_lookup(&cfg, "Modules")) != NULL && (config_setting_type(s) == CONFIG_TYPE_LIST || config_setting_type(s) == CONFIG_TYPE_ARRAY)) { + int i = 0; + config_setting_t* c; + while((c = config_setting_get_elem(s, i)) != NULL) { + config_setting_t* type; + if(config_setting_type(c) == CONFIG_TYPE_GROUP && (type = config_setting_lookup(c, "Type")) != NULL && config_setting_type(type) == CONFIG_TYPE_STRING) { + char* p; + void* lib; + + dir = MDEStringConcatenate(LIBDIR "/mpanel/lib", config_setting_get_string(type)); + p = MDEStringConcatenate(dir, "Module.so"); + free(dir); + + if((lib = dlopen(p, RTLD_LOCAL | RTLD_LAZY)) != NULL) { + void (*call)(MwWidget box, config_setting_t* setting) = dlsym(lib, "module"); + + call(box, c); + + dlclose(lib); + } + + free(p); + } + i++; + } + } + + config_destroy(&cfg); +} diff --git a/mpanel/mpanel.h b/mpanel/mpanel.h new file mode 100644 index 0000000..71f7312 --- /dev/null +++ b/mpanel/mpanel.h @@ -0,0 +1,22 @@ +#ifndef __MPANEL_H__ +#define __MPANEL_H__ + +#include "config.h" + +/* Milsko */ +#include +#include + +/* External */ +#include + +/* Standard */ +#include + +/* main.c */ +extern MwWidget window, box; + +/* module.c */ +void load_modules(void); + +#endif diff --git a/mpanel/mpanelrc.in b/mpanel/mpanelrc.in new file mode 100644 index 0000000..f716ca1 --- /dev/null +++ b/mpanel/mpanelrc.in @@ -0,0 +1,5 @@ +Modules: ( + { + Type = "Separator"; + } +); diff --git a/mpanel/separator/CMakeLists.txt b/mpanel/separator/CMakeLists.txt new file mode 100644 index 0000000..ae87556 --- /dev/null +++ b/mpanel/separator/CMakeLists.txt @@ -0,0 +1,6 @@ +include(MDEBase) +include(MDEPkgConfig) +mde_setup_library(SeparatorModule ${CMAKE_INSTALL_LIBDIR}/mpanel) + +mde_pkg_config_add(SeparatorModule libconfig) + diff --git a/mpanel/separator/module.c b/mpanel/separator/module.c new file mode 100644 index 0000000..66538f0 --- /dev/null +++ b/mpanel/separator/module.c @@ -0,0 +1,9 @@ +#include +#include + +void module(MwWidget box, config_setting_t* setting) { + MwVaCreateWidget(MwSeparatorClass, "separator", box, 0, 0, 0, 0, + MwNfixedSize, 10, + MwNorientation, MwVERTICAL, + NULL); +} diff --git a/startmde/startmde.in b/startmde/startmde.in index 0c46a81..20cc965 100755 --- a/startmde/startmde.in +++ b/startmde/startmde.in @@ -1,5 +1,19 @@ #!/bin/sh -"@CMAKE_INSTALL_FULL_BINDIR@/mpanel" & +stop_all () { + kill $PANEL $WM + exit +} -exec "@CMAKE_INSTALL_FULL_BINDIR@/milkwm" +trap "stop_all" INT +trap "stop_all" TERM + +"@CMAKE_INSTALL_FULL_BINDIR@/mpanel" & +PANEL="$!" + +"@CMAKE_INSTALL_FULL_BINDIR@/milkwm" & +WM="$!" + +while true; do + wait +done diff --git a/wizard.sh.in b/wizard.sh.in index aa6e26d..69023ef 100755 --- a/wizard.sh.in +++ b/wizard.sh.in @@ -1,6 +1,8 @@ #!/bin/sh mkdir -p "@CMAKE_INSTALL_FULL_SYSCONFDIR@/mdm" mkdir -p "@CMAKE_INSTALL_FULL_SYSCONFDIR@/milkwm" +mkdir -p "@CMAKE_INSTALL_FULL_SYSCONFDIR@/mpanel" cp "@CMAKE_CURRENT_BINARY_DIR@/mdm/mdmrc" "@CMAKE_INSTALL_FULL_SYSCONFDIR@/mdm/" cp "@CMAKE_CURRENT_BINARY_DIR@/milkwm/milkwmrc" "@CMAKE_INSTALL_FULL_SYSCONFDIR@/milkwm/" +cp "@CMAKE_CURRENT_BINARY_DIR@/mpanel/mpanelrc" "@CMAKE_INSTALL_FULL_SYSCONFDIR@/mpanel/"