diff --git a/milkwm/wm.c b/milkwm/wm.c index f2c626f..49789d0 100644 --- a/milkwm/wm.c +++ b/milkwm/wm.c @@ -28,6 +28,10 @@ typedef struct wmframe { int maximized; MwRect old_size; MwPoint old_point; + + MwWidget submenu; + + MwMenu menu; } wmframe_t; void loop_wm(void) { @@ -188,6 +192,38 @@ static void maximize(MwWidget handle, void* user, void* client) { } } +static void spawn_menu(MwWidget handle, void* user, void* client) { + MwWidget w = handle; + wmframe_t* f; + MwPoint p; + + while(w != NULL && strcmp(MwGetName(w), "frame") != 0) w = MwGetParent(w); + + f = w->opaque; + + if(f->submenu == NULL) { + f->submenu = MwCreateWidget(MwSubMenuClass, "submenu", handle, 0, MwGetInteger(handle, MwNheight), 0, 0); + + p.x = 0; + p.y = MwGetInteger(handle, MwNheight); + MwSubMenuAppear(f->submenu, f->menu, &p, 0); + } else { + MwDestroyWidget(f->submenu); + f->submenu = NULL; + } +} + +static void menu_menu(MwWidget handle, void* user, void* client) { + MwWidget w = handle; + wmframe_t* f; + + while(w != NULL && strcmp(MwGetName(w), "frame") != 0) w = MwGetParent(w); + + f = w->opaque; + + f->submenu = NULL; +} + static void apply_button(MwWidget widget, const char* str) { MwWidget w = widget; wmframe_t* f; @@ -204,6 +240,8 @@ static void apply_button(MwWidget widget, const char* str) { px = f->iconify; } else if(strcmp(str, "Menu") == 0) { f->menu_button = widget; + MwAddUserHandler(widget, MwNactivateHandler, spawn_menu, w); + MwAddUserHandler(widget, MwNmenuHandler, menu_menu, w); } if(px != NULL) { @@ -228,6 +266,11 @@ static void drag_down(MwWidget handle, void* user, void* client) { MwGetCursorCoord(w, &c); + if(f->submenu != NULL) { + MwDestroyWidget(f->submenu); + f->submenu = NULL; + } + f->dragging = 1; f->drag_point.x = c.x - x; f->drag_point.y = c.y - y; @@ -310,6 +353,13 @@ MwWidget wm_frame(int w, int h) { wmframe_t* f = malloc(sizeof(*f)); unsigned char* icon; int y, x; + MwMenu m; + const char* menus[] = { + "Maximize", + "Iconify", + "----", + "Close", + NULL}; pthread_mutex_lock(&xmutex); @@ -325,6 +375,25 @@ MwWidget wm_frame(int w, int h) { f->maximized = 0; f->dragging = 0; + f->submenu = NULL; + + f->menu = malloc(sizeof(*f->menu)); + f->menu->name = NULL; + f->menu->keep = 0; + f->menu->wsub = NULL; + f->menu->sub = NULL; + f->menu->opaque = NULL; + + for(i = 0; menus[i] != NULL; i++) { + m = malloc(sizeof(*m)); + m->name = MwStringDuplicate(menus[i]); + m->keep = 0; + m->wsub = NULL; + m->sub = NULL; + m->opaque = NULL; + arrput(f->menu->sub, m); + } + f->menu_button = NULL; icon = malloc(10 * 6 * 4);