From: Daniel Déchelotte <[email protected]>
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
---
src/dock.c | 106 +++++++++++------------------------------------------
src/superfluous.c | 103 ---------------------------------------------------
src/superfluous.h | 1 -
3 files changed, 21 insertions(+), 189 deletions(-)
diff --git a/src/dock.c b/src/dock.c
index 130f548..69fb9a5 100644
--- a/src/dock.c
+++ b/src/dock.c
@@ -3622,7 +3622,7 @@ static void handleDockMove(WDock *dock, WAppIcon *aicon,
XEvent *event)
int x = aicon->x_pos, y = aicon->y_pos;;
int shad_x = x, shad_y = y;
XEvent ev;
- int grabbed = 0, swapped = 0, done;
+ int grabbed = 0, done, previously_on_right, now_on_right,
previous_x_pos;
Pixmap ghost = None;
int superfluous = wPreferences.superfluous; /* we catch it to avoid
problems */
@@ -3648,23 +3648,10 @@ static void handleDockMove(WDock *dock, WAppIcon
*aicon, XEvent *event)
XClearWindow(dpy, scr->dock_shadow);
}
XMapWindow(dpy, scr->dock_shadow);
- } else {
- int i;
- WDrawerChain *dc;
- /* Find out the actual height of the dock, to create its shadow
*/
- y = 0;
- for (i = 0; i < dock->max_icons; i++) {
- if (dock->icon_array[i] != NULL &&
dock->icon_array[i]->yindex > y)
- y = dock->icon_array[i]->yindex;
- }
- for (dc = scr->drawers; dc; dc = dc->next) {
- if ((dc->adrawer->y_pos - dock->y_pos) / ICON_SIZE > y)
- y = (dc->adrawer->y_pos - dock->y_pos) /
ICON_SIZE;
- }
- y++;
- XResizeWindow(dpy, scr->dock_shadow, ICON_SIZE, ICON_SIZE * y);
}
+ previously_on_right = now_on_right = dock->on_right_side;
+ previous_x_pos = dock->x_pos;
done = 0;
while (!done) {
WMMaskEvent(dpy, PointerMotionMask | ButtonReleaseMask |
ButtonPressMask
@@ -3700,61 +3687,25 @@ static void handleDockMove(WDock *dock, WAppIcon
*aicon, XEvent *event)
moveDock(dock, x, y);
break;
case WM_DOCK:
- /* move vertically if pointer is inside the
dock */
- if ((dock->on_right_side && ev.xmotion.x_root
>= dock->x_pos - ICON_SIZE)
- || (!dock->on_right_side &&
ev.xmotion.x_root <= dock->x_pos + ICON_SIZE * 2)) {
-
- x = ev.xmotion.x_root - ofs_x;
- y = ev.xmotion.y_root - ofs_y;
- wScreenKeepInside(scr, &x, &y,
ICON_SIZE, ICON_SIZE);
- moveDock(dock, dock->x_pos, y);
- }
- /* move horizontally to change sides */
x = ev.xmotion.x_root - ofs_x;
- if (!dock->on_right_side) {
-
- /* is on left */
- if (ev.xmotion.x_root > dock->x_pos +
ICON_SIZE * 2) {
- XMoveWindow(dpy,
scr->dock_shadow, scr->scr_width - ICON_SIZE
- - DOCK_EXTRA_SPACE
- 1, dock->y_pos);
- if (superfluous && ghost ==
None) {
- ghost =
MakeGhostDock(dock, dock->x_pos,
-
scr->scr_width - ICON_SIZE
- -
DOCK_EXTRA_SPACE - 1, dock->y_pos);
-
XSetWindowBackgroundPixmap(dpy, scr->dock_shadow, ghost);
- XClearWindow(dpy,
scr->dock_shadow);
- }
- XMapRaised(dpy,
scr->dock_shadow);
- swapped = 1;
- } else {
- if (superfluous && ghost !=
None) {
- XFreePixmap(dpy, ghost);
- ghost = None;
- }
- XUnmapWindow(dpy,
scr->dock_shadow);
- swapped = 0;
- }
- } else {
- /* is on right */
- if (ev.xmotion.x_root < dock->x_pos -
ICON_SIZE) {
- XMoveWindow(dpy,
scr->dock_shadow, DOCK_EXTRA_SPACE, dock->y_pos);
- if (superfluous && ghost ==
None) {
- ghost =
MakeGhostDock(dock, dock->x_pos,
-
DOCK_EXTRA_SPACE, dock->y_pos);
-
XSetWindowBackgroundPixmap(dpy, scr->dock_shadow, ghost);
- XClearWindow(dpy,
scr->dock_shadow);
- }
- XMapRaised(dpy,
scr->dock_shadow);
- swapped = -1;
- } else {
- XUnmapWindow(dpy,
scr->dock_shadow);
- swapped = 0;
- if (superfluous && ghost !=
None) {
- XFreePixmap(dpy, ghost);
- ghost = None;
- }
- }
+ y = ev.xmotion.y_root - ofs_y;
+ if (previously_on_right)
+ {
+ now_on_right = (ev.xmotion.x_root >=
previous_x_pos - ICON_SIZE);
+ }
+ else
+ {
+ now_on_right = (ev.xmotion.x_root >
previous_x_pos + ICON_SIZE * 2);
}
+ if (now_on_right != dock->on_right_side)
+ {
+ dock->on_right_side = now_on_right;
+ swapDock(dock);
+ wArrangeIcons(scr, False);
+ }
+ // Also perform the vertical move
+ wScreenKeepInside(scr, &x, &y, ICON_SIZE,
ICON_SIZE);
+ moveDock(dock, dock->x_pos, y);
break;
case WM_DRAWER:
{
@@ -3799,19 +3750,7 @@ static void handleDockMove(WDock *dock, WAppIcon *aicon,
XEvent *event)
shad_y);
XUnmapWindow(dpy, scr->dock_shadow);
moveDock(dock, shad_x, shad_y);
- } else {
- XUnmapWindow(dpy, scr->dock_shadow);
- }
- XResizeWindow(dpy, scr->dock_shadow, ICON_SIZE,
ICON_SIZE);
- if (dock->type == WM_DOCK) {
- if (swapped != 0) {
- if (swapped > 0)
- dock->on_right_side = 1;
- else
- dock->on_right_side = 0;
- swapDock(dock);
- wArrangeIcons(scr, False);
- }
+ XResizeWindow(dpy, scr->dock_shadow, ICON_SIZE,
ICON_SIZE);
}
done = 1;
break;
@@ -4712,9 +4651,6 @@ static WDock * drawerRestoreState(WScreen *scr,
WMPropList *drawer_state)
x = scr->dock->x_pos;
}
y_index = (y - scr->dock->y_pos) / ICON_SIZE;
- if (y_index <= 0) {
- y_index = 1;
- }
if (y_index >= scr->dock->max_icons) {
/* Here we should do something more intelligent, since
it
* can happen even if the user hasn't hand-edited his
diff --git a/src/superfluous.c b/src/superfluous.c
index 8df8ac2..0c95ed4 100644
--- a/src/superfluous.c
+++ b/src/superfluous.c
@@ -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;
diff --git a/src/superfluous.h b/src/superfluous.h
index b7b70b1..b3424cd 100644
--- a/src/superfluous.h
+++ b/src/superfluous.h
@@ -24,7 +24,6 @@
#include "dock.h"
void DoKaboom(WScreen *scr, Window win, int x, int y);
-Pixmap MakeGhostDock(WDock *dock, int sx, int dx, int y);
Pixmap MakeGhostIcon(WScreen *scr, Drawable drawable);
void DoWindowBirth(WWindow *wwin);
#endif
--
1.7.10.4
--
To unsubscribe, send mail to [email protected].