1
0
mirror of https://github.com/gryf/wmaker.git synced 2025-12-21 21:38:00 +01:00

Real-time dock left-right swapping

No more ghost dock when switching sides: the real swap happens
immediately, you can still adjust vertically afterwards. Removed two
functions in superfluous that are no longer used
This commit is contained in:
Daniel Déchelotte
2013-04-12 01:42:43 +02:00
committed by Carlos R. Mafra
parent cf5fdca63d
commit 5e004d5f11
3 changed files with 21 additions and 189 deletions

View File

@@ -137,109 +137,6 @@ void DoKaboom(WScreen * scr, Window win, int x, int y)
#endif /* NORMAL_ICON_KABOOM */
}
static int addGhostTile(WScreen *scr, RImage *back, Pixmap which, int dy, int height,
unsigned long red_mask, unsigned long green_mask, unsigned long blue_mask)
{
XImage *img;
RImage *dock_image;
img = XGetImage(dpy, which, 0, 0, wPreferences.icon_size, height, AllPlanes, ZPixmap);
if (!img) {
RReleaseImage(back);
return -1;
}
img->red_mask = red_mask;
img->green_mask = green_mask;
img->blue_mask = blue_mask;
dock_image = RCreateImageFromXImage(scr->rcontext, img, NULL);
XDestroyImage(img);
if (!dock_image) {
RReleaseImage(back);
return -1;
}
RCombineAreaWithOpaqueness(back, dock_image, 0, 0, wPreferences.icon_size,
height, 0, dy, 30 * 256 / 100);
RReleaseImage(dock_image);
return 0;
}
Pixmap MakeGhostDock(WDock * dock, int sx, int dx, int y)
{
WScreen *scr = dock->screen_ptr;
WDrawerChain *dc;
WDock *drawer;
XImage *img;
RImage *back;
Pixmap pixmap;
int i, virtual_tiles, h, j, n;
unsigned long red_mask, green_mask, blue_mask;
virtual_tiles = 0;
for (i = 0; i < dock->max_icons; i++) {
if (dock->icon_array[i] != NULL && dock->icon_array[i]->yindex > virtual_tiles)
virtual_tiles = dock->icon_array[i]->yindex;
}
for (dc = scr->drawers; dc != NULL; dc = dc->next) {
if (dc->adrawer->y_pos - dock->y_pos > virtual_tiles * wPreferences.icon_size)
virtual_tiles = (dc->adrawer->y_pos - dock->y_pos) / wPreferences.icon_size;
}
virtual_tiles++;
h = virtual_tiles * wPreferences.icon_size;
h = (y + h > scr->scr_height) ? scr->scr_height - y : h;
virtual_tiles = h / wPreferences.icon_size; /* The visible ones */
if (h % wPreferences.icon_size)
virtual_tiles++; /* There is one partially visible tile at end */
img = XGetImage(dpy, scr->root_win, dx, y, wPreferences.icon_size, h, AllPlanes, ZPixmap);
if (!img)
return None;
red_mask = img->red_mask;
green_mask = img->green_mask;
blue_mask = img->blue_mask;
back = RCreateImageFromXImage(scr->rcontext, img, NULL);
XDestroyImage(img);
if (!back) {
return None;
}
for (i = 0; i < dock->max_icons; i++) {
if (dock->icon_array[i] != NULL && dock->icon_array[i]->yindex < virtual_tiles) {
Pixmap which;
j = dock->icon_array[i]->yindex * wPreferences.icon_size;
n = (h - j < wPreferences.icon_size) ? h - j : wPreferences.icon_size;
if (dock->icon_array[i]->icon->pixmap)
which = dock->icon_array[i]->icon->pixmap;
else
which = dock->icon_array[i]->icon->core->window;
if (addGhostTile(scr, back, which, j, n, red_mask, green_mask, blue_mask))
return None; /* back is released by addGhostTile */
}
}
for (dc = scr->drawers; dc != NULL; dc = dc->next) {
Pixmap which;
drawer = dc->adrawer;
if (drawer->y_pos >= scr->scr_height)
continue;
j = drawer->y_pos - dock->y_pos;
n = (h - j < wPreferences.icon_size) ? h - j : wPreferences.icon_size;
if (drawer->icon_array[0]->icon->pixmap)
which = drawer->icon_array[0]->icon->pixmap;
else
which = drawer->icon_array[0]->icon->core->window;
if (addGhostTile(scr, back, which, j, n, red_mask, green_mask, blue_mask))
return None; /* back is released by addGhostTile */
}
RConvertImage(scr->rcontext, back, &pixmap);
RReleaseImage(back);
return pixmap;
}
Pixmap MakeGhostIcon(WScreen * scr, Drawable drawable)
{
RImage *back;