diff --git a/common/control.c b/common/control.c index 83254ef2..a0d3d852 100644 --- a/common/control.c +++ b/common/control.c @@ -62,6 +62,13 @@ void uiControlSetFocus(uiControl *c) (*(c->SetFocus))(c); } +void uiControlSetMinSize(uiControl *c, int w, int h) +{ + c->MinWidth = w; + c->MinHeight = h; + (*(c->SetMinSize))(c, w, h); +} + #define uiprivControlSignature 0x7569436F uiControl *uiAllocControl(size_t size, uint32_t OSsig, uint32_t typesig, const char *typenamestr) @@ -72,6 +79,10 @@ uiControl *uiAllocControl(size_t size, uint32_t OSsig, uint32_t typesig, const c c->Signature = uiprivControlSignature; c->OSSignature = OSsig; c->TypeSignature = typesig; + + c->MinWidth = -1; + c->MinHeight = -1; + return c; } diff --git a/ui.h b/ui.h index f5965648..303caf35 100644 --- a/ui.h +++ b/ui.h @@ -92,6 +92,9 @@ struct uiControl { void (*Enable)(uiControl *); void (*Disable)(uiControl *); void (*SetFocus)(uiControl *); + void (*SetMinSize)(uiControl*, int, int); + + int MinWidth, MinHeight; }; // TOOD add argument names to all arguments #define uiControl(this) ((uiControl *) (this)) @@ -107,6 +110,7 @@ _UI_EXTERN int uiControlEnabled(uiControl *); _UI_EXTERN void uiControlEnable(uiControl *); _UI_EXTERN void uiControlDisable(uiControl *); _UI_EXTERN void uiControlSetFocus(uiControl *); +_UI_EXTERN void uiControlSetMinSize(uiControl *, int w, int h); // -1 = no minimum _UI_EXTERN uiControl *uiAllocControl(size_t n, uint32_t OSsig, uint32_t typesig, const char *typenamestr); _UI_EXTERN void uiFreeControl(uiControl *); diff --git a/ui_unix.h b/ui_unix.h index 44ba9ef5..79c9d25c 100644 --- a/ui_unix.h +++ b/ui_unix.h @@ -88,6 +88,11 @@ _UI_EXTERN void uiUnixControlSetContainer(uiUnixControl *, GtkContainer *, gbool { \ gtk_widget_grab_focus(type(c)->widget); \ } +#define uiUnixControlDefaultSetMinSize(type) \ + static void type ## SetMinSize(uiControl *c, int w, int h) \ + { \ + gtk_widget_set_size_request(type(c)->widget, w, h); \ + } // TODO this whole addedBefore stuff is a MASSIVE HACK. #define uiUnixControlDefaultSetContainer(type) \ static void type ## SetContainer(uiUnixControl *c, GtkContainer *container, gboolean remove) \ @@ -116,6 +121,7 @@ _UI_EXTERN void uiUnixControlSetContainer(uiUnixControl *, GtkContainer *, gbool uiUnixControlDefaultEnable(type) \ uiUnixControlDefaultDisable(type) \ uiUnixControlDefaultSetFocus(type) \ + uiUnixControlDefaultSetMinSize(type) \ uiUnixControlDefaultSetContainer(type) #define uiUnixControlAllDefaults(type) \ @@ -137,6 +143,7 @@ _UI_EXTERN void uiUnixControlSetContainer(uiUnixControl *, GtkContainer *, gbool uiControl(var)->Enable = type ## Enable; \ uiControl(var)->Disable = type ## Disable; \ uiControl(var)->SetFocus = type ## SetFocus; \ + uiControl(var)->SetMinSize = type ## SetMinSize; \ uiUnixControl(var)->SetContainer = type ## SetContainer; // TODO document _UI_EXTERN uiUnixControl *uiUnixAllocControl(size_t n, uint32_t typesig, const char *typenamestr); diff --git a/ui_windows.h b/ui_windows.h index 3917c970..85c3137b 100644 --- a/ui_windows.h +++ b/ui_windows.h @@ -107,6 +107,10 @@ _UI_EXTERN void uiWindowsControlChildVisibilityChanged(uiWindowsControl *); { \ SetFocus(type(c)->hwnd); \ } +#define uiWindowsControlDefaultSetMinSize(type) \ + static void type ## SetMinSize(uiControl *c, int w, int h) \ + { \ + } #define uiWindowsControlDefaultSyncEnableState(type) \ static void type ## SyncEnableState(uiWindowsControl *c, int enabled) \ { \ @@ -158,6 +162,7 @@ _UI_EXTERN void uiWindowsControlChildVisibilityChanged(uiWindowsControl *); uiWindowsControlDefaultEnable(type) \ uiWindowsControlDefaultDisable(type) \ uiWindowsControlDefaultSetFocus(type) \ + uiWindowsControlDefaultSetMinSize(type) \ uiWindowsControlDefaultSyncEnableState(type) \ uiWindowsControlDefaultSetParentHWND(type) \ uiWindowsControlDefaultMinimumSizeChanged(type) \ @@ -184,6 +189,7 @@ _UI_EXTERN void uiWindowsControlChildVisibilityChanged(uiWindowsControl *); uiControl(var)->Enable = type ## Enable; \ uiControl(var)->Disable = type ## Disable; \ uiControl(var)->SetFocus = type ## SetFocus; \ + uiControl(var)->SetMinSize = type ## SetMinSize; \ uiWindowsControl(var)->SyncEnableState = type ## SyncEnableState; \ uiWindowsControl(var)->SetParentHWND = type ## SetParentHWND; \ uiWindowsControl(var)->MinimumSize = type ## MinimumSize; \ diff --git a/unix/button.c b/unix/button.c index 00a87f49..82577d54 100644 --- a/unix/button.c +++ b/unix/button.c @@ -51,5 +51,7 @@ uiButton *uiNewButton(const char *text) g_signal_connect(b->widget, "clicked", G_CALLBACK(onClicked), b); uiButtonOnClicked(b, defaultOnClicked, NULL); + gtk_widget_set_size_request(b->widget, 64, 1); + return b; } diff --git a/unix/window.c b/unix/window.c index a4b469d4..786db63a 100644 --- a/unix/window.c +++ b/unix/window.c @@ -20,6 +20,9 @@ struct uiWindow { uiControl *child; int margined; + int width; + int height; + int (*onClosing)(uiWindow *, void *); void *onClosingData; void (*onContentSizeChanged)(uiWindow *, void *); @@ -101,11 +104,28 @@ uiUnixControlDefaultVisible(uiWindow) static void uiWindowShow(uiControl *c) { uiWindow *w = uiWindow(c); + int width; + int height; // don't use gtk_widget_show_all() as that will show all children, regardless of user settings // don't use gtk_widget_show(); that doesn't bring to front or give keyboard focus // (gtk_window_present() does call gtk_widget_show() though) gtk_window_present(w->window); + + // set the size properly + width = w->width; + height = w->height; + if (w->menubar) { + GtkRequisition min, nat; + int menuheight; + + gtk_widget_get_preferred_size(w->menubar, &min, &nat); + menuheight = min.height; + if (nat.height > menuheight) + menuheight = nat.height; + height += menuheight; + } + gtk_window_resize(w->window, width, height); } uiUnixControlDefaultHide(uiWindow) @@ -113,6 +133,7 @@ uiUnixControlDefaultEnabled(uiWindow) uiUnixControlDefaultEnable(uiWindow) uiUnixControlDefaultDisable(uiWindow) uiUnixControlDefaultSetFocus(uiWindow) +uiUnixControlDefaultSetMinSize(uiWindow) // TODO? uiUnixControlDefaultSetContainer(uiWindow) @@ -253,6 +274,8 @@ uiWindow *uiNewWindow(const char *title, int width, int height, int hasMenubar) if (hasMenubar) { w->menubar = uiprivMakeMenubar(uiWindow(w)); gtk_container_add(w->vboxContainer, w->menubar); + } else { + w->menubar = NULL; } w->childHolderWidget = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 0); diff --git a/windows/area.cpp b/windows/area.cpp index 0042fccc..aa486e03 100644 --- a/windows/area.cpp +++ b/windows/area.cpp @@ -55,9 +55,11 @@ uiWindowsControlAllDefaults(uiArea) static void uiAreaMinimumSize(uiWindowsControl *c, int *width, int *height) { - // TODO - *width = 0; - *height = 0; + *width = c->c.MinWidth; + if (*width < 1) *width = 1; + + *height = c->c.MinHeight; + if (*height < 1) *height = 1; } ATOM registerAreaClass(HICON hDefaultIcon, HCURSOR hDefaultCursor) diff --git a/windows/box.cpp b/windows/box.cpp index c3069895..5ed84476 100644 --- a/windows/box.cpp +++ b/windows/box.cpp @@ -38,7 +38,6 @@ static void boxRelayout(uiBox *b) int i; int minimumWidth, minimumHeight; int nVisible; - uiWindowsSizing *d; if (b->controls->size() == 0) return; @@ -165,10 +164,8 @@ static void uiBoxMinimumSize(uiWindowsControl *c, int *width, int *height) // these two contain the largest minimum width and height of all stretchy controls in the box // all stretchy controls will use this value to determine the final minimum size int maxStretchyWidth, maxStretchyHeight; - int i; int minimumWidth, minimumHeight; int nVisible; - uiWindowsSizing sizing; *width = 0; *height = 0; @@ -235,6 +232,12 @@ static void uiBoxMinimumSizeChanged(uiWindowsControl *c) boxRelayout(b); } +static void uiBoxSetMinSize(uiControl *c, int w, int h) +{ + // checkme + uiBoxMinimumSizeChanged(uiWindowsControl(c)); +} + uiWindowsControlDefaultLayoutRect(uiBox) uiWindowsControlDefaultAssignControlIDZOrder(uiBox) diff --git a/windows/button.cpp b/windows/button.cpp index d8913ec7..fc326b25 100644 --- a/windows/button.cpp +++ b/windows/button.cpp @@ -32,6 +32,7 @@ uiWindowsControlAllDefaultsExceptDestroy(uiButton) // from http://msdn.microsoft.com/en-us/library/windows/desktop/dn742486.aspx#sizingandspacing #define buttonHeight 14 +#define buttonMinWidth 64 static void uiButtonMinimumSize(uiWindowsControl *c, int *width, int *height) { @@ -45,6 +46,7 @@ static void uiButtonMinimumSize(uiWindowsControl *c, int *width, int *height) size.cy = 0; if (SendMessageW(b->hwnd, BCM_GETIDEALSIZE, 0, (LPARAM) (&size)) != FALSE) { *width = size.cx; + if (*width < buttonMinWidth) *width = buttonMinWidth; *height = size.cy; return; } @@ -53,6 +55,7 @@ static void uiButtonMinimumSize(uiWindowsControl *c, int *width, int *height) // Microsoft says to use a fixed width for all buttons; this isn't good enough // use the text width instead, with some edge padding *width = uiWindowsWindowTextWidth(b->hwnd) + (2 * GetSystemMetrics(SM_CXEDGE)); + if (*width < buttonMinWidth) *width = buttonMinWidth; y = buttonHeight; uiWindowsGetSizing(b->hwnd, &sizing); uiWindowsSizingDlgUnitsToPixels(&sizing, NULL, &y); diff --git a/windows/colordialog.cpp b/windows/colordialog.cpp index d7030a4f..fef9b3d6 100644 --- a/windows/colordialog.cpp +++ b/windows/colordialog.cpp @@ -87,7 +87,6 @@ static void hsv2RGB(double h, double s, double v, double *r, double *g, double * int h60; double x; double m; - double c1, c2; c = v * s; hPrime = h * 6; diff --git a/windows/form.cpp b/windows/form.cpp index 6cd2923b..6def8a04 100644 --- a/windows/form.cpp +++ b/windows/form.cpp @@ -232,6 +232,12 @@ static void uiFormMinimumSizeChanged(uiWindowsControl *c) formRelayout(f); } +static void uiFormSetMinSize(uiControl *c, int w, int h) +{ + // checkme + uiFormMinimumSizeChanged(uiWindowsControl(c)); +} + uiWindowsControlDefaultLayoutRect(uiForm) uiWindowsControlDefaultAssignControlIDZOrder(uiForm) diff --git a/windows/grid.cpp b/windows/grid.cpp index a412a950..a41e8060 100644 --- a/windows/grid.cpp +++ b/windows/grid.cpp @@ -516,6 +516,12 @@ static void uiGridMinimumSizeChanged(uiWindowsControl *c) gridRelayout(g); } +static void uiGridSetMinSize(uiControl *c, int w, int h) +{ + // checkme + uiGridMinimumSizeChanged(uiWindowsControl(c)); +} + uiWindowsControlDefaultLayoutRect(uiGrid) uiWindowsControlDefaultAssignControlIDZOrder(uiGrid) diff --git a/windows/group.cpp b/windows/group.cpp index d40c78bc..60947a24 100644 --- a/windows/group.cpp +++ b/windows/group.cpp @@ -119,6 +119,12 @@ static void uiGroupMinimumSizeChanged(uiWindowsControl *c) groupRelayout(g); } +static void uiGroupSetMinSize(uiControl *c, int w, int h) +{ + // checkme + uiGroupMinimumSizeChanged(uiWindowsControl(c)); +} + uiWindowsControlDefaultLayoutRect(uiGroup) uiWindowsControlDefaultAssignControlIDZOrder(uiGroup) diff --git a/windows/tab.cpp b/windows/tab.cpp index 03017a2c..3cc9e08c 100644 --- a/windows/tab.cpp +++ b/windows/tab.cpp @@ -164,6 +164,12 @@ static void uiTabMinimumSizeChanged(uiWindowsControl *c) tabRelayout(t); } +static void uiTabSetMinSize(uiControl *c, int w, int h) +{ + // checkme + uiTabMinimumSizeChanged(uiWindowsControl(c)); +} + uiWindowsControlDefaultLayoutRect(uiTab) uiWindowsControlDefaultAssignControlIDZOrder(uiTab) diff --git a/windows/window.cpp b/windows/window.cpp index ebbc6511..23c64a29 100644 --- a/windows/window.cpp +++ b/windows/window.cpp @@ -274,6 +274,11 @@ static void uiWindowLayoutRect(uiWindowsControl *c, RECT *r) uiWindowsEnsureGetClientRect(w->hwnd, r); } +static void uiWindowSetMinSize(uiControl *c, int w, int h) +{ + // TODO: relayout, eventually +} + uiWindowsControlDefaultAssignControlIDZOrder(uiWindow) static void uiWindowChildVisibilityChanged(uiWindowsControl *c)