things
This commit is contained in:
parent
bf3610bde8
commit
90c96d3f4b
1 changed files with 69 additions and 0 deletions
69
milkwm/wm.c
69
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);
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue