Jason Edmeades : cmd.exe: Add COLOR command.
Alexandre Julliard
julliard at wine.codeweavers.com
Thu Mar 8 07:17:06 CST 2007
Module: wine
Branch: master
Commit: e37463fab5635487e872b321c7ac72710b61b9aa
URL: http://source.winehq.org/git/wine.git/?a=commit;h=e37463fab5635487e872b321c7ac72710b61b9aa
Author: Jason Edmeades <us at edmeades.me.uk>
Date: Thu Mar 8 00:37:44 2007 +0000
cmd.exe: Add COLOR command.
---
programs/cmd/builtins.c | 51 ++++++++++++++++++++++++++++++++++++++++++++++-
programs/cmd/wcmd.h | 4 ++-
programs/cmd/wcmdmain.c | 7 ++++-
3 files changed, 58 insertions(+), 4 deletions(-)
diff --git a/programs/cmd/builtins.c b/programs/cmd/builtins.c
index 85f7980..5420d91 100644
--- a/programs/cmd/builtins.c
+++ b/programs/cmd/builtins.c
@@ -47,7 +47,7 @@ struct env_stack *pushd_directories;
extern HINSTANCE hinst;
extern char *inbuilt[];
-extern int echo_mode, verify_mode;
+extern int echo_mode, verify_mode, defaultColor;
extern char quals[MAX_PATH], param1[MAX_PATH], param2[MAX_PATH];
extern BATCH_CONTEXT *context;
extern DWORD errorlevel;
@@ -1631,3 +1631,52 @@ void WCMD_assoc (char *command) {
/* Clean up */
RegCloseKey(key);
}
+
+/****************************************************************************
+ * WCMD_color
+ *
+ * Clear the terminal screen.
+ */
+
+void WCMD_color (void) {
+
+ /* Emulate by filling the screen from the top left to bottom right with
+ spaces, then moving the cursor to the top left afterwards */
+ CONSOLE_SCREEN_BUFFER_INFO consoleInfo;
+ HANDLE hStdOut = GetStdHandle(STD_OUTPUT_HANDLE);
+
+ if (param1[0] != 0x00 && strlen(param1) > 2) {
+ WCMD_output ("Argument invalid\n");
+ return;
+ }
+
+ if (GetConsoleScreenBufferInfo(hStdOut, &consoleInfo))
+ {
+ COORD topLeft;
+ DWORD screenSize;
+ DWORD color = 0;
+
+ screenSize = consoleInfo.dwSize.X * (consoleInfo.dwSize.Y + 1);
+
+ topLeft.X = 0;
+ topLeft.Y = 0;
+
+ /* Convert the color hex digits */
+ if (param1[0] == 0x00) {
+ color = defaultColor;
+ } else {
+ color = strtoul(param1, NULL, 16);
+ }
+
+ /* Fail if fg == bg color */
+ if (((color & 0xF0) >> 4) == (color & 0x0F)) {
+ errorlevel = 1;
+ return;
+ }
+
+ /* Set the current screen contents and ensure all future writes
+ remain this color */
+ FillConsoleOutputAttribute(hStdOut, color, screenSize, topLeft, &screenSize);
+ SetConsoleTextAttribute(hStdOut, color);
+ }
+}
diff --git a/programs/cmd/wcmd.h b/programs/cmd/wcmd.h
index 5474da7..173a79c 100644
--- a/programs/cmd/wcmd.h
+++ b/programs/cmd/wcmd.h
@@ -32,6 +32,7 @@ void WCMD_batch (char *, char *, int, char *, HANDLE);
void WCMD_call (char *command);
void WCMD_change_tty (void);
void WCMD_clear_screen (void);
+void WCMD_color (void);
void WCMD_copy (void);
void WCMD_create_dir (void);
void WCMD_delete (char *);
@@ -157,9 +158,10 @@ struct env_stack
#define WCMD_PUSHD 38
#define WCMD_POPD 39
#define WCMD_ASSOC 40
+#define WCMD_COLOR 41
/* Must be last in list */
-#define WCMD_EXIT 41
+#define WCMD_EXIT 42
/* Some standard messages */
extern const char nyi[];
diff --git a/programs/cmd/wcmdmain.c b/programs/cmd/wcmdmain.c
index 1bea185..1297299 100644
--- a/programs/cmd/wcmdmain.c
+++ b/programs/cmd/wcmdmain.c
@@ -35,11 +35,11 @@ const char * const inbuilt[] = {"ATTRIB", "CALL", "CD", "CHDIR", "CLS", "COPY",
"HELP", "IF", "LABEL", "MD", "MKDIR", "MOVE", "PATH", "PAUSE",
"PROMPT", "REM", "REN", "RENAME", "RD", "RMDIR", "SET", "SHIFT",
"TIME", "TITLE", "TYPE", "VERIFY", "VER", "VOL",
- "ENDLOCAL", "SETLOCAL", "PUSHD", "POPD", "ASSOC", "EXIT" };
+ "ENDLOCAL", "SETLOCAL", "PUSHD", "POPD", "ASSOC", "COLOR", "EXIT" };
HINSTANCE hinst;
DWORD errorlevel;
-int echo_mode = 1, verify_mode = 0;
+int echo_mode = 1, verify_mode = 0, defaultColor = 7;
static int opt_c, opt_k, opt_s;
const char nyi[] = "Not Yet Implemented\n\n";
const char newline[] = "\n";
@@ -578,6 +578,9 @@ void WCMD_process_command (char *command)
case WCMD_ASSOC:
WCMD_assoc(p);
break;
+ case WCMD_COLOR:
+ WCMD_color();
+ break;
case WCMD_EXIT:
WCMD_exit ();
break;
More information about the wine-cvs
mailing list