diff --git a/include/Mw/TypeDefs.h b/include/Mw/TypeDefs.h index 7e75c81..3b7dffb 100644 --- a/include/Mw/TypeDefs.h +++ b/include/Mw/TypeDefs.h @@ -219,6 +219,8 @@ struct _MwSubWindow { int y; int width; int height; + MwPoint cursor_start; + MwPoint base; }; struct _MwMouse { diff --git a/src/widget/subwindow.c b/src/widget/subwindow.c index d4294e4..b3ce527 100644 --- a/src/widget/subwindow.c +++ b/src/widget/subwindow.c @@ -346,6 +346,17 @@ static MwWidget mwSubWindowGetFrameImpl(MwWidget handle) { return sw->frame; } +static void mouse_down(MwWidget handle, void* ptr) { + MwSubWindow sw = handle->internal; + MwMouse* m = ptr; + + if(m->button == MwMOUSE_LEFT) { + MwGetCursorCoord(handle, &sw->cursor_start); + sw->base.x = MwGetInteger(handle, MwNx); + sw->base.y = MwGetInteger(handle, MwNy); + } +} + static void func_handler(MwWidget handle, const char* name, void* out, va_list va) { (void)va; @@ -354,6 +365,21 @@ static void func_handler(MwWidget handle, const char* name, void* out, va_list v } } +static void tick(MwWidget handle) { + MwSubWindow sw = handle->internal; + + if(handle->pressed) { + MwPoint p; + + MwGetCursorCoord(handle, &p); + + MwVaApply(handle, + MwNx, sw->base.x + p.x - sw->cursor_start.x, + MwNy, sw->base.y + p.y - sw->cursor_start.y, + NULL); + } +} + MwClassRec MwSubWindowClassRec = { wcreate, /* create */ destroy, /* destroy */ @@ -363,10 +389,10 @@ MwClassRec MwSubWindowClassRec = { prop_change, /* prop_change */ NULL, /* mouse_move */ NULL, /* mouse_up */ - NULL, /* mouse_down */ + mouse_down, /* mouse_down */ NULL, /* key */ func_handler, /* execute */ - NULL, /* tick */ + tick, /* tick */ resize, /* resize */ NULL, /* children_update */ NULL, /* children_prop_change */