+static void combosize(struct wgt_window *win, HWND cbwnd, const char **items, int num_items,
+ int width, int height, struct wgt_rect *sz)
+{
+ int i, max_width, sum_height;
+ struct wgt_rect textsz;
+
+ wgt_string_size(win, "00", &textsz);
+ max_width = width < 0 && width != WGT_AUTO ? -width : textsz.width;
+
+ /* first get the height of the editbox */
+ sum_height = SendMessage(cbwnd, CB_GETITEMHEIGHT, -1, 0);
+ sz->y = sum_height;
+ /* then add the height of the dropdown list items */
+ /* XXX I can't figure out why, but it's not sufficient to show all items
+ * without some more height, so let's double it...
+ */
+ sum_height *= 2;
+ sum_height += SendMessage(cbwnd, CB_GETITEMHEIGHT, 0, 0) * num_items;
+ sum_height += GetSystemMetrics(SM_CYEDGE) * 2;
+
+ if(width < 0) {
+ int sbar_width;
+ for(i=0; i<num_items; i++) {
+ wgt_string_size(win, items[i], &textsz);
+ if(textsz.width > max_width) max_width = textsz.width;
+ }
+ sbar_width = GetSystemMetrics(SM_CXVSCROLL);
+ width = max_width + sbar_width + GetSystemMetrics(SM_CXEDGE) * 2;
+ }
+ if(height < 0) height = sum_height;
+
+ sz->width = width;
+ sz->height = height;
+}
+