From cf385cccf3585299391aa73fad4f49a79bc88f55 Mon Sep 17 00:00:00 2001 From: Darkvater Date: Thu, 7 Dec 2006 00:47:35 +0000 Subject: (svn r7409) -Codechange: Make the ResizeWindow function also available outside of window.c. This makes it possible to programmatically resize windows specifying a delta x,y. --- window.c | 92 +++++++++++++++++++++++++++++++++++----------------------------- 1 file changed, 51 insertions(+), 41 deletions(-) (limited to 'window.c') diff --git a/window.c b/window.c index 2e4c3787c..422da787c 100644 --- a/window.c +++ b/window.c @@ -1026,6 +1026,55 @@ static bool HandleMouseOver(void) return true; } +/** Update all the widgets of a window based on their resize flags + * Both the areas of the old window and the new sized window are set dirty + * ensuring proper redrawal. + * @param w Window to resize + * @param x delta x-size of changed window (positive if larger, etc.( + * @param y delta y-size of changed window */ +void ResizeWindow(Window *w, int x, int y) +{ + Widget *wi; + bool resize_height = false; + bool resize_width = false; + + if (x == 0 && y == 0) return; + + SetWindowDirty(w); + for (wi = w->widget; wi->type != WWT_LAST; wi++) { + /* Isolate the resizing flags */ + byte rsizeflag = GB(wi->display_flags, 0, 4); + + if (rsizeflag == RESIZE_NONE) continue; + + /* Resize the widget based on its resize-flag */ + if (rsizeflag & RESIZE_LEFT) { + wi->left += x; + resize_width = true; + } + + if (rsizeflag & RESIZE_RIGHT) { + wi->right += x; + resize_width = true; + } + + if (rsizeflag & RESIZE_TOP) { + wi->top += y; + resize_height = true; + } + + if (rsizeflag & RESIZE_BOTTOM) { + wi->bottom += y; + resize_height = true; + } + } + + /* We resized at least 1 widget, so let's resize the window totally */ + if (resize_width) w->width += x; + if (resize_height) w->height += y; + + SetWindowDirty(w); +} static bool _dragging_window; @@ -1211,45 +1260,8 @@ static bool HandleWindowDragging(void) _drag_delta.x += x; _drag_delta.y += y; - SetWindowDirty(w); - - /* Scroll through all the windows and update the widgets if needed */ - { - Widget *wi = w->widget; - bool resize_height = false; - bool resize_width = false; - - while (wi->type != WWT_LAST) { - /* Isolate the resizing flags */ - byte rsizeflag = GB(wi->display_flags, 0, 4); - - if (rsizeflag != RESIZE_NONE) { - /* Resize this widget */ - if (rsizeflag & RESIZE_LEFT) { - wi->left += x; - resize_width = true; - } - if (rsizeflag & RESIZE_RIGHT) { - wi->right += x; - resize_width = true; - } - - if (rsizeflag & RESIZE_TOP) { - wi->top += y; - resize_height = true; - } - if (rsizeflag & RESIZE_BOTTOM) { - wi->bottom += y; - resize_height = true; - } - } - wi++; - } - - /* We resized at least 1 widget, so let's rezise the window totally */ - if (resize_width) w->width = x + w->width; - if (resize_height) w->height = y + w->height; - } + /* ResizeWindow sets both pre- and after-size to dirty for redrawal */ + ResizeWindow(w, x, y); e.event = WE_RESIZE; e.we.sizing.size.x = x + w->width; @@ -1257,8 +1269,6 @@ static bool HandleWindowDragging(void) e.we.sizing.diff.x = x; e.we.sizing.diff.y = y; w->wndproc(w, &e); - - SetWindowDirty(w); return false; } } -- cgit v1.2.3-70-g09d2