From 95e0ca8f49b1b76ef855b976a610fd506073d19d Mon Sep 17 00:00:00 2001 From: Pietro Gagliardi Date: Thu, 10 Sep 2015 21:17:00 -0400 Subject: [PATCH] Added uiAreaHandler.RedrawOnResize() to handle redrawing on resizes. --- gtkarea/area.c | 2 ++ gtkarea/main.c | 6 ++++++ gtkarea/ui.h | 1 + macarea/alt/area.m | 3 +++ macarea/alt/main.m | 6 ++++++ macarea/alt/ui.h | 1 + macarea/main.m | 6 ++++++ macarea/ui.h | 1 + winarea/area.c | 10 +++++++++- winarea/main.c | 6 ++++++ winarea/ui.h | 1 + 11 files changed, 42 insertions(+), 1 deletion(-) diff --git a/gtkarea/area.c b/gtkarea/area.c index 0ff06ff9..2748521d 100644 --- a/gtkarea/area.c +++ b/gtkarea/area.c @@ -113,6 +113,8 @@ static void areaWidget_size_allocate(GtkWidget *w, GtkAllocation *allocation) ap->clientWidth = allocation->width; ap->clientHeight = allocation->height; updateScroll(areaWidget(w)); + if ((*(ap->ah->RedrawOnResize))(ap->ah, ap->a)) + gtk_widget_queue_resize(w); } static gboolean areaWidget_draw(GtkWidget *w, cairo_t *cr) diff --git a/gtkarea/main.c b/gtkarea/main.c index 2b3db10e..3237aea4 100644 --- a/gtkarea/main.c +++ b/gtkarea/main.c @@ -99,6 +99,11 @@ static uintmax_t handlerVScrollMax(uiAreaHandler *a, uiArea *area) return gtk_spin_button_get_value_as_int(GTK_SPIN_BUTTON(nvspinb)); } +static int handlerRedrawOnResize(uiAreaHandler *a, uiArea *area) +{ + return 1; +} + static void recalcScroll(GtkSpinButton *sb, gpointer data) { areaUpdateScroll(area); @@ -124,6 +129,7 @@ int main(void) h.ah.Draw = handlerDraw; h.ah.HScrollMax = handlerHScrollMax; h.ah.VScrollMax = handlerVScrollMax; + h.ah.RedrawOnResize = handlerRedrawOnResize; gtk_init(NULL, NULL); diff --git a/gtkarea/ui.h b/gtkarea/ui.h index 4cc6097d..90dc0fbd 100644 --- a/gtkarea/ui.h +++ b/gtkarea/ui.h @@ -10,6 +10,7 @@ struct uiAreaHandler { void (*Draw)(uiAreaHandler *, uiArea *, uiAreaDrawParams *); uintmax_t (*HScrollMax)(uiAreaHandler *, uiArea *); uintmax_t (*VScrollMax)(uiAreaHandler *, uiArea *); + int (*RedrawOnResize)(uiAreaHandler *, uiArea *); }; struct uiAreaDrawParams { diff --git a/macarea/alt/area.m b/macarea/alt/area.m index 900213fd..95affe47 100644 --- a/macarea/alt/area.m +++ b/macarea/alt/area.m @@ -287,6 +287,9 @@ struct uiArea { // and update the scrolling position [self hscrollTo:self->hscrollpos]; [self vscrollTo:self->vscrollpos]; + + if ((*(self->libui_a->ah->RedrawOnResize))(self->libui_a->ah, self->libui_a)) + [self->drawingView setNeedsDisplay:YES]; } - (IBAction)hscrollEvent:(id)sender diff --git a/macarea/alt/main.m b/macarea/alt/main.m index 31b152aa..3ee15aa6 100644 --- a/macarea/alt/main.m +++ b/macarea/alt/main.m @@ -105,6 +105,11 @@ static uintmax_t handlerVScrollMax(uiAreaHandler *a, uiArea *area) return _wtoi(c); */} +static int handlerRedrawOnResize(uiAreaHandler *a, uiArea *area) +{ + return 1; +} + // areaUpdateScroll(area); @interface appDelegate : NSObject @@ -162,6 +167,7 @@ int main(void) h.ah.Draw = handlerDraw; h.ah.HScrollMax = handlerHScrollMax; h.ah.VScrollMax = handlerVScrollMax; + h.ah.RedrawOnResize = handlerRedrawOnResize; app = [NSApplication sharedApplication]; [app setActivationPolicy:NSApplicationActivationPolicyRegular]; diff --git a/macarea/alt/ui.h b/macarea/alt/ui.h index 4cc6097d..90dc0fbd 100644 --- a/macarea/alt/ui.h +++ b/macarea/alt/ui.h @@ -10,6 +10,7 @@ struct uiAreaHandler { void (*Draw)(uiAreaHandler *, uiArea *, uiAreaDrawParams *); uintmax_t (*HScrollMax)(uiAreaHandler *, uiArea *); uintmax_t (*VScrollMax)(uiAreaHandler *, uiArea *); + int (*RedrawOnResize)(uiAreaHandler *, uiArea *); }; struct uiAreaDrawParams { diff --git a/macarea/main.m b/macarea/main.m index 93551754..71737b93 100644 --- a/macarea/main.m +++ b/macarea/main.m @@ -105,6 +105,11 @@ static uintmax_t handlerVScrollMax(uiAreaHandler *a, uiArea *area) return _wtoi(c); */} +static int handlerRedrawOnResize(uiAreaHandler *a, uiArea *area) +{ + return 1; +} + // areaUpdateScroll(area); @interface appDelegate : NSObject @@ -162,6 +167,7 @@ int main(void) h.ah.Draw = handlerDraw; h.ah.HScrollMax = handlerHScrollMax; h.ah.VScrollMax = handlerVScrollMax; + h.ah.RedrawOnResize = handlerRedrawOnResize; app = [NSApplication sharedApplication]; [app setActivationPolicy:NSApplicationActivationPolicyRegular]; diff --git a/macarea/ui.h b/macarea/ui.h index 4cc6097d..90dc0fbd 100644 --- a/macarea/ui.h +++ b/macarea/ui.h @@ -10,6 +10,7 @@ struct uiAreaHandler { void (*Draw)(uiAreaHandler *, uiArea *, uiAreaDrawParams *); uintmax_t (*HScrollMax)(uiAreaHandler *, uiArea *); uintmax_t (*VScrollMax)(uiAreaHandler *, uiArea *); + int (*RedrawOnResize)(uiAreaHandler *, uiArea *); }; struct uiAreaDrawParams { diff --git a/winarea/area.c b/winarea/area.c index e96659a8..d1e07bac 100644 --- a/winarea/area.c +++ b/winarea/area.c @@ -257,6 +257,7 @@ static LRESULT CALLBACK areaWndProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM HDC dc; PAINTSTRUCT ps; RECT client; + WINDOWPOS *wp = (WINDOWPOS *) lParam; a = (uiArea *) GetWindowLongPtrW(hwnd, GWLP_USERDATA); if (a == NULL) { @@ -281,6 +282,13 @@ static LRESULT CALLBACK areaWndProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM logLastError("error getting client rect in WM_PRINTCLIENT in areaWndProc()"); doPaint(a, (HDC) wParam, &client, &client); return 0; + case WM_WINDOWPOSCHANGED: + if ((wp->flags & SWP_NOSIZE) != 0) + break; + if ((*(a->ah->RedrawOnResize))(a->ah, a)) + if (InvalidateRect(a->hwnd, NULL, TRUE) == 0) + logLastError("error redrawing area on resize in areaWndProc()"); + return 0; case WM_HSCROLL: hscroll(a, wParam, lParam); return 0; @@ -312,7 +320,7 @@ ATOM registerAreaClass(void) //TODO wc.hIcon = hDefaultIcon; //TODO wc.hCursor = hDefaultCursor; wc.hbrBackground = (HBRUSH) (COLOR_BTNFACE + 1); - wc.style = CS_HREDRAW | CS_VREDRAW; + // don't specify CS_HREDRAW or CS_VREDRAW; that's decided by the uiAreaHandler in RedrawOnResize() return RegisterClassW(&wc); } diff --git a/winarea/main.c b/winarea/main.c index 6a681232..8087d2b6 100644 --- a/winarea/main.c +++ b/winarea/main.c @@ -105,6 +105,11 @@ static uintmax_t handlerVScrollMax(uiAreaHandler *a, uiArea *area) return _wtoi(c); } +static int handlerRedrawOnResize(uiAreaHandler *a, uiArea *area) +{ + return 1; +} + static void repos(HWND hwnd) { RECT r; @@ -155,6 +160,7 @@ int main(void) h.ah.Draw = handlerDraw; h.ah.HScrollMax = handlerHScrollMax; h.ah.VScrollMax = handlerVScrollMax; + h.ah.RedrawOnResize = handlerRedrawOnResize; registerAreaClass(); diff --git a/winarea/ui.h b/winarea/ui.h index 4cc6097d..90dc0fbd 100644 --- a/winarea/ui.h +++ b/winarea/ui.h @@ -10,6 +10,7 @@ struct uiAreaHandler { void (*Draw)(uiAreaHandler *, uiArea *, uiAreaDrawParams *); uintmax_t (*HScrollMax)(uiAreaHandler *, uiArea *); uintmax_t (*VScrollMax)(uiAreaHandler *, uiArea *); + int (*RedrawOnResize)(uiAreaHandler *, uiArea *); }; struct uiAreaDrawParams {