Jacek Caban : server: Introduce IOCTL_CONDRV_SET_INPUT_INFO ioctl.

Alexandre Julliard julliard at winehq.org
Mon Jul 20 15:30:09 CDT 2020


Module: wine
Branch: master
Commit: dcd02876ea73f65dc286038f0f70189c4994152f
URL:    https://source.winehq.org/git/wine.git/?a=commit;h=dcd02876ea73f65dc286038f0f70189c4994152f

Author: Jacek Caban <jacek at codeweavers.com>
Date:   Mon Jul 20 15:38:00 2020 +0200

server: Introduce IOCTL_CONDRV_SET_INPUT_INFO ioctl.

Signed-off-by: Jacek Caban <jacek at codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard at winehq.org>

---

 include/wine/condrv.h | 11 +++++++++
 server/console.c      | 62 +++++++++++++++++++++++++++++++++++++++++++++++++++
 2 files changed, 73 insertions(+)

diff --git a/include/wine/condrv.h b/include/wine/condrv.h
index fedf3f308c..f6888443c9 100644
--- a/include/wine/condrv.h
+++ b/include/wine/condrv.h
@@ -32,6 +32,7 @@
 #define IOCTL_CONDRV_WRITE_INPUT           CTL_CODE(FILE_DEVICE_CONSOLE, 11, METHOD_BUFFERED, FILE_WRITE_PROPERTIES)
 #define IOCTL_CONDRV_PEEK                  CTL_CODE(FILE_DEVICE_CONSOLE, 12, METHOD_BUFFERED, FILE_READ_ACCESS)
 #define IOCTL_CONDRV_GET_INPUT_INFO        CTL_CODE(FILE_DEVICE_CONSOLE, 13, METHOD_BUFFERED, FILE_READ_PROPERTIES)
+#define IOCTL_CONDRV_SET_INPUT_INFO        CTL_CODE(FILE_DEVICE_CONSOLE, 14, METHOD_BUFFERED, FILE_WRITE_PROPERTIES)
 #define IOCTL_CONDRV_GET_TITLE             CTL_CODE(FILE_DEVICE_CONSOLE, 15, METHOD_BUFFERED, FILE_READ_PROPERTIES)
 
 /* console output ioctls */
@@ -64,10 +65,20 @@ typedef struct
 /* IOCTL_CONDRV_GET_INPUT_INFO result */
 struct condrv_input_info
 {
+    unsigned int  input_cp;       /* console input codepage */
+    unsigned int  output_cp;      /* console output codepage */
     unsigned int  history_mode;   /* whether we duplicate lines in history */
     unsigned int  history_size;   /* number of lines in history */
     unsigned int  edition_mode;   /* index to the edition mode flavors */
     unsigned int  input_count;    /* number of available input records */
+    condrv_handle_t win;          /* renderer window handle */
+};
+
+/* IOCTL_CONDRV_SET_INPUT_INFO params */
+struct condrv_input_info_params
+{
+    unsigned int  mask;               /* setting mask */
+    struct condrv_input_info info;    /* input_info */
 };
 
 /* IOCTL_CONDRV_GET_OUTPUT_INFO result */
diff --git a/server/console.c b/server/console.c
index 3c562cb507..a348ed5bca 100644
--- a/server/console.c
+++ b/server/console.c
@@ -1577,13 +1577,75 @@ static int console_input_ioctl( struct fd *fd, ioctl_code_t code, struct async *
                 set_error( STATUS_INVALID_PARAMETER );
                 return 0;
             }
+            info.input_cp      = console->input_cp;
+            info.output_cp     = console->output_cp;
             info.history_mode  = console->history_mode;
             info.history_size  = console->history_size;
             info.edition_mode  = console->edition_mode;
             info.input_count   = console->recnum;
+            info.win           = console->win;
             return set_reply_data( &info, sizeof(info) ) != NULL;
         }
 
+    case IOCTL_CONDRV_SET_INPUT_INFO:
+        {
+            const struct condrv_input_info_params *params = get_req_data();
+            if (get_req_data_size() != sizeof(*params))
+            {
+                set_error( STATUS_INVALID_PARAMETER );
+                return 0;
+            }
+            if (params->mask & SET_CONSOLE_INPUT_INFO_HISTORY_MODE)
+            {
+                console->history_mode = params->info.history_mode;
+            }
+            if ((params->mask & SET_CONSOLE_INPUT_INFO_HISTORY_SIZE) &&
+                console->history_size != params->info.history_size)
+            {
+                struct history_line **mem = NULL;
+                int i, delta;
+
+                if (params->info.history_size)
+                {
+                    if (!(mem = mem_alloc( params->info.history_size * sizeof(*mem) ))) return 0;
+                    memset( mem, 0, params->info.history_size * sizeof(*mem) );
+                }
+
+                delta = (console->history_index > params->info.history_size) ?
+                    (console->history_index - params->info.history_size) : 0;
+
+                for (i = delta; i < console->history_index; i++)
+                {
+                    mem[i - delta] = console->history[i];
+                    console->history[i] = NULL;
+                }
+                console->history_index -= delta;
+
+                for (i = 0; i < console->history_size; i++)
+                    free( console->history[i] );
+                free( console->history );
+                console->history = mem;
+                console->history_size = params->info.history_size;
+            }
+            if (params->mask & SET_CONSOLE_INPUT_INFO_EDITION_MODE)
+            {
+                console->edition_mode = params->info.edition_mode;
+            }
+            if (params->mask & SET_CONSOLE_INPUT_INFO_INPUT_CODEPAGE)
+            {
+                console->input_cp = params->info.input_cp;
+            }
+            if (params->mask & SET_CONSOLE_INPUT_INFO_OUTPUT_CODEPAGE)
+            {
+                console->output_cp = params->info.output_cp;
+            }
+            if (params->mask & SET_CONSOLE_INPUT_INFO_WIN)
+            {
+                console->win = params->info.win;
+            }
+            return 1;
+        }
+
     case IOCTL_CONDRV_GET_TITLE:
         if (!console->title_len) return 1;
         return set_reply_data( console->title, min( console->title_len, get_reply_max_size() )) != NULL;




More information about the wine-cvs mailing list