mirror of
https://github.com/gryf/wmaker.git
synced 2025-12-20 04:48:06 +01:00
- Support for multiline balloons (Vitaly Ovtchinnikov <ov@rbcmail.ru>)
This commit is contained in:
@@ -80,6 +80,7 @@ Changes since version 0.80.2:
|
|||||||
- Fixed e memory leak in the code that reads a localized root menu
|
- Fixed e memory leak in the code that reads a localized root menu
|
||||||
- Added support for generating pkgconfig files for WINGS, wmlib and wrlib.
|
- Added support for generating pkgconfig files for WINGS, wmlib and wrlib.
|
||||||
("Marcelo E. Magallon" <mmagallo@debian.org>)
|
("Marcelo E. Magallon" <mmagallo@debian.org>)
|
||||||
|
- Support for multiline balloons (Vitaly Ovtchinnikov <ov@rbcmail.ru>)
|
||||||
|
|
||||||
|
|
||||||
Changes since version 0.80.1:
|
Changes since version 0.80.1:
|
||||||
|
|||||||
234
src/balloon.c
234
src/balloon.c
@@ -81,6 +81,79 @@ typedef struct _WBalloon {
|
|||||||
#define BRIGHT (BOTTOM|RIGHT)
|
#define BRIGHT (BOTTOM|RIGHT)
|
||||||
|
|
||||||
|
|
||||||
|
static int
|
||||||
|
countLines(const char *text)
|
||||||
|
{
|
||||||
|
const char *p = text;
|
||||||
|
int h = 1;
|
||||||
|
|
||||||
|
while (*p) {
|
||||||
|
if (*p == '\n' && p[1] != 0)
|
||||||
|
h++;
|
||||||
|
p++;
|
||||||
|
}
|
||||||
|
return h;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
static int
|
||||||
|
getMaxStringWidth(WMFont *font, char *text)
|
||||||
|
{
|
||||||
|
char *p = text;
|
||||||
|
char *pb = p;
|
||||||
|
int pos = 0;
|
||||||
|
int w = 0, wt;
|
||||||
|
|
||||||
|
while (*p) {
|
||||||
|
if (*p == '\n') {
|
||||||
|
wt = WMWidthOfString(font, pb, pos);
|
||||||
|
if (wt > w)
|
||||||
|
w = wt;
|
||||||
|
pos = 0;
|
||||||
|
pb = p + 1;
|
||||||
|
} else {
|
||||||
|
pos++;
|
||||||
|
}
|
||||||
|
p++;
|
||||||
|
}
|
||||||
|
if (pos > 0) {
|
||||||
|
wt = WMWidthOfString(font, pb, pos);
|
||||||
|
if (wt > w)
|
||||||
|
w = wt;
|
||||||
|
}
|
||||||
|
return w;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
static void
|
||||||
|
drawMultiLineString(WMScreen *scr, Pixmap pixmap, WMColor *color,
|
||||||
|
WMFont *font, int x, int y, char *text, int len)
|
||||||
|
{
|
||||||
|
char *p = text;
|
||||||
|
char *pb = p;
|
||||||
|
int l = 0, pos = 0;
|
||||||
|
int height = WMFontHeight(font);
|
||||||
|
|
||||||
|
while (*p && p - text < len) {
|
||||||
|
if (*p == '\n') {
|
||||||
|
WMDrawString(scr, pixmap, color, font, x, y + l * height, pb,
|
||||||
|
pos);
|
||||||
|
l++;
|
||||||
|
pos = 0;
|
||||||
|
pb = p + 1;
|
||||||
|
} else {
|
||||||
|
pos++;
|
||||||
|
}
|
||||||
|
p++;
|
||||||
|
}
|
||||||
|
if (pos > 0) {
|
||||||
|
WMDrawString(scr, pixmap, color, font, x, y + l * height, pb, pos);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
#ifdef SHAPED_BALLOON
|
#ifdef SHAPED_BALLOON
|
||||||
|
|
||||||
#define SPACE 12
|
#define SPACE 12
|
||||||
@@ -92,73 +165,81 @@ drawBalloon(WScreen *scr, Pixmap bitmap, Pixmap pix, int x, int y, int w,
|
|||||||
{
|
{
|
||||||
GC bgc = scr->balloon->monoGC;
|
GC bgc = scr->balloon->monoGC;
|
||||||
GC gc = scr->draw_gc;
|
GC gc = scr->draw_gc;
|
||||||
int rad = h*3/10;
|
int rad = h * 3 / 10;
|
||||||
XPoint pt[3], ipt[3];
|
XPoint pt[3], ipt[3];
|
||||||
int w1;
|
int w1;
|
||||||
|
|
||||||
/* outline */
|
/* outline */
|
||||||
XSetForeground(dpy, bgc, 1);
|
XSetForeground(dpy, bgc, 1);
|
||||||
|
|
||||||
XFillArc(dpy, bitmap, bgc, x, y, rad, rad, 90*64, 90*64);
|
XFillArc(dpy, bitmap, bgc, x, y, rad, rad, 90 * 64, 90 * 64);
|
||||||
XFillArc(dpy, bitmap, bgc, x, y+h-1-rad, rad, rad, 180*64, 90*64);
|
XFillArc(dpy, bitmap, bgc, x, y + h - 1 - rad, rad, rad, 180 * 64,
|
||||||
|
90 * 64);
|
||||||
|
|
||||||
XFillArc(dpy, bitmap, bgc, x+w-1-rad, y, rad, rad, 0*64, 90*64);
|
XFillArc(dpy, bitmap, bgc, x + w - 1 - rad, y, rad, rad, 0 * 64,
|
||||||
XFillArc(dpy, bitmap, bgc, x+w-1-rad, y+h-1-rad, rad, rad, 270*64, 90*64);
|
90 * 64);
|
||||||
|
XFillArc(dpy, bitmap, bgc, x + w - 1 - rad, y + h - 1 - rad, rad, rad,
|
||||||
|
270 * 64, 90 * 64);
|
||||||
|
|
||||||
XFillRectangle(dpy, bitmap, bgc, x, y+rad/2, w, h-rad);
|
XFillRectangle(dpy, bitmap, bgc, x, y + rad / 2, w, h - rad);
|
||||||
XFillRectangle(dpy, bitmap, bgc, x+rad/2, y, w-rad, h);
|
XFillRectangle(dpy, bitmap, bgc, x + rad / 2, y, w - rad, h);
|
||||||
|
|
||||||
/* interior */
|
/* interior */
|
||||||
XSetForeground(dpy, gc, scr->white_pixel);
|
XSetForeground(dpy, gc, scr->white_pixel);
|
||||||
|
|
||||||
XFillArc(dpy, pix, gc, x+1, y+1, rad, rad, 90*64, 90*64);
|
XFillArc(dpy, pix, gc, x + 1, y + 1, rad, rad, 90 * 64, 90 * 64);
|
||||||
XFillArc(dpy, pix, gc, x+1, y+h-2-rad, rad, rad, 180*64, 90*64);
|
XFillArc(dpy, pix, gc, x + 1, y + h - 2 - rad, rad, rad, 180 * 64,
|
||||||
|
90 * 64);
|
||||||
|
|
||||||
XFillArc(dpy, pix, gc, x+w-2-rad, y+1, rad, rad, 0*64, 90*64);
|
XFillArc(dpy, pix, gc, x + w - 2 - rad, y + 1, rad, rad, 0 * 64,
|
||||||
XFillArc(dpy, pix, gc, x+w-2-rad, y+h-2-rad, rad, rad, 270*64, 90*64);
|
90 * 64);
|
||||||
|
XFillArc(dpy, pix, gc, x + w - 2 - rad, y + h - 2 - rad, rad, rad,
|
||||||
|
270 * 64, 90 * 64);
|
||||||
|
|
||||||
XFillRectangle(dpy, pix, gc, x+1, y+1+rad/2, w-2, h-2-rad);
|
XFillRectangle(dpy, pix, gc, x + 1, y + 1 + rad / 2, w - 2,
|
||||||
XFillRectangle(dpy, pix, gc, x+1+rad/2, y+1, w-2-rad, h-2);
|
h - 2 - rad);
|
||||||
|
XFillRectangle(dpy, pix, gc, x + 1 + rad / 2, y + 1, w - 2 - rad,
|
||||||
|
h - 2);
|
||||||
|
|
||||||
if (side & BOTTOM) {
|
if (side & BOTTOM) {
|
||||||
pt[0].y = y+h-1;
|
pt[0].y = y + h - 1;
|
||||||
pt[1].y = y+h-1+SPACE;
|
pt[1].y = y + h - 1 + SPACE;
|
||||||
pt[2].y = y+h-1;
|
pt[2].y = y + h - 1;
|
||||||
ipt[0].y = pt[0].y-1;
|
ipt[0].y = pt[0].y - 1;
|
||||||
ipt[1].y = pt[1].y-1;
|
ipt[1].y = pt[1].y - 1;
|
||||||
ipt[2].y = pt[2].y-1;
|
ipt[2].y = pt[2].y - 1;
|
||||||
} else {
|
} else {
|
||||||
pt[0].y = y;
|
pt[0].y = y;
|
||||||
pt[1].y = y-SPACE;
|
pt[1].y = y - SPACE;
|
||||||
pt[2].y = y;
|
pt[2].y = y;
|
||||||
ipt[0].y = pt[0].y+1;
|
ipt[0].y = pt[0].y + 1;
|
||||||
ipt[1].y = pt[1].y+1;
|
ipt[1].y = pt[1].y + 1;
|
||||||
ipt[2].y = pt[2].y+1;
|
ipt[2].y = pt[2].y + 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
/*w1 = WMAX(h, 24);*/
|
/*w1 = WMAX(h, 24); */
|
||||||
w1 = WMAX(h, 21);
|
w1 = WMAX(h, 21);
|
||||||
|
|
||||||
if (side & RIGHT) {
|
if (side & RIGHT) {
|
||||||
pt[0].x = x+w-w1+2*w1/16;
|
pt[0].x = x + w - w1 + 2 * w1 / 16;
|
||||||
pt[1].x = x+w-w1+11*w1/16;
|
pt[1].x = x + w - w1 + 11 * w1 / 16;
|
||||||
pt[2].x = x+w-w1+7*w1/16;
|
pt[2].x = x + w - w1 + 7 * w1 / 16;
|
||||||
ipt[0].x = x+1+w-w1+2*(w1-1)/16;
|
ipt[0].x = x + 1 + w - w1 + 2 * (w1 - 1) / 16;
|
||||||
ipt[1].x = x+1+w-w1+11*(w1-1)/16;
|
ipt[1].x = x + 1 + w - w1 + 11 * (w1 - 1) / 16;
|
||||||
ipt[2].x = x+1+w-w1+7*(w1-1)/16;
|
ipt[2].x = x + 1 + w - w1 + 7 * (w1 - 1) / 16;
|
||||||
/*ipt[0].x = pt[0].x+1;
|
/*ipt[0].x = pt[0].x+1;
|
||||||
ipt[1].x = pt[1].x;
|
ipt[1].x = pt[1].x;
|
||||||
ipt[2].x = pt[2].x;*/
|
ipt[2].x = pt[2].x; */
|
||||||
} else {
|
} else {
|
||||||
pt[0].x = x+w1-2*w1/16;
|
pt[0].x = x + w1 - 2 * w1 / 16;
|
||||||
pt[1].x = x+w1-11*w1/16;
|
pt[1].x = x + w1 - 11 * w1 / 16;
|
||||||
pt[2].x = x+w1-7*w1/16;
|
pt[2].x = x + w1 - 7 * w1 / 16;
|
||||||
ipt[0].x = x-1+w1-2*(w1-1)/16;
|
ipt[0].x = x - 1 + w1 - 2 * (w1 - 1) / 16;
|
||||||
ipt[1].x = x-1+w1-11*(w1-1)/16;
|
ipt[1].x = x - 1 + w1 - 11 * (w1 - 1) / 16;
|
||||||
ipt[2].x = x-1+w1-7*(w1-1)/16;
|
ipt[2].x = x - 1 + w1 - 7 * (w1 - 1) / 16;
|
||||||
/*ipt[0].x = pt[0].x-1;
|
/*ipt[0].x = pt[0].x-1;
|
||||||
ipt[1].x = pt[1].x;
|
ipt[1].x = pt[1].x;
|
||||||
ipt[2].x = pt[2].x;*/
|
ipt[2].x = pt[2].x; */
|
||||||
}
|
}
|
||||||
|
|
||||||
XFillPolygon(dpy, bitmap, bgc, pt, 3, Convex, CoordModeOrigin);
|
XFillPolygon(dpy, bitmap, bgc, pt, 3, Convex, CoordModeOrigin);
|
||||||
@@ -187,18 +268,23 @@ makePixmap(WScreen *scr, int width, int height, int side, Pixmap *mask)
|
|||||||
Pixmap pixmap;
|
Pixmap pixmap;
|
||||||
int x, y;
|
int x, y;
|
||||||
|
|
||||||
bitmap = XCreatePixmap(dpy, scr->root_win, width+SPACE, height+SPACE, 1);
|
bitmap =
|
||||||
|
XCreatePixmap(dpy, scr->root_win, width + SPACE, height + SPACE,
|
||||||
|
1);
|
||||||
|
|
||||||
if (!bal->monoGC) {
|
if (!bal->monoGC) {
|
||||||
bal->monoGC = XCreateGC(dpy, bitmap, 0, NULL);
|
bal->monoGC = XCreateGC(dpy, bitmap, 0, NULL);
|
||||||
}
|
}
|
||||||
XSetForeground(dpy, bal->monoGC, 0);
|
XSetForeground(dpy, bal->monoGC, 0);
|
||||||
XFillRectangle(dpy, bitmap, bal->monoGC, 0, 0, width+SPACE, height+SPACE);
|
XFillRectangle(dpy, bitmap, bal->monoGC, 0, 0, width + SPACE,
|
||||||
|
height + SPACE);
|
||||||
|
|
||||||
pixmap = XCreatePixmap(dpy, scr->root_win, width+SPACE, height+SPACE,
|
pixmap =
|
||||||
|
XCreatePixmap(dpy, scr->root_win, width + SPACE, height + SPACE,
|
||||||
scr->w_depth);
|
scr->w_depth);
|
||||||
XSetForeground(dpy, scr->draw_gc, scr->black_pixel);
|
XSetForeground(dpy, scr->draw_gc, scr->black_pixel);
|
||||||
XFillRectangle(dpy, pixmap, scr->draw_gc, 0, 0, width+SPACE, height+SPACE);
|
XFillRectangle(dpy, pixmap, scr->draw_gc, 0, 0, width + SPACE,
|
||||||
|
height + SPACE);
|
||||||
|
|
||||||
if (side & BOTTOM) {
|
if (side & BOTTOM) {
|
||||||
y = 0;
|
y = 0;
|
||||||
@@ -230,8 +316,8 @@ showText(WScreen *scr, int x, int y, int h, int w, char *text)
|
|||||||
if (scr->balloon->contents)
|
if (scr->balloon->contents)
|
||||||
XFreePixmap(dpy, scr->balloon->contents);
|
XFreePixmap(dpy, scr->balloon->contents);
|
||||||
|
|
||||||
width = WMWidthOfString(font, text, strlen(text))+16;
|
width = getMaxStringWidth(font, text) + 16;
|
||||||
height = WMFontHeight(font) + 4;
|
height = countLines(text) * WMFontHeight(font) + 4;
|
||||||
|
|
||||||
if (height < 16)
|
if (height < 16)
|
||||||
height = 16;
|
height = 16;
|
||||||
@@ -241,19 +327,19 @@ showText(WScreen *scr, int x, int y, int h, int w, char *text)
|
|||||||
|
|
||||||
if (x + width > scr->scr_width) {
|
if (x + width > scr->scr_width) {
|
||||||
side = RIGHT;
|
side = RIGHT;
|
||||||
bx = x - width + w/2;
|
bx = x - width + w / 2;
|
||||||
if (bx < 0)
|
if (bx < 0)
|
||||||
bx = 0;
|
bx = 0;
|
||||||
} else {
|
} else {
|
||||||
side = LEFT;
|
side = LEFT;
|
||||||
bx = x + w/2;
|
bx = x + w / 2;
|
||||||
}
|
}
|
||||||
if (bx + width > scr->scr_width)
|
if (bx + width > scr->scr_width)
|
||||||
bx = scr->scr_width - width;
|
bx = scr->scr_width - width;
|
||||||
|
|
||||||
if (y - (height + SPACE) < 0) {
|
if (y - (height + SPACE) < 0) {
|
||||||
side |= TOP;
|
side |= TOP;
|
||||||
by = y+h-1;
|
by = y + h - 1;
|
||||||
ty = SPACE;
|
ty = SPACE;
|
||||||
} else {
|
} else {
|
||||||
side |= BOTTOM;
|
side |= BOTTOM;
|
||||||
@@ -262,14 +348,13 @@ showText(WScreen *scr, int x, int y, int h, int w, char *text)
|
|||||||
}
|
}
|
||||||
pixmap = makePixmap(scr, width, height, side, &mask);
|
pixmap = makePixmap(scr, width, height, side, &mask);
|
||||||
|
|
||||||
WMDrawString(scr->wmscreen, pixmap, scr->black, font, 8,
|
drawMultiLineString(scr->wmscreen, pixmap, scr->black, font, 8, ty + 2,
|
||||||
ty + (height - WMFontHeight(font))/2,
|
|
||||||
text, strlen(text));
|
text, strlen(text));
|
||||||
|
|
||||||
XSetWindowBackgroundPixmap(dpy, scr->balloon->window, pixmap);
|
XSetWindowBackgroundPixmap(dpy, scr->balloon->window, pixmap);
|
||||||
scr->balloon->contents = pixmap;
|
scr->balloon->contents = pixmap;
|
||||||
|
|
||||||
XResizeWindow(dpy, scr->balloon->window, width, height+SPACE);
|
XResizeWindow(dpy, scr->balloon->window, width, height + SPACE);
|
||||||
XShapeCombineMask(dpy, scr->balloon->window, ShapeBounding, 0, 0, mask,
|
XShapeCombineMask(dpy, scr->balloon->window, ShapeBounding, 0, 0, mask,
|
||||||
ShapeSet);
|
ShapeSet);
|
||||||
XFreePixmap(dpy, mask);
|
XFreePixmap(dpy, mask);
|
||||||
@@ -280,6 +365,8 @@ showText(WScreen *scr, int x, int y, int h, int w, char *text)
|
|||||||
scr->balloon->mapped = 1;
|
scr->balloon->mapped = 1;
|
||||||
}
|
}
|
||||||
#else /* !SHAPED_BALLOON */
|
#else /* !SHAPED_BALLOON */
|
||||||
|
|
||||||
|
|
||||||
static void
|
static void
|
||||||
showText(WScreen *scr, int x, int y, int h, int w, char *text)
|
showText(WScreen *scr, int x, int y, int h, int w, char *text)
|
||||||
{
|
{
|
||||||
@@ -291,12 +378,13 @@ showText(WScreen *scr, int x, int y, int h, int w, char *text)
|
|||||||
if (scr->balloon->contents)
|
if (scr->balloon->contents)
|
||||||
XFreePixmap(dpy, scr->balloon->contents);
|
XFreePixmap(dpy, scr->balloon->contents);
|
||||||
|
|
||||||
width = WMWidthOfString(font, text, strlen(text))+8;
|
width = getMaxStringWidth(font, text) + 8;
|
||||||
height = WMFontHeight(font) + 4;
|
/*width = WMWidthOfString(font, text, strlen(text))+8;*/
|
||||||
|
height = countLines(text) * WMFontHeight(font) + 4;
|
||||||
|
|
||||||
if (x < 0)
|
if (x < 0)
|
||||||
x = 0;
|
x = 0;
|
||||||
else if (x + width > scr->scr_width-1)
|
else if (x + width > scr->scr_width - 1)
|
||||||
x = scr->scr_width - width;
|
x = scr->scr_width - width;
|
||||||
|
|
||||||
if (y - height - 2 < 0) {
|
if (y - height - 2 < 0) {
|
||||||
@@ -313,11 +401,12 @@ showText(WScreen *scr, int x, int y, int h, int w, char *text)
|
|||||||
else
|
else
|
||||||
XSetForeground(dpy, scr->draw_gc, scr->light_pixel);
|
XSetForeground(dpy, scr->draw_gc, scr->light_pixel);
|
||||||
|
|
||||||
pixmap = XCreatePixmap(dpy, scr->root_win, width, height, scr->w_depth);
|
pixmap =
|
||||||
|
XCreatePixmap(dpy, scr->root_win, width, height, scr->w_depth);
|
||||||
XFillRectangle(dpy, pixmap, scr->draw_gc, 0, 0, width, height);
|
XFillRectangle(dpy, pixmap, scr->draw_gc, 0, 0, width, height);
|
||||||
|
|
||||||
WMDrawString(scr->wmscreen, pixmap, scr->window_title_color[0], font, 4, 2,
|
drawMultiLineString(scr->wmscreen, pixmap, scr->window_title_color[0],
|
||||||
text, strlen(text));
|
font, 4, 2, text, strlen(text));
|
||||||
|
|
||||||
XResizeWindow(dpy, scr->balloon->window, width, height);
|
XResizeWindow(dpy, scr->balloon->window, width, height);
|
||||||
XMoveWindow(dpy, scr->balloon->window, x, y);
|
XMoveWindow(dpy, scr->balloon->window, x, y);
|
||||||
@@ -354,11 +443,10 @@ showBalloon(WScreen *scr)
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
static void
|
static void
|
||||||
frameBalloon(WObjDescriptor *object)
|
frameBalloon(WObjDescriptor *object)
|
||||||
{
|
{
|
||||||
WFrameWindow *fwin = (WFrameWindow*)object->parent;
|
WFrameWindow *fwin = (WFrameWindow *) object->parent;
|
||||||
WScreen *scr = fwin->core->screen_ptr;
|
WScreen *scr = fwin->core->screen_ptr;
|
||||||
|
|
||||||
if (fwin->titlebar != object->self
|
if (fwin->titlebar != object->self
|
||||||
@@ -371,7 +459,8 @@ frameBalloon(WObjDescriptor *object)
|
|||||||
scr->balloon->text = wstrdup(fwin->title);
|
scr->balloon->text = wstrdup(fwin->title);
|
||||||
scr->balloon->objectWindow = fwin->core->window;
|
scr->balloon->objectWindow = fwin->core->window;
|
||||||
scr->balloon->timer = WMAddTimerHandler(BALLOON_DELAY,
|
scr->balloon->timer = WMAddTimerHandler(BALLOON_DELAY,
|
||||||
(WMCallback*)showBalloon, scr);
|
(WMCallback *) showBalloon,
|
||||||
|
scr);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -379,7 +468,7 @@ frameBalloon(WObjDescriptor *object)
|
|||||||
static void
|
static void
|
||||||
miniwindowBalloon(WObjDescriptor *object)
|
miniwindowBalloon(WObjDescriptor *object)
|
||||||
{
|
{
|
||||||
WIcon *icon = (WIcon*)object->parent;
|
WIcon *icon = (WIcon *) object->parent;
|
||||||
WScreen *scr = icon->core->screen_ptr;
|
WScreen *scr = icon->core->screen_ptr;
|
||||||
|
|
||||||
if (!icon->icon_name) {
|
if (!icon->icon_name) {
|
||||||
@@ -396,23 +485,23 @@ miniwindowBalloon(WObjDescriptor *object)
|
|||||||
showBalloon(scr);
|
showBalloon(scr);
|
||||||
} else {
|
} else {
|
||||||
scr->balloon->timer = WMAddTimerHandler(BALLOON_DELAY,
|
scr->balloon->timer = WMAddTimerHandler(BALLOON_DELAY,
|
||||||
(WMCallback*)showBalloon, scr);
|
(WMCallback *) showBalloon,
|
||||||
|
scr);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
static void
|
static void
|
||||||
appiconBalloon(WObjDescriptor *object)
|
appiconBalloon(WObjDescriptor *object)
|
||||||
{
|
{
|
||||||
WAppIcon *aicon = (WAppIcon*)object->parent;
|
WAppIcon *aicon = (WAppIcon *) object->parent;
|
||||||
WScreen *scr = aicon->icon->core->screen_ptr;
|
WScreen *scr = aicon->icon->core->screen_ptr;
|
||||||
char *tmp;
|
char *tmp;
|
||||||
|
|
||||||
if (aicon->command && aicon->wm_class) {
|
if (aicon->command && aicon->wm_class) {
|
||||||
int len = strlen(aicon->command)+strlen(aicon->wm_class)+8;
|
int len = strlen(aicon->command) + strlen(aicon->wm_class) + 8;
|
||||||
tmp = wmalloc(len);
|
tmp = wmalloc(len);
|
||||||
snprintf(tmp, len, "%s (%s)", aicon->wm_class, aicon->command);
|
snprintf(tmp, len, "%s\n(%s)", aicon->wm_class, aicon->command);
|
||||||
scr->balloon->text = tmp;
|
scr->balloon->text = tmp;
|
||||||
} else if (aicon->command) {
|
} else if (aicon->command) {
|
||||||
scr->balloon->text = wstrdup(aicon->command);
|
scr->balloon->text = wstrdup(aicon->command);
|
||||||
@@ -422,7 +511,7 @@ appiconBalloon(WObjDescriptor *object)
|
|||||||
wBalloonHide(scr);
|
wBalloonHide(scr);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
scr->balloon->h = aicon->icon->core->height-2;
|
scr->balloon->h = aicon->icon->core->height - 2;
|
||||||
|
|
||||||
scr->balloon->objectWindow = aicon->icon->core->window;
|
scr->balloon->objectWindow = aicon->icon->core->window;
|
||||||
if ((scr->balloon->prevType == object->parent_type
|
if ((scr->balloon->prevType == object->parent_type
|
||||||
@@ -432,7 +521,8 @@ appiconBalloon(WObjDescriptor *object)
|
|||||||
showBalloon(scr);
|
showBalloon(scr);
|
||||||
} else {
|
} else {
|
||||||
scr->balloon->timer = WMAddTimerHandler(BALLOON_DELAY,
|
scr->balloon->timer = WMAddTimerHandler(BALLOON_DELAY,
|
||||||
(WMCallback*)showBalloon, scr);
|
(WMCallback *) showBalloon,
|
||||||
|
scr);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -450,8 +540,8 @@ wBalloonInitialize(WScreen *scr)
|
|||||||
|
|
||||||
scr->balloon = bal;
|
scr->balloon = bal;
|
||||||
|
|
||||||
vmask = CWSaveUnder|CWOverrideRedirect|CWColormap|CWBackPixel
|
vmask = CWSaveUnder | CWOverrideRedirect | CWColormap | CWBackPixel
|
||||||
|CWBorderPixel;
|
| CWBorderPixel;
|
||||||
attribs.save_under = True;
|
attribs.save_under = True;
|
||||||
attribs.override_redirect = True;
|
attribs.override_redirect = True;
|
||||||
attribs.colormap = scr->w_colormap;
|
attribs.colormap = scr->w_colormap;
|
||||||
@@ -469,7 +559,6 @@ wBalloonInitialize(WScreen *scr)
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
void
|
void
|
||||||
wBalloonEnteredObject(WScreen *scr, WObjDescriptor *object)
|
wBalloonEnteredObject(WScreen *scr, WObjDescriptor *object)
|
||||||
{
|
{
|
||||||
@@ -498,7 +587,8 @@ wBalloonEnteredObject(WScreen *scr, WObjDescriptor *object)
|
|||||||
break;
|
break;
|
||||||
|
|
||||||
case WCLASS_DOCK_ICON:
|
case WCLASS_DOCK_ICON:
|
||||||
if (object->parent != scr->clip_icon && wPreferences.appicon_balloon)
|
if (object->parent != scr->clip_icon
|
||||||
|
&& wPreferences.appicon_balloon)
|
||||||
appiconBalloon(object);
|
appiconBalloon(object);
|
||||||
else
|
else
|
||||||
wBalloonHide(scr);
|
wBalloonHide(scr);
|
||||||
@@ -536,4 +626,6 @@ wBalloonHide(WScreen *scr)
|
|||||||
scr->balloon->prevType = 0;
|
scr->balloon->prevType = 0;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user