2004-01-18 02:24:06 -08:00
|
|
|
/*
|
2007-01-13 11:14:29 -08:00
|
|
|
* Copyright (C) 2000-2007 Carsten Haitzler, Geoff Harrison and various contributors
|
2009-02-14 03:09:06 -08:00
|
|
|
* Copyright (C) 2004-2009 Kim Woelders
|
2004-01-18 02:24:06 -08:00
|
|
|
*
|
|
|
|
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
|
|
* of this software and associated documentation files (the "Software"), to
|
|
|
|
* deal in the Software without restriction, including without limitation the
|
|
|
|
* rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
|
|
|
|
* sell copies of the Software, and to permit persons to whom the Software is
|
|
|
|
* furnished to do so, subject to the following conditions:
|
|
|
|
*
|
|
|
|
* The above copyright notice and this permission notice shall be included in
|
|
|
|
* all copies of the Software, its documentation and marketing & publicity
|
|
|
|
* materials, and acknowledgment shall be given in the documentation, materials
|
|
|
|
* and software packages that this Software was used.
|
|
|
|
*
|
|
|
|
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
|
|
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
|
|
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
|
|
|
|
* THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
|
|
|
|
* IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
|
|
|
|
* CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
|
|
|
*/
|
|
|
|
#include "E.h"
|
2009-12-19 23:29:51 -08:00
|
|
|
#include "borders.h"
|
2006-11-19 13:55:52 -08:00
|
|
|
#include "cursors.h"
|
2005-09-04 00:27:20 -07:00
|
|
|
#include "desktops.h"
|
2005-07-16 09:57:45 -07:00
|
|
|
#include "emodule.h"
|
2007-12-23 16:04:55 -08:00
|
|
|
#include "events.h"
|
2005-07-16 09:57:45 -07:00
|
|
|
#include "ewins.h"
|
2006-11-19 13:55:52 -08:00
|
|
|
#include "focus.h"
|
|
|
|
#include "grabs.h"
|
2005-11-19 07:47:10 -08:00
|
|
|
#include "groups.h"
|
2005-10-27 16:18:35 -07:00
|
|
|
#include "hints.h"
|
2006-04-16 06:27:38 -07:00
|
|
|
#include "timers.h"
|
2005-07-16 09:57:45 -07:00
|
|
|
#include "xwin.h"
|
2009-02-14 03:09:06 -08:00
|
|
|
#include <X11/keysym.h>
|
2004-01-18 02:24:06 -08:00
|
|
|
|
2008-03-23 04:54:24 -07:00
|
|
|
static struct {
|
2009-12-19 23:29:51 -08:00
|
|
|
Win events;
|
2005-08-15 09:57:13 -07:00
|
|
|
EWin *ewin;
|
2009-02-14 03:09:06 -08:00
|
|
|
char mode;
|
|
|
|
char using_kbd;
|
|
|
|
char nogroup;
|
|
|
|
char grab_server;
|
2005-08-15 09:57:13 -07:00
|
|
|
int start_x, start_y;
|
2009-02-14 03:09:06 -08:00
|
|
|
int cur_x, cur_y;
|
2005-08-15 09:57:13 -07:00
|
|
|
int win_x, win_y, win_w, win_h;
|
|
|
|
int swapcoord_x, swapcoord_y;
|
|
|
|
int resize_detail;
|
|
|
|
} Mode_mr;
|
2004-01-18 02:24:06 -08:00
|
|
|
|
2009-12-19 23:29:51 -08:00
|
|
|
static void _MoveResizeInit(void);
|
|
|
|
|
2007-06-11 15:28:35 -07:00
|
|
|
static int
|
|
|
|
_NeedServerGrab(int mode)
|
|
|
|
{
|
|
|
|
if (mode == 0)
|
|
|
|
return 0;
|
2007-06-24 13:10:39 -07:00
|
|
|
if (mode <= 2)
|
2007-07-11 02:21:27 -07:00
|
|
|
return !Conf.movres.avoid_server_grab;
|
2007-06-11 15:28:35 -07:00
|
|
|
return 1;
|
|
|
|
}
|
|
|
|
|
2005-05-07 02:27:16 -07:00
|
|
|
void
|
|
|
|
EwinShapeSet(EWin * ewin)
|
|
|
|
{
|
2005-12-22 10:43:15 -08:00
|
|
|
int bl, br, bt, bb;
|
|
|
|
|
2005-05-07 02:27:16 -07:00
|
|
|
ewin->shape_x = EoGetX(ewin);
|
|
|
|
ewin->shape_y = EoGetY(ewin);
|
2005-12-22 10:43:15 -08:00
|
|
|
|
2005-07-08 09:48:19 -07:00
|
|
|
if (ewin->state.shaded)
|
2005-05-07 02:27:16 -07:00
|
|
|
{
|
2005-12-22 10:43:15 -08:00
|
|
|
EwinBorderGetSize(ewin, &bl, &br, &bt, &bb);
|
|
|
|
ewin->shape_w = EoGetW(ewin) - (bl + br);
|
|
|
|
ewin->shape_h = EoGetH(ewin) - (bt + bb);
|
2005-05-07 02:27:16 -07:00
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
ewin->shape_w = ewin->client.w;
|
|
|
|
ewin->shape_h = ewin->client.h;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2009-12-10 08:37:56 -08:00
|
|
|
void
|
|
|
|
MoveResizeMoveStart(EWin * ewin, int kbd, int constrained, int nogroup)
|
2004-01-18 02:24:06 -08:00
|
|
|
{
|
|
|
|
EWin **gwins;
|
2007-12-23 16:04:55 -08:00
|
|
|
int i, num, cx, cy;
|
2004-01-18 02:24:06 -08:00
|
|
|
|
2005-07-08 09:48:19 -07:00
|
|
|
if (!ewin || ewin->state.inhibit_move)
|
2009-12-10 08:37:56 -08:00
|
|
|
return;
|
2004-01-18 02:24:06 -08:00
|
|
|
|
2009-12-19 23:29:51 -08:00
|
|
|
_MoveResizeInit();
|
|
|
|
|
2005-08-15 09:57:13 -07:00
|
|
|
Mode_mr.ewin = ewin;
|
2009-02-14 03:09:06 -08:00
|
|
|
Mode_mr.using_kbd = kbd;
|
2006-05-28 03:12:25 -07:00
|
|
|
Mode_mr.nogroup = nogroup;
|
2004-07-15 11:23:54 -07:00
|
|
|
|
2007-12-23 16:04:55 -08:00
|
|
|
EventsGetXY(&cx, &cy);
|
|
|
|
|
2008-12-14 08:44:45 -08:00
|
|
|
SoundPlay(SOUND_MOVE_START);
|
2004-12-28 15:46:49 -08:00
|
|
|
|
2004-03-20 07:49:05 -08:00
|
|
|
Mode.mode = MODE_MOVE_PENDING;
|
|
|
|
Mode.constrained = constrained;
|
2005-03-04 14:14:58 -08:00
|
|
|
|
2009-02-14 03:09:06 -08:00
|
|
|
Mode_mr.start_x = Mode_mr.cur_x = cx;
|
|
|
|
Mode_mr.start_y = Mode_mr.cur_y = cy;
|
2007-12-22 06:40:20 -08:00
|
|
|
|
|
|
|
Mode_mr.win_x = Mode_mr.start_x - (EoGetX(ewin) + EoGetX(EoGetDesk(ewin)));
|
|
|
|
Mode_mr.win_y = Mode_mr.start_y - (EoGetY(ewin) + EoGetY(EoGetDesk(ewin)));
|
2004-01-18 02:24:06 -08:00
|
|
|
|
2006-05-03 13:52:15 -07:00
|
|
|
EwinRaise(ewin);
|
2004-12-28 15:46:49 -08:00
|
|
|
gwins = ListWinGroupMembersForEwin(ewin, GROUP_ACTION_MOVE, nogroup
|
2004-05-19 14:41:03 -07:00
|
|
|
|| Mode.move.swap, &num);
|
2005-11-19 07:47:10 -08:00
|
|
|
|
|
|
|
if (Conf.movres.mode_move < 0 || Conf.movres.mode_move > 5)
|
|
|
|
Conf.movres.mode_move = 0;
|
|
|
|
Mode_mr.mode = Conf.movres.mode_move;
|
|
|
|
if (num > 1 && Conf.movres.mode_move == 5)
|
|
|
|
Mode_mr.mode = 0;
|
2007-06-11 15:28:35 -07:00
|
|
|
Mode_mr.grab_server = _NeedServerGrab(Mode_mr.mode);
|
2005-11-19 07:47:10 -08:00
|
|
|
|
2004-01-18 02:24:06 -08:00
|
|
|
for (i = 0; i < num; i++)
|
|
|
|
{
|
2005-11-05 09:12:53 -08:00
|
|
|
EwinShapeSet(gwins[i]);
|
2006-04-12 08:19:40 -07:00
|
|
|
EwinOpFloatAt(gwins[i], OPSRC_USER, EoGetX(gwins[i]), EoGetY(gwins[i]));
|
2005-11-19 07:47:10 -08:00
|
|
|
if (Mode_mr.mode == 0)
|
2006-04-07 12:48:10 -07:00
|
|
|
{
|
|
|
|
ewin->state.moving = 1;
|
|
|
|
EwinUpdateOpacity(gwins[i]);
|
|
|
|
}
|
2004-01-18 02:24:06 -08:00
|
|
|
}
|
|
|
|
Efree(gwins);
|
2005-11-19 07:47:10 -08:00
|
|
|
|
2009-11-16 12:55:14 -08:00
|
|
|
if (kbd)
|
2009-12-19 23:29:51 -08:00
|
|
|
GrabKeyboardSet(Mode_mr.events);
|
2009-11-16 12:55:14 -08:00
|
|
|
else
|
2009-12-19 23:29:51 -08:00
|
|
|
GrabPointerSet(Mode_mr.events, ECSR_ACT_MOVE, 1);
|
2009-11-16 12:55:14 -08:00
|
|
|
|
2005-08-15 09:57:13 -07:00
|
|
|
Mode_mr.swapcoord_x = EoGetX(ewin);
|
|
|
|
Mode_mr.swapcoord_y = EoGetY(ewin);
|
2004-01-18 02:24:06 -08:00
|
|
|
}
|
|
|
|
|
2009-12-10 08:37:56 -08:00
|
|
|
static void
|
|
|
|
_MoveResizeMoveEnd(EWin * ewin)
|
2004-01-18 02:24:06 -08:00
|
|
|
{
|
|
|
|
EWin **gwins;
|
2005-09-04 00:27:20 -07:00
|
|
|
int num, i;
|
2005-05-07 02:27:16 -07:00
|
|
|
Desk *d1, *d2;
|
2004-01-18 02:24:06 -08:00
|
|
|
|
2005-08-15 09:57:13 -07:00
|
|
|
if (ewin && ewin != Mode_mr.ewin)
|
2009-12-10 08:37:56 -08:00
|
|
|
return;
|
2004-01-18 02:24:06 -08:00
|
|
|
|
2009-02-14 03:09:06 -08:00
|
|
|
GrabKeyboardRelease();
|
2004-11-25 11:14:40 -08:00
|
|
|
GrabPointerRelease();
|
|
|
|
|
2008-12-14 08:44:45 -08:00
|
|
|
SoundPlay(SOUND_MOVE_STOP);
|
2004-01-18 02:24:06 -08:00
|
|
|
|
2005-08-15 09:57:13 -07:00
|
|
|
ewin = Mode_mr.ewin;
|
2004-01-18 02:24:06 -08:00
|
|
|
if (!ewin)
|
2005-07-19 15:33:30 -07:00
|
|
|
goto done;
|
2004-05-19 14:41:03 -07:00
|
|
|
|
2005-11-05 09:12:53 -08:00
|
|
|
ewin->state.show_coords = 0;
|
|
|
|
|
2006-05-28 03:12:25 -07:00
|
|
|
gwins = ListWinGroupMembersForEwin(ewin, GROUP_ACTION_MOVE, Mode_mr.nogroup
|
2004-05-19 14:41:03 -07:00
|
|
|
|| Mode.move.swap, &num);
|
2004-01-18 02:24:06 -08:00
|
|
|
|
2004-03-20 07:49:05 -08:00
|
|
|
if (Mode.mode == MODE_MOVE)
|
2004-01-18 02:24:06 -08:00
|
|
|
{
|
|
|
|
for (i = 0; i < num; i++)
|
2005-11-19 07:47:10 -08:00
|
|
|
DrawEwinShape(gwins[i], Mode_mr.mode,
|
2004-05-19 14:41:03 -07:00
|
|
|
gwins[i]->shape_x, gwins[i]->shape_y,
|
2007-06-11 15:28:35 -07:00
|
|
|
gwins[i]->client.w, gwins[i]->client.h, 2, i);
|
2004-01-18 02:24:06 -08:00
|
|
|
}
|
2004-03-20 07:49:05 -08:00
|
|
|
Mode.mode = MODE_NONE;
|
2004-01-18 02:24:06 -08:00
|
|
|
|
2007-12-21 14:04:55 -08:00
|
|
|
d2 = DesktopAt(Mode.events.mx, Mode.events.my);
|
2005-02-26 17:11:51 -08:00
|
|
|
|
2004-01-18 02:24:06 -08:00
|
|
|
for (i = 0; i < num; i++)
|
|
|
|
{
|
2005-05-07 02:27:16 -07:00
|
|
|
ewin = gwins[i];
|
2005-09-04 00:27:20 -07:00
|
|
|
d1 = EoGetDesk(ewin);
|
|
|
|
if (d2 == d1)
|
2006-04-12 08:19:40 -07:00
|
|
|
EwinOpUnfloatAt(ewin, OPSRC_USER, d2, ewin->shape_x, ewin->shape_y);
|
2005-05-07 02:27:16 -07:00
|
|
|
else
|
2006-04-12 08:19:40 -07:00
|
|
|
EwinOpUnfloatAt(ewin, OPSRC_USER, d2,
|
|
|
|
ewin->shape_x - (EoGetX(d2) - EoGetX(d1)),
|
|
|
|
ewin->shape_y - (EoGetY(d2) - EoGetY(d1)));
|
2005-11-19 07:47:10 -08:00
|
|
|
if (Mode_mr.mode == 0)
|
2006-04-07 12:48:10 -07:00
|
|
|
{
|
|
|
|
ewin->state.moving = 0;
|
|
|
|
EwinUpdateOpacity(ewin);
|
|
|
|
}
|
2004-01-18 02:24:06 -08:00
|
|
|
}
|
2004-12-28 15:46:49 -08:00
|
|
|
|
2005-07-19 15:33:30 -07:00
|
|
|
Efree(gwins);
|
|
|
|
|
2008-02-13 13:31:29 -08:00
|
|
|
ESync(ESYNC_MOVRES);
|
2004-04-08 15:17:56 -07:00
|
|
|
|
2005-07-19 15:33:30 -07:00
|
|
|
done:
|
|
|
|
Mode.mode = MODE_NONE;
|
2004-05-19 14:41:03 -07:00
|
|
|
Mode.move.swap = 0;
|
2005-05-29 07:59:17 -07:00
|
|
|
Mode.place.doing_manual = 0;
|
2004-12-28 15:46:49 -08:00
|
|
|
|
2007-06-11 15:28:35 -07:00
|
|
|
if (Mode_mr.grab_server)
|
2005-07-19 15:33:30 -07:00
|
|
|
{
|
2006-02-02 14:34:06 -08:00
|
|
|
FocusEnable(1);
|
2005-07-19 15:33:30 -07:00
|
|
|
EUngrabServer();
|
|
|
|
ModulesSignal(ESIGNAL_ANIMATION_RESUME, NULL);
|
|
|
|
}
|
2004-01-18 02:24:06 -08:00
|
|
|
}
|
|
|
|
|
2009-12-10 08:37:56 -08:00
|
|
|
static void
|
|
|
|
_MoveResizeMoveSuspend(void)
|
2004-01-18 02:24:06 -08:00
|
|
|
{
|
2004-05-15 15:42:21 -07:00
|
|
|
EWin *ewin, **lst;
|
|
|
|
int i, num;
|
2004-01-18 02:24:06 -08:00
|
|
|
|
2005-08-15 09:57:13 -07:00
|
|
|
ewin = Mode_mr.ewin;
|
2004-01-18 02:24:06 -08:00
|
|
|
if (!ewin)
|
2009-12-10 08:37:56 -08:00
|
|
|
return;
|
2004-01-18 02:24:06 -08:00
|
|
|
|
2004-05-15 15:42:21 -07:00
|
|
|
if (Mode.mode == MODE_MOVE_PENDING)
|
2009-12-10 08:37:56 -08:00
|
|
|
return;
|
2004-05-15 15:42:21 -07:00
|
|
|
|
|
|
|
/* If non opaque undraw our boxes */
|
2007-06-11 15:28:35 -07:00
|
|
|
if (Mode_mr.grab_server)
|
2004-01-18 02:24:06 -08:00
|
|
|
{
|
2006-05-28 03:12:25 -07:00
|
|
|
lst = ListWinGroupMembersForEwin(ewin, GROUP_ACTION_MOVE,
|
|
|
|
Mode_mr.nogroup, &num);
|
2004-05-15 15:42:21 -07:00
|
|
|
for (i = 0; i < num; i++)
|
|
|
|
{
|
|
|
|
ewin = lst[i];
|
2005-11-19 07:47:10 -08:00
|
|
|
DrawEwinShape(ewin, Mode_mr.mode, ewin->shape_x,
|
2007-06-11 15:28:35 -07:00
|
|
|
ewin->shape_y, ewin->client.w, ewin->client.h, 3, i);
|
2004-05-15 15:42:21 -07:00
|
|
|
}
|
2008-02-23 04:09:38 -08:00
|
|
|
Efree(lst);
|
2005-11-19 12:43:09 -08:00
|
|
|
|
|
|
|
EUngrabServer();
|
2004-01-18 02:24:06 -08:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2009-12-10 08:37:56 -08:00
|
|
|
static void
|
|
|
|
_MoveResizeMoveResume(void)
|
2004-01-18 02:24:06 -08:00
|
|
|
{
|
2004-05-15 15:42:21 -07:00
|
|
|
EWin *ewin, **lst;
|
|
|
|
int i, num;
|
2006-02-02 10:38:03 -08:00
|
|
|
int x, y, fl, dx, dy;
|
2004-01-18 02:24:06 -08:00
|
|
|
|
2005-08-15 09:57:13 -07:00
|
|
|
ewin = Mode_mr.ewin;
|
2004-01-18 02:24:06 -08:00
|
|
|
if (!ewin)
|
2009-12-10 08:37:56 -08:00
|
|
|
return;
|
2004-01-18 02:24:06 -08:00
|
|
|
|
2009-12-19 23:29:51 -08:00
|
|
|
GrabPointerSet(Mode_mr.events, ECSR_ACT_MOVE, 1);
|
2007-01-12 17:44:03 -08:00
|
|
|
|
2005-11-19 07:47:10 -08:00
|
|
|
fl = (Mode_mr.mode == 5) ? 4 : 0;
|
2004-03-20 07:49:05 -08:00
|
|
|
if (Mode.mode == MODE_MOVE_PENDING)
|
2004-05-15 15:42:21 -07:00
|
|
|
{
|
|
|
|
Mode.mode = MODE_MOVE;
|
|
|
|
fl = 0; /* This is the first time we draw it */
|
|
|
|
}
|
2004-01-18 02:24:06 -08:00
|
|
|
|
2007-06-11 15:28:35 -07:00
|
|
|
if (Mode_mr.grab_server)
|
2005-05-07 04:20:02 -07:00
|
|
|
EGrabServer();
|
|
|
|
|
2007-12-21 14:04:55 -08:00
|
|
|
dx =
|
|
|
|
Mode.events.mx - Mode_mr.win_x - EoGetX(EoGetDesk(ewin)) - ewin->shape_x;
|
|
|
|
dy =
|
|
|
|
Mode.events.my - Mode_mr.win_y - EoGetY(EoGetDesk(ewin)) - ewin->shape_y;
|
2006-02-02 10:38:03 -08:00
|
|
|
|
2004-05-15 15:42:21 -07:00
|
|
|
/* Redraw any windows that were in "move mode" */
|
2006-05-28 03:12:25 -07:00
|
|
|
lst = ListWinGroupMembersForEwin(ewin, GROUP_ACTION_MOVE,
|
|
|
|
Mode_mr.nogroup, &num);
|
2004-05-15 15:42:21 -07:00
|
|
|
for (i = 0; i < num; i++)
|
|
|
|
{
|
|
|
|
ewin = lst[i];
|
|
|
|
|
2004-12-28 15:46:49 -08:00
|
|
|
if (!EoIsFloating(ewin))
|
2004-05-15 15:42:21 -07:00
|
|
|
continue;
|
|
|
|
|
2006-02-02 10:38:03 -08:00
|
|
|
x = ewin->shape_x + dx;
|
|
|
|
y = ewin->shape_y + dy;
|
2005-11-19 07:47:10 -08:00
|
|
|
DrawEwinShape(ewin, Mode_mr.mode, x, y,
|
2007-06-11 15:28:35 -07:00
|
|
|
ewin->client.w, ewin->client.h, fl, i);
|
2004-05-15 15:42:21 -07:00
|
|
|
}
|
2008-02-23 04:09:38 -08:00
|
|
|
Efree(lst);
|
2004-01-18 02:24:06 -08:00
|
|
|
}
|
|
|
|
|
2007-06-17 13:03:29 -07:00
|
|
|
#define RD(h, v) (((h) << 8) + (v))
|
|
|
|
#define RD_H(hv) (((hv) >> 8) & 0xff)
|
|
|
|
#define RD_V(hv) (((hv) ) & 0xff)
|
|
|
|
|
2009-12-10 08:37:56 -08:00
|
|
|
void
|
|
|
|
MoveResizeResizeStart(EWin * ewin, int kbd, int hv)
|
2004-01-18 02:24:06 -08:00
|
|
|
{
|
2007-12-23 16:04:55 -08:00
|
|
|
int x, y, w, h, ww, hh, cx, cy;
|
2006-11-26 09:10:40 -08:00
|
|
|
unsigned int csr;
|
2004-01-18 02:24:06 -08:00
|
|
|
|
2005-07-08 09:48:19 -07:00
|
|
|
if (!ewin || ewin->state.inhibit_resize)
|
2009-12-10 08:37:56 -08:00
|
|
|
return;
|
2004-01-18 02:24:06 -08:00
|
|
|
|
2009-12-19 23:29:51 -08:00
|
|
|
_MoveResizeInit();
|
|
|
|
|
2005-08-15 09:57:13 -07:00
|
|
|
Mode_mr.ewin = ewin;
|
2004-07-15 11:23:54 -07:00
|
|
|
|
2007-12-23 16:04:55 -08:00
|
|
|
EventsGetXY(&cx, &cy);
|
|
|
|
|
2008-12-14 08:44:45 -08:00
|
|
|
SoundPlay(SOUND_RESIZE_START);
|
2004-12-28 15:46:49 -08:00
|
|
|
|
2005-11-19 07:47:10 -08:00
|
|
|
if (Conf.movres.mode_resize < 0 || Conf.movres.mode_resize > 4)
|
|
|
|
Conf.movres.mode_resize = 0;
|
2007-06-11 15:28:35 -07:00
|
|
|
Mode_mr.mode = Conf.movres.mode_resize;
|
2009-02-14 03:09:06 -08:00
|
|
|
Mode_mr.using_kbd = kbd;
|
2007-06-11 15:28:35 -07:00
|
|
|
Mode_mr.grab_server = _NeedServerGrab(Mode_mr.mode);
|
|
|
|
if (Mode_mr.grab_server)
|
2005-07-19 15:33:30 -07:00
|
|
|
{
|
|
|
|
EGrabServer();
|
|
|
|
ModulesSignal(ESIGNAL_ANIMATION_SUSPEND, NULL);
|
2005-10-19 09:16:41 -07:00
|
|
|
/* Run idlers (stacking, border updates, ...) before drawing lines */
|
2006-04-09 03:18:34 -07:00
|
|
|
IdlersRun();
|
2005-07-19 15:33:30 -07:00
|
|
|
}
|
2007-06-11 15:28:35 -07:00
|
|
|
if (Mode_mr.mode == 0)
|
2005-07-24 08:29:30 -07:00
|
|
|
{
|
2006-04-07 12:48:10 -07:00
|
|
|
ewin->state.resizing = 1;
|
2006-04-02 01:45:40 -08:00
|
|
|
EwinUpdateOpacity(ewin);
|
2005-07-24 08:29:30 -07:00
|
|
|
}
|
2004-12-28 15:46:49 -08:00
|
|
|
|
2004-01-18 02:24:06 -08:00
|
|
|
switch (hv)
|
|
|
|
{
|
2006-11-26 09:10:40 -08:00
|
|
|
default:
|
2004-01-18 02:24:06 -08:00
|
|
|
case MODE_RESIZE:
|
2004-03-20 07:49:05 -08:00
|
|
|
Mode.mode = hv;
|
2009-02-14 03:09:06 -08:00
|
|
|
if (kbd)
|
|
|
|
{
|
|
|
|
Mode_mr.resize_detail = 0;
|
|
|
|
csr = ECSR_ACT_RESIZE_BR;
|
|
|
|
break;
|
|
|
|
}
|
2007-12-23 16:04:55 -08:00
|
|
|
x = cx - EoGetX(ewin);
|
|
|
|
y = cy - EoGetY(ewin);
|
2004-12-28 15:46:49 -08:00
|
|
|
w = EoGetW(ewin) >> 1;
|
|
|
|
h = EoGetH(ewin) >> 1;
|
|
|
|
ww = EoGetW(ewin) / 6;
|
|
|
|
hh = EoGetH(ewin) / 6;
|
|
|
|
|
2006-11-26 09:10:40 -08:00
|
|
|
csr = ECSR_ACT_RESIZE;
|
2004-01-18 02:24:06 -08:00
|
|
|
if ((x < w) && (y < h))
|
2006-11-26 09:10:40 -08:00
|
|
|
{
|
2007-06-17 13:03:29 -07:00
|
|
|
Mode_mr.resize_detail = RD(1, 1);
|
2006-11-26 09:10:40 -08:00
|
|
|
csr = ECSR_ACT_RESIZE_TL;
|
|
|
|
}
|
|
|
|
else if ((x >= w) && (y < h))
|
|
|
|
{
|
2007-06-17 13:03:29 -07:00
|
|
|
Mode_mr.resize_detail = RD(2, 1);
|
2006-11-26 09:10:40 -08:00
|
|
|
csr = ECSR_ACT_RESIZE_TR;
|
|
|
|
}
|
|
|
|
else if ((x < w) && (y >= h))
|
|
|
|
{
|
2007-06-17 13:03:29 -07:00
|
|
|
Mode_mr.resize_detail = RD(1, 2);
|
2006-11-26 09:10:40 -08:00
|
|
|
csr = ECSR_ACT_RESIZE_BL;
|
|
|
|
}
|
|
|
|
else if ((x >= w) && (y >= h))
|
|
|
|
{
|
2007-06-17 13:03:29 -07:00
|
|
|
Mode_mr.resize_detail = RD(2, 2);
|
2006-11-26 09:10:40 -08:00
|
|
|
csr = ECSR_ACT_RESIZE_BR;
|
|
|
|
}
|
2004-07-22 09:11:43 -07:00
|
|
|
|
|
|
|
/* The following four if statements added on 07/22/04 by Josh Holtrop.
|
|
|
|
* They allow strictly horizontal or vertical resizing when the
|
|
|
|
* cursor is towards the middle of an edge of a window. */
|
2004-11-21 12:37:38 -08:00
|
|
|
if ((abs(x - w) < (w >> 1)) && (y < hh))
|
2004-07-22 09:11:43 -07:00
|
|
|
{
|
|
|
|
Mode.mode = MODE_RESIZE_V;
|
2007-06-17 13:03:29 -07:00
|
|
|
Mode_mr.resize_detail = RD(0, 1);
|
2006-11-26 09:10:40 -08:00
|
|
|
csr = ECSR_ACT_RESIZE_V;
|
2004-07-22 09:11:43 -07:00
|
|
|
}
|
2004-12-28 15:46:49 -08:00
|
|
|
else if ((abs(x - w) < (w >> 1)) && (y > (EoGetH(ewin) - hh)))
|
2004-07-22 09:11:43 -07:00
|
|
|
{
|
|
|
|
Mode.mode = MODE_RESIZE_V;
|
2007-06-17 13:03:29 -07:00
|
|
|
Mode_mr.resize_detail = RD(0, 2);
|
2006-11-26 09:10:40 -08:00
|
|
|
csr = ECSR_ACT_RESIZE_V;
|
2004-07-22 09:11:43 -07:00
|
|
|
}
|
2004-11-21 12:37:38 -08:00
|
|
|
else if ((abs(y - h) < (h >> 1)) && (x < ww))
|
2004-07-22 09:11:43 -07:00
|
|
|
{
|
|
|
|
Mode.mode = MODE_RESIZE_H;
|
2007-06-17 13:03:29 -07:00
|
|
|
Mode_mr.resize_detail = RD(1, 0);
|
2006-11-26 09:10:40 -08:00
|
|
|
csr = ECSR_ACT_RESIZE_H;
|
2004-07-22 09:11:43 -07:00
|
|
|
}
|
2004-12-28 15:46:49 -08:00
|
|
|
else if ((abs(y - h) < (h >> 1)) && (x > (EoGetW(ewin) - ww)))
|
2004-07-22 09:11:43 -07:00
|
|
|
{
|
|
|
|
Mode.mode = MODE_RESIZE_H;
|
2007-06-17 13:03:29 -07:00
|
|
|
Mode_mr.resize_detail = RD(2, 0);
|
2006-11-26 09:10:40 -08:00
|
|
|
csr = ECSR_ACT_RESIZE_H;
|
2004-07-22 09:11:43 -07:00
|
|
|
}
|
2004-01-18 02:24:06 -08:00
|
|
|
break;
|
2004-07-22 09:11:43 -07:00
|
|
|
|
2004-01-18 02:24:06 -08:00
|
|
|
case MODE_RESIZE_H:
|
2004-03-20 07:49:05 -08:00
|
|
|
Mode.mode = hv;
|
2007-12-23 16:04:55 -08:00
|
|
|
x = cx - EoGetX(ewin);
|
2004-12-28 15:46:49 -08:00
|
|
|
w = EoGetW(ewin) >> 1;
|
2004-01-18 02:24:06 -08:00
|
|
|
if (x < w)
|
2007-06-17 13:03:29 -07:00
|
|
|
Mode_mr.resize_detail = RD(1, 0);
|
2004-01-18 02:24:06 -08:00
|
|
|
else
|
2007-06-17 13:03:29 -07:00
|
|
|
Mode_mr.resize_detail = RD(2, 0);
|
2006-11-26 09:10:40 -08:00
|
|
|
csr = ECSR_ACT_RESIZE_H;
|
2004-01-18 02:24:06 -08:00
|
|
|
break;
|
2004-07-22 09:11:43 -07:00
|
|
|
|
2004-01-18 02:24:06 -08:00
|
|
|
case MODE_RESIZE_V:
|
2004-03-20 07:49:05 -08:00
|
|
|
Mode.mode = hv;
|
2007-12-23 16:04:55 -08:00
|
|
|
y = cy - EoGetY(ewin);
|
2004-12-28 15:46:49 -08:00
|
|
|
h = EoGetH(ewin) >> 1;
|
2004-01-18 02:24:06 -08:00
|
|
|
if (y < h)
|
2007-06-17 13:03:29 -07:00
|
|
|
Mode_mr.resize_detail = RD(0, 1);
|
2004-01-18 02:24:06 -08:00
|
|
|
else
|
2007-06-17 13:03:29 -07:00
|
|
|
Mode_mr.resize_detail = RD(0, 2);
|
2006-11-26 09:10:40 -08:00
|
|
|
csr = ECSR_ACT_RESIZE_V;
|
2004-01-18 02:24:06 -08:00
|
|
|
break;
|
|
|
|
}
|
2004-07-22 09:11:43 -07:00
|
|
|
|
2009-02-14 03:09:06 -08:00
|
|
|
Mode_mr.start_x = Mode_mr.cur_x = cx;
|
|
|
|
Mode_mr.start_y = Mode_mr.cur_y = cy;
|
2005-08-15 09:57:13 -07:00
|
|
|
Mode_mr.win_x = EoGetX(ewin);
|
|
|
|
Mode_mr.win_y = EoGetY(ewin);
|
|
|
|
Mode_mr.win_w = ewin->client.w;
|
|
|
|
Mode_mr.win_h = ewin->client.h;
|
2006-11-26 09:10:40 -08:00
|
|
|
|
2009-02-14 03:09:06 -08:00
|
|
|
if (kbd)
|
2009-12-19 23:29:51 -08:00
|
|
|
GrabKeyboardSet(Mode_mr.events);
|
2009-02-14 03:09:06 -08:00
|
|
|
else
|
2009-12-19 23:29:51 -08:00
|
|
|
GrabPointerSet(Mode_mr.events, csr, 1);
|
2006-11-26 09:10:40 -08:00
|
|
|
|
2005-05-07 02:27:16 -07:00
|
|
|
EwinShapeSet(ewin);
|
2005-11-05 09:12:53 -08:00
|
|
|
ewin->state.show_coords = 1;
|
2004-12-28 15:46:49 -08:00
|
|
|
DrawEwinShape(ewin, Conf.movres.mode_resize, EoGetX(ewin), EoGetY(ewin),
|
2007-06-11 15:28:35 -07:00
|
|
|
ewin->client.w, ewin->client.h, 0, 0);
|
2004-01-18 02:24:06 -08:00
|
|
|
}
|
|
|
|
|
2009-12-10 08:37:56 -08:00
|
|
|
static void
|
|
|
|
_MoveResizeResizeEnd(EWin * ewin)
|
2004-01-18 02:24:06 -08:00
|
|
|
{
|
2005-08-15 09:57:13 -07:00
|
|
|
if (ewin && ewin != Mode_mr.ewin)
|
2009-12-10 08:37:56 -08:00
|
|
|
return;
|
2004-01-18 02:24:06 -08:00
|
|
|
|
2005-07-19 15:33:30 -07:00
|
|
|
Mode.mode = MODE_NONE;
|
|
|
|
|
2009-02-14 03:09:06 -08:00
|
|
|
GrabKeyboardRelease();
|
2004-11-25 11:14:40 -08:00
|
|
|
GrabPointerRelease();
|
|
|
|
|
2008-12-14 08:44:45 -08:00
|
|
|
SoundPlay(SOUND_RESIZE_STOP);
|
2004-01-18 02:24:06 -08:00
|
|
|
|
2005-08-15 09:57:13 -07:00
|
|
|
ewin = Mode_mr.ewin;
|
2004-01-18 02:24:06 -08:00
|
|
|
if (!ewin)
|
2005-07-19 15:33:30 -07:00
|
|
|
goto done;
|
|
|
|
|
2005-11-05 09:12:53 -08:00
|
|
|
ewin->state.show_coords = 0;
|
2004-12-28 15:46:49 -08:00
|
|
|
DrawEwinShape(ewin, Conf.movres.mode_resize, ewin->shape_x, ewin->shape_y,
|
2007-06-17 13:03:29 -07:00
|
|
|
ewin->shape_w, ewin->shape_h, 2, 0);
|
2004-12-28 15:46:49 -08:00
|
|
|
|
2007-06-11 15:28:35 -07:00
|
|
|
if (Mode_mr.mode == 0)
|
2005-07-24 08:29:30 -07:00
|
|
|
{
|
2006-04-07 12:48:10 -07:00
|
|
|
ewin->state.resizing = 0;
|
2006-04-02 01:45:40 -08:00
|
|
|
EwinUpdateOpacity(ewin);
|
2005-07-24 08:29:30 -07:00
|
|
|
}
|
2005-11-19 07:47:10 -08:00
|
|
|
else
|
|
|
|
{
|
|
|
|
if (ewin->state.shaded)
|
2006-02-19 14:23:50 -08:00
|
|
|
EwinOpMove(ewin, OPSRC_USER, ewin->shape_x, ewin->shape_y);
|
2005-11-19 07:47:10 -08:00
|
|
|
else
|
2006-02-19 14:23:50 -08:00
|
|
|
EwinOpMoveResize(ewin, OPSRC_USER, ewin->shape_x, ewin->shape_y,
|
|
|
|
ewin->shape_w, ewin->shape_h);
|
2005-11-19 07:47:10 -08:00
|
|
|
}
|
2005-07-24 08:29:30 -07:00
|
|
|
|
2008-02-13 13:31:29 -08:00
|
|
|
ESync(ESYNC_MOVRES);
|
2004-12-28 15:46:49 -08:00
|
|
|
|
2005-07-19 15:33:30 -07:00
|
|
|
done:
|
2007-06-11 15:28:35 -07:00
|
|
|
if (Mode_mr.grab_server)
|
2005-07-19 15:33:30 -07:00
|
|
|
{
|
|
|
|
EUngrabServer();
|
|
|
|
ModulesSignal(ESIGNAL_ANIMATION_RESUME, NULL);
|
|
|
|
}
|
2004-01-18 02:24:06 -08:00
|
|
|
}
|
|
|
|
|
2007-09-05 12:12:56 -07:00
|
|
|
static void
|
2009-12-10 08:37:56 -08:00
|
|
|
_MoveResizeMoveHandleMotion(void)
|
2004-01-18 02:24:06 -08:00
|
|
|
{
|
2004-05-18 16:31:07 -07:00
|
|
|
int dx, dy, dd;
|
|
|
|
EWin *ewin, **gwins, *ewin1;
|
|
|
|
int i, num;
|
2004-01-18 02:24:06 -08:00
|
|
|
int ndx, ndy;
|
|
|
|
int screen_snap_dist;
|
2004-05-16 09:02:58 -07:00
|
|
|
char jumpx, jumpy;
|
|
|
|
int min_dx, max_dx, min_dy, max_dy;
|
2004-01-18 02:24:06 -08:00
|
|
|
|
2005-08-15 09:57:13 -07:00
|
|
|
ewin = Mode_mr.ewin;
|
2004-01-18 02:24:06 -08:00
|
|
|
if (!ewin)
|
|
|
|
return;
|
|
|
|
|
2007-12-21 14:04:55 -08:00
|
|
|
EdgeCheckMotion(Mode.events.mx, Mode.events.my);
|
2005-01-02 07:38:52 -08:00
|
|
|
|
2004-12-28 15:46:49 -08:00
|
|
|
gwins = ListWinGroupMembersForEwin(ewin, GROUP_ACTION_MOVE,
|
2006-05-28 03:12:25 -07:00
|
|
|
Mode_mr.nogroup || Mode.move.swap, &num);
|
2004-01-18 02:24:06 -08:00
|
|
|
|
2004-03-20 07:49:05 -08:00
|
|
|
if (Mode.mode == MODE_MOVE_PENDING)
|
2004-01-18 02:24:06 -08:00
|
|
|
{
|
2007-06-11 15:28:35 -07:00
|
|
|
if (Mode_mr.grab_server)
|
2005-07-19 15:33:30 -07:00
|
|
|
{
|
|
|
|
EGrabServer();
|
2006-02-02 14:34:06 -08:00
|
|
|
FocusEnable(0);
|
2005-07-19 15:33:30 -07:00
|
|
|
ModulesSignal(ESIGNAL_ANIMATION_SUSPEND, NULL);
|
|
|
|
}
|
2005-05-07 04:20:02 -07:00
|
|
|
|
2005-11-19 07:47:10 -08:00
|
|
|
if (Mode_mr.mode == 0 || num == 1)
|
2005-11-05 09:12:53 -08:00
|
|
|
ewin->state.show_coords = 1;
|
|
|
|
|
2004-01-18 02:24:06 -08:00
|
|
|
for (i = 0; i < num; i++)
|
2004-05-18 16:31:07 -07:00
|
|
|
{
|
|
|
|
ewin1 = gwins[i];
|
2008-03-01 07:36:15 -08:00
|
|
|
DrawEwinShape(ewin1, Mode_mr.mode, EoGetX(ewin1), EoGetY(ewin1),
|
|
|
|
ewin1->client.w, ewin1->client.h, 0, i);
|
|
|
|
if (Conf.movres.mode_move == 0)
|
|
|
|
Mode_mr.mode = 0;
|
2004-05-18 16:31:07 -07:00
|
|
|
}
|
2004-03-20 07:49:05 -08:00
|
|
|
Mode.mode = MODE_MOVE;
|
2007-12-22 06:40:20 -08:00
|
|
|
dx = Mode.events.mx - Mode_mr.start_x;
|
|
|
|
dy = Mode.events.my - Mode_mr.start_y;
|
|
|
|
}
|
2008-03-01 07:36:15 -08:00
|
|
|
else if (Mode.mode == MODE_MOVE)
|
2007-12-22 06:40:20 -08:00
|
|
|
{
|
|
|
|
dx = Mode.events.mx - Mode.events.px;
|
|
|
|
dy = Mode.events.my - Mode.events.py;
|
2004-01-18 02:24:06 -08:00
|
|
|
}
|
2008-03-01 07:36:15 -08:00
|
|
|
else
|
|
|
|
{
|
|
|
|
/* It should not be possible to get here. */
|
|
|
|
goto done;
|
|
|
|
}
|
2004-05-15 15:42:21 -07:00
|
|
|
|
2004-05-16 09:02:58 -07:00
|
|
|
jumpx = 0;
|
|
|
|
jumpy = 0;
|
|
|
|
min_dx = dx;
|
|
|
|
min_dy = dy;
|
|
|
|
max_dx = dx;
|
|
|
|
max_dy = dy;
|
2004-01-18 02:24:06 -08:00
|
|
|
|
2004-05-16 09:02:58 -07:00
|
|
|
for (i = 0; i < num; i++)
|
|
|
|
{
|
|
|
|
ndx = dx;
|
|
|
|
ndy = dy;
|
|
|
|
/* make our ewin resist other ewins around the place */
|
|
|
|
SnapEwin(gwins[i], dx, dy, &ndx, &ndy);
|
|
|
|
if ((dx < 0) && (ndx <= 0))
|
|
|
|
{
|
|
|
|
if (ndx > min_dx)
|
|
|
|
min_dx = ndx;
|
|
|
|
if (ndx < max_dx)
|
|
|
|
max_dx = ndx;
|
|
|
|
}
|
|
|
|
else if (ndx >= 0)
|
|
|
|
{
|
|
|
|
if (ndx < min_dx)
|
|
|
|
min_dx = ndx;
|
|
|
|
if (ndx > max_dx)
|
|
|
|
max_dx = ndx;
|
|
|
|
}
|
|
|
|
if ((dy < 0) && (ndy <= 0))
|
|
|
|
{
|
|
|
|
if (ndy > min_dy)
|
|
|
|
min_dy = ndy;
|
|
|
|
if (ndy < max_dy)
|
|
|
|
max_dy = ndy;
|
|
|
|
}
|
|
|
|
else if (ndy >= 0)
|
|
|
|
{
|
|
|
|
if (ndy < min_dy)
|
|
|
|
min_dy = ndy;
|
|
|
|
if (ndy > max_dy)
|
|
|
|
max_dy = ndy;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
if (min_dx == dx)
|
|
|
|
ndx = max_dx;
|
|
|
|
else
|
|
|
|
ndx = min_dx;
|
|
|
|
if (min_dy == dy)
|
|
|
|
ndy = max_dy;
|
|
|
|
else
|
|
|
|
ndy = min_dy;
|
|
|
|
|
|
|
|
screen_snap_dist =
|
2008-03-24 04:12:40 -07:00
|
|
|
Mode.constrained ? (WinGetW(VROOT) +
|
|
|
|
WinGetH(VROOT)) : Conf.snap.screen_snap_dist;
|
2004-05-16 09:02:58 -07:00
|
|
|
|
|
|
|
for (i = 0; i < num; i++)
|
|
|
|
{
|
2004-05-18 16:31:07 -07:00
|
|
|
ewin1 = gwins[i];
|
|
|
|
|
2004-05-16 09:02:58 -07:00
|
|
|
/* jump out of snap horizontally */
|
2004-05-18 16:31:07 -07:00
|
|
|
dd = ewin1->req_x - ewin1->shape_x;
|
|
|
|
if (dd < 0)
|
|
|
|
dd = -dd;
|
2004-05-16 09:02:58 -07:00
|
|
|
if ((ndx != dx) &&
|
2004-05-18 16:31:07 -07:00
|
|
|
(((ewin1->shape_x == 0) &&
|
|
|
|
(dd > screen_snap_dist)) ||
|
2008-03-24 04:12:40 -07:00
|
|
|
((ewin1->shape_x == (WinGetW(VROOT) - EoGetW(ewin1))) &&
|
2004-05-18 16:31:07 -07:00
|
|
|
(dd > screen_snap_dist)) ||
|
|
|
|
((ewin1->shape_x != 0) &&
|
2008-03-24 04:12:40 -07:00
|
|
|
(ewin1->shape_x != (WinGetW(VROOT) - EoGetW(ewin1)) &&
|
2004-05-18 16:31:07 -07:00
|
|
|
(dd > Conf.snap.edge_snap_dist)))))
|
2004-05-16 09:02:58 -07:00
|
|
|
{
|
|
|
|
jumpx = 1;
|
2004-05-18 16:31:07 -07:00
|
|
|
ndx = ewin1->req_x - ewin1->shape_x + dx;
|
2004-05-16 09:02:58 -07:00
|
|
|
}
|
|
|
|
|
|
|
|
/* jump out of snap vertically */
|
2004-05-18 16:31:07 -07:00
|
|
|
dd = ewin1->req_y - ewin1->shape_y;
|
|
|
|
if (dd < 0)
|
|
|
|
dd = -dd;
|
2004-05-16 09:02:58 -07:00
|
|
|
if ((ndy != dy) &&
|
2004-05-18 16:31:07 -07:00
|
|
|
(((ewin1->shape_y == 0) &&
|
|
|
|
(dd > screen_snap_dist)) ||
|
2008-03-24 04:12:40 -07:00
|
|
|
((ewin1->shape_y == (WinGetH(VROOT) - EoGetH(ewin1))) &&
|
2004-05-18 16:31:07 -07:00
|
|
|
(dd > screen_snap_dist)) ||
|
|
|
|
((ewin1->shape_y != 0) &&
|
2008-03-24 04:12:40 -07:00
|
|
|
(ewin1->shape_y != (WinGetH(VROOT) - EoGetH(ewin1)) &&
|
2004-05-18 16:31:07 -07:00
|
|
|
(dd > Conf.snap.edge_snap_dist)))))
|
2004-05-16 09:02:58 -07:00
|
|
|
{
|
|
|
|
jumpy = 1;
|
2004-05-18 16:31:07 -07:00
|
|
|
ndy = ewin1->req_y - ewin1->shape_y + dy;
|
2004-05-16 09:02:58 -07:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
for (i = 0; i < num; i++)
|
|
|
|
{
|
2004-05-18 16:31:07 -07:00
|
|
|
ewin1 = gwins[i];
|
|
|
|
|
2004-05-16 09:02:58 -07:00
|
|
|
/* if its opaque move mode check to see if we have to float */
|
2005-03-04 14:14:58 -08:00
|
|
|
/* the window above all desktops (reparent to root) */
|
2005-11-19 07:47:10 -08:00
|
|
|
if (Mode_mr.mode == 0)
|
2005-05-07 02:27:16 -07:00
|
|
|
{
|
2005-09-04 00:27:20 -07:00
|
|
|
Desk *dsk;
|
2005-05-07 02:27:16 -07:00
|
|
|
|
2005-09-04 00:27:20 -07:00
|
|
|
dsk = EoGetDesk(ewin1);
|
2005-05-07 02:27:16 -07:00
|
|
|
DetermineEwinFloat(ewin1, ndx, ndy);
|
2005-09-04 00:27:20 -07:00
|
|
|
if (dsk != EoGetDesk(ewin1))
|
2005-05-07 02:27:16 -07:00
|
|
|
{
|
2005-09-04 00:27:20 -07:00
|
|
|
ewin1->shape_x += EoGetX(dsk);
|
|
|
|
ewin1->shape_y += EoGetY(dsk);
|
|
|
|
ewin1->req_x += EoGetX(dsk);
|
|
|
|
ewin1->req_y += EoGetY(dsk);
|
2005-05-07 02:27:16 -07:00
|
|
|
}
|
|
|
|
}
|
2004-05-18 16:31:07 -07:00
|
|
|
|
2004-05-16 09:02:58 -07:00
|
|
|
/* draw the new position of the window */
|
2005-11-19 07:47:10 -08:00
|
|
|
DrawEwinShape(ewin1, Mode_mr.mode,
|
2004-05-19 14:41:03 -07:00
|
|
|
ewin1->shape_x + ndx, ewin1->shape_y + ndy,
|
2007-06-11 15:28:35 -07:00
|
|
|
ewin1->client.w, ewin1->client.h, 1, i);
|
2004-05-18 16:31:07 -07:00
|
|
|
|
|
|
|
/* if we didnt jump the window after a resist at the edge */
|
2004-05-16 09:02:58 -07:00
|
|
|
/* reset the requested x to be the prev. requested + delta */
|
2004-05-18 16:31:07 -07:00
|
|
|
/* if we did jump set requested to current shape position */
|
|
|
|
ewin1->req_x = (jumpx) ? ewin1->shape_x : ewin1->req_x + dx;
|
|
|
|
ewin1->req_y = (jumpy) ? ewin1->shape_y : ewin1->req_y + dy;
|
2004-05-16 09:02:58 -07:00
|
|
|
|
|
|
|
/* swapping of group member locations: */
|
2005-11-19 07:47:10 -08:00
|
|
|
if (Mode.move.swap && GroupsGetSwapmove())
|
2004-05-16 09:02:58 -07:00
|
|
|
{
|
2004-05-18 16:31:07 -07:00
|
|
|
EWin **all_gwins, *ewin2;
|
|
|
|
int j, all_gwins_num;
|
2004-05-16 09:02:58 -07:00
|
|
|
|
2004-12-28 15:46:49 -08:00
|
|
|
all_gwins = ListWinGroupMembersForEwin(ewin, GROUP_ACTION_ANY, 0,
|
2004-05-18 16:31:07 -07:00
|
|
|
&all_gwins_num);
|
2004-05-16 09:02:58 -07:00
|
|
|
|
|
|
|
for (j = 0; j < all_gwins_num; j++)
|
|
|
|
{
|
2004-05-18 16:31:07 -07:00
|
|
|
ewin2 = all_gwins[j];
|
|
|
|
|
|
|
|
if (ewin1 == ewin2)
|
2004-05-16 09:02:58 -07:00
|
|
|
continue;
|
|
|
|
|
|
|
|
/* check for sufficient overlap and avoid flickering */
|
2004-05-18 16:31:07 -07:00
|
|
|
if (((ewin1->shape_x >= ewin2->shape_x &&
|
2007-12-22 06:40:20 -08:00
|
|
|
ewin1->shape_x <= ewin2->shape_x + EoGetW(ewin2) / 2 &&
|
|
|
|
dx <= 0) ||
|
2004-05-18 16:31:07 -07:00
|
|
|
(ewin1->shape_x <= ewin2->shape_x &&
|
2007-12-22 06:40:20 -08:00
|
|
|
ewin1->shape_x + EoGetW(ewin1) / 2 >= ewin2->shape_x &&
|
|
|
|
dx >= 0)) &&
|
2007-12-21 14:04:55 -08:00
|
|
|
((ewin1->shape_y >= ewin2->shape_y &&
|
|
|
|
ewin1->shape_y <= ewin2->shape_y + EoGetH(ewin2) / 2 &&
|
2007-12-22 06:40:20 -08:00
|
|
|
dy <= 0) ||
|
2007-12-21 14:04:55 -08:00
|
|
|
(EoGetY(ewin1) <= EoGetY(ewin2) &&
|
2007-12-22 06:40:20 -08:00
|
|
|
ewin1->shape_y + EoGetH(ewin1) / 2 >= ewin2->shape_y &&
|
|
|
|
dy >= 0)))
|
2004-05-16 09:02:58 -07:00
|
|
|
{
|
|
|
|
int tmp_swapcoord_x;
|
|
|
|
int tmp_swapcoord_y;
|
|
|
|
|
2005-08-15 09:57:13 -07:00
|
|
|
tmp_swapcoord_x = Mode_mr.swapcoord_x;
|
|
|
|
tmp_swapcoord_y = Mode_mr.swapcoord_y;
|
|
|
|
Mode_mr.swapcoord_x = ewin2->shape_x;
|
|
|
|
Mode_mr.swapcoord_y = ewin2->shape_y;
|
2006-02-19 14:23:50 -08:00
|
|
|
EwinOpMove(ewin2, OPSRC_USER,
|
|
|
|
tmp_swapcoord_x, tmp_swapcoord_y);
|
2004-05-16 09:02:58 -07:00
|
|
|
break;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
Efree(all_gwins);
|
|
|
|
}
|
|
|
|
}
|
2008-03-01 07:36:15 -08:00
|
|
|
|
|
|
|
done:
|
2004-01-18 02:24:06 -08:00
|
|
|
Efree(gwins);
|
|
|
|
}
|
|
|
|
|
2007-09-05 12:12:56 -07:00
|
|
|
static void
|
2009-12-10 08:37:56 -08:00
|
|
|
_MoveResizeResizeHandleMotion(void)
|
2004-01-18 02:24:06 -08:00
|
|
|
{
|
|
|
|
int x, y, w, h;
|
|
|
|
EWin *ewin;
|
|
|
|
|
2005-08-15 09:57:13 -07:00
|
|
|
ewin = Mode_mr.ewin;
|
2004-01-18 02:24:06 -08:00
|
|
|
if (!ewin)
|
|
|
|
return;
|
|
|
|
|
2007-06-17 13:03:29 -07:00
|
|
|
w = ewin->client.w;
|
|
|
|
h = ewin->client.h;
|
|
|
|
x = ewin->shape_x;
|
|
|
|
y = ewin->shape_y;
|
|
|
|
|
|
|
|
switch (RD_H(Mode_mr.resize_detail))
|
2004-01-18 02:24:06 -08:00
|
|
|
{
|
2007-06-11 15:28:35 -07:00
|
|
|
default:
|
2004-01-18 02:24:06 -08:00
|
|
|
break;
|
2007-06-17 13:03:29 -07:00
|
|
|
case 1: /* Left */
|
2007-12-21 14:04:55 -08:00
|
|
|
w = Mode_mr.win_w - (Mode.events.mx - Mode_mr.start_x);
|
2007-06-17 13:03:29 -07:00
|
|
|
ICCCM_SizeMatch(ewin, w, h, &w, &h);
|
|
|
|
x = Mode_mr.win_x + (Mode_mr.win_w - w);
|
2004-01-18 02:24:06 -08:00
|
|
|
break;
|
2007-06-17 13:03:29 -07:00
|
|
|
case 2: /* Right */
|
2007-12-21 14:04:55 -08:00
|
|
|
w = Mode_mr.win_w + (Mode.events.mx - Mode_mr.start_x);
|
2007-06-17 13:03:29 -07:00
|
|
|
ICCCM_SizeMatch(ewin, w, h, &w, &h);
|
|
|
|
break;
|
|
|
|
}
|
2004-01-18 02:24:06 -08:00
|
|
|
|
2007-06-17 13:03:29 -07:00
|
|
|
switch (RD_V(Mode_mr.resize_detail))
|
|
|
|
{
|
|
|
|
default:
|
|
|
|
break;
|
|
|
|
case 1: /* Top */
|
2007-12-21 14:04:55 -08:00
|
|
|
h = Mode_mr.win_h - (Mode.events.my - Mode_mr.start_y);
|
2007-06-17 13:03:29 -07:00
|
|
|
ICCCM_SizeMatch(ewin, w, h, &w, &h);
|
|
|
|
y = Mode_mr.win_y + (Mode_mr.win_h - h);
|
|
|
|
break;
|
|
|
|
case 2: /* Bottom */
|
2007-12-21 14:04:55 -08:00
|
|
|
h = Mode_mr.win_h + (Mode.events.my - Mode_mr.start_y);
|
2007-06-17 13:03:29 -07:00
|
|
|
ICCCM_SizeMatch(ewin, w, h, &w, &h);
|
2004-01-18 02:24:06 -08:00
|
|
|
break;
|
|
|
|
}
|
2007-06-17 13:03:29 -07:00
|
|
|
|
2007-06-11 15:28:35 -07:00
|
|
|
DrawEwinShape(ewin, Conf.movres.mode_resize, x, y, w, h, 1, 0);
|
2004-01-18 02:24:06 -08:00
|
|
|
}
|
2006-11-19 13:55:52 -08:00
|
|
|
|
2009-12-19 23:29:51 -08:00
|
|
|
static void
|
|
|
|
_MoveResizeHandleKey(unsigned int key)
|
2009-02-14 03:09:06 -08:00
|
|
|
{
|
|
|
|
EWin *ewin;
|
|
|
|
int resize, delta, end = 0;
|
|
|
|
|
|
|
|
ewin = Mode_mr.ewin;
|
|
|
|
if (!ewin)
|
|
|
|
return;
|
|
|
|
|
|
|
|
resize = Mode.mode == MODE_RESIZE ||
|
|
|
|
Mode.mode == MODE_RESIZE_H || Mode.mode == MODE_RESIZE_V;
|
|
|
|
|
|
|
|
Mode.events.px = Mode_mr.cur_x;
|
|
|
|
Mode.events.py = Mode_mr.cur_y;
|
|
|
|
delta = 5;
|
|
|
|
|
|
|
|
switch (key)
|
|
|
|
{
|
|
|
|
default:
|
|
|
|
return;
|
2009-12-10 08:37:56 -08:00
|
|
|
|
2009-02-14 03:09:06 -08:00
|
|
|
case XK_Escape:
|
|
|
|
Mode_mr.cur_x = Mode_mr.start_x;
|
|
|
|
Mode_mr.cur_y = Mode_mr.start_y;
|
|
|
|
case XK_Return:
|
|
|
|
end = 1;
|
|
|
|
break;
|
|
|
|
|
|
|
|
case XK_Left:
|
|
|
|
if (!RD_H(Mode_mr.resize_detail))
|
|
|
|
Mode_mr.resize_detail |= RD(1, 0);
|
|
|
|
if (resize && ewin->icccm.w_inc > delta)
|
|
|
|
delta = ewin->icccm.w_inc;
|
|
|
|
Mode_mr.cur_x -= delta;
|
|
|
|
break;
|
|
|
|
case XK_Right:
|
|
|
|
if (!RD_H(Mode_mr.resize_detail))
|
|
|
|
Mode_mr.resize_detail |= RD(2, 0);
|
|
|
|
if (resize && ewin->icccm.w_inc > delta)
|
|
|
|
delta = ewin->icccm.w_inc;
|
|
|
|
Mode_mr.cur_x += delta;
|
|
|
|
break;
|
|
|
|
case XK_Up:
|
|
|
|
if (!RD_V(Mode_mr.resize_detail))
|
|
|
|
Mode_mr.resize_detail |= RD(0, 1);
|
|
|
|
if (resize && ewin->icccm.h_inc > delta)
|
|
|
|
delta = ewin->icccm.h_inc;
|
|
|
|
Mode_mr.cur_y -= delta;
|
|
|
|
break;
|
|
|
|
case XK_Down:
|
|
|
|
if (!RD_V(Mode_mr.resize_detail))
|
|
|
|
Mode_mr.resize_detail |= RD(0, 2);
|
|
|
|
if (resize && ewin->icccm.h_inc > delta)
|
|
|
|
delta = ewin->icccm.h_inc;
|
|
|
|
Mode_mr.cur_y += delta;
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
|
|
|
|
Mode_mr.using_kbd = 2;
|
|
|
|
Mode.events.mx = Mode_mr.cur_x;
|
|
|
|
Mode.events.my = Mode_mr.cur_y;
|
|
|
|
|
|
|
|
switch (Mode.mode)
|
|
|
|
{
|
|
|
|
case MODE_MOVE_PENDING:
|
|
|
|
case MODE_MOVE:
|
2009-12-10 08:37:56 -08:00
|
|
|
_MoveResizeMoveHandleMotion();
|
2009-02-14 03:09:06 -08:00
|
|
|
if (end)
|
2009-12-10 08:37:56 -08:00
|
|
|
_MoveResizeMoveEnd(NULL);
|
2009-02-14 03:09:06 -08:00
|
|
|
break;
|
|
|
|
|
|
|
|
case MODE_RESIZE:
|
|
|
|
case MODE_RESIZE_H:
|
|
|
|
case MODE_RESIZE_V:
|
2009-12-10 08:37:56 -08:00
|
|
|
_MoveResizeResizeHandleMotion();
|
2009-02-14 03:09:06 -08:00
|
|
|
if (end)
|
2009-12-10 08:37:56 -08:00
|
|
|
_MoveResizeResizeEnd(NULL);
|
2009-02-14 03:09:06 -08:00
|
|
|
break;
|
|
|
|
|
|
|
|
default:
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2009-12-19 23:29:51 -08:00
|
|
|
static void
|
|
|
|
_MoveResizeHandleMotion(void)
|
2006-11-19 13:55:52 -08:00
|
|
|
{
|
|
|
|
switch (Mode.mode)
|
|
|
|
{
|
|
|
|
case MODE_MOVE_PENDING:
|
|
|
|
case MODE_MOVE:
|
2009-12-10 08:37:56 -08:00
|
|
|
_MoveResizeMoveHandleMotion();
|
2006-11-19 13:55:52 -08:00
|
|
|
break;
|
|
|
|
|
|
|
|
case MODE_RESIZE:
|
|
|
|
case MODE_RESIZE_H:
|
|
|
|
case MODE_RESIZE_V:
|
2009-12-10 08:37:56 -08:00
|
|
|
_MoveResizeResizeHandleMotion();
|
2006-11-19 13:55:52 -08:00
|
|
|
break;
|
|
|
|
|
|
|
|
default:
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2009-12-10 08:37:56 -08:00
|
|
|
void
|
|
|
|
MoveResizeSuspend(void)
|
2006-11-19 13:55:52 -08:00
|
|
|
{
|
|
|
|
switch (Mode.mode)
|
|
|
|
{
|
|
|
|
case MODE_MOVE_PENDING:
|
|
|
|
case MODE_MOVE:
|
2009-12-10 08:37:56 -08:00
|
|
|
_MoveResizeMoveSuspend();
|
2006-11-19 13:55:52 -08:00
|
|
|
break;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2009-12-10 08:37:56 -08:00
|
|
|
void
|
|
|
|
MoveResizeResume(void)
|
2006-11-19 13:55:52 -08:00
|
|
|
{
|
|
|
|
switch (Mode.mode)
|
|
|
|
{
|
|
|
|
case MODE_MOVE_PENDING:
|
|
|
|
case MODE_MOVE:
|
2009-12-10 08:37:56 -08:00
|
|
|
_MoveResizeMoveResume();
|
2006-11-19 13:55:52 -08:00
|
|
|
break;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2009-12-10 08:37:56 -08:00
|
|
|
void
|
|
|
|
MoveResizeEnd(EWin * ewin)
|
2006-11-19 13:55:52 -08:00
|
|
|
{
|
|
|
|
switch (Mode.mode)
|
|
|
|
{
|
|
|
|
case MODE_RESIZE:
|
|
|
|
case MODE_RESIZE_H:
|
|
|
|
case MODE_RESIZE_V:
|
2009-12-10 08:37:56 -08:00
|
|
|
_MoveResizeResizeEnd(ewin);
|
2006-11-19 13:55:52 -08:00
|
|
|
Mode.action_inhibit = 1;
|
|
|
|
break;
|
|
|
|
|
|
|
|
case MODE_MOVE_PENDING:
|
|
|
|
case MODE_MOVE:
|
2009-12-10 08:37:56 -08:00
|
|
|
_MoveResizeMoveEnd(ewin);
|
2009-12-26 02:35:47 -08:00
|
|
|
Mode.action_inhibit = 1;
|
2006-11-19 13:55:52 -08:00
|
|
|
break;
|
2009-12-19 23:29:51 -08:00
|
|
|
}
|
|
|
|
}
|
2006-11-19 13:55:52 -08:00
|
|
|
|
2009-12-19 23:29:51 -08:00
|
|
|
static void
|
|
|
|
_MoveResizeEventHandler(Win win __UNUSED__, XEvent * ev, void *prm __UNUSED__)
|
|
|
|
{
|
|
|
|
#if 0
|
|
|
|
Eprintf("%s: type=%2d win=%#lx\n", __func__, ev->type, ev->xany.window);
|
|
|
|
#endif
|
|
|
|
switch (ev->type)
|
|
|
|
{
|
2006-11-19 13:55:52 -08:00
|
|
|
default:
|
|
|
|
break;
|
2009-12-19 23:29:51 -08:00
|
|
|
case KeyPress:
|
|
|
|
_MoveResizeHandleKey(XLookupKeysym(&ev->xkey, 0));
|
|
|
|
break;
|
|
|
|
#if 0
|
|
|
|
case ButtonPress:
|
|
|
|
break;
|
|
|
|
#endif
|
|
|
|
case ButtonRelease:
|
|
|
|
MoveResizeEnd(NULL);
|
|
|
|
if (Mode_mr.ewin)
|
|
|
|
BorderCheckState(Mode_mr.ewin, ev);
|
|
|
|
break;
|
|
|
|
case MotionNotify:
|
|
|
|
_MoveResizeHandleMotion();
|
|
|
|
break;
|
2006-11-19 13:55:52 -08:00
|
|
|
}
|
|
|
|
}
|
2007-06-16 01:41:53 -07:00
|
|
|
|
2009-12-19 23:29:51 -08:00
|
|
|
static void
|
|
|
|
_MoveResizeInit(void)
|
|
|
|
{
|
|
|
|
if (Mode_mr.events)
|
|
|
|
return;
|
|
|
|
Mode_mr.events = ECreateEventWindow(VROOT, 0, 0, 1, 1);
|
|
|
|
EMapWindow(Mode_mr.events);
|
|
|
|
EventCallbackRegister(Mode_mr.events, _MoveResizeEventHandler, NULL);
|
|
|
|
}
|
|
|
|
|
2007-06-16 01:41:53 -07:00
|
|
|
void
|
|
|
|
SlideEwinTo(EWin * ewin, int fx, int fy, int tx, int ty, int speed, int mode)
|
|
|
|
{
|
|
|
|
SlideEwinsTo(&ewin, &fx, &fy, &tx, &ty, 1, speed, mode);
|
|
|
|
}
|
|
|
|
|
|
|
|
void
|
|
|
|
SlideEwinsTo(EWin ** ewin, int *fx, int *fy, int *tx, int *ty, int num_wins,
|
|
|
|
int speed, int mode)
|
|
|
|
{
|
|
|
|
int k, x, y, w, h, i;
|
|
|
|
char firstlast;
|
|
|
|
|
|
|
|
if (num_wins <= 0)
|
|
|
|
return;
|
|
|
|
|
|
|
|
firstlast = 0;
|
|
|
|
FocusEnable(0);
|
2008-12-14 08:44:45 -08:00
|
|
|
SoundPlay(SOUND_WINDOW_SLIDE);
|
2007-06-16 01:41:53 -07:00
|
|
|
|
|
|
|
Mode_mr.grab_server = _NeedServerGrab(mode);
|
|
|
|
if (Mode_mr.grab_server)
|
|
|
|
EGrabServer();
|
|
|
|
|
|
|
|
ETimedLoopInit(0, 1024, speed);
|
|
|
|
for (k = 0; k <= 1024;)
|
|
|
|
{
|
|
|
|
for (i = 0; i < num_wins; i++)
|
|
|
|
{
|
|
|
|
if (!ewin[i])
|
|
|
|
continue;
|
|
|
|
|
|
|
|
x = ((fx[i] * (1024 - k)) + (tx[i] * k)) >> 10;
|
|
|
|
y = ((fy[i] * (1024 - k)) + (ty[i] * k)) >> 10;
|
|
|
|
w = ewin[i]->client.w;
|
|
|
|
h = ewin[i]->client.h;
|
|
|
|
if (mode == 0)
|
|
|
|
EoMove(ewin[i], x, y);
|
|
|
|
else
|
|
|
|
DrawEwinShape(ewin[i], mode, x, y, w, h, firstlast, i);
|
|
|
|
firstlast = 1;
|
|
|
|
}
|
|
|
|
/* We may loop faster here than originally intended */
|
|
|
|
k = ETimedLoopNext();
|
|
|
|
}
|
|
|
|
|
|
|
|
for (i = 0; i < num_wins; i++)
|
|
|
|
{
|
|
|
|
if (!ewin[i])
|
|
|
|
continue;
|
|
|
|
|
|
|
|
ewin[i]->state.animated = 0;
|
|
|
|
|
|
|
|
if (mode > 0)
|
|
|
|
DrawEwinShape(ewin[i], mode, tx[i], ty[i], ewin[i]->client.w,
|
|
|
|
ewin[i]->client.h, 2, i);
|
|
|
|
EwinMove(ewin[i], tx[i], ty[i]);
|
|
|
|
}
|
|
|
|
|
|
|
|
FocusEnable(1);
|
|
|
|
|
|
|
|
if (Mode_mr.grab_server)
|
|
|
|
EUngrabServer();
|
|
|
|
|
2008-12-14 08:44:45 -08:00
|
|
|
SoundPlay(SOUND_WINDOW_SLIDE_END);
|
2007-06-16 01:41:53 -07:00
|
|
|
}
|