Enlightenment CVS committal Author : kwo Project : e16 Module : e
Dir : e16/e/src Modified Files: iconify.c Log Message: Iconbox/systray fixes. =================================================================== RCS file: /cvsroot/enlightenment/e16/e/src/iconify.c,v retrieving revision 1.133 retrieving revision 1.134 diff -u -3 -r1.133 -r1.134 --- iconify.c 16 Feb 2005 17:58:30 -0000 1.133 +++ iconify.c 20 Feb 2005 17:22:01 -0000 1.134 @@ -44,13 +44,19 @@ } SWin; static void SystrayInit(Iconbox * ib, Window win, int screen); +static void SystrayExit(Iconbox * ib); static void IconboxObjSwinFree(Iconbox * ib, SWin * swin); -typedef union +typedef struct { - void *obj; - EWin *ewin; - SWin *swin; + union + { + void *obj; + EWin *ewin; + SWin *swin; + } u; + int xo, yo, wo, ho; /* Outer */ + int xi, yi, wi, hi; /* Inner */ } IboxOject; struct _iconbox @@ -74,9 +80,14 @@ int auto_resize_anchor; /* internally set stuff */ + EWin *ewin; int w, h; int pos; int max, max_min; + ImageClass *ic_box; + ImageClass *ic_item_base; + Imlib_Image *im_item_base; + char force_update; char arrow1_hilited; char arrow1_clicked; @@ -87,8 +98,6 @@ char scrollbar_clicked; char scrollbox_clicked; - Pixmap pmap, mask; - Window win; Window cover_win; Window icon_win; @@ -97,7 +106,6 @@ Window arrow2_win; Window scrollbar_win; Window scrollbarknob_win; - EWin *ewin; int num_objs; IboxOject *objs; @@ -299,7 +307,7 @@ { Iconbox *ib; - ib = Emalloc(sizeof(Iconbox)); + ib = Ecalloc(1, sizeof(Iconbox)); ib->name = Estrdup(name); ib->type = (!strncmp(name, "_ST_", 4)) ? IB_TYPE_SYSTRAY : IB_TYPE_ICONBOX; ib->orientation = 0; @@ -348,7 +356,6 @@ ib->scrollbar_win = ECreateWindow(ib->scroll_win, 122, 26, 6, 6, 0); EventCallbackRegister(ib->scrollbar_win, 0, IboxEventScrollbarWin, ib); ib->scrollbarknob_win = ECreateWindow(ib->scrollbar_win, -20, -20, 4, 4, 0); - ib->pmap = ecore_x_pixmap_new(ib->icon_win, 128, 32, VRoot.depth); ESelectInput(ib->icon_win, EnterWindowMask | LeaveWindowMask | ButtonPressMask | @@ -398,16 +405,25 @@ if (ib->name) Efree(ib->name); + switch (ib->type) + { + case IB_TYPE_ICONBOX: + break; + case IB_TYPE_SYSTRAY: + SystrayExit(ib); + break; + } + for (i = 0; i < ib->num_objs; i++) { switch (ib->type) { case IB_TYPE_ICONBOX: if (!exiting) - EwinDeIconify(ib->objs[i].ewin); + EwinDeIconify(ib->objs[i].u.ewin); break; case IB_TYPE_SYSTRAY: - IconboxObjSwinFree(ib, ib->objs[i].swin); + IconboxObjSwinFree(ib, ib->objs[i].u.swin); break; } } @@ -415,9 +431,6 @@ if (ib->objs) Efree(ib->objs); - if (ib->pmap) - ecore_x_pixmap_del(ib->pmap); - EDestroyWindow(ib->win); Efree(ib); @@ -429,9 +442,9 @@ static void IB_Reconfigure(Iconbox * ib) { - ImageClass *ic; + ImageClass *ic, *ic2; EWin *ewin; - int extra = 0; + int extra; ewin = ib->ewin; ib->force_update = 1; @@ -442,11 +455,18 @@ ewin->client.no_resize_h = 0; ewin->client.no_resize_v = 0; + extra = 0; if (ib->orientation) { ic = ImageclassFind("ICONBOX_VERTICAL", 0); if (ic) extra = ic->padding.left + ic->padding.right; + if (ib->draw_icon_base) + { + ic2 = ImageclassFind("DEFAULT_ICON_BUTTON", 0); + if (ic2) + extra += ic2->padding.left + ic2->padding.right; + } ewin->client.width.max = ewin->client.width.min = ib->iconsize + ib->scroll_thickness + extra; ewin->client.no_resize_h = 1; @@ -456,7 +476,13 @@ { ic = ImageclassFind("ICONBOX_HORIZONTAL", 0); if (ic) - extra = ic->padding.left + ic->padding.right; + extra = ic->padding.top + ic->padding.bottom; + if (ib->draw_icon_base) + { + ic2 = ImageclassFind("DEFAULT_ICON_BUTTON", 0); + if (ic2) + extra += ic2->padding.top + ic2->padding.bottom; + } ewin->client.height.max = ewin->client.height.min = ib->iconsize + ib->scroll_thickness + extra; ewin->client.no_resize_v = 1; @@ -529,8 +555,16 @@ pq = Mode.queue_up; Mode.queue_up = 0; - HintsSetWindowName(ib->win, "Iconbox"); - HintsSetWindowClass(ib->win, ib->name, "Enlightenment_IconBox"); + if (ib->type == IB_TYPE_ICONBOX) + { + HintsSetWindowName(ib->win, "Iconbox"); + HintsSetWindowClass(ib->win, ib->name, "Enlightenment_IconBox"); + } + else + { + HintsSetWindowName(ib->win, "Systray"); + HintsSetWindowClass(ib->win, ib->name, "Enlightenment_IconBox"); + } ewin = AddInternalToFamily(ib->win, NULL, EWIN_TYPE_ICONBOX, ib, IconboxEwinInit); @@ -580,7 +614,7 @@ int i; for (i = 0; i < ib->num_objs; i++) - if (ib->objs[i].obj == obj) + if (ib->objs[i].u.obj == obj) return i; return -1; @@ -594,8 +628,8 @@ return -1; ib->num_objs++; - ib->objs = Erealloc(ib->objs, sizeof(EWin *) * ib->num_objs); - ib->objs[ib->num_objs - 1].obj = obj; + ib->objs = Erealloc(ib->objs, sizeof(IboxOject) * ib->num_objs); + ib->objs[ib->num_objs - 1].u.obj = obj; return 0; /* Success */ } @@ -614,7 +648,7 @@ ib->objs[j] = ib->objs[j + 1]; ib->num_objs--; if (ib->num_objs > 0) - ib->objs = Erealloc(ib->objs, sizeof(EWin *) * ib->num_objs); + ib->objs = Erealloc(ib->objs, sizeof(IboxOject) * ib->num_objs); else { Efree(ib->objs); @@ -733,7 +767,6 @@ imlib_context_set_drawable(draw); im = imlib_create_scaled_image_from_drawable(mask, 0, 0, EoGetW(ewin), EoGetH(ewin), w, h, 1, 0); - ecore_x_pixmap_del(ib->pmap); imlib_context_set_image(im); imlib_image_set_has_alpha(1); /* Should be set by imlib? */ } @@ -975,43 +1008,24 @@ } static void -IconboxFindIconSize(Iconbox * ib, Imlib_Image * im, int type __UNUSED__, - int *pw, int *ph) +IconboxFindIconSize(Imlib_Image * im, int *pw, int *ph, int size) { - int w, h, minsz, maxsz, maxwh; + int w, h, minsz, maxwh; imlib_context_set_image(im); w = imlib_image_get_width(); h = imlib_image_get_height(); + maxwh = (w > h) ? w : h; if (maxwh <= 1) goto done; - maxsz = ib->iconsize; - - if (ib->draw_icon_base) - { - ImageClass *ic; - int maxpad; - - ic = ImageclassFind("DEFAULT_ICON_BUTTON", 0); - if (ic) - { - maxpad = ic->padding.left + ic->padding.right; - if (maxpad < ic->padding.top + ic->padding.bottom) - maxpad = ic->padding.top + ic->padding.bottom; - maxsz -= maxpad; - if (maxsz < 8) - maxsz = 8; - } - } - - minsz = (maxsz * 3) / 4; + minsz = (size * 3) / 4; - if (maxwh < minsz || maxwh > maxsz) + if (maxwh < minsz || maxwh > size) { - w = (w * maxsz) / maxwh; - h = (h * maxsz) / maxwh; + w = (w * size) / maxwh; + h = (h * size) / maxwh; } done: @@ -1020,51 +1034,138 @@ } static void -IB_CalcMax(Iconbox * ib) +IconboxLayoutImageWin(Iconbox * ib) { - int i, x, y, w, h; + int i, xo, yo, wo, ho, wi, hi; + int item_pad, padl, padr, padt, padb; + IboxOject *ibo; + + if (ib->orientation) + ib->ic_box = ImageclassFind("ICONBOX_VERTICAL", 0); + else + ib->ic_box = ImageclassFind("ICONBOX_HORIZONTAL", 0); + + if (ib->draw_icon_base && !ib->im_item_base) + { + ib->ic_item_base = ImageclassFind("DEFAULT_ICON_BUTTON", 0); + if (ib->ic_item_base) + ib->im_item_base = + ImageclassGetImage(ib->ic_item_base, 0, 0, STATE_NORMAL); + if (!ib->im_item_base) + { + ib->ic_item_base = NULL; + ib->draw_icon_base = 0; + } + } + + if (ib->draw_icon_base) + { + padl = ib->ic_item_base->padding.left; + padr = ib->ic_item_base->padding.right; + padt = ib->ic_item_base->padding.top; + padb = ib->ic_item_base->padding.bottom; + + item_pad = 0; + } + else + { + padl = padr = padt = padb = 0; + + item_pad = 2; + } + + xo = 0; + yo = 0; + if (ib->ic_box) + { + xo += ib->ic_box->padding.left; + yo += ib->ic_box->padding.top; + } - x = 0; - y = 0; for (i = 0; i < ib->num_objs; i++) { - w = 8; - h = 8; + ibo = &ib->objs[i]; + + /* Inner size */ if (ib->type == IB_TYPE_ICONBOX) { EWin *ewin; - ewin = ib->objs[i].ewin; + ewin = ibo->u.ewin; if (!ewin->icon_image) UpdateAppIcon(ewin, ib->icon_mode); + wi = hi = 8; if (ewin->icon_image) - IconboxFindIconSize(ib, ewin->icon_image, ewin->icon_type, &w, - &h); + IconboxFindIconSize(ewin->icon_image, &wi, &hi, ib->iconsize); } else { - if (ib->objs[i].swin->mapped) - w = h = ib->iconsize; - else - w = h = 0; + wi = hi = ib->iconsize; } - if (ib->draw_icon_base) + /* Outer size */ + if (ib->draw_icon_base && ib->im_item_base) { - x += ib->iconsize; - y += ib->iconsize; + if (ib->type == IB_TYPE_ICONBOX) + { + wo = ib->iconsize + padl + padr; + ho = ib->iconsize + padt + padb; + } + else + { + if (ib->objs[i].u.swin->mapped) + { + wo = ib->iconsize + padl + padr; + ho = ib->iconsize + padt + padb; + } + else + wo = ho = 0; + } } else { - x += w + 2; - y += h + 2; + if (ib->orientation) + { + wo = ib->iconsize; + ho = hi; + } + else + { + wo = wi; + ho = ib->iconsize; + } } + + ibo->xo = xo; + ibo->yo = yo; + ibo->wo = wo; + ibo->ho = ho; + ibo->xi = xo + (wo - wi) / 2; + ibo->yi = yo + (ho - hi) / 2; + ibo->wi = wi; + ibo->hi = hi; +#if 0 + Eprintf("xo,yo=%d,%d wo,ho=%d,%d xi,yi=%d,%d wi,hi=%d,%d\n", + ibo->xo, ibo->yo, ibo->wo, ibo->ho, ibo->xi, ibo->yi, ibo->wi, + ibo->hi); +#endif + + if (ib->orientation) + yo += ho + item_pad; + else + xo += wo + item_pad; + } + + if (ib->ic_box) + { + xo += ib->ic_box->padding.right; + yo += ib->ic_box->padding.bottom; } if (ib->orientation) - ib->max = y - 2; + ib->max = yo - item_pad; else - ib->max = x - 2; + ib->max = xo - item_pad; if (ib->max < ib->max_min) ib->max = ib->max_min; @@ -1073,87 +1174,19 @@ static EWin * IB_FindIcon(Iconbox * ib, int px, int py) { - int i, x = 0, y = 0; - ImageClass *ic = NULL; + int i; + IboxOject *ibo; - if (ib->orientation) - { - ic = ImageclassFind("ICONBOX_VERTICAL", 0); - y = -ib->pos; - x = 0; - if (ic) - { - x += ic->padding.left; - y += ic->padding.top; - } - } - else - { - ic = ImageclassFind("ICONBOX_HORIZONTAL", 0); - x = -ib->pos; - y = 0; - if (ic) - { - x += ic->padding.left; - y += ic->padding.top; - } - } + if (ib->type != IB_TYPE_ICONBOX) + return NULL; for (i = 0; i < ib->num_objs; i++) { - int w, h, xx, yy; + ibo = &ib->objs[i]; - w = 8; - h = 8; - if (ib->type == IB_TYPE_ICONBOX) - { - EWin *ewin; - - ewin = ib->objs[i].ewin; - if (!ewin->icon_image) - UpdateAppIcon(ewin, ib->icon_mode); - if (ewin->icon_image) - { - IconboxFindIconSize(ib, ewin->icon_image, ewin->icon_type, &w, - &h); - xx = x; - yy = y; - if (ib->orientation) - { - if (ib->draw_icon_base) - yy += (ib->iconsize - h) / 2; - xx += (ib->iconsize - w) / 2; - } - else - { - if (ib->draw_icon_base) - xx += (ib->iconsize - w) / 2; - yy += (ib->iconsize - h) / 2; - } - if ((px >= (xx - 1)) && (py >= (yy - 1)) - && (px < (xx + w + 1)) && (py < (yy + h + 1))) - return ewin; - } - } - else - { - w = h = ib->iconsize; - } - - if (ib->orientation) - { - if (ib->draw_icon_base) - y += ib->iconsize; - else - y += h + 2; - } - else - { - if (ib->draw_icon_base) - x += ib->iconsize; - else - x += w + 2; - } + if (px >= ibo->xo - 1 && py >= ibo->yo - 1 && + px < ibo->xo + ibo->wo + 1 && py < ibo->yo + ibo->ho + 1) + return ibo->u.ewin; } return NULL; } @@ -1173,13 +1206,9 @@ bs = ib->h - (ib->arrow_thickness * 2); else bs = ib->h; - bw = (ib->h * bs) / ib->max; if (ic) - { - bs -= (ic->padding.top + ic->padding.bottom); - bw = ((ib->h - (ic->padding.top + ic->padding.bottom)) * bs) / - ib->max; - } + bs -= (ic->padding.top + ic->padding.bottom); + bw = (ib->h * bs) / ib->max; if (bs < 1) bs = 1; if (bw > bs) @@ -1200,6 +1229,7 @@ else EMoveResizeWindow(ib->scrollbarknob_win, -9999, -9999, ib->bar_thickness, ib->knob_length); + if (show_sb) { /* fix this area */ @@ -1417,13 +1447,9 @@ bs = ib->w - (ib->arrow_thickness * 2); else bs = ib->w; - bw = (ib->w * bs) / ib->max; if (ic) - { - bs -= (ic->padding.left + ic->padding.right); - bw = ((ib->w - (ic->padding.left + ic->padding.right)) * bs) / - ib->max; - } + bs -= (ic->padding.left + ic->padding.right); + bw = (ib->w * bs) / ib->max; if (bs < 1) bs = 1; if (bw > bs) @@ -1435,6 +1461,7 @@ bx += ic->padding.left; if ((ib->scrollbar_hide) && (bw == bs)) show_sb = 0; + ic = ImageclassFind("ICONBOX_SCROLLKNOB_HORIZONTAL", 0); if ((ic) && (bw > ib->knob_length)) EMoveResizeWindow(ib->scrollbarknob_win, @@ -1651,6 +1678,7 @@ ST_ICONBOX); } } +#if 0 /* FIXME - Remove? */ PropagateShapes(ib->win); if (ib->ewin) { @@ -1661,38 +1689,23 @@ if (ib->ewin->border == b) EwinPropagateShapes(ib->ewin); } +#endif } static void IB_FixPos(Iconbox * ib) { - if (ib->orientation) - { - ImageClass *ic; - int v = 0; + int v; - ic = ImageclassFind("ICONBOX_SCROLLBAR_BASE_VERTICAL", 0); - v = ib->max - ib->h; - if (ic) - v += ic->padding.top + ic->padding.bottom; - if (ib->pos > v) - ib->pos = v; - } + if (ib->orientation) + v = ib->max - ib->h; else - { - ImageClass *ic; - int v = 0; + v = ib->max - ib->w; - ic = ImageclassFind("ICONBOX_SCROLLBAR_BASE_HORIZONTAL", 0); - v = ib->max - ib->w; - if (ic) - v += ic->padding.left + ic->padding.right; - if (ib->pos > v) - ib->pos = v; - } + if (ib->pos > v) + ib->pos = v; if (ib->pos < 0) ib->pos = 0; - } static void @@ -1701,30 +1714,23 @@ char pq; char was_shaded = 0; int i, x, y, w, h; - ImageClass *ib_ic_cover, *ib_ic_box; - int ib_x0, ib_y0, ib_xlt, ib_ylt, ib_ww, ib_hh; + ImageClass *ib_ic_cover; + int ib_xlt, ib_ylt, ib_ww, ib_hh; + int ib_x0, ib_y0, ib_w0, ib_h0; Imlib_Image *im, *im2; int ww, hh; + Pixmap pmap, mask; - if (!ib) - return; - if (!ib->ewin) + if (!ib || !ib->ewin) return; - if (ib->orientation) - { - ib_ic_box = ImageclassFind("ICONBOX_VERTICAL", 0); - } - else - { - ib_ic_box = ImageclassFind("ICONBOX_HORIZONTAL", 0); - } - x = EoGetX(ib->ewin); y = EoGetY(ib->ewin); w = ib->w; h = ib->h; + IconboxLayoutImageWin(ib); + if (ib->auto_resize) { int add = 0; @@ -1735,12 +1741,9 @@ EwinUnShade(ib->ewin); } - IB_CalcMax(ib); if (ib->orientation) { - if (ib_ic_box) - add = ib_ic_box->padding.top + ib_ic_box->padding.bottom; - add += ib->max; + add = ib->max; if (ib->ewin->border) { if ((ib->ewin->border->border.top + @@ -1761,9 +1764,7 @@ } else { - if (ib_ic_box) - add = ib_ic_box->padding.left + ib_ic_box->padding.right; - add += ib->max; + add = ib->max; if (ib->ewin->border) { if ((ib->ewin->border->border.left + @@ -1784,15 +1785,13 @@ } } - if (ib->force_update || (x != EoGetX(ib->ewin)) - || (y != EoGetY(ib->ewin)) || (w != ib->ewin->client.w) - || (h != ib->ewin->client.h)) + if (ib->force_update || + (x != EoGetX(ib->ewin)) || (y != EoGetY(ib->ewin)) || + (w != ib->ewin->client.w) || (h != ib->ewin->client.h)) { ib->w = w; ib->h = h; MoveResizeEwin(ib->ewin, x, y, w, h); - EResizeWindow(ib->win, w, h); - im = imlib_create_image(w, h); ib->force_update = 0; } @@ -1802,32 +1801,46 @@ pq = Mode.queue_up; Mode.queue_up = 0; - IB_CalcMax(ib); IB_FixPos(ib); IB_DrawScroll(ib); + /* Geometry of iconbox window, excluding scrollbar */ + ib_xlt = 0; + ib_ylt = 0; + ib_ww = ib->w; + ib_hh = ib->h; if (ib->orientation) { ib_ic_cover = ImageclassFind("ICONBOX_COVER_VERTICAL", 0); - ib_x0 = 0; - ib_y0 = -ib->pos; - ib_xlt = (ib->scrollbar_side == 1) ? 0 : ib->scroll_thickness; - ib_ylt = 0; - ib_ww = ib->w - ib->scroll_thickness; - ib_hh = ib->h; + if (ib->scrollbar_side == 0) + ib_xlt = ib->scroll_thickness; + ib_ww -= ib->scroll_thickness; + + /* Geometry of icon window (including invisible parts) */ + ib_x0 = ib_xlt; + ib_y0 = ib_ylt - ib->pos; + ib_w0 = ib_ww; + ib_h0 = ib_hh; + if (ib_h0 < ib->max) + ib_h0 = ib->max; } else { ib_ic_cover = ImageclassFind("ICONBOX_COVER_HORIZONTAL", 0); - ib_x0 = -ib->pos; - ib_y0 = 0; - ib_xlt = 0; - ib_ylt = (ib->scrollbar_side == 1) ? 0 : ib->scroll_thickness; - ib_ww = ib->w; - ib_hh = ib->h - ib->scroll_thickness; + if (ib->scrollbar_side == 0) + ib_ylt = ib->scroll_thickness; + ib_hh -= ib->scroll_thickness; + + /* Geometry of icon window (including invisible parts) */ + ib_x0 = ib_xlt - ib->pos; + ib_y0 = ib_ylt; + ib_w0 = ib_ww; + if (ib_w0 < ib->max) + ib_w0 = ib->max; + ib_h0 = ib_hh; } - EMoveResizeWindow(ib->icon_win, ib_xlt, ib_ylt, ib_ww, ib_hh); + EMoveResizeWindow(ib->icon_win, ib_x0, ib_y0, ib_w0, ib_h0); if (ib_ic_cover && !ib->cover_hide) { @@ -1842,94 +1855,56 @@ EUnmapWindow(ib->cover_win); } - if (!ib->nobg && ib_ic_box) + if (ib->ic_box && + ((ib->type == IB_TYPE_ICONBOX && !ib->nobg) || + (ib->type == IB_TYPE_SYSTRAY && (!ib->nobg || !ib->draw_icon_base)))) { - im2 = ImageclassGetImage(ib_ic_box, 0, 0, STATE_NORMAL); + /* Start out with iconbox image class image */ + im2 = ImageclassGetImage(ib->ic_box, 0, 0, STATE_NORMAL); imlib_context_set_image(im2); ww = imlib_image_get_width(); hh = imlib_image_get_height(); - im = imlib_create_cropped_scaled_image(0, 0, ww, hh, w, h); - imlib_context_set_image(im2); + im = imlib_create_cropped_scaled_image(0, 0, ww, hh, ib_w0, ib_h0); imlib_free_image(); } else { - im = imlib_create_image(w, h); + /* Start out with blank image */ + im = imlib_create_image(ib_w0, ib_h0); imlib_context_set_image(im); imlib_image_set_has_alpha(1); imlib_context_set_blend(0); imlib_context_set_color(0, 0, 0, 0); - imlib_image_fill_rectangle(0, 0, w, h); - } - - x = ib_x0; - y = ib_y0; - if (ib_ic_box) - { - x += ib_ic_box->padding.left; - y += ib_ic_box->padding.top; + imlib_image_fill_rectangle(0, 0, ib_w0, ib_h0); } for (i = 0; i < ib->num_objs; i++) { - EWin *ewin; + IboxOject *ibo; - w = 8; - h = 8; + ibo = &ib->objs[i]; - if (ib->type == IB_TYPE_ICONBOX) + if (ib->draw_icon_base && ib->im_item_base) { - if (ib->draw_icon_base) - { - ImageClass *ic; + imlib_context_set_image(ib->im_item_base); + ww = imlib_image_get_width(); + hh = imlib_image_get_height(); + imlib_context_set_image(im); + imlib_context_set_blend(1); + imlib_blend_image_onto_image(ib->im_item_base, 1, 0, 0, + ww, hh, ibo->xo, ibo->yo, + ibo->wo, ibo->ho); + imlib_context_set_blend(0); + } - /* get the base pixmap */ - ic = ImageclassFind("DEFAULT_ICON_BUTTON", 0); - if (ic) - { - im2 = ImageclassGetImage(ic, 0, 0, STATE_NORMAL); - imlib_context_set_image(im2); - ww = imlib_image_get_width(); - hh = imlib_image_get_height(); - imlib_context_set_image(im); - imlib_context_set_blend(0); - imlib_blend_image_onto_image(im2, 1, 0, 0, ww, hh, - x, y, ib->iconsize, - ib->iconsize); -#if 0 - imlib_context_set_image(im2); - imlib_free_image(); -#endif - } - } + if (ib->type == IB_TYPE_ICONBOX) + { + EWin *ewin; - ewin = ib->objs[i].ewin; + ewin = ib->objs[i].u.ewin; - if (!ewin->icon_image) - UpdateAppIcon(ewin, ib->icon_mode); if (ewin->icon_image) { - int xoff, yoff; - - IconboxFindIconSize(ib, ewin->icon_image, ewin->icon_type, &w, - &h); - - if (ib->draw_icon_base) - { - xoff = (ib->iconsize - w) / 2; - yoff = (ib->iconsize - h) / 2; - } - else if (ib->orientation) - { - xoff = (ib->iconsize - w) / 2; - yoff = 0; - } - else - { - xoff = 0; - yoff = (ib->iconsize - h) / 2; - } - imlib_context_set_image(ewin->icon_image); ww = imlib_image_get_width(); hh = imlib_image_get_height(); @@ -1938,46 +1913,39 @@ imlib_context_set_blend(1); imlib_blend_image_onto_image(ewin->icon_image, 1, 0, 0, ww, hh, - x + xoff, y + yoff, w, h); + ibo->xi, ibo->yi, ibo->wi, + ibo->hi); + imlib_context_set_blend(0); imlib_context_set_anti_alias(0); } } else { - if (ib->objs[i].swin->mapped) + if (ib->objs[i].u.swin->mapped) { - w = h = ib->iconsize; - EMoveResizeWindow(ib->objs[i].swin->win, x, y, w, h); - } - else - { - w = h = 0; + EMoveResizeWindow(ib->objs[i].u.swin->win, + ibo->xi, ibo->yi, ibo->wi, ibo->hi); } } - - if (ib->orientation) - y += (ib->draw_icon_base) ? ib->iconsize : h + 2; - else - x += (ib->draw_icon_base) ? ib->iconsize : w + 2; } - if (ib->pmap != None) - imlib_free_pixmap_and_mask(ib->pmap); - ib->pmap = ib->mask = None; imlib_context_set_drawable(ib->icon_win); imlib_context_set_image(im); imlib_image_set_has_alpha(1); - imlib_render_pixmaps_for_whole_image(&ib->pmap, &ib->mask); - ESetWindowBackgroundPixmap(ib->icon_win, ib->pmap); - EShapeCombineMask(ib->icon_win, ShapeBounding, 0, 0, ib->mask, ShapeSet); + pmap = mask = None; + imlib_render_pixmaps_for_whole_image(&pmap, &mask); + ESetWindowBackgroundPixmap(ib->icon_win, pmap); + EShapeCombineMask(ib->icon_win, ShapeBounding, 0, 0, mask, ShapeSet); if (ib->nobg && ib->num_objs == 0) EMoveWindow(ib->icon_win, -ib->w, -ib->h); + imlib_free_pixmap_and_mask(pmap); imlib_free_image(); EClearWindow(ib->icon_win); + if (ib->type == IB_TYPE_SYSTRAY && ib->nobg && !ib->draw_icon_base) + PropagateShapes(ib->icon_win); PropagateShapes(ib->win); ICCCM_GetShapeInfo(ib->ewin); - EwinPropagateShapes(ib->ewin); Mode.queue_up = pq; } @@ -2092,17 +2060,26 @@ else if (ev->xbutton.button == 3) IB_ShowMenu(ib, ev->xbutton.x, ev->xbutton.y); break; + case ButtonRelease: if (!ib->scrollbox_clicked) break; - ib->scrollbox_clicked = 0; - GetWinXY(ib->scrollbar_win, &x, &y); - GetWinWH(ib->scrollbar_win, (unsigned int *)&w, (unsigned int *)&h); - if (ev->xbutton.x < x) - IB_Scroll(ib, -8); - if (ev->xbutton.x > (x + w)) - IB_Scroll(ib, 8); + EGetGeometry(ib->scrollbar_win, NULL, &x, &y, &w, &h, NULL, NULL); + if (ib->orientation) + { + if (ev->xbutton.y < y) + IB_Scroll(ib, -8); + else if (ev->xbutton.y > (y + h)) + IB_Scroll(ib, 8); + } + else + { + if (ev->xbutton.x < x) + IB_Scroll(ib, -8); + else if (ev->xbutton.x > (x + w)) + IB_Scroll(ib, 8); + } break; } } @@ -2111,8 +2088,8 @@ IboxEventScrollbarWin(XEvent * ev, void *prm) { Iconbox *ib = (Iconbox *) prm; - static int px, py; - int dx, dy, bs, x, y; + static int px, py, pos0; + int bs, dp, ppos; ImageClass *ic; switch (ev->type) @@ -2122,6 +2099,7 @@ { px = ev->xbutton.x_root; py = ev->xbutton.y_root; + pos0 = ib->pos; ib->scrollbar_clicked = 1; } else if (ev->xbutton.button == 3) @@ -2145,43 +2123,32 @@ if (!ib->scrollbar_clicked) break; - dx = ev->xmotion.x_root - px; - dy = ev->xmotion.y_root - py; - px = ev->xmotion.x_root; - py = ev->xmotion.y_root; - if (ib->orientation) { ic = ImageclassFind("ICONBOX_SCROLLBAR_BASE_VERTICAL", 0); - GetWinXY(ib->scrollbar_win, &x, &y); bs = ib->h - (ib->arrow_thickness * 2); if (ic) - { - bs -= (ic->padding.top + ic->padding.bottom); - y -= ic->padding.top; - } + bs -= (ic->padding.top + ic->padding.bottom); if (bs < 1) bs = 1; - ib->pos = ((y + dy + 1) * ib->max) / bs; - IB_FixPos(ib); - IconboxRedraw(ib); + dp = ev->xmotion.y_root - py; } else { ic = ImageclassFind("ICONBOX_SCROLLBAR_BASE_HORIZONTAL", 0); - GetWinXY(ib->scrollbar_win, &x, &y); bs = ib->w - (ib->arrow_thickness * 2); if (ic) - { - bs -= (ic->padding.left + ic->padding.right); - x -= ic->padding.left; - } + bs -= (ic->padding.left + ic->padding.right); if (bs < 1) bs = 1; - ib->pos = ((x + dx + 1) * ib->max) / bs; - IB_FixPos(ib); - IconboxRedraw(ib); + dp = ev->xmotion.x_root - px; } + ppos = ib->pos; + ib->pos = pos0 + (dp * ib->max) / bs; + IB_FixPos(ib); + if (ib->pos != ppos) + IconboxRedraw(ib); + break; } IB_DrawScroll(ib); } @@ -2251,7 +2218,7 @@ if (!ib->arrow2_clicked) break; ib->arrow2_clicked = 0; - IB_Scroll(ib, -8); + IB_Scroll(ib, 8); break; case EnterNotify: @@ -2272,9 +2239,8 @@ static EWin *name_ewin = NULL; ToolTip *tt; EWin *ewin; - EWin **gwins; - int j, numg; - char iconified; + int x, y; + const char *name; switch (ev->type) { @@ -2291,60 +2257,46 @@ ib->icon_clicked = 0; ewin = IB_FindIcon(ib, ev->xbutton.x, ev->xbutton.y); - if (ewin) - { - tt = FindItem("ICONBOX", 0, LIST_FINDBY_NAME, LIST_TYPE_TOOLTIP); - if (tt) - TooltipHide(tt); - gwins = ListWinGroupMembersForEwin(ewin, GROUP_ACTION_ICONIFY, - Mode.nogroup, &numg); - iconified = ewin->iconified; + if (!ewin) + break; - if (gwins) - { - for (j = 0; j < numg; j++) - { - if ((gwins[j]->iconified) && (iconified)) - EwinDeIconify(gwins[j]); - } - Efree(gwins); - } - } + tt = FindItem("ICONBOX", 0, LIST_FINDBY_NAME, LIST_TYPE_TOOLTIP); + if (tt) + TooltipHide(tt); + + EwinOpIconify(ewin, 0); break; case MotionNotify: + x = ev->xmotion.x; + y = ev->xmotion.y; + goto do_motion; + case EnterNotify: - if (ev->type == MotionNotify) - { - ewin = IB_FindIcon(ib, ev->xmotion.x, ev->xmotion.y); - Mode.x = ev->xmotion.x_root; - Mode.y = ev->xmotion.y_root; - } - else - { - ewin = IB_FindIcon(ib, ev->xcrossing.x, ev->xcrossing.y); - Mode.x = ev->xcrossing.x_root; - Mode.y = ev->xcrossing.y_root; - } + x = ev->xcrossing.x; + y = ev->xcrossing.y; + goto do_motion; - if (ib->shownames && ewin != name_ewin) - { - tt = FindItem("ICONBOX", 0, LIST_FINDBY_NAME, LIST_TYPE_TOOLTIP); - if (tt) - { - const char *name; + do_motion: + if (!ib->shownames) + break; - TooltipHide(tt); - if (ewin) - { + ewin = IB_FindIcon(ib, x, y); + if (ewin == name_ewin) + break; + name_ewin = ewin; - name = EwinGetIconName(ewin); - if (name) - TooltipShow(tt, name, NULL, Mode.x, Mode.y); - } - } - name_ewin = ewin; - } + tt = FindItem("ICONBOX", 0, LIST_FINDBY_NAME, LIST_TYPE_TOOLTIP); + if (!tt) + break; + + TooltipHide(tt); + if (!ewin) + break; + + name = EwinGetIconName(ewin); + if (name) + TooltipShow(tt, name, NULL, Mode.x, Mode.y); break; case LeaveNotify: @@ -2358,26 +2310,6 @@ } } -#if 0 -static void -IboxEventScrolWin(XEvent * ev, void *prm) -{ - MenuItem *mi = (MenuItem *) prm; - - switch (ev->type) - { - case ButtonPress: - break; - case ButtonRelease: - break; - case EnterNotify: - break; - case LeaveNotify: - break; - } -} -#endif - /* * Configuration dialog */ @@ -2429,10 +2361,24 @@ } static void +CB_IconSizeSlider(Dialog * d, int val __UNUSED__, void *data) +{ + DItem *di; + char s[256]; + + di = data; + Esnprintf(s, sizeof(s), _("Icon size: %2d"), tmp_ib_iconsize); + DialogItemTextSetText(di, s); + DialogDrawItems(d, di, 0, 0, 99999, 99999); +} + +static void IconboxConfigure(Iconbox * ib) { Dialog *d; - DItem *table, *di, *radio1, *radio2, *radio3, *radio4, *table2; + DItem *di, *table, *table2; + DItem *radio1, *radio2, *radio3, *radio4, *label; + char s[256]; if (!ib) return; @@ -2616,11 +2562,12 @@ DialogItemSetFill(di, 1, 0); DialogItemSeparatorSetOrientation(di, 0); - di = DialogAddItem(table, DITEM_TEXT); + label = di = DialogAddItem(table, DITEM_TEXT); DialogItemSetPadding(di, 2, 2, 2, 2); DialogItemSetFill(di, 0, 0); DialogItemSetAlign(di, 0, 512); - DialogItemTextSetText(di, _("Icon size")); + Esnprintf(s, sizeof(s), _("Icon size: %2d"), tmp_ib_iconsize); + DialogItemTextSetText(di, s); di = DialogAddItem(table, DITEM_SLIDER); DialogItemSetPadding(di, 2, 2, 2, 2); @@ -2630,6 +2577,7 @@ DialogItemSliderSetJump(di, 8); DialogItemSliderSetVal(di, tmp_ib_iconsize); DialogItemSliderSetValPtr(di, &tmp_ib_iconsize); + DialogItemSetCallback(di, CB_IconSizeSlider, 0, label); di = DialogAddItem(table, DITEM_SEPARATOR); DialogItemSetPadding(di, 2, 2, 2, 2); @@ -3096,7 +3044,7 @@ int i; for (i = 0; i < ib->num_objs; i++) - if (ib->objs[i].swin->win == win) + if (ib->objs[i].u.swin->win == win) return i; return -1; @@ -3143,8 +3091,8 @@ XReparentWindow(disp, win, ib->icon_win, 0, 0); if (swin->mapped) { - IconboxRedraw(ib); XMapWindow(disp, win); + IconboxRedraw(ib); } EventCallbackRegister(win, 0, SystrayEvent, ib); @@ -3163,7 +3111,7 @@ if (i < 0) return; - if (IconboxObjectDel(ib, ib->objs[i].swin) == 0) + if (IconboxObjectDel(ib, ib->objs[i].u.swin) == 0) IconboxRedraw(ib); } @@ -3178,7 +3126,7 @@ if (i < 0) return; - swin = ib->objs[i].swin; + swin = ib->objs[i].u.swin; SystrayGetXembedInfo(win, xembed_info); if (EventDebug(EDBUG_TYPE_ICONBOX)) @@ -3190,21 +3138,25 @@ return; if (map) - XMapWindow(disp, win); + EMapWindow(win); else - XUnmapWindow(disp, win); + EUnmapWindow(win); swin->mapped = map; IconboxRedraw(ib); } static void -IconboxObjSwinFree(Iconbox * ib __UNUSED__, SWin * swin) +IconboxObjSwinFree(Iconbox * ib, SWin * swin) { if (EventDebug(EDBUG_TYPE_ICONBOX)) Eprintf("IconboxObjSwinFree %#lx\n", swin->win); + if (disp) { + EventCallbackUnregister(swin->win, 0, SystrayEvent, ib); + EUnregisterWindow(swin->win); + XUnmapWindow(disp, swin->win); XReparentWindow(disp, swin->win, VRoot.win, 0, 0); } @@ -3321,3 +3273,9 @@ ecore_x_client_message32_send(VRoot.win, E_XA_MANAGER, StructureNotifyMask, CurrentTime, _NET_SYSTEM_TRAY_Sx, win, 0, 0); } + +static void +SystrayExit(Iconbox * ib) +{ + EventCallbackUnregister(ib->win, 0, SystrayEvent, ib); +} ------------------------------------------------------- SF email is sponsored by - The IT Product Guide Read honest & candid reviews on hundreds of IT Products from real users. Discover which products truly live up to the hype. Start reading now. http://ads.osdn.com/?ad_id=6595&alloc_id=14396&op=click _______________________________________________ enlightenment-cvs mailing list enlightenment-cvs@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/enlightenment-cvs