reactos/base/shell/cmd/window.c

226 lines
4.7 KiB
C

/*
* WINDOW.C - activate & window internal commands.
*
* clone from 4nt activate command
*
* 10 Sep 1999 (Paolo Pantaleo)
* started (window command in WINDOW.c)
*
* 29 Sep 1999 (Paolo Pantaleo)
* activate and window in a single file using mainly the same code
* (nice size optimization :)
*
* 30-Apr-2005 (Magnus Olsen <magnus@greatlord.com>)
* Remove all hardcoded strings in En.rc
*/
#include "precomp.h"
#if defined(INCLUDE_CMD_WINDOW) || defined(INCLUDE_CMD_ACTIVATE)
#define A_MIN 0x01
#define A_MAX 0x02
#define A_RESTORE 0x04
#define A_POS 0x08
#define A_SIZE 0x10
#define A_CLOSE 0x20
/*
* service function to perform actions on windows
*
* param is a string to parse for options/actions
* hWnd is the handle of window on which to perform actions
*/
static INT ServiceActivate (LPTSTR param, HWND hWnd)
{
LPTSTR *p = 0, p_tmp;
INT argc = 0, i;
INT iAction = 0;
LPTSTR title = 0;
WINDOWPLACEMENT wp;
RECT pos;
LPTSTR tmp;
if (*param)
p = split(param, &argc, FALSE);
for (i = 0; i < argc; i++)
{
p_tmp = p[i];
if (*p_tmp == _T('/'))
p_tmp++;
if (_tcsicmp(p_tmp, _T("min")) == 0)
{
iAction |= A_MIN;
continue;
}
if (_tcsicmp(p_tmp, _T("max")) == 0)
{
iAction |= A_MAX;
continue;
}
if (_tcsicmp(p_tmp, _T("restore")) == 0)
{
iAction |= A_RESTORE;
continue;
}
if (_tcsicmp(p_tmp, _T("close")) == 0)
{
iAction |= A_CLOSE;
continue;
}
if (_tcsnicmp(p_tmp, _T("pos"), 3) == 0)
{
iAction |= A_POS;
tmp = p_tmp+3;
if (*tmp == _T('='))
tmp++;
pos.left= _ttoi(tmp);
if (!(tmp=_tcschr(tmp, _T(','))))
{
error_invalid_parameter_format(p[i]);
freep(p);
return 1;
}
pos.top = _ttoi (++tmp);
if (!(tmp=_tcschr(tmp, _T(','))))
{
error_invalid_parameter_format(p[i]);
freep(p);
return 1;
}
pos.right = _ttoi(++tmp) + pos.left;
if (!(tmp = _tcschr(tmp, _T(','))))
{
error_invalid_parameter_format(p[i]);
freep(p);
return 1;
}
pos.bottom = _ttoi(++tmp) + pos.top;
continue;
}
if (_tcsnicmp(p_tmp, _T("size"), 4)==0)
{
iAction |=A_SIZE;
continue;
}
/* none of them=window title */
if (title)
{
error_invalid_parameter_format(p[i]);
freep(p);
return 1;
}
if (p_tmp[0] == _T('"'))
{
title = (p_tmp + 1);
*_tcschr(p_tmp + 1, _T('"')) = 0;
continue;
}
title = p_tmp;
}
if (title)
SetWindowText(hWnd, title);
wp.length = sizeof(WINDOWPLACEMENT);
GetWindowPlacement(hWnd, &wp);
if (iAction & A_POS)
wp.rcNormalPosition = pos;
if (iAction & A_MIN)
wp.showCmd = SW_MINIMIZE;
if (iAction & A_MAX)
wp.showCmd = SW_SHOWMAXIMIZED;
/* if no actions are specified default is SW_RESTORE */
if ((iAction & A_RESTORE) || (!iAction))
wp.showCmd = SW_RESTORE;
if (iAction & A_CLOSE)
{
FIXME("!!!FIXME: CLOSE Not implemented!!!\n");
}
wp.length = sizeof(WINDOWPLACEMENT);
SetWindowPlacement(hWnd, &wp);
if (p)
freep(p);
return 0;
}
INT CommandWindow (LPTSTR param)
{
HWND hwnd;
if (_tcsncmp (param, _T("/?"), 2) == 0)
{
ConOutResPaging(TRUE,STRING_WINDOW_HELP1);
return 0;
}
hwnd = GetConsoleWindow();
Sleep(0);
return ServiceActivate(param, hwnd);
}
INT CommandActivate (LPTSTR param)
{
HWND hwnd;
LPTSTR *arg;
INT argc;
if (_tcsncmp (param, _T("/?"), 2) == 0)
{
ConOutResPaging(TRUE,STRING_WINDOW_HELP2);
return 0;
}
if (!(*param))
return 1;
/* Split the user input into array */
arg = split (param, &argc, FALSE);
if (argc < 2)
{
if (arg != NULL)
freep(arg);
}
hwnd = FindWindow(NULL, arg[0]);
if (hwnd == NULL)
{
if (arg != NULL)
freep(arg);
ConErrResPuts(STRING_WINDOW_ERROR1);
return 1;
}
if (arg != NULL)
freep(arg);
return ServiceActivate(param, hwnd);
}
#endif /* defined(INCLUDE_CMD_WINDOW) || defined(INCLUDE_CMD_ACTIVATE) */