Enlightenment CVS committal Author : kwo Project : e16 Module : e
Dir : e16/e/src Modified Files: E.h dialog.c draw.c events.c Log Message: Don't use draw queue for dialog updates. =================================================================== RCS file: /cvsroot/enlightenment/e16/e/src/E.h,v retrieving revision 1.427 retrieving revision 1.428 diff -u -3 -r1.427 -r1.428 --- E.h 14 May 2005 09:19:49 -0000 1.427 +++ E.h 14 May 2005 16:46:01 -0000 1.428 @@ -1126,6 +1126,7 @@ #define USE_DQ_ICLASS 0 #define USE_DQ_TCLASS 0 #define USE_DQ_SHAPE 0 +#define USE_DQ_DIALOG 0 typedef struct _drawqueue { @@ -1147,8 +1148,10 @@ Pager *pager; Pager *redraw_pager; char newbg; +#if USE_DQ_DIALOG Dialog *d; DItem *di; +#endif } DrawQueue; @@ -1495,6 +1498,8 @@ void DialogCallbackClose(Dialog * d, int val, void *data); +void DialogsCheckUpdate(void); + void DialogOK(const char *title, const char *fmt, ...); void DialogOKstr(const char *title, const char *txt); void DialogAlert(const char *fmt, ...); =================================================================== RCS file: /cvsroot/enlightenment/e16/e/src/dialog.c,v retrieving revision 1.109 retrieving revision 1.110 diff -u -3 -r1.109 -r1.110 --- dialog.c 8 May 2005 16:01:44 -0000 1.109 +++ dialog.c 14 May 2005 16:46:01 -0000 1.110 @@ -152,6 +152,8 @@ DItemArea area; } item; + + char update; }; typedef struct @@ -194,6 +196,9 @@ int num_bindings; DKeyBind *keybindings; void *data; + + char update; + int xu1, yu1, xu2, yu2; }; static Dialog *FindDialog(Window win); @@ -204,6 +209,8 @@ static void MoveTableBy(Dialog * d, DItem * di, int dx, int dy); static void DialogItemsRealize(Dialog * d); +static char dialog_update_pending = 0; + void DialogBindKey(Dialog * d, const char *key, DialogCallbackFunc * func, int val) { @@ -738,6 +745,7 @@ di->hilited = 0; di->clicked = 0; di->win = 0; + switch (di->type) { case DITEM_NONE: @@ -1530,195 +1538,228 @@ } } -#define INTERSECTS(x, y, w, h, xx, yy, ww, hh) \ -((x < (xx + ww)) && \ - (y < (yy + hh)) && \ - ((x + w) > xx) && \ - ((y + h) > yy)) - void DialogDrawItems(Dialog * d, DItem * di, int x, int y, int w, int h) { + d->update = 1; + di->update = 1; + + if (d->xu1 > x) + d->xu1 = x; + if (d->yu1 > y) + d->yu1 = y; + x += w; + y += h; + if (d->xu2 < x) + d->xu2 = x; + if (d->yu2 < y) + d->yu2 = y; + + dialog_update_pending = 1; +} + +static void +DialogDrawItem(Dialog * d, DItem * di) +{ int state; - if (Mode.queue_up) - { - DrawQueue *dq; + if (!di->update && di->type != DITEM_TABLE) + return; - dq = Ecalloc(1, sizeof(DrawQueue)); - dq->w = w; - dq->h = h; - dq->d = d; - dq->di = di; - dq->x = x; - dq->y = y; - AddItem(dq, "DRAW", 0, LIST_TYPE_DRAW); - return; - } + if (di->x > d->xu2 || di->y > d->yu2 || + di->x + di->w <= d->xu1 || di->y + di->h <= d->yu1) + return; - if (di->type == DITEM_TABLE) + switch (di->type) { - int i; + case DITEM_TABLE: + { + int i; + DItem *dii; + + for (i = 0; i < di->item.table.num_items; i++) + { + dii = di->item.table.items[i]; + if (di->update) + dii->update = 1; + DialogDrawItem(d, dii); + } + } + break; - if (INTERSECTS(x, y, w, h, di->x, di->y, di->w, di->h)) + case DITEM_SLIDER: + if (di->item.slider.horizontal) { - for (i = 0; i < di->item.table.num_items; i++) - DialogDrawItems(d, di->item.table.items[i], x, y, w, h); + di->item.slider.knob_x = + di->item.slider.base_x + + (((di->item.slider.base_w - + di->item.slider.knob_w) * (di->item.slider.val - + di->item.slider.lower)) / + (di->item.slider.upper - di->item.slider.lower)); + di->item.slider.knob_y = + di->item.slider.base_y + + ((di->item.slider.base_h - di->item.slider.knob_h) / 2); } - return; + else + { + di->item.slider.knob_y = + (di->item.slider.base_y + di->item.slider.base_h - + di->item.slider.knob_h) - + (((di->item.slider.base_h - + di->item.slider.knob_h) * (di->item.slider.val - + di->item.slider.lower)) / + (di->item.slider.upper - di->item.slider.lower)); + di->item.slider.knob_x = + di->item.slider.base_x + + ((di->item.slider.base_w - di->item.slider.knob_w) / 2); + } + 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->item.slider.base_win) + ImageclassApply(di->item.slider.ic_base, + di->item.slider.base_win, + di->item.slider.base_w, di->item.slider.base_h, + 0, 0, STATE_NORMAL, 0, ST_WIDGET); + if (di->item.slider.border_win) + ImageclassApply(di->item.slider.ic_border, + di->item.slider.border_win, + di->item.slider.border_w, + di->item.slider.border_h, 0, 0, STATE_NORMAL, 0, + ST_WIDGET); + state = STATE_NORMAL; + if ((di->hilited) && (di->clicked)) + state = STATE_CLICKED; + else if ((di->hilited) && (!di->clicked)) + state = STATE_HILITED; + else if (!(di->hilited) && (di->clicked)) + state = STATE_CLICKED; + if (di->item.slider.knob_win) + ImageclassApply(di->item.slider.ic_knob, + di->item.slider.knob_win, + di->item.slider.knob_w, di->item.slider.knob_h, + 0, 0, state, 0, ST_WIDGET); + break; + case DITEM_BUTTON: + state = STATE_NORMAL; + if ((di->hilited) && (di->clicked)) + state = STATE_CLICKED; + else if ((di->hilited) && (!di->clicked)) + state = STATE_HILITED; + else if (!(di->hilited) && (di->clicked)) + state = STATE_CLICKED; + ImageclassApply(di->iclass, di->win, di->w, di->h, 0, 0, state, 0, + ST_WIDGET); + TextclassApply(di->iclass, di->win, di->w, di->h, 0, 0, state, 1, + di->tclass, di->item.button.text); + break; + case DITEM_AREA: + ImageclassApply(di->iclass, di->win, di->w, di->h, 0, 0, + STATE_NORMAL, 0, ST_DIALOG); + break; + case DITEM_CHECKBUTTON: + state = STATE_NORMAL; + if ((di->hilited) && (di->clicked)) + state = STATE_CLICKED; + else if ((di->hilited) && (!di->clicked)) + state = STATE_HILITED; + else if (!(di->hilited) && (di->clicked)) + state = STATE_CLICKED; + if (di->item.check_button.onoff) + ImageclassApply(di->iclass, di->item.check_button.check_win, + di->item.check_button.check_orig_w, + di->item.check_button.check_orig_h, 1, 0, state, + 0, ST_WIDGET); + else + ImageclassApply(di->iclass, di->item.check_button.check_win, + di->item.check_button.check_orig_w, + di->item.check_button.check_orig_h, 0, 0, state, + 0, ST_WIDGET); + EClearArea(d->win, di->x, di->y, di->w, di->h, False); + TextDraw(di->tclass, d->win, 0, 0, STATE_NORMAL, + di->item.check_button.text, + di->x + di->item.check_button.check_orig_w + + di->iclass->padding.left, di->y, + di->w - di->item.check_button.check_orig_w - + di->iclass->padding.left, 99999, 17, + di->tclass->justification); + break; + case DITEM_TEXT: + EClearArea(d->win, di->x, di->y, di->w, di->h, False); + TextDraw(di->tclass, d->win, 0, 0, STATE_NORMAL, + di->item.text.text, di->x, di->y, di->w, 99999, 17, + di->tclass->justification); + break; + case DITEM_IMAGE: + break; + case DITEM_SEPARATOR: + if (di->item.separator.horizontal) + ImageclassApply(di->iclass, di->win, di->w, di->h, 0, 0, + STATE_NORMAL, 0, ST_WIDGET); + else + ImageclassApply(di->iclass, di->win, di->w, di->h, 0, 0, + STATE_CLICKED, 0, ST_WIDGET); + break; + case DITEM_RADIOBUTTON: + state = STATE_NORMAL; + if ((di->hilited) && (di->clicked)) + state = STATE_CLICKED; + else if ((di->hilited) && (!di->clicked)) + state = STATE_HILITED; + else if (!(di->hilited) && (di->clicked)) + state = STATE_CLICKED; + if (di->item.radio_button.onoff) + ImageclassApply(di->iclass, di->item.radio_button.radio_win, + di->item.radio_button.radio_orig_w, + di->item.radio_button.radio_orig_h, 1, 0, state, + 0, ST_WIDGET); + else + ImageclassApply(di->iclass, di->item.radio_button.radio_win, + di->item.radio_button.radio_orig_w, + di->item.radio_button.radio_orig_w, 0, 0, state, + 0, ST_WIDGET); + EClearArea(d->win, di->x, di->y, di->w, di->h, False); + TextDraw(di->tclass, d->win, 0, 0, STATE_NORMAL, + di->item.radio_button.text, + di->x + di->item.radio_button.radio_orig_w + + di->iclass->padding.left, di->y, + di->w - di->item.radio_button.radio_orig_w - + di->iclass->padding.left, 99999, 17, + di->tclass->justification); + break; + default: + break; } - if (INTERSECTS(x, y, w, h, di->x, di->y, di->w, di->h)) + di->update = 0; +} + +void +DialogsCheckUpdate(void) +{ + Dialog *d, **ds; + int i, num; + + if (!dialog_update_pending) + return; + dialog_update_pending = 0; + + ds = (Dialog **) ListItemType(&num, LIST_TYPE_DIALOG); + for (i = 0; i < num; i++) { - switch (di->type) - { - case DITEM_SLIDER: - if (di->item.slider.horizontal) - { - di->item.slider.knob_x = - di->item.slider.base_x + - (((di->item.slider.base_w - - di->item.slider.knob_w) * (di->item.slider.val - - di->item.slider.lower)) / - (di->item.slider.upper - di->item.slider.lower)); - di->item.slider.knob_y = - di->item.slider.base_y + - ((di->item.slider.base_h - di->item.slider.knob_h) / 2); - } - else - { - di->item.slider.knob_y = - (di->item.slider.base_y + di->item.slider.base_h - - di->item.slider.knob_h) - - (((di->item.slider.base_h - - di->item.slider.knob_h) * (di->item.slider.val - - di->item.slider.lower)) / - (di->item.slider.upper - di->item.slider.lower)); - di->item.slider.knob_x = - di->item.slider.base_x + - ((di->item.slider.base_w - di->item.slider.knob_w) / 2); - } - 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->item.slider.base_win) - ImageclassApply(di->item.slider.ic_base, - di->item.slider.base_win, - di->item.slider.base_w, di->item.slider.base_h, - 0, 0, STATE_NORMAL, 0, ST_WIDGET); - if (di->item.slider.border_win) - ImageclassApply(di->item.slider.ic_border, - di->item.slider.border_win, - di->item.slider.border_w, - di->item.slider.border_h, 0, 0, STATE_NORMAL, 0, - ST_WIDGET); - state = STATE_NORMAL; - if ((di->hilited) && (di->clicked)) - state = STATE_CLICKED; - else if ((di->hilited) && (!di->clicked)) - state = STATE_HILITED; - else if (!(di->hilited) && (di->clicked)) - state = STATE_CLICKED; - if (di->item.slider.knob_win) - ImageclassApply(di->item.slider.ic_knob, - di->item.slider.knob_win, - di->item.slider.knob_w, di->item.slider.knob_h, - 0, 0, state, 0, ST_WIDGET); - break; - case DITEM_BUTTON: - state = STATE_NORMAL; - if ((di->hilited) && (di->clicked)) - state = STATE_CLICKED; - else if ((di->hilited) && (!di->clicked)) - state = STATE_HILITED; - else if (!(di->hilited) && (di->clicked)) - state = STATE_CLICKED; - ImageclassApply(di->iclass, di->win, di->w, di->h, 0, 0, state, 0, - ST_WIDGET); - TextclassApply(di->iclass, di->win, di->w, di->h, 0, 0, state, 1, - di->tclass, di->item.button.text); - break; - case DITEM_AREA: - ImageclassApply(di->iclass, di->win, di->w, di->h, 0, 0, - STATE_NORMAL, 0, ST_DIALOG); - break; - case DITEM_CHECKBUTTON: - state = STATE_NORMAL; - if ((di->hilited) && (di->clicked)) - state = STATE_CLICKED; - else if ((di->hilited) && (!di->clicked)) - state = STATE_HILITED; - else if (!(di->hilited) && (di->clicked)) - state = STATE_CLICKED; - if (di->item.check_button.onoff) - ImageclassApply(di->iclass, di->item.check_button.check_win, - di->item.check_button.check_orig_w, - di->item.check_button.check_orig_h, 1, 0, state, - 0, ST_WIDGET); - else - ImageclassApply(di->iclass, di->item.check_button.check_win, - di->item.check_button.check_orig_w, - di->item.check_button.check_orig_h, 0, 0, state, - 0, ST_WIDGET); - EClearArea(d->win, di->x, di->y, di->w, di->h, False); - TextDraw(di->tclass, d->win, 0, 0, STATE_NORMAL, - di->item.check_button.text, - di->x + di->item.check_button.check_orig_w + - di->iclass->padding.left, di->y, - di->w - di->item.check_button.check_orig_w - - di->iclass->padding.left, 99999, 17, - di->tclass->justification); - break; - case DITEM_TEXT: - EClearArea(d->win, di->x, di->y, di->w, di->h, False); - TextDraw(di->tclass, d->win, 0, 0, STATE_NORMAL, - di->item.text.text, di->x, di->y, di->w, 99999, 17, - di->tclass->justification); - break; - case DITEM_IMAGE: - break; - case DITEM_SEPARATOR: - if (di->item.separator.horizontal) - ImageclassApply(di->iclass, di->win, di->w, di->h, 0, 0, - STATE_NORMAL, 0, ST_WIDGET); - else - ImageclassApply(di->iclass, di->win, di->w, di->h, 0, 0, - STATE_CLICKED, 0, ST_WIDGET); - break; - case DITEM_RADIOBUTTON: - state = STATE_NORMAL; - if ((di->hilited) && (di->clicked)) - state = STATE_CLICKED; - else if ((di->hilited) && (!di->clicked)) - state = STATE_HILITED; - else if (!(di->hilited) && (di->clicked)) - state = STATE_CLICKED; - if (di->item.radio_button.onoff) - ImageclassApply(di->iclass, di->item.radio_button.radio_win, - di->item.radio_button.radio_orig_w, - di->item.radio_button.radio_orig_h, 1, 0, state, - 0, ST_WIDGET); - else - ImageclassApply(di->iclass, di->item.radio_button.radio_win, - di->item.radio_button.radio_orig_w, - di->item.radio_button.radio_orig_w, 0, 0, state, - 0, ST_WIDGET); - EClearArea(d->win, di->x, di->y, di->w, di->h, False); - TextDraw(di->tclass, d->win, 0, 0, STATE_NORMAL, - di->item.radio_button.text, - di->x + di->item.radio_button.radio_orig_w + - di->iclass->padding.left, di->y, - di->w - di->item.radio_button.radio_orig_w - - di->iclass->padding.left, 99999, 17, - di->tclass->justification); - break; - default: - break; - } + d = ds[i]; + if (!d->update) + continue; + + DialogDrawItem(d, d->item); + d->update = 0; + d->xu1 = d->yu1 = 99999; + d->xu2 = d->yu2 = 0; } + if (ds) + Efree(ds); } static void =================================================================== RCS file: /cvsroot/enlightenment/e16/e/src/draw.c,v retrieving revision 1.67 retrieving revision 1.68 diff -u -3 -r1.67 -r1.68 --- draw.c 8 May 2005 16:01:45 -0000 1.67 +++ draw.c 14 May 2005 16:46:02 -0000 1.68 @@ -57,6 +57,7 @@ { already = 0; +#if USE_DQ_DIALOG if (dq->d) { for (i = 0; i < num; i++) @@ -85,6 +86,7 @@ } } } +#endif #if USE_DQ_SHAPE else if (dq->shape_propagate) { @@ -125,7 +127,7 @@ } } #endif - else if (dq->pager) + if (dq->pager) { for (i = 0; i < num; i++) { @@ -206,6 +208,7 @@ { dq = lst[i]; +#if USE_DQ_DIALOG if (dq->d) { /* printf("D %x\n", dq->d->ewin->client.win); */ @@ -214,6 +217,7 @@ LIST_TYPE_DIALOG)) DialogDrawItems(dq->d, dq->di, dq->x, dq->y, dq->w, dq->h); } +#endif #if USE_DQ_SHAPE else if (dq->shape_propagate) { @@ -243,7 +247,7 @@ dq->image_type); } #endif - else if (dq->pager) + if (dq->pager) { /* printf("P %x\n", dq->win); */ if (FindItem =================================================================== RCS file: /cvsroot/enlightenment/e16/e/src/events.c,v retrieving revision 1.87 retrieving revision 1.88 diff -u -3 -r1.87 -r1.88 --- events.c 14 May 2005 09:19:51 -0000 1.87 +++ events.c 14 May 2005 16:46:02 -0000 1.88 @@ -647,6 +647,7 @@ count = EventsProcess(&evq_ptr, &evq_num); HandleDrawQueue(); + DialogsCheckUpdate(); XFlush(disp); pcount = count; ------------------------------------------------------- This SF.Net email is sponsored by Oracle Space Sweepstakes Want to be the first software developer in space? Enter now for the Oracle Space Sweepstakes! http://ads.osdn.com/?ad_id=7393&alloc_id=16281&op=click _______________________________________________ enlightenment-cvs mailing list enlightenment-cvs@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/enlightenment-cvs