update for HEAD-2003050101
[reactos.git] / subsys / system / cmd / window.c
diff --git a/subsys/system/cmd/window.c b/subsys/system/cmd/window.c
new file mode 100644 (file)
index 0000000..38211ab
--- /dev/null
@@ -0,0 +1,247 @@
+/* $Id$
+ *
+ * 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 :)
+ */
+
+
+#include "config.h"
+
+#if (  defined(INCLUDE_CMD_WINDOW) ||  defined(INCLUDE_CMD_ACTIVATE)  )
+
+#include "cmd.h"
+#include <windows.h>
+#include <stdlib.h>
+#include <string.h>
+#include <tchar.h>
+
+
+#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 funciton to perform actions on windows
+
+ param is a string to parse for options/actions
+ hWnd is the handle of window on wich 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);
+
+
+       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)
+               ConErrPrintf(_T("!!!FIXME:  CLOSE Not implemented!!!\n"));
+
+       wp.length=sizeof(WINDOWPLACEMENT);
+       SetWindowPlacement(hWnd,&wp);
+
+       if(p)
+               freep(p);
+
+       return 0;
+}
+
+
+
+
+INT CommandWindow (LPTSTR cmd, LPTSTR param)
+{
+       HWND h;
+
+       if (_tcsncmp (param, _T("/?"), 2) == 0)
+       {
+               ConOutPuts(_T("change console window aspect\n"
+                             "\n"
+                             "WINDOW [/POS[=]left,top,width,heigth]\n"
+                             "              [MIN|MAX|RESTORE] [\"title\"]\n"
+                             "\n"
+                             "/POS          specify window placement and dimensions\n"
+                             "MIN           minimize the window\n"
+                             "MAX           maximize the window\n"
+                             "RESTORE       restore the window"));
+               return 0;
+       }
+
+       h = GetConsoleWindow();
+       Sleep(0);
+       return ServiceActivate(param,h);
+}
+
+
+INT CommandActivate (LPTSTR cmd, LPTSTR param)
+{
+       LPTSTR str;
+       HWND h;
+
+       if (_tcsncmp (param, _T("/?"), 2) == 0)
+       {
+               ConOutPuts(_T("change console window aspect\n"
+                             "\n"
+                             "ACTIAVTE \"window\" [/POS[=]left,top,width,heigth]\n"
+                             "              [MIN|MAX|RESTORE] [\"title\"]\n"                         
+                             "\n"
+                             "window        tile of window on wich perform actions\n"
+                             "/POS          specify window placement and dimensions\n"
+                             "MIN           minimize the window\n"
+                             "MAX           maximize the window\n"
+                             "RESTORE       restore the window\n"
+                             "title          new title"));
+               return 0;
+       }
+
+       if(!(*param))
+               return 1;
+
+       str=_tcschr(param,_T(' '));
+
+       if (str)
+       {
+               *str=_T('\0');
+               str++;
+       }
+       else
+               str = "";
+
+       h=FindWindow(NULL, param);
+       if (!h)
+       {
+               ConErrPuts("window not found");
+               return 1;
+       }
+
+       return ServiceActivate(str,h);
+}
+
+#endif /* (  defined(INCLUDE_CMD_WINDOW) ||  defined(INCLUDE_CMD_ACTIVATE)  ) */