diff --git a/src/moveres.c b/src/moveres.c index f0fac049..34d20054 100644 --- a/src/moveres.c +++ b/src/moveres.c @@ -1258,249 +1258,266 @@ wKeyboardMoveResizeWindow(WWindow *wwin) ww=w; wh=h; while(1) { - /* - looper.ox=off_x; - looper.oy=off_y; - */ - WMMaskEvent(dpy, KeyPressMask | ButtonReleaseMask - | ButtonPressMask | ExposureMask, &event); - if (wwin->flags.shaded || scr->selected_windows) { - if(scr->selected_windows) - drawFrames(wwin,scr->selected_windows,off_x,off_y); - else drawTransparentFrame(wwin, src_x+off_x, src_y+off_y, w, h); - /*** I HATE EDGE RESISTANCE - ]d ***/ - } - else { - drawTransparentFrame(wwin, src_x+off_x, src_y+off_y, ww, wh); - } - - if(ctrlmode) - showGeometry(wwin, src_x+off_x, src_y+off_y, src_x+off_x+ww, src_y+off_y+wh,0); - - XUngrabServer(dpy); - XSync(dpy, False); - - switch (event.type) { - case KeyPress: - /* accelerate */ - if (event.xkey.time - lastTime > 50) { - kspeed/=(1 + (event.xkey.time - lastTime)/100); - } else { - if (kspeed < 20) { - kspeed++; + /* + looper.ox=off_x; + looper.oy=off_y; + */ + do { + WMMaskEvent(dpy, KeyPressMask | ButtonReleaseMask + | ButtonPressMask | ExposureMask, &event); + if (event.type == Expose) { + WMHandleEvent(&event); } - } - if (kspeed < _KS) kspeed = _KS; - lastTime = event.xkey.time; + } while (event.type == Expose); - if (event.xkey.state & ControlMask && !wwin->flags.shaded) { - ctrlmode=1; - wUnselectWindows(scr); + + while (XCheckTypedEvent(dpy, Expose, &event)) { + WMHandleEvent(&event); + } + if (wwin->flags.shaded || scr->selected_windows) { + if(scr->selected_windows) + drawFrames(wwin,scr->selected_windows,off_x,off_y); + else drawTransparentFrame(wwin, src_x+off_x, src_y+off_y, w, h); + /*** I HATE EDGE RESISTANCE - ]d ***/ } else { - ctrlmode=0; + drawTransparentFrame(wwin, src_x+off_x, src_y+off_y, ww, wh); } - if (event.xkey.keycode == shiftl || event.xkey.keycode == shiftr) { - if (ctrlmode) - cycleGeometryDisplay(wwin, src_x+off_x, src_y+off_y, ww, wh, 0); - else - cyclePositionDisplay(wwin, src_x+off_x, src_y+off_y, ww, wh); - } - else { - keysym = XLookupKeysym(&event.xkey, 0); - switch (keysym) { - case XK_Return: - done=2; + if(ctrlmode) + showGeometry(wwin, src_x+off_x, src_y+off_y, src_x+off_x+ww, src_y+off_y+wh,0); + + XUngrabServer(dpy); + XSync(dpy, False); + + switch (event.type) { + case KeyPress: + /* accelerate */ + if (event.xkey.time - lastTime > 50) { + kspeed/=(1 + (event.xkey.time - lastTime)/100); + } else { + if (kspeed < 20) { + kspeed++; + } + } + if (kspeed < _KS) kspeed = _KS; + lastTime = event.xkey.time; + + if (event.xkey.state & ControlMask && !wwin->flags.shaded) { + ctrlmode=1; + wUnselectWindows(scr); + } + else { + ctrlmode=0; + } + if (event.xkey.keycode == shiftl || event.xkey.keycode == shiftr) { + if (ctrlmode) + cycleGeometryDisplay(wwin, src_x+off_x, src_y+off_y, ww, wh, 0); + else + cyclePositionDisplay(wwin, src_x+off_x, src_y+off_y, ww, wh); + } + else { + + keysym = XLookupKeysym(&event.xkey, 0); + switch (keysym) { + case XK_Return: + done=2; + break; + case XK_Escape: + done=1; + break; + case XK_Up: +#ifdef XK_KP_Up + case XK_KP_Up: +#endif + case XK_k: + if (ctrlmode){ + if (moment != UP) + h = wh; + h-=kspeed; + moment = UP; + if (h < 1) h = 1; + } + else off_y-=kspeed; + break; + case XK_Down: +#ifdef XK_KP_Down + case XK_KP_Down: +#endif + case XK_j: + if (ctrlmode){ + if (moment != DOWN) + h = wh; + h+=kspeed; + moment = DOWN; + } + else off_y+=kspeed; + break; + case XK_Left: +#ifdef XK_KP_Left + case XK_KP_Left: +#endif + case XK_h: + if (ctrlmode) { + if (moment != LEFT) + w = ww; + w-=kspeed; + if (w < 1) w = 1; + moment = LEFT; + } + else off_x-=kspeed; + break; + case XK_Right: +#ifdef XK_KP_Right + case XK_KP_Right: +#endif + case XK_l: + if (ctrlmode) { + if (moment != RIGHT) + w = ww; + w+=kspeed; + moment = RIGHT; + } + else off_x+=kspeed; + break; + } + + ww=w;wh=h; + wh-=vert_border; + wWindowConstrainSize(wwin, &ww, &wh); + wh+=vert_border; + + if (wPreferences.ws_cycle){ + if (src_x + off_x + ww < 20){ + if(!scr->current_workspace) { + wWorkspaceChange(scr, scr->workspace_count-1); + } + else wWorkspaceChange(scr, scr->current_workspace-1); + off_x += scr_width; + } + else if (src_x + off_x + 20 > scr_width){ + if(scr->current_workspace == scr->workspace_count-1) { + wWorkspaceChange(scr, 0); + } + else wWorkspaceChange(scr, scr->current_workspace+1); + off_x -= scr_width; + } + } + else { + if (src_x + off_x + ww < 20) + off_x = 20 - ww - src_x; + else if (src_x + off_x + 20 > scr_width) + off_x = scr_width - 20 - src_x; + } + + if (src_y + off_y + wh < 20) { + off_y = 20 - wh - src_y; + } + else if (src_y + off_y + 20 > scr_height) { + off_y = scr_height - 20 - src_y; + } + } break; - case XK_Escape: + case ButtonPress: + case ButtonRelease: done=1; break; - case XK_Up: -#ifdef XK_KP_Up - case XK_KP_Up: -#endif - case XK_k: - if (ctrlmode){ - if (moment != UP) - h = wh; - h-=kspeed; - moment = UP; - if (h < 1) h = 1; + case Expose: + WMHandleEvent(&event); + while (XCheckTypedEvent(dpy, Expose, &event)) { + WMHandleEvent(&event); } - else off_y-=kspeed; break; - case XK_Down: -#ifdef XK_KP_Down - case XK_KP_Down: -#endif - case XK_j: - if (ctrlmode){ - if (moment != DOWN) - h = wh; - h+=kspeed; - moment = DOWN; - } - else off_y+=kspeed; - break; - case XK_Left: -#ifdef XK_KP_Left - case XK_KP_Left: -#endif - case XK_h: - if (ctrlmode) { - if (moment != LEFT) - w = ww; - w-=kspeed; - if (w < 1) w = 1; - moment = LEFT; - } - else off_x-=kspeed; - break; - case XK_Right: -#ifdef XK_KP_Right - case XK_KP_Right: -#endif - case XK_l: - if (ctrlmode) { - if (moment != RIGHT) - w = ww; - w+=kspeed; - moment = RIGHT; - } - else off_x+=kspeed; - break; - } - ww=w;wh=h; - wh-=vert_border; - wWindowConstrainSize(wwin, &ww, &wh); - wh+=vert_border; - - if (wPreferences.ws_cycle){ - if (src_x + off_x + ww < 20){ - if(!scr->current_workspace) { - wWorkspaceChange(scr, scr->workspace_count-1); - } - else wWorkspaceChange(scr, scr->current_workspace-1); - off_x += scr_width; - } - else if (src_x + off_x + 20 > scr_width){ - if(scr->current_workspace == scr->workspace_count-1) { - wWorkspaceChange(scr, 0); - } - else wWorkspaceChange(scr, scr->current_workspace+1); - off_x -= scr_width; - } - } - else { - if (src_x + off_x + ww < 20) - off_x = 20 - ww - src_x; - else if (src_x + off_x + 20 > scr_width) - off_x = scr_width - 20 - src_x; - } - - if (src_y + off_y + wh < 20) { - off_y = 20 - wh - src_y; - } - else if (src_y + off_y + 20 > scr_height) { - off_y = scr_height - 20 - src_y; + default: + WMHandleEvent(&event); + break; + } + + XGrabServer(dpy); + /*xxx*/ + + if (wwin->flags.shaded && !scr->selected_windows){ + moveGeometryDisplayCentered(scr, src_x+off_x + w/2, src_y+off_y + h/2); + } else { + if (ctrlmode) { + WMUnmapWidget(scr->gview); + mapGeometryDisplay(wwin, src_x+off_x, src_y+off_y, ww, wh); + } else if(!scr->selected_windows) { + WMUnmapWidget(scr->gview); + mapPositionDisplay(wwin, src_x+off_x, src_y+off_y, ww, wh); } } - break; - case ButtonPress: - case ButtonRelease: - done=1; - break; - default: - WMHandleEvent(&event); - break; - } - XGrabServer(dpy); - /*xxx*/ + if (wwin->flags.shaded || scr->selected_windows) { + if (scr->selected_windows) + drawFrames(wwin,scr->selected_windows,off_x,off_y); + else + drawTransparentFrame(wwin, src_x+off_x, src_y+off_y, w, h); + } else { + drawTransparentFrame(wwin, src_x+off_x, src_y+off_y, ww, wh); + } - if (wwin->flags.shaded && !scr->selected_windows){ - moveGeometryDisplayCentered(scr, src_x+off_x + w/2, src_y+off_y + h/2); - } else { - if (ctrlmode) { - WMUnmapWidget(scr->gview); - mapGeometryDisplay(wwin, src_x+off_x, src_y+off_y, ww, wh); - } else if(!scr->selected_windows) { - WMUnmapWidget(scr->gview); - mapPositionDisplay(wwin, src_x+off_x, src_y+off_y, ww, wh); - } - } - - if (wwin->flags.shaded || scr->selected_windows) { - if (scr->selected_windows) - drawFrames(wwin,scr->selected_windows,off_x,off_y); - else - drawTransparentFrame(wwin, src_x+off_x, src_y+off_y, w, h); - } else { - drawTransparentFrame(wwin, src_x+off_x, src_y+off_y, ww, wh); - } - - - if (ctrlmode) { - showGeometry(wwin, src_x+off_x, src_y+off_y, src_x+off_x+ww, src_y+off_y+wh,0); - } else if(!scr->selected_windows) - showPosition(wwin, src_x+off_x, src_y+off_y); - /**/ - - if(done){ - scr->keymove_tick=0; - /* - WMDeleteTimerWithClientData(&looper); - */ + + if (ctrlmode) { + showGeometry(wwin, src_x+off_x, src_y+off_y, src_x+off_x+ww, src_y+off_y+wh,0); + } else if(!scr->selected_windows) + showPosition(wwin, src_x+off_x, src_y+off_y); + /**/ + + if (done) { + scr->keymove_tick=0; + /* + WMDeleteTimerWithClientData(&looper); + */ if (wwin->flags.shaded || scr->selected_windows) { - if(scr->selected_windows) - drawFrames(wwin,scr->selected_windows,off_x,off_y); - else drawTransparentFrame(wwin, src_x+off_x, src_y+off_y, w, h); + if(scr->selected_windows) + drawFrames(wwin,scr->selected_windows,off_x,off_y); + else drawTransparentFrame(wwin, src_x+off_x, src_y+off_y, w, h); } else { drawTransparentFrame(wwin, src_x+off_x, src_y+off_y, ww, wh); } - if (ctrlmode) { - showGeometry(wwin, src_x+off_x, src_y+off_y, src_x+off_x+ww, src_y+off_y+wh,0); - WMUnmapWidget(scr->gview); - } else - WMUnmapWidget(scr->gview); - - XUngrabKeyboard(dpy, CurrentTime); - XUngrabPointer(dpy, CurrentTime); - XUngrabServer(dpy); + if (ctrlmode) { + showGeometry(wwin, src_x+off_x, src_y+off_y, src_x+off_x+ww, src_y+off_y+wh,0); + WMUnmapWidget(scr->gview); + } else + WMUnmapWidget(scr->gview); - if(done==2) { - if (wwin->flags.shaded || scr->selected_windows) { - if (!scr->selected_windows) { - wWindowMove(wwin, src_x+off_x, src_y+off_y); - wWindowSynthConfigureNotify(wwin); - } else { - int i; - WMBag *bag = scr->selected_windows; - doWindowMove(wwin,scr->selected_windows,off_x,off_y); - for (i = 0; i < WMGetBagItemCount(bag); i++) { - wWindowSynthConfigureNotify(WMGetFromBag(bag, i)); - } - } - } else { - if (wwin->client.width != ww) - wwin->flags.user_changed_width = 1; - - if (wwin->client.height != wh - vert_border) - wwin->flags.user_changed_height = 1; - - wWindowConfigure(wwin, src_x+off_x, src_y+off_y, - ww, wh - vert_border); - wWindowSynthConfigureNotify(wwin); - } - wWindowChangeWorkspace(wwin, scr->current_workspace); - wSetFocusTo(scr, wwin); - } - return 1; - } + XUngrabKeyboard(dpy, CurrentTime); + XUngrabPointer(dpy, CurrentTime); + XUngrabServer(dpy); + + if(done==2) { + if (wwin->flags.shaded || scr->selected_windows) { + if (!scr->selected_windows) { + wWindowMove(wwin, src_x+off_x, src_y+off_y); + wWindowSynthConfigureNotify(wwin); + } else { + int i; + WMBag *bag = scr->selected_windows; + doWindowMove(wwin,scr->selected_windows,off_x,off_y); + for (i = 0; i < WMGetBagItemCount(bag); i++) { + wWindowSynthConfigureNotify(WMGetFromBag(bag, i)); + } + } + } else { + if (wwin->client.width != ww) + wwin->flags.user_changed_width = 1; + + if (wwin->client.height != wh - vert_border) + wwin->flags.user_changed_height = 1; + + wWindowConfigure(wwin, src_x+off_x, src_y+off_y, + ww, wh - vert_border); + wWindowSynthConfigureNotify(wwin); + } + wWindowChangeWorkspace(wwin, scr->current_workspace); + wSetFocusTo(scr, wwin); + } + return 1; + } } } diff --git a/src/workspace.c b/src/workspace.c index 99ca3c89..c76a12ce 100644 --- a/src/workspace.c +++ b/src/workspace.c @@ -1,9 +1,9 @@ /* workspace.c- Workspace management - * + * * Window Maker window manager - * + * * Copyright (c) 1997, 1998 Alfredo K. Kojima - * + * * 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 @@ -16,7 +16,7 @@ * * 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, + * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, * USA. */ #include "wconfig.h" @@ -72,7 +72,7 @@ make_keys() { if (dWorkspaces!=NULL) return; - + dWorkspaces = PLMakeString("Workspaces"); dName = PLMakeString("Name"); dClip = PLMakeString("Clip"); @@ -94,7 +94,7 @@ wWorkspaceNew(WScreen *scr) { WWorkspace *wspace, **list; int i; - + if (scr->workspace_count < MAX_WORKSPACES) { scr->workspace_count++; @@ -178,7 +178,7 @@ wWorkspaceDelete(WScreen *scr, int workspace) wDockDestroy(scr->workspaces[workspace]->clip); scr->workspaces[workspace]->clip = NULL; } - + list = wmalloc(sizeof(WWorkspace*)*(scr->workspace_count-1)); j = 0; for (i=0; iworkspace_count; i++) { @@ -264,7 +264,7 @@ hideWorkpaceName(void *data) RImage *img = RCloneImage(scr->workspace_name_data->back); Pixmap pix; - scr->workspace_name_timer = + scr->workspace_name_timer = WMAddTimerHandler(WORKSPACE_NAME_FADE_DELAY, hideWorkpaceName, scr); @@ -373,7 +373,7 @@ showWorkspaceName(WScreen *scr, int workspace) } XSetForeground(dpy, scr->draw_gc, scr->white_pixel); - WMDrawString(scr->wmscreen, text, scr->draw_gc, scr->workspace_name_font, + WMDrawString(scr->wmscreen, text, scr->draw_gc, scr->workspace_name_font, 2, 2, scr->workspaces[workspace]->name, strlen(scr->workspaces[workspace]->name)); #ifdef SHAPE @@ -487,7 +487,7 @@ void wWorkspaceForceChange(WScreen *scr, int workspace) { WWindow *tmp, *foc=NULL, *foc2=NULL; - + if (workspace >= MAX_WORKSPACES || workspace < 0) return; @@ -510,9 +510,9 @@ wWorkspaceForceChange(WScreen *scr, int workspace) || tmp->flags.changing_workspace) { foc = tmp; } - + /* foc2 = tmp; will fix annoyance with gnome panel - * but will create annoyance for every other application + * but will create annoyance for every other application */ while (tmp) { @@ -521,11 +521,11 @@ wWorkspaceForceChange(WScreen *scr, int workspace) if ((tmp->flags.mapped||tmp->flags.shaded) && !IS_OMNIPRESENT(tmp) && !tmp->flags.changing_workspace) { - + wWindowUnmap(tmp); } /* also unmap miniwindows not on this workspace */ - if (tmp->flags.miniaturized && !IS_OMNIPRESENT(tmp) + if (tmp->flags.miniaturized && !IS_OMNIPRESENT(tmp) && tmp->icon) { if (!wPreferences.sticky_icons) { XUnmapWindow(dpy, tmp->icon->core->window); @@ -744,13 +744,30 @@ void updateWorkspaceGeometry(WScreen *scr, int workspace, int *view_x, int *view } +typedef struct _delay_configure { + WWindow *wwin; + int delay_count; +} _delay_configure; + +void _sendConfigureNotify (_delay_configure *delay) { + WWindow *wwin; + + delay->delay_count--; + if (!delay->delay_count) { + for (wwin = delay->wwin; wwin; wwin = wwin->prev) { + wWindowSynthConfigureNotify(wwin); + } + } +} + Bool wWorkspaceSetViewPort(WScreen *scr, int workspace, int view_x, int view_y) { Bool adjust_flag = False; int diff_x, diff_y; + static _delay_configure delay_configure = {NULL, 0}; WWindow *wwin; - printf("wWorkspaceSetViewPort %d %d\n", view_x, view_y); + /*printf("wWorkspaceSetViewPort %d %d\n", view_x, view_y);*/ updateWorkspaceGeometry(scr, workspace, &view_x, &view_y); @@ -780,12 +797,16 @@ Bool wWorkspaceSetViewPort(WScreen *scr, int workspace, int view_x, int view_y) scr->workspaces[workspace]->view_y = view_y; - for( wwin = scr->focused_window; wwin; wwin = wwin->prev) { + for (wwin = scr->focused_window; wwin; wwin = wwin->prev) { if (wwin->frame->workspace == workspace) { wWindowMove(wwin, wwin->frame_x + diff_x, wwin->frame_y + diff_y); - wWindowSynthConfigureNotify(wwin); } } + if (1) { /* if delay*/ + delay_configure.delay_count++; + delay_configure.wwin = scr->focused_window; + WMAddTimerHandler(200, (WMCallback *)_sendConfigureNotify, &delay_configure); + } return adjust_flag; } @@ -808,7 +829,7 @@ switchWSCommand(WMenu *menu, WMenuEntry *entry) static void deleteWSCommand(WMenu *menu, WMenuEntry *entry) { - wWorkspaceDelete(menu->frame->screen_ptr, + wWorkspaceDelete(menu->frame->screen_ptr, menu->frame->screen_ptr->workspace_count-1); } @@ -823,14 +844,14 @@ newWSCommand(WMenu *menu, WMenuEntry *foo) /* autochange workspace*/ if (ws>=0) wWorkspaceChange(menu->frame->screen_ptr, ws); - - + + /* if (ws<9) { int kcode; if (wKeyBindings[WKBD_WORKSPACE1+ws]) { kcode = wKeyBindings[WKBD_WORKSPACE1+ws]->keycode; - entry->rtext = + entry->rtext = wstrdup(XKeysymToString(XKeycodeToKeysym(dpy, kcode, 0))); } }*/ @@ -841,10 +862,10 @@ static char* cropline(char *line) { char *start, *end; - + if (strlen(line)==0) return line; - + start = line; end = &(line[strlen(line)])-1; while (isspace(*line) && *line!=0) line++; @@ -898,7 +919,7 @@ wWorkspaceRename(WScreen *scr, int workspace, char *name) if (scr->clip_icon) wClipIconPaint(scr->clip_icon); - + #ifdef GNOME_STUFF wGNOMEUpdateWorkspaceNamesHint(scr); #endif @@ -931,10 +952,10 @@ wWorkspaceMenuMake(WScreen *scr, Bool titled) wwarning(_("could not create Workspace menu")); return NULL; } - + /* callback to be called when an entry is edited */ wsmenu->on_edit = onMenuEntryEdited; - + wMenuAddCallback(wsmenu, _("New"), newWSCommand, NULL); wMenuAddCallback(wsmenu, _("Destroy Last"), deleteWSCommand, NULL); @@ -976,8 +997,8 @@ wWorkspaceMenuUpdate(WScreen *scr, WMenu *menu) } } wMenuRealize(menu); - - for (i=0; iworkspace_count; i++) { + + for (i=0; iworkspace_count; i++) { menu->entries[i+2]->flags.indicator_on = 0; } menu->entries[scr->current_workspace+2]->flags.indicator_on = 1; @@ -993,7 +1014,7 @@ wWorkspaceMenuUpdate(WScreen *scr, WMenu *menu) /* if menu got unreachable, bring it to a visible place */ if (menu->frame_x < tmp - (int)menu->frame->core->width) wMenuMove(menu, tmp - (int)menu->frame->core->width, menu->frame_y, False); - + wMenuPaint(menu); } @@ -1046,7 +1067,7 @@ wWorkspaceRestoreState(WScreen *scr) if (!parr) return; - + wscount = scr->workspace_count; for (i=0; i < WMIN(PLGetNumberOfElements(parr), MAX_WORKSPACES); i++) { wks_state = PLGetArrayElement(parr, i);