kwo pushed a commit to branch master. http://git.enlightenment.org/e16/e16.git/commit/?id=872e4f57c5cdfdf5b9c16771c3b41754d0c56e45
commit 872e4f57c5cdfdf5b9c16771c3b41754d0c56e45 Author: Kim Woelders <k...@woelders.dk> Date: Sun Dec 29 23:49:32 2013 +0100 Simplify/fix dialog layout code. The widget and table coordinates were not properly aligned, potentially causing some widgets (last in a table) to not be rendered properly in certain themes. --- src/dialog.c | 276 ++++++++++++++++++++++++----------------------------------- 1 file changed, 112 insertions(+), 164 deletions(-) diff --git a/src/dialog.c b/src/dialog.c index fc9d947..2f5d187 100644 --- a/src/dialog.c +++ b/src/dialog.c @@ -181,7 +181,6 @@ static int FindADialog(void); static void DialogHandleEvents(Win win, XEvent * ev, void *prm); static void DItemHandleEvents(Win win, XEvent * ev, void *prm); -static void MoveTableBy(Dialog * d, DItem * di, int dx, int dy); static void DialogItemsRealize(Dialog * d); static void DialogItemDestroy(DItem * di, int clean); static void DialogDrawItems(Dialog * d, DItem * di, int x, int y, int w, @@ -767,6 +766,76 @@ DialogItemCallCallback(Dialog * d, DItem * di) } static void +DialogMoveItemBy(Dialog * d, DItem * di, int dx, int dy) +{ + int i; + EImageBorder *pad; + + di->x += dx; + di->y += dy; + + if (di->win) + EMoveResizeWindow(di->win, di->x, di->y, di->w, di->h); + + switch (di->type) + { + case DITEM_TABLE: + for (i = 0; i < di->item.table.num_items; i++) + DialogMoveItemBy(d, di->item.table.items[i], dx, dy); + break; + case DITEM_AREA: + pad = ImageclassGetPadding(di->iclass); + di->item.area.w = di->w - (pad->left + pad->right); + di->item.area.h = di->h - (pad->top + pad->bottom); + EMoveResizeWindow(di->item.area.area_win, + pad->left, pad->top, + di->item.area.w, di->item.area.h); + break; + case DITEM_CHECKBUTTON: + EMoveResizeWindow(di->item.check_button.check_win, + di->x, + di->y + + (di->h - di->item.check_button.orig_h) / 2, + di->item.check_button.orig_w, + di->item.check_button.orig_h); + break; + case DITEM_RADIOBUTTON: + EMoveResizeWindow(di->item.radio_button.radio_win, + di->x, + di->y + + (di->h - + di->item.radio_button.orig_h) / 2, + di->item.radio_button.orig_w, + di->item.radio_button.orig_h); + break; + case DITEM_SLIDER: + di->item.slider.base_x = 0; + di->item.slider.base_y = 0; + di->item.slider.base_w = di->w; + di->item.slider.base_h = di->h; + di->item.slider.knob_w = di->item.slider.knob_orig_w; + di->item.slider.knob_h = di->item.slider.knob_orig_h; + if (di->item.slider.base_win) + EMoveResizeWindow(di->item.slider.base_win, + di->x + di->item.slider.base_x, + di->y + di->item.slider.base_y, + di->item.slider.base_w, di->item.slider.base_h); + if (di->item.slider.knob_win) + EMoveResizeWindow(di->item.slider.knob_win, + di->x + di->item.slider.knob_x, + di->y + di->item.slider.knob_y, + di->item.slider.knob_w, di->item.slider.knob_h); + if (di->win) + EMoveResizeWindow(di->win, + di->x + di->item.slider.numeric_x, + di->y + di->item.slider.numeric_y, + di->item.slider.numeric_w, + di->item.slider.numeric_h); + break; + } +} + +static void DialogRealizeItem(Dialog * d, DItem * di) { const char *iclass, *tclass; @@ -1026,13 +1095,19 @@ DialogRealizeItem(Dialog * d, DItem * di) int i, r, c, x, y; int *col_size, *row_size; - pad = ImageclassGetPadding(d->iclass); - cols = di->item.table.num_columns; rows = 1; if (cols <= 0) break; + if (d->item == di) + { + /* Top-level item */ + pad = ImageclassGetPadding(d->iclass); + di->x = pad->left; + di->y = pad->top; + } + col_size = ECALLOC(int, cols); row_size = ECALLOC(int, rows); @@ -1074,6 +1149,7 @@ DialogRealizeItem(Dialog * d, DItem * di) row_size[rows - 1] = 0; } } + if (di->item.table.homogenous_h) { int max = 0; @@ -1112,102 +1188,34 @@ DialogRealizeItem(Dialog * d, DItem * di) for (i = 0; i < di->item.table.num_items; i++) { DItem *dii; - int j, sw = 0, sh = 0; + int j, sw, sh, dx, dy; dii = di->item.table.items[i]; - for (j = 0; j < dii->col_span; j++) + for (sw = j = 0; j < dii->col_span; j++) sw += col_size[c + j]; - for (j = 0; j < dii->row_span; j++) + for (sh = j = 0; j < dii->row_span; j++) sh += row_size[r + j]; + if (dii->fill_h) dii->w = sw - (dii->padding.left + dii->padding.right); if (dii->fill_v) dii->h = sh - (dii->padding.top + dii->padding.bottom); + if (dii->w <= 0 || dii->h <= 0) goto skip; - if (dii->type == DITEM_TABLE) - { - int dx, dy, newx, newy; - - newx = - di->x + x + pad->left + dii->padding.left + - (((sw - (dii->padding.left + dii->padding.right) - - dii->w) * dii->align_h) >> 10); - newy = - di->y + y + pad->top + dii->padding.top + - (((sh - (dii->padding.top + dii->padding.bottom) - - dii->h) * dii->align_v) >> 10); - dx = newx - dii->x - pad->left; - dy = newy - dii->y - pad->top; - MoveTableBy(d, dii, dx, dy); - } - else - { - dii->x = - di->x + x + pad->left + dii->padding.left + - (((sw - (dii->padding.left + dii->padding.right) - - dii->w) * dii->align_h) >> 10); - dii->y = - di->y + y + pad->top + dii->padding.top + - (((sh - (dii->padding.top + dii->padding.bottom) - - dii->h) * dii->align_v) >> 10); - if (dii->win) - EMoveResizeWindow(dii->win, dii->x, dii->y, - dii->w, dii->h); - if (dii->type == DITEM_CHECKBUTTON) - EMoveResizeWindow(dii->item.check_button.check_win, - dii->x, - dii->y + - (dii->h - - dii->item.check_button.orig_h) / 2, - dii->item.check_button.orig_w, - dii->item.check_button.orig_h); - if (dii->type == DITEM_RADIOBUTTON) - EMoveResizeWindow(dii->item.radio_button.radio_win, - dii->x, - dii->y + - (dii->h - - dii->item.radio_button.orig_h) / 2, - dii->item.radio_button.orig_w, - dii->item.radio_button.orig_h); - if (dii->type == DITEM_AREA) - { - pad = ImageclassGetPadding(dii->iclass); - dii->item.area.w = dii->w - (pad->left + pad->right); - dii->item.area.h = dii->h - (pad->top + pad->bottom); - EMoveResizeWindow(dii->item.area.area_win, - pad->left, pad->top, - dii->item.area.w, dii->item.area.h); - } - if (dii->type == DITEM_SLIDER) - { - dii->item.slider.base_x = 0; - dii->item.slider.base_y = 0; - dii->item.slider.base_w = dii->w; - dii->item.slider.base_h = dii->h; - dii->item.slider.knob_w = - dii->item.slider.knob_orig_w; - dii->item.slider.knob_h = - dii->item.slider.knob_orig_h; - if (dii->item.slider.base_win) - EMoveResizeWindow(dii->item.slider.base_win, - dii->x + - dii->item.slider.base_x, - dii->y + - dii->item.slider.base_y, - dii->item.slider.base_w, - dii->item.slider.base_h); - if (dii->win) - EMoveResizeWindow(dii->win, - dii->x + - dii->item.slider.numeric_x, - dii->y + - dii->item.slider.numeric_y, - dii->item.slider.numeric_w, - dii->item.slider.numeric_h); - } - } + + dx = + di->x + x + dii->padding.left + + (((sw - (dii->padding.left + dii->padding.right) - dii->w) * + dii->align_h) >> 10); + dy = + di->y + y + dii->padding.top + + (((sh - (dii->padding.top + dii->padding.bottom) - dii->h) * + dii->align_v) >> 10); + dx -= dii->x; + dy -= dii->y; + DialogMoveItemBy(d, dii, dx, dy); skip: x += sw; @@ -1238,67 +1246,6 @@ DialogRealizeItem(Dialog * d, DItem * di) } static void -MoveTableBy(Dialog * d, DItem * di, int dx, int dy) -{ - int i; - - di->x += dx; - di->y += dy; - for (i = 0; i < di->item.table.num_items; i++) - { - DItem *dii; - - dii = di->item.table.items[i]; - - if (dii->type == DITEM_TABLE) - { - MoveTableBy(d, dii, dx, dy); - continue; - } - - dii->x += dx; - dii->y += dy; - - if (dii->win) - EMoveWindow(dii->win, dii->x, dii->y); - - switch (dii->type) - { - case DITEM_CHECKBUTTON: - EMoveWindow(dii->item.check_button.check_win, dii->x, - dii->y + - ((dii->h - dii->item.check_button.orig_h) / 2)); - break; - case DITEM_RADIOBUTTON: - EMoveWindow(dii->item.radio_button.radio_win, dii->x, - dii->y + - ((dii->h - dii->item.radio_button.orig_h) / 2)); - break; - case DITEM_SLIDER: - if (dii->item.slider.base_win) - EMoveResizeWindow(dii->item.slider.base_win, - dii->x + dii->item.slider.base_x, - dii->y + dii->item.slider.base_y, - dii->item.slider.base_w, - dii->item.slider.base_h); - if (dii->item.slider.knob_win) - EMoveResizeWindow(dii->item.slider.knob_win, - dii->x + dii->item.slider.knob_x, - dii->y + dii->item.slider.knob_y, - dii->item.slider.knob_w, - dii->item.slider.knob_h); - if (dii->win) - EMoveResizeWindow(dii->win, - dii->x + dii->item.slider.numeric_x, - dii->y + dii->item.slider.numeric_y, - dii->item.slider.numeric_w, - dii->item.slider.numeric_h); - break; - } - } -} - -static void DialogDrawItems(Dialog * d, DItem * di, int x, int y, int w, int h) { d->update = 1; @@ -1342,6 +1289,22 @@ DialogDrawItem(Dialog * d, DItem * di) d->xu1, d->yu1, d->xu2, d->yu2); #endif +#if 0 /* Debug */ + if (di->type == DITEM_TABLE) + { + XGCValues gcv; + GC gc; + + pad = ImageclassGetPadding(d->iclass); + gcv.subwindow_mode = IncludeInferiors; + gc = EXCreateGC(WinGetPmap(d->win), GCSubwindowMode, &gcv); + XSetForeground(disp, gc, Dpy.pixel_black); + XDrawRectangle(disp, WinGetPmap(d->win), gc, + di->x, di->y, di->w, di->h); + EXFreeGC(gc); + } +#endif + switch (di->type) { case DITEM_TABLE: @@ -1356,21 +1319,6 @@ DialogDrawItem(Dialog * d, DItem * di) dii->update = 1; DialogDrawItem(d, dii); } - -#if 0 /* Debug */ - { - XGCValues gcv; - GC gc; - - pad = ImageclassGetPadding(d->iclass); - gcv.subwindow_mode = IncludeInferiors; - gc = EXCreateGC(WinGetPmap(d->win), GCSubwindowMode, &gcv); - XSetForeground(disp, gc, Dpy.pixel_black); - XDrawRectangle(disp, WinGetPmap(d->win), gc, - pad->left + di->x, pad->top + di->y, di->w, di->h); - EXFreeGC(gc); - } -#endif } break; --