/* -*-c-*- */ /* This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ #include "config.h" #include "libs/fvwmlib.h" #include "libs/ColorUtils.h" #include "libs/Graphics.h" #include "Tools.h" /* left, center and right offsets */ #define ITEM_DRAW_LCR_OFFSETS 1,0,1 /* * Fonction pour ItemDraw / functions for ItemDraw */ void InitItemDraw(struct XObj *xobj) { unsigned long mask; XSetWindowAttributes Attr; int minHeight,minWidth; /* Enregistrement des couleurs et de la police */ if (xobj->colorset >= 0) { xobj->TabColor[fore] = Colorset[xobj->colorset].fg; xobj->TabColor[back] = Colorset[xobj->colorset].bg; xobj->TabColor[hili] = Colorset[xobj->colorset].hilite; xobj->TabColor[shad] = Colorset[xobj->colorset].shadow; } else { xobj->TabColor[fore] = GetColor(xobj->forecolor); xobj->TabColor[back] = GetColor(xobj->backcolor); xobj->TabColor[hili] = GetColor(xobj->hilicolor); xobj->TabColor[shad] = GetColor(xobj->shadcolor); } Attr.background_pixel = xobj->TabColor[back]; mask = CWBackPixel; xobj->win = XCreateWindow(dpy, *xobj->ParentWin, xobj->x, xobj->y, xobj->width, xobj->height, 0, CopyFromParent, InputOutput, CopyFromParent, mask, &Attr); xobj->gc = fvwmlib_XCreateGC(dpy, xobj->win, 0, NULL); XSetForeground(dpy, xobj->gc, xobj->TabColor[fore]); if ((xobj->Ffont = FlocaleLoadFont(dpy, xobj->font, ScriptName)) == NULL) { fprintf(stderr, "%s: Couldn't load font. Exiting!\n", ScriptName); exit(1); } if (xobj->Ffont->font != NULL) XSetFont(dpy, xobj->gc, xobj->Ffont->font->fid); XSetLineAttributes(dpy, xobj->gc, 1, LineSolid, CapRound, JoinMiter); /* Redimensionnement du widget */ if (xobj->icon == NULL) { if (strlen(xobj->title) != 0) { /* title but no icon */ minHeight = xobj->Ffont->height + 2; minWidth = FlocaleTextWidth(xobj->Ffont, xobj->title, strlen(xobj->title)) + 2; if (xobj->height < minHeight) xobj->height = minHeight; if (xobj->width < minWidth) xobj->width = minWidth; } } else if (strlen(xobj->title)==0) { /* icon but no title */ if (xobj->heighticon_h) xobj->height = xobj->icon_h; if (xobj->widthicon_w) xobj->width = xobj->icon_w; } else { /* title and icon */ if (xobj->icon_w > FlocaleTextWidth(xobj->Ffont, xobj->title, strlen(xobj->title))+2) { /* icon is wider than the title */ if (xobj->widthicon_w) xobj->width = xobj->icon_w; } else { /* title is wider than icon */ if (xobj->width < FlocaleTextWidth(xobj->Ffont, xobj->title, strlen(xobj->title)) + 2) xobj->width = FlocaleTextWidth(xobj->Ffont, xobj->title, strlen(xobj->title)) + 2; } xobj->height = xobj->icon_h+ xobj->Ffont->height + 2; } XResizeWindow(dpy, xobj->win, xobj->width, xobj->height); if (xobj->colorset >= 0) SetWindowBackground(dpy, xobj->win, xobj->width, xobj->height, &Colorset[xobj->colorset], Pdepth, xobj->gc, True); XSelectInput(dpy, xobj->win, ExposureMask); /* x and y value of a clic */ xobj->value2 = -1; xobj->value3 = -1; } void DestroyItemDraw(struct XObj *xobj) { FlocaleUnloadFont(dpy,xobj->Ffont); XFreeGC(dpy,xobj->gc); XDestroyWindow(dpy,xobj->win); } void DrawItemDraw(struct XObj *xobj, XEvent *evp) { if (evp) { XClearArea( dpy,xobj->win, evp->xexpose.x, evp->xexpose.y, evp->xexpose.width, evp->xexpose.height, False); } else { XClearArea(dpy,xobj->win,0,0,xobj->width,xobj->height,False); } DrawIconStr(0,xobj,False,ITEM_DRAW_LCR_OFFSETS, NULL, NULL, evp); } void EvtMouseItemDraw(struct XObj *xobj,XButtonEvent *EvtButton) { unsigned int modif; int x1,x2,y1,y2; Window Win1,Win2; FQueryPointer(dpy, *xobj->ParentWin, &Win1, &Win2, &x1, &y1, &x2, &y2, &modif); xobj->value2 = x2-xobj->x; xobj->value3 = y2-xobj->y; SendMsg(xobj,SingleClic); } void EvtKeyItemDraw(struct XObj *xobj, XKeyEvent *EvtKey) { KeySym ks; unsigned char buf[10]; unsigned int modif; int x1,x2,y1,y2; Window Win1,Win2; FQueryPointer(dpy, *xobj->ParentWin, &Win1, &Win2, &x1, &y1, &x2, &y2, &modif); xobj->value2 = x2-xobj->x; xobj->value3 = y2-xobj->y; XLookupString(EvtKey, (char *)buf, sizeof(buf), &ks, NULL); if (ks == XK_Left && xobj->value2 > 0) { FWarpPointer(dpy, None, None, 0, 0, 0, 0, -1, 0); } else if (ks == XK_Right && xobj->value2 < xobj->width - 1) { FWarpPointer(dpy, None, None, 0, 0, 0, 0, 1, 0); } else if (ks == XK_Up && xobj->value3 > 0) { FWarpPointer(dpy, None, None, 0, 0, 0, 0, 0, -1); } else if (ks == XK_Down && xobj->value3 < xobj->height - 1) { FWarpPointer(dpy, None, None, 0, 0, 0, 0, 0, 1); } else if (ks == XK_Return) { EvtMouseItemDraw(xobj, NULL); } } void ProcessMsgItemDraw(struct XObj *xobj,unsigned long type,unsigned long *body) { }