diff --git a/src/event.c b/src/event.c index 3165c325..a5247612 100644 --- a/src/event.c +++ b/src/event.c @@ -1002,19 +1002,19 @@ handleEnterNotify(XEvent *event) int x,y; if (event->xcrossing.window == scr->virtual_edge_r) { XWarpPointer(dpy, None, scr->root_win, 0,0,0,0, scr->scr_width - wPreferences.vedge_thickness - 1, event->xcrossing.y_root); - wWorkspaceGetViewPosition(scr, scr->current_workspace, &x, &y, NULL, NULL); + wWorkspaceGetViewPosition(scr, scr->current_workspace, &x, &y); wWorkspaceSetViewPort(scr, scr->current_workspace, x + VIRTUALEDGE_SCROLL_HSTEP, y); } else if (event->xcrossing.window == scr->virtual_edge_l) { XWarpPointer(dpy, None, scr->root_win, 0,0,0,0, wPreferences.vedge_thickness + 1, event->xcrossing.y_root); - wWorkspaceGetViewPosition(scr, scr->current_workspace, &x, &y, NULL, NULL); + wWorkspaceGetViewPosition(scr, scr->current_workspace, &x, &y); wWorkspaceSetViewPort(scr, scr->current_workspace, x - VIRTUALEDGE_SCROLL_HSTEP, y); } else if (event->xcrossing.window == scr->virtual_edge_u) { XWarpPointer(dpy, None, scr->root_win, 0,0,0,0, event->xcrossing.x_root, wPreferences.vedge_thickness + 1); - wWorkspaceGetViewPosition(scr, scr->current_workspace, &x, &y, NULL, NULL); + wWorkspaceGetViewPosition(scr, scr->current_workspace, &x, &y); wWorkspaceSetViewPort(scr, scr->current_workspace, x, y - VIRTUALEDGE_SCROLL_VSTEP); } else if (event->xcrossing.window == scr->virtual_edge_d) { XWarpPointer(dpy, None, scr->root_win, 0,0,0,0, event->xcrossing.x_root, scr->scr_height - wPreferences.vedge_thickness - 1); - wWorkspaceGetViewPosition(scr, scr->current_workspace, &x, &y, NULL, NULL); + wWorkspaceGetViewPosition(scr, scr->current_workspace, &x, &y); wWorkspaceSetViewPort(scr, scr->current_workspace, x, y + VIRTUALEDGE_SCROLL_VSTEP); } } diff --git a/src/workspace.c b/src/workspace.c index 332e49fd..e2fa6f29 100644 --- a/src/workspace.c +++ b/src/workspace.c @@ -636,7 +636,8 @@ wWorkspaceForceChange(WScreen *scr, int workspace) #ifdef VIRTUAL_DESKTOP -void wWorkspaceManageEdge(WScreen *scr) { +void wWorkspaceManageEdge(WScreen *scr) +{ int w; int vmask; XSetWindowAttributes attribs; @@ -646,7 +647,7 @@ void wWorkspaceManageEdge(WScreen *scr) { initVDesk = True; for (w = 0; w < scr->workspace_count; w++) { puts("reset workspace"); - wWorkspaceResizeViewPort(scr, w, 0, 0, wPreferences.vedge_maxwidth, wPreferences.vedge_maxheight); + wWorkspaceResizeViewPort(scr, w, wPreferences.vedge_maxwidth, wPreferences.vedge_maxheight); wWorkspaceSetViewPort(scr, w, 0, 0); } @@ -677,7 +678,8 @@ void wWorkspaceManageEdge(WScreen *scr) { } } -void wWorkspaceRaiseEdge(WScreen *scr) { +void wWorkspaceRaiseEdge(WScreen *scr) +{ if (wPreferences.vedge_thickness && initVDesk) { XRaiseWindow(dpy, scr->virtual_edge_u); XRaiseWindow(dpy, scr->virtual_edge_d); @@ -686,36 +688,22 @@ void wWorkspaceRaiseEdge(WScreen *scr) { } } -void wWorkspaceResizeViewPort(WScreen *scr, int workspace, int x, int y, int width, int height) +void wWorkspaceResizeViewPort(WScreen *scr, int workspace, int width, int height) { - if (width < scr->scr_width) return; - if (height < scr->scr_height) return; - - scr->workspaces[workspace]->x = x; - scr->workspaces[workspace]->y = y; scr->workspaces[workspace]->width = WMAX(width,scr->scr_width); scr->workspaces[workspace]->height = WMAX(height,scr->scr_height); - + } -void wWorkspaceSetViewPort(WScreen *scr, int workspace, int view_x, int view_y) +void wWorkspaceAdjustViewPort(WScreen *scr, int workspace, int view_x, int view_y) { + int diff_x, diff_y; WWindow *wwin; - if (view_x < scr->workspaces[workspace]->x - || view_y < scr->workspaces[workspace]->y - || view_x + scr->scr_width > scr->workspaces[workspace]->width - || view_y + scr->scr_height > scr->workspaces[workspace]->height) return; - diff_x = scr->workspaces[workspace]->view_x - view_x; diff_y = scr->workspaces[workspace]->view_y - view_y; - scr->workspaces[workspace]->view_x = WMIN(view_x, scr->workspaces[workspace]->width - scr->scr_width); - scr->workspaces[workspace]->view_y = WMIN(view_y, scr->workspaces[workspace]->height - scr->scr_height); - - printf("set view %d %d, %d\n",workspace, scr->workspaces[workspace]->view_x, scr->workspaces[workspace]->view_y); - wwin = scr->focused_window; while (wwin) { if (wwin->frame->workspace == workspace) { @@ -724,13 +712,49 @@ void wWorkspaceSetViewPort(WScreen *scr, int workspace, int view_x, int view_y) } wwin = wwin->prev; } + + if (scr->workspaces[workspace]->view_x < 0) { + scr->workspaces[workspace]->width -= view_x; + scr->workspaces[workspace]->view_x = 0; + } else if (scr->workspaces[workspace]->view_x > scr->workspaces[workspace]->width - scr->scr_width) { + scr->workspaces[workspace]->width = scr->workspaces[workspace]->view_x + scr->scr_width; + } + + if (scr->workspaces[workspace]->view_y < 0) { + scr->workspaces[workspace]->height -= view_y; + scr->workspaces[workspace]->view_y = 0; + } else if (scr->workspaces[workspace]->view_y > scr->workspaces[workspace]->height - scr->scr_height) { + scr->workspaces[workspace]->height = scr->workspaces[workspace]->view_y + scr->scr_height; + } + + scr->workspaces[workspace]->view_x = WMIN(view_x, scr->workspaces[workspace]->width - scr->scr_width); + scr->workspaces[workspace]->view_y = WMIN(view_y, scr->workspaces[workspace]->height - scr->scr_height); + + + /* +printf("set view %d %d, %d\n", + workspace, scr->workspaces[workspace]->view_x, scr->workspaces[workspace]->view_y); + */ + } -void wWorkspaceGetViewPosition(WScreen *scr, int workspace, int *view_x, int *view_y, int *x, int *y) { +void wWorkspaceSetViewPort(WScreen *scr, int workspace, int view_x, int view_y) +{ + + if (view_x < 0) view_x = 0; + else if (view_x > scr->workspaces[workspace]->width - scr->scr_width) + view_x = scr->workspaces[workspace]->width - scr->scr_width; + + if (view_y < 0) view_y = 0; + else if (view_y > scr->workspaces[workspace]->width - scr->scr_height) + view_y = scr->workspaces[workspace]->width - scr->scr_height; + + wWorkspaceAdjustViewPort(scr, workspace, view_x, view_y); +} + +void wWorkspaceGetViewPosition(WScreen *scr, int workspace, int *view_x, int *view_y) { if (view_x) *view_x = scr->workspaces[workspace]->view_x; if (view_y) *view_y = scr->workspaces[workspace]->view_y; - if (x) *x = scr->workspaces[workspace]->x; - if (y) *y = scr->workspaces[workspace]->y; } #endif diff --git a/src/workspace.h b/src/workspace.h index 3729bdd1..72a766e5 100644 --- a/src/workspace.h +++ b/src/workspace.h @@ -28,7 +28,7 @@ typedef struct WWorkspace { char *name; #ifdef VIRTUAL_DESKTOP - int x ,y, width, height; + int width, height; int view_x, view_y; #endif struct WDock *clip; @@ -42,9 +42,10 @@ void wWorkspaceForceChange(WScreen *scr, int workspace); #ifdef VIRTUAL_DESKTOP void wWorkspaceManageEdge(WScreen *scr); void wWorkspaceRaiseEdge(WScreen *scr); -void wWorkspaceResizeViewPort(WScreen *scr, int workspace, int x, int y, int width, int height); +void wWorkspaceResizeViewPort(WScreen *scr, int workspace, int width, int height); void wWorkspaceSetViewPort(WScreen *scr, int workspace, int view_x, int view_y); -void wWorkspaceGetViewPosition(WScreen *scr, int workspace, int *view_x, int *view_y, int *x, int *y); +void wWorkspaceAdjustViewPort(WScreen *scr, int workspace, int view_x, int view_y); +void wWorkspaceGetViewPosition(WScreen *scr, int workspace, int *view_x, int *view_y); #endif