diff --git a/examples/basic/messagebox.c b/examples/basic/messagebox.c index 50481fd..0a8f1cc 100644 --- a/examples/basic/messagebox.c +++ b/examples/basic/messagebox.c @@ -8,7 +8,7 @@ void ok(MwWidget handle, void* user, void* call) { } void spawn(MwWidget handle, void* user, void* call) { - MwWidget mb = MwMessageBox(handle, "news has arrived!", "title", MwMB_ICONNEWS | MwMB_BUTTONOK); + MwWidget mb = MwMessageBox(user, "news has arrived!", "title", MwMB_ICONNEWS | MwMB_BUTTONOK); (void)handle; (void)call; diff --git a/include/Mw/Core.h b/include/Mw/Core.h index 226d5ad..37b4f40 100644 --- a/include/Mw/Core.h +++ b/include/Mw/Core.h @@ -300,6 +300,13 @@ MWDECL MwWidget MwGetParent(MwWidget handle); */ MWDECL void MwShow(MwWidget handle, int toggle); +/*! + * @brief Reparents widget + * @param handle Widget + * @param new_parent New parent + */ +MWDECL void MwReparent(MwWidget handle, MwWidget new_parent); + #ifdef __cplusplus } #endif diff --git a/src/core.c b/src/core.c index e289486..f0a47bd 100644 --- a/src/core.c +++ b/src/core.c @@ -271,9 +271,15 @@ static void clean_destroy_queue(MwWidget handle) { } int MwStep(MwWidget handle) { - int i; + int i; + MwWidget* widgets = NULL; if(setjmp(handle->before_step)) return 0; - for(i = 0; i < arrlen(handle->children); i++) MwStep(handle->children[i]); + for(i = 0; i < arrlen(handle->children); i++) { + arrput(widgets, handle->children[i]); + } + for(i = 0; i < arrlen(widgets); i++) MwStep(widgets[i]); + + arrfree(widgets); handle->prop_event = 0; if(handle->lowlevel != NULL && MwLLPending(handle->lowlevel)) MwLLNextEvent(handle->lowlevel); @@ -639,3 +645,18 @@ int MwLibraryInit(void) { void MwShow(MwWidget handle, int toggle) { MwLLShow(handle->lowlevel, toggle); } + +void MwReparent(MwWidget handle, MwWidget new_parent) { + if(handle->parent != NULL) { + int i; + for(i = 0; i < arrlen(handle->parent->children); i++) { + if(handle->parent->children[i] == handle) { + arrdel(handle->parent->children, i); + break; + } + } + } + + handle->parent = new_parent; + arrput(new_parent->children, handle); +} diff --git a/src/dialog/colorpicker.c b/src/dialog/colorpicker.c index ff5c383..c050db7 100644 --- a/src/dialog/colorpicker.c +++ b/src/dialog/colorpicker.c @@ -339,29 +339,28 @@ color_picker_t* color_picker_setup(MwWidget parent, int w, int h) { } MwWidget MwColorPicker(MwWidget handle, const char* title) { - MwPoint p; color_picker_t* wheel; MwWidget window; MwSizeHints sh; - int ww = handle == NULL ? 0 : MwGetInteger(handle, MwNwidth); - int wh = handle == NULL ? 0 : MwGetInteger(handle, MwNheight); int wx; int wy; - p.x = (ww - WIN_SIZE) / 2; - p.y = (wh - WIN_SIZE) / 2; - - wx = wy = 0; - if(handle == NULL) wx = wy = MwDEFAULT; + if(handle == NULL) { + wx = wy = MwDEFAULT; + } else { + wx = MwGetInteger(handle, MwNx) + (MwGetInteger(handle, MwNwidth) - WIN_SIZE) / 2; + wy = MwGetInteger(handle, MwNy) + (MwGetInteger(handle, MwNheight) - WIN_SIZE) / 2; + } sh.min_width = sh.max_width = WIN_SIZE; sh.min_height = sh.max_height = WIN_SIZE; - window = MwVaCreateWidget(MwWindowClass, "main", handle, wx, wy, + window = MwVaCreateWidget(MwWindowClass, "main", NULL, wx, wy, WIN_SIZE, WIN_SIZE, MwNtitle, title, MwNsizeHints, &sh, NULL); + if(handle != NULL) MwReparent(window, handle); wheel = color_picker_setup(window, WIN_SIZE, WIN_SIZE); @@ -370,7 +369,6 @@ MwWidget MwColorPicker(MwWidget handle, const char* title) { MwAddTickList(window); MwLLBeginStateChange(window->lowlevel); - if(handle != NULL) MwLLDetach(window->lowlevel, &p); MwLLMakePopup(window->lowlevel, handle == NULL ? NULL : handle->lowlevel); MwLLEndStateChange(window->lowlevel); diff --git a/src/dialog/filechooser.c b/src/dialog/filechooser.c index 519e956..33f35d7 100644 --- a/src/dialog/filechooser.c +++ b/src/dialog/filechooser.c @@ -458,9 +458,6 @@ static void scan(MwWidget handle, const char* path, int record) { MwWidget MwFileChooser(MwWidget handle, const char* title) { MwWidget window; - MwPoint p; - int ww = handle == NULL ? 0 : MwGetInteger(handle, MwNwidth); - int wh = handle == NULL ? 0 : MwGetInteger(handle, MwNheight); int w, h; filechooser_t* fc = malloc(sizeof(*fc)); char* path; @@ -473,15 +470,17 @@ MwWidget MwFileChooser(MwWidget handle, const char* title) { w = 700; h = w * 2 / 3; - p.x = (ww - w) / 2; - p.y = (wh - h) / 2; + if(handle == NULL) { + wx = wy = MwDEFAULT; + } else { + wx = MwGetInteger(handle, MwNx) + (MwGetInteger(handle, MwNwidth) - w) / 2; + wy = MwGetInteger(handle, MwNy) + (MwGetInteger(handle, MwNheight) - h) / 2; + } - wx = wy = 0; - if(handle == NULL) wx = wy = MwDEFAULT; - - window = MwVaCreateWidget(MwWindowClass, "filechooser", handle, wx, wy, w, h, + window = MwVaCreateWidget(MwWindowClass, "filechooser", NULL, wx, wy, w, h, MwNtitle, title, NULL); + if(handle != NULL) MwReparent(window, handle); fc->history_seek = 0; @@ -508,7 +507,6 @@ MwWidget MwFileChooser(MwWidget handle, const char* title) { free(path); MwLLBeginStateChange(window->lowlevel); - if(handle != NULL) MwLLDetach(window->lowlevel, &p); MwLLMakePopup(window->lowlevel, handle == NULL ? NULL : handle->lowlevel); MwLLEndStateChange(window->lowlevel); diff --git a/src/dialog/messagebox.c b/src/dialog/messagebox.c index e9c2aba..bdae35c 100644 --- a/src/dialog/messagebox.c +++ b/src/dialog/messagebox.c @@ -27,32 +27,32 @@ static void messagebox_close(MwWidget handle, void* user, void* call) { MwWidget MwMessageBox(MwWidget handle, const char* text, const char* title, unsigned int flag) { MwWidget window; - MwPoint p; int w, h; int left = 8; int th; int x = 0; int wx; int wy; - int ww = handle == NULL ? 0 : MwGetInteger(handle, MwNwidth); - int wh = handle == NULL ? 0 : MwGetInteger(handle, MwNheight); MwSizeHints sh; w = 512; h = 32 * 4; - wx = wy = 0; - if(handle == NULL) wx = wy = MwDEFAULT; + if(handle == NULL) { + wx = wy = MwDEFAULT; + } else { + wx = MwGetInteger(handle, MwNx) + (MwGetInteger(handle, MwNwidth) - w) / 2; + wy = MwGetInteger(handle, MwNy) + (MwGetInteger(handle, MwNheight) - h) / 2; + } sh.min_width = sh.max_width = w; sh.min_height = sh.max_height = h; - p.x = (ww - w) / 2; - p.y = (wh - h) / 2; - window = MwVaCreateWidget(MwWindowClass, "messagebox", handle, wx, wy, w, h, + window = MwVaCreateWidget(MwWindowClass, "messagebox", NULL, wx, wy, w, h, MwNtitle, title, MwNsizeHints, &sh, NULL); + if(handle != NULL) MwReparent(window, handle); window->opaque = NULL; @@ -110,7 +110,6 @@ MwWidget MwMessageBox(MwWidget handle, const char* text, const char* title, unsi NULL); MwLLBeginStateChange(window->lowlevel); - if(handle != NULL) MwLLDetach(window->lowlevel, &p); MwLLMakePopup(window->lowlevel, handle == NULL ? NULL : handle->lowlevel); MwLLEndStateChange(window->lowlevel);