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;
|
int maximized;
|
||||||
MwRect old_size;
|
MwRect old_size;
|
||||||
MwPoint old_point;
|
MwPoint old_point;
|
||||||
|
|
||||||
|
MwWidget submenu;
|
||||||
|
|
||||||
|
MwMenu menu;
|
||||||
} wmframe_t;
|
} wmframe_t;
|
||||||
|
|
||||||
void loop_wm(void) {
|
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) {
|
static void apply_button(MwWidget widget, const char* str) {
|
||||||
MwWidget w = widget;
|
MwWidget w = widget;
|
||||||
wmframe_t* f;
|
wmframe_t* f;
|
||||||
|
|
@ -204,6 +240,8 @@ static void apply_button(MwWidget widget, const char* str) {
|
||||||
px = f->iconify;
|
px = f->iconify;
|
||||||
} else if(strcmp(str, "Menu") == 0) {
|
} else if(strcmp(str, "Menu") == 0) {
|
||||||
f->menu_button = widget;
|
f->menu_button = widget;
|
||||||
|
MwAddUserHandler(widget, MwNactivateHandler, spawn_menu, w);
|
||||||
|
MwAddUserHandler(widget, MwNmenuHandler, menu_menu, w);
|
||||||
}
|
}
|
||||||
|
|
||||||
if(px != NULL) {
|
if(px != NULL) {
|
||||||
|
|
@ -228,6 +266,11 @@ static void drag_down(MwWidget handle, void* user, void* client) {
|
||||||
|
|
||||||
MwGetCursorCoord(w, &c);
|
MwGetCursorCoord(w, &c);
|
||||||
|
|
||||||
|
if(f->submenu != NULL) {
|
||||||
|
MwDestroyWidget(f->submenu);
|
||||||
|
f->submenu = NULL;
|
||||||
|
}
|
||||||
|
|
||||||
f->dragging = 1;
|
f->dragging = 1;
|
||||||
f->drag_point.x = c.x - x;
|
f->drag_point.x = c.x - x;
|
||||||
f->drag_point.y = c.y - y;
|
f->drag_point.y = c.y - y;
|
||||||
|
|
@ -310,6 +353,13 @@ MwWidget wm_frame(int w, int h) {
|
||||||
wmframe_t* f = malloc(sizeof(*f));
|
wmframe_t* f = malloc(sizeof(*f));
|
||||||
unsigned char* icon;
|
unsigned char* icon;
|
||||||
int y, x;
|
int y, x;
|
||||||
|
MwMenu m;
|
||||||
|
const char* menus[] = {
|
||||||
|
"Maximize",
|
||||||
|
"Iconify",
|
||||||
|
"----",
|
||||||
|
"Close",
|
||||||
|
NULL};
|
||||||
|
|
||||||
pthread_mutex_lock(&xmutex);
|
pthread_mutex_lock(&xmutex);
|
||||||
|
|
||||||
|
|
@ -325,6 +375,25 @@ MwWidget wm_frame(int w, int h) {
|
||||||
f->maximized = 0;
|
f->maximized = 0;
|
||||||
f->dragging = 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;
|
f->menu_button = NULL;
|
||||||
|
|
||||||
icon = malloc(10 * 6 * 4);
|
icon = malloc(10 * 6 * 4);
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue