Rearranging window ops stuff.

SVN revision: 13278
This commit is contained in:
Kim Woelders 2005-02-10 09:27:19 +00:00
parent b3320bdaee
commit 291399acf3
1 changed files with 316 additions and 252 deletions

568
src/ipc.c
View File

@ -529,6 +529,114 @@ doMoveConstrainedNoGroup(EWin * ewin, const char *params)
}
#endif
typedef enum
{
EWIN_OP_INVALID,
EWIN_OP_CLOSE,
EWIN_OP_KILL,
EWIN_OP_ICONIFY,
EWIN_OP_OPACITY,
EWIN_OP_SHADOW,
EWIN_OP_SHADE,
EWIN_OP_SHADE,
EWIN_OP_STICK,
EWIN_OP_FIXED_POS,
EWIN_OP_NEVER_USE_AREA,
EWIN_OP_FOCUS_CLICK,
EWIN_OP_FOCUS_NEVER,
EWIN_OP_TITLE,
EWIN_OP_MAX_WIDTH,
EWIN_OP_MAX_HEIGHT,
EWIN_OP_MAX_SIZE,
EWIN_OP_RAISE,
EWIN_OP_LOWER,
EWIN_OP_LAYER,
EWIN_OP_BORDER,
EWIN_OP_DESK,
EWIN_OP_AREA,
EWIN_OP_MOVE,
EWIN_OP_SIZE,
EWIN_OP_MOVE_REL,
EWIN_OP_SIZE_REL,
EWIN_OP_FOCUS,
EWIN_OP_FULLSCREEN,
EWIN_OP_SKIP_LISTS,
EWIN_OP_ZOOM,
EWIN_OP_SNAP,
} winop_e;
typedef struct
{
const char *name;
char len;
char ok_ipc;
char ok_match;
char op;
} WinOp;
static const WinOp winops[] = {
{"close", 2, 1, 1, EWIN_OP_CLOSE},
{"kill", 0, 1, 1, EWIN_OP_KILL},
{"iconify", 2, 1, 1, EWIN_OP_ICONIFY},
{"opacity", 2, 1, 1, EWIN_OP_OPACITY},
{"shadow", 0, 1, 1, EWIN_OP_SHADOW}, /* Place before "shade" */
{"shade", 2, 1, 1, EWIN_OP_SHADE},
{"stick", 2, 1, 1, EWIN_OP_STICK},
{"fixedpos", 0, 1, 1, EWIN_OP_FIXED_POS},
{"never_use_area", 0, 1, 1, EWIN_OP_NEVER_USE_AREA},
{"focusclick", 0, 1, 1, EWIN_OP_FOCUS_CLICK},
{"neverfocus", 0, 1, 1, EWIN_OP_FOCUS_NEVER},
{"title", 2, 1, 1, EWIN_OP_TITLE},
{"toggle_width", 0, 1, 1, EWIN_OP_MAX_WIDTH},
{"tw", 2, 1, 1, EWIN_OP_MAX_WIDTH},
{"toggle_height", 0, 1, 1, EWIN_OP_MAX_HEIGHT},
{"th", 0, 1, 1, EWIN_OP_MAX_HEIGHT},
{"toggle_size", 0, 1, 1, EWIN_OP_MAX_SIZE},
{"ts", 2, 1, 1, EWIN_OP_MAX_SIZE},
{"raise", 2, 1, 1, EWIN_OP_RAISE},
{"lower", 2, 1, 1, EWIN_OP_LOWER},
{"layer", 2, 1, 1, EWIN_OP_LAYER},
{"border", 2, 1, 1, EWIN_OP_BORDER},
{"desk", 2, 1, 1, EWIN_OP_DESK},
{"area", 2, 1, 1, EWIN_OP_AREA},
{"move", 2, 1, 1, EWIN_OP_MOVE},
{"resize", 0, 1, 1, EWIN_OP_SIZE},
{"sz", 2, 1, 1, EWIN_OP_SIZE},
{"move_relative", 0, 1, 1, EWIN_OP_MOVE_REL},
{"mr", 2, 1, 1, EWIN_OP_MOVE_REL},
{"resize_relative", 0, 1, 1, EWIN_OP_SIZE_REL},
{"sr", 2, 1, 1, EWIN_OP_SIZE_REL},
{"focus", 2, 1, 1, EWIN_OP_FOCUS},
{"fullscreen", 2, 1, 1, EWIN_OP_FULLSCREEN},
{"skiplists", 4, 1, 1, EWIN_OP_SKIP_LISTS},
{"zoom", 2, 1, 1, EWIN_OP_ZOOM},
{"snap", 0, 1, 1, EWIN_OP_SNAP},
{NULL, 0, 0, 0, EWIN_OP_INVALID} /* Terminator */
};
static const WinOp *
WinopFind(const char *op)
{
const WinOp *wop;
wop = winops;
for (; wop->name; wop++)
{
if (wop->len)
{
if (!strncmp(op, wop->name, wop->len))
break;
}
else
{
if (!strcmp(op, wop->name))
break;
}
}
return wop;
}
static void
IPC_WinOps(const char *params, Client * c __UNUSED__)
{
@ -536,8 +644,11 @@ IPC_WinOps(const char *params, Client * c __UNUSED__)
char windowid[FILEPATH_LEN_MAX];
char operation[FILEPATH_LEN_MAX];
char param1[FILEPATH_LEN_MAX];
const char *p;
const WinOp *wop;
unsigned int val;
char on;
int a, b;
if (params == NULL)
{
@ -566,339 +677,292 @@ IPC_WinOps(const char *params, Client * c __UNUSED__)
goto done;
}
if (!strncmp(operation, "close", 2))
wop = WinopFind(operation);
switch (wop->op)
{
default:
case EWIN_OP_INVALID:
IpcPrintf("Error: unknown operation");
break;
case EWIN_OP_CLOSE:
EwinOpClose(ewin);
}
else if (!strcmp(operation, "kill"))
{
break;
case EWIN_OP_KILL:
EwinOpKill(ewin);
}
else if (!strncmp(operation, "iconify", 2))
{
break;
case EWIN_OP_ICONIFY:
if (SetEwinBoolean("window iconified", &ewin->iconified, param1, 0))
EwinOpIconify(ewin, !ewin->iconified);
}
break;
#if USE_COMPOSITE
else if (!strncmp(operation, "opacity", 2))
{
case EWIN_OP_OPACITY:
if (!strcmp(param1, "?"))
{
IpcPrintf("opacity: %u", ewin->props.opacity >> 24);
goto done;
}
else
{
val = 0xff;
sscanf(param1, "%i", &val);
EwinOpSetOpacity(ewin, val);
}
}
else if (!strcmp(operation, "shadow")) /* Place before "shade" */
{
val = 0xff;
sscanf(param1, "%i", &val);
EwinOpSetOpacity(ewin, val);
break;
case EWIN_OP_SHADOW:
on = EoGetShadow(ewin);
if (SetEwinBoolean("shadow", &on, param1, 0))
EoSetShadow(ewin, !on);
}
break;
#endif
else if (!strncmp(operation, "shade", 2))
{
case EWIN_OP_SHADE:
if (SetEwinBoolean("window shaded", &ewin->shaded, param1, 0))
EwinOpShade(ewin, !ewin->shaded);
}
else if (!strncmp(operation, "stick", 2))
{
break;
case EWIN_OP_STICK:
on = EoIsSticky(ewin);
if (SetEwinBoolean("window sticky", &on, param1, 0))
EwinOpStick(ewin, !on);
}
else if (!strcmp(operation, "fixedpos"))
{
break;
case EWIN_OP_FIXED_POS:
SetEwinBoolean("window fixedpos", &ewin->fixedpos, param1, 1);
}
else if (!strcmp(operation, "never_use_area"))
{
break;
case EWIN_OP_NEVER_USE_AREA:
SetEwinBoolean("window never_use_area", &ewin->never_use_area, param1,
1);
}
else if (!strcmp(operation, "focusclick"))
{
break;
case EWIN_OP_FOCUS_CLICK:
SetEwinBoolean("window focusclick", &ewin->focusclick, param1, 1);
}
else if (!strcmp(operation, "neverfocus"))
{
break;
case EWIN_OP_FOCUS_NEVER:
SetEwinBoolean("window neverfocus", &ewin->neverfocus, param1, 1);
}
else if (!strncmp(operation, "title", 2))
{
char *ptr = strstr(params, "title");
break;
if (ptr)
case EWIN_OP_TITLE:
p = atword(params, 3);
if (!p)
{
ptr += strlen("title");
while (*ptr == ' ')
ptr++;
if (strlen(ptr))
{
if (!strncmp(ptr, "?", 1))
{
/* return the window title */
IpcPrintf("window title: %s", ewin->icccm.wm_name);
}
else
{
/* set the new title */
if (ewin->icccm.wm_name)
Efree(ewin->icccm.wm_name);
ewin->icccm.wm_name =
Emalloc((strlen(ptr) + 1) * sizeof(char));
strcpy(ewin->icccm.wm_name, ptr);
XStoreName(disp, ewin->client.win, ewin->icccm.wm_name);
EwinBorderUpdateInfo(ewin);
}
}
else
{
/* error */
IpcPrintf("Error: no title specified");
}
IpcPrintf("Error: no title specified");
goto done;
}
}
else if (!strcmp(operation, "toggle_width") || !strcmp(operation, "tw"))
{
if (!strcmp(p, "?"))
{
IpcPrintf("window title: %s", ewin->icccm.wm_name);
goto done;
}
_EFREE(ewin->icccm.wm_name);
ewin->icccm.wm_name = Estrdup(p);
XStoreName(disp, ewin->client.win, ewin->icccm.wm_name);
EwinBorderUpdateInfo(ewin);
break;
case EWIN_OP_MAX_WIDTH:
MaxWidth(ewin, param1);
}
else if (!strcmp(operation, "toggle_height") || !strcmp(operation, "th"))
{
break;
case EWIN_OP_MAX_HEIGHT:
MaxHeight(ewin, param1);
}
else if (!strcmp(operation, "toggle_size") || !strcmp(operation, "ts"))
{
break;
case EWIN_OP_MAX_SIZE:
MaxSize(ewin, param1);
}
else if (!strncmp(operation, "raise", 2))
{
break;
case EWIN_OP_RAISE:
EwinOpRaise(ewin);
}
else if (!strncmp(operation, "lower", 2))
{
break;
case EWIN_OP_LOWER:
EwinOpLower(ewin);
}
else if (!strncmp(operation, "layer", 2))
{
break;
case EWIN_OP_LAYER:
if (!strcmp(param1, "?"))
{
IpcPrintf("window layer: %d", EoGetLayer(ewin));
goto done;
}
else
{
val = atoi(param1);
EwinOpSetLayer(ewin, val);
}
}
else if (!strncmp(operation, "border", 2))
{
if (param1[0])
{
if (!strcmp(param1, "?"))
{
if (ewin->border)
{
if (ewin->border->name)
{
IpcPrintf("window border: %s", ewin->border->name);
}
}
}
else
{
EwinOpSetBorder(ewin, param1);
}
}
else
val = atoi(param1);
EwinOpSetLayer(ewin, val);
break;
case EWIN_OP_BORDER:
if (!param1[0])
{
IpcPrintf("Error: no border specified");
goto done;
}
}
else if (!strncmp(operation, "desk", 2))
{
if (param1[0])
if (!strcmp(param1, "?"))
{
if (!strncmp(param1, "next", 1))
{
EwinOpMoveToDesk(ewin, EoGetDesk(ewin) + 1);
}
else if (!strncmp(param1, "prev", 1))
{
EwinOpMoveToDesk(ewin, EoGetDesk(ewin) - 1);
}
else if (!strcmp(param1, "?"))
{
IpcPrintf("window desk: %d", EoGetDesk(ewin));
}
else
{
EwinOpMoveToDesk(ewin, atoi(param1));
}
IpcPrintf("window border: %s", BorderGetName(ewin->border));
goto done;
}
else
EwinOpSetBorder(ewin, param1);
break;
case EWIN_OP_DESK:
if (!param1[0])
{
IpcPrintf("Error: no desktop supplied");
goto done;
}
}
else if (!strncmp(operation, "area", 2))
{
int a, b;
if (param1[0])
if (!strncmp(param1, "next", 1))
{
if (!strcmp(param1, "?"))
{
IpcPrintf("window area: %d %d", ewin->area_x, ewin->area_y);
}
else
{
sscanf(params, "%*s %*s %i %i", &a, &b);
MoveEwinToArea(ewin, a, b);
}
EwinOpMoveToDesk(ewin, EoGetDesk(ewin) + 1);
}
else if (!strncmp(param1, "prev", 1))
{
EwinOpMoveToDesk(ewin, EoGetDesk(ewin) - 1);
}
else if (!strcmp(param1, "?"))
{
IpcPrintf("window desk: %d", EoGetDesk(ewin));
}
else
{
EwinOpMoveToDesk(ewin, atoi(param1));
}
break;
case EWIN_OP_AREA:
if (!param1[0])
{
IpcPrintf("Error: no area supplied");
goto done;
}
}
else if (!strncmp(operation, "move", 2))
{
int a, b;
if (param1[0])
if (!strcmp(param1, "?"))
{
if (!strcmp(param1, "ptr"))
{
ActionMoveStart(ewin, 1, 0, 0);
}
else if (!strcmp(param1, "?"))
{
IpcPrintf("window location: %d %d", EoGetX(ewin),
EoGetY(ewin));
}
else if (!strcmp(param1, "??"))
{
IpcPrintf("client location: %d %d",
EoGetX(ewin) + ewin->border->border.left,
EoGetY(ewin) + ewin->border->border.top);
}
else
{
sscanf(params, "%*s %*s %i %i", &a, &b);
MoveResizeEwin(ewin, a, b, ewin->client.w, ewin->client.h);
}
IpcPrintf("window area: %d %d", ewin->area_x, ewin->area_y);
}
else
{
IpcPrintf("Error: no coords supplied");
sscanf(params, "%*s %*s %i %i", &a, &b);
MoveEwinToArea(ewin, a, b);
}
}
else if (!strcmp(operation, "resize") || !strcmp(operation, "sz"))
{
int a, b;
break;
if (param1[0])
case EWIN_OP_MOVE:
if (!param1[0])
{
if (!strcmp(param1, "ptr"))
{
ActionResizeStart(ewin, 0, MODE_RESIZE);
}
else if (!strcmp(param1, "ptr-h"))
{
ActionResizeStart(ewin, 0, MODE_RESIZE_H);
}
else if (!strcmp(param1, "ptr-v"))
{
ActionResizeStart(ewin, 0, MODE_RESIZE_V);
}
else if (!strcmp(param1, "?"))
{
IpcPrintf("window size: %d %d", ewin->client.w,
ewin->client.h);
}
else if (!strcmp(param1, "??"))
{
IpcPrintf("frame size: %d %d", EoGetW(ewin), EoGetH(ewin));
}
else
{
sscanf(params, "%*s %*s %i %i", &a, &b);
MoveResizeEwin(ewin, EoGetX(ewin), EoGetY(ewin), a, b);
}
IpcPrintf("Error: no coords supplied");
goto done;
}
}
else if (!strcmp(operation, "move_relative") || !strcmp(operation, "mr"))
{
int a, b;
if (param1[0])
if (!strcmp(param1, "ptr"))
{
ActionMoveStart(ewin, 1, 0, 0);
}
else if (!strcmp(param1, "?"))
{
IpcPrintf("window location: %d %d", EoGetX(ewin), EoGetY(ewin));
}
else if (!strcmp(param1, "??"))
{
IpcPrintf("client location: %d %d",
EoGetX(ewin) + ewin->border->border.left,
EoGetY(ewin) + ewin->border->border.top);
}
else
{
sscanf(params, "%*s %*s %i %i", &a, &b);
a += EoGetX(ewin);
b += EoGetY(ewin);
MoveResizeEwin(ewin, a, b, ewin->client.w, ewin->client.h);
}
}
else if (!strcmp(operation, "resize_relative") || !strcmp(operation, "sr"))
{
int a, b;
break;
if (param1[0])
case EWIN_OP_SIZE:
if (!param1[0])
goto done;
if (!strcmp(param1, "ptr"))
{
ActionResizeStart(ewin, 0, MODE_RESIZE);
}
else if (!strcmp(param1, "ptr-h"))
{
ActionResizeStart(ewin, 0, MODE_RESIZE_H);
}
else if (!strcmp(param1, "ptr-v"))
{
ActionResizeStart(ewin, 0, MODE_RESIZE_V);
}
else if (!strcmp(param1, "?"))
{
IpcPrintf("window size: %d %d", ewin->client.w, ewin->client.h);
}
else if (!strcmp(param1, "??"))
{
IpcPrintf("frame size: %d %d", EoGetW(ewin), EoGetH(ewin));
}
else
{
sscanf(params, "%*s %*s %i %i", &a, &b);
a += ewin->client.w;
b += ewin->client.h;
MoveResizeEwin(ewin, EoGetX(ewin), EoGetY(ewin), a, b);
}
}
else if (!strncmp(operation, "focus", 2))
{
break;
case EWIN_OP_MOVE_REL:
if (!param1[0])
goto done;
sscanf(params, "%*s %*s %i %i", &a, &b);
a += EoGetX(ewin);
b += EoGetY(ewin);
MoveResizeEwin(ewin, a, b, ewin->client.w, ewin->client.h);
break;
case EWIN_OP_SIZE_REL:
if (!param1[0])
goto done;
sscanf(params, "%*s %*s %i %i", &a, &b);
a += ewin->client.w;
b += ewin->client.h;
MoveResizeEwin(ewin, EoGetX(ewin), EoGetY(ewin), a, b);
break;
case EWIN_OP_FOCUS:
if (!strcmp(param1, "?"))
{
IpcPrintf("focused: %s", (ewin == GetFocusEwin())? "yes" : "no");
goto done;
}
else
{
GotoDesktopByEwin(ewin);
if (ewin->iconified)
EwinOpIconify(ewin, 0);
if (ewin->shaded)
EwinOpShade(ewin, 0);
EwinOpRaise(ewin);
FocusToEWin(ewin, FOCUS_SET);
}
}
else if (!strncmp(operation, "fullscreen", 2))
{
GotoDesktopByEwin(ewin);
if (ewin->iconified)
EwinOpIconify(ewin, 0);
if (ewin->shaded)
EwinOpShade(ewin, 0);
EwinOpRaise(ewin);
FocusToEWin(ewin, FOCUS_SET);
break;
case EWIN_OP_FULLSCREEN:
on = ewin->st.fullscreen;
if (SetEwinBoolean("fullscreen", &on, param1, 0))
EwinSetFullscreen(ewin, !on);
}
else if (!strncmp(operation, "skiplists", 4))
{
break;
case EWIN_OP_SKIP_LISTS:
if (SetEwinBoolean("skiplists", &ewin->skiptask, param1, 1))
EwinOpSkipLists(ewin, ewin->skiptask);
}
else if (!strncmp(operation, "zoom", 2))
{
break;
case EWIN_OP_ZOOM:
if (InZoom())
Zoom(NULL);
else
Zoom(ewin);
}
else if (!strcmp(operation, "snap"))
{
break;
case EWIN_OP_SNAP:
SnapshotEwinSet(ewin, atword(params, 3));
}
else
{
IpcPrintf("Error: unknown operation");
break;
}
RememberImportantInfoForEwin(ewin);