[PATCH 1/4] [WineConsole]: now properly managing window position (in wineconsole) from within wineserver

Eric Pouech eric.pouech at orange.fr
Mon Nov 15 14:35:55 CST 2010


- apply same scheme for data->curcfg.win_pos as for the other fields of curcfg: they are modified
  by calling WINECON_SetConfig, which stores the modified values in wineserver, which in turn
  notifies wineconsole of the changes, and wineconsole apply them to the data->curcfg
- get rid of WINECON_NotifyWindowChange

A+
---

 programs/wineconsole/curses.c          |   15 +++----
 programs/wineconsole/user.c            |   65 +++++++++++++-------------------
 programs/wineconsole/winecon_private.h |    1 
 programs/wineconsole/wineconsole.c     |   58 ++++++++++-------------------
 4 files changed, 54 insertions(+), 85 deletions(-)


diff --git a/programs/wineconsole/curses.c b/programs/wineconsole/curses.c
index 773f985..5038bce 100644
--- a/programs/wineconsole/curses.c
+++ b/programs/wineconsole/curses.c
@@ -422,17 +422,16 @@ static void WCCURSES_SetFont(struct inner_data* data, const WCHAR* font,
  */
 static void WCCURSES_ScrollV(struct inner_data* data, int delta)
 {
-    int	pos = data->curcfg.win_pos.Y;
+    struct config_data  cfg = data->curcfg;
 
-    pos += delta;
-    if (pos < 0) pos = 0;
-    if (pos > data->curcfg.sb_height - data->curcfg.win_height)
-        pos = data->curcfg.sb_height - data->curcfg.win_height;
-    if (pos != data->curcfg.win_pos.Y)
+    cfg.win_pos.Y += delta;
+    if (cfg.win_pos.Y < 0) cfg.win_pos.Y = 0;
+    if (cfg.win_pos.Y > data->curcfg.sb_height - data->curcfg.win_height)
+        cfg.win_pos.Y = data->curcfg.sb_height - data->curcfg.win_height;
+    if (cfg.win_pos.Y != data->curcfg.win_pos.Y)
     {
-        data->curcfg.win_pos.Y = pos;
         WCCURSES_PosCursor(data);
-        WINECON_NotifyWindowChange(data);
+        WINECON_SetConfig(data, &cfg);
     }
 }
 
diff --git a/programs/wineconsole/user.c b/programs/wineconsole/user.c
index df39194..86106c5 100644
--- a/programs/wineconsole/user.c
+++ b/programs/wineconsole/user.c
@@ -800,11 +800,13 @@ static void WCUSER_Scroll(struct inner_data* data, int pos, BOOL horz)
 {
     if (horz)
     {
+        ScrollWindow(data->hWnd, (data->curcfg.win_pos.X - pos) * data->curcfg.cell_width, 0, NULL, NULL);
 	SetScrollPos(data->hWnd, SB_HORZ, pos, TRUE);
 	data->curcfg.win_pos.X = pos;
     }
     else
     {
+        ScrollWindow(data->hWnd, 0, (data->curcfg.win_pos.Y - pos) * data->curcfg.cell_height, NULL, NULL);
 	SetScrollPos(data->hWnd, SB_VERT, pos, TRUE);
 	data->curcfg.win_pos.Y = pos;
     }
@@ -1211,29 +1213,23 @@ static LRESULT CALLBACK WCUSER_Proc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM
 	break;
     case WM_HSCROLL:
         {
-            int	pos = data->curcfg.win_pos.X;
+            struct config_data  cfg = data->curcfg;
 
             switch (LOWORD(wParam))
             {
-            case SB_PAGEUP: 	pos -= 8; 		break;
-            case SB_PAGEDOWN: 	pos += 8; 		break;
-            case SB_LINEUP: 	pos--;			break;
-            case SB_LINEDOWN: 	pos++;	 		break;
-            case SB_THUMBTRACK: pos = HIWORD(wParam);	break;
-            default: 					break;
+            case SB_PAGEUP: 	cfg.win_pos.X -= 8; 		break;
+            case SB_PAGEDOWN: 	cfg.win_pos.X += 8; 		break;
+            case SB_LINEUP: 	cfg.win_pos.X--;		break;
+            case SB_LINEDOWN: 	cfg.win_pos.X++; 		break;
+            case SB_THUMBTRACK: cfg.win_pos.X = HIWORD(wParam);	break;
+            default: 					        break;
             }
-            if (pos < 0) pos = 0;
-            if (pos > data->curcfg.sb_width - data->curcfg.win_width)
-                pos = data->curcfg.sb_width - data->curcfg.win_width;
-            if (pos != data->curcfg.win_pos.X)
+            if (cfg.win_pos.X < 0) cfg.win_pos.X = 0;
+            if (cfg.win_pos.X > data->curcfg.sb_width - data->curcfg.win_width)
+                cfg.win_pos.X = data->curcfg.sb_width - data->curcfg.win_width;
+            if (cfg.win_pos.X != data->curcfg.win_pos.X)
             {
-                ScrollWindow(hWnd, (data->curcfg.win_pos.X - pos) * data->curcfg.cell_width, 0,
-                             NULL, NULL);
-                data->curcfg.win_pos.X = pos;
-                SetScrollPos(hWnd, SB_HORZ, pos, TRUE);
-                UpdateWindow(hWnd);
-                WCUSER_PosCursor(data);
-                WINECON_NotifyWindowChange(data);
+                WINECON_SetConfig(data, &cfg);
             }
         }
 	break;
@@ -1246,40 +1242,33 @@ static LRESULT CALLBACK WCUSER_Proc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM
         /* else fallthrough */
     case WM_VSCROLL:
         {
-	    int	pos = data->curcfg.win_pos.Y;
+	    struct config_data  cfg = data->curcfg;
 
             if (uMsg == WM_MOUSEWHEEL)
             {
                 UINT scrollLines = 3;
                 SystemParametersInfoW(SPI_GETWHEELSCROLLLINES, 0, &scrollLines, 0);
                 scrollLines *= -GET_WHEEL_DELTA_WPARAM(wParam) / WHEEL_DELTA;
-                pos += scrollLines;
+                cfg.win_pos.Y += scrollLines;
             } else {
                 switch (LOWORD(wParam))
                 {
-                case SB_PAGEUP: 	pos -= 8; 		break;
-                case SB_PAGEDOWN: 	pos += 8; 		break;
-                case SB_LINEUP: 	pos--;			break;
-                case SB_LINEDOWN: 	pos++;	 		break;
-                case SB_THUMBTRACK: pos = HIWORD(wParam);	break;
-                default: 					break;
+                case SB_PAGEUP:     cfg.win_pos.Y -= 8; 		break;
+                case SB_PAGEDOWN:   cfg.win_pos.Y += 8; 		break;
+                case SB_LINEUP:     cfg.win_pos.Y--;			break;
+                case SB_LINEDOWN:   cfg.win_pos.Y++;	 		break;
+                case SB_THUMBTRACK: cfg.win_pos.Y = HIWORD(wParam);	break;
+                default: 					        break;
                 }
             }
 
-	    if (pos < 0) pos = 0;
-	    if (pos > data->curcfg.sb_height - data->curcfg.win_height)
-                pos = data->curcfg.sb_height - data->curcfg.win_height;
-	    if (pos != data->curcfg.win_pos.Y)
+	    if (cfg.win_pos.Y < 0) cfg.win_pos.Y = 0;
+	    if (cfg.win_pos.Y > data->curcfg.sb_height - data->curcfg.win_height)
+                cfg.win_pos.Y = data->curcfg.sb_height - data->curcfg.win_height;
+	    if (cfg.win_pos.Y != data->curcfg.win_pos.Y)
 	    {
-		ScrollWindow(hWnd, 0, (data->curcfg.win_pos.Y - pos) * data->curcfg.cell_height,
-                             NULL, NULL);
-		data->curcfg.win_pos.Y = pos;
-		SetScrollPos(hWnd, SB_VERT, pos, TRUE);
-		UpdateWindow(hWnd);
-		WCUSER_PosCursor(data);
-		WINECON_NotifyWindowChange(data);
+                WINECON_SetConfig(data, &cfg);
 	    }
-
         }
         break;
     case WM_SYSCOMMAND:
diff --git a/programs/wineconsole/winecon_private.h b/programs/wineconsole/winecon_private.h
index ca33ec6..a9a462a 100644
--- a/programs/wineconsole/winecon_private.h
+++ b/programs/wineconsole/winecon_private.h
@@ -77,7 +77,6 @@ struct inner_data {
 
 /* from wineconsole.c */
 extern void WINECON_Fatal(const char* msg);
-extern void WINECON_NotifyWindowChange(struct inner_data* data);
 extern int  WINECON_GetHistorySize(HANDLE hConIn);
 extern int  WINECON_GetHistoryMode(HANDLE hConIn);
 extern BOOL WINECON_GetConsoleTitle(HANDLE hConIn, WCHAR* buffer, size_t len);
diff --git a/programs/wineconsole/wineconsole.c b/programs/wineconsole/wineconsole.c
index 52edfb3..0830d43 100644
--- a/programs/wineconsole/wineconsole.c
+++ b/programs/wineconsole/wineconsole.c
@@ -82,26 +82,6 @@ static void WINECON_FetchCells(struct inner_data* data, int upd_tp, int upd_bm)
 }
 
 /******************************************************************
- *		WINECON_NotifyWindowChange
- *
- * Inform server that visible window on sb has changed
- */
-void WINECON_NotifyWindowChange(struct inner_data* data)
-{
-    SERVER_START_REQ( set_console_output_info )
-    {
-        req->handle       = wine_server_obj_handle( data->hConOut );
-        req->win_left     = data->curcfg.win_pos.X;
-        req->win_top      = data->curcfg.win_pos.Y;
-        req->win_right    = data->curcfg.win_pos.X + data->curcfg.win_width - 1;
-        req->win_bottom   = data->curcfg.win_pos.Y + data->curcfg.win_height - 1;
-        req->mask         = SET_CONSOLE_OUTPUT_INFO_DISPLAY_WINDOW;
-        wine_server_call( req );
-    }
-    SERVER_END_REQ;
-}
-
-/******************************************************************
  *		WINECON_SetHistorySize
  *
  *
@@ -402,28 +382,30 @@ void     WINECON_SetConfig(struct inner_data* data, const struct config_data* cf
      * The Change<A><B> actually modify the <B> dimension of <A>.
      */
 #define TstSBfWidth()   (data->curcfg.sb_width != cfg->sb_width)
-#define TstWinWidth()   (data->curcfg.win_width != cfg->win_width)
+#define TstWinHPos()    (data->curcfg.win_width != cfg->win_width || data->curcfg.win_pos.X != cfg->win_pos.X)
 
 #define ChgSBfWidth()   do {c.X = cfg->sb_width; \
                             c.Y = data->curcfg.sb_height;\
                             SetConsoleScreenBufferSize(data->hConOut, c);\
                         } while (0)
-#define ChgWinWidth()   do {pos.Left = pos.Top = 0; \
-                            pos.Right = cfg->win_width - data->curcfg.win_width; \
+#define ChgWinHPos()    do {pos.Left = cfg->win_pos.X - data->curcfg.win_pos.X; \
+                            pos.Top = 0; \
+                            pos.Right = pos.Left + cfg->win_width - data->curcfg.win_width; \
                             pos.Bottom = 0; \
                             SetConsoleWindowInfo(data->hConOut, FALSE, &pos);\
                         } while (0)
 #define TstSBfHeight()  (data->curcfg.sb_height != cfg->sb_height)
-#define TstWinHeight()  (data->curcfg.win_height != cfg->win_height)
+#define TstWinVPos()    (data->curcfg.win_height != cfg->win_height || data->curcfg.win_pos.Y != cfg->win_pos.Y)
 
 /* since we're going to apply height after width is done, we use width as defined 
  * in cfg, and not in data->curcfg because if won't be updated yet */
 #define ChgSBfHeight()  do {c.X = cfg->sb_width; c.Y = cfg->sb_height; \
                             SetConsoleScreenBufferSize(data->hConOut, c); \
                         } while (0)
-#define ChgWinHeight()  do {pos.Left = pos.Top = 0; \
+#define ChgWinVPos()    do {pos.Left = 0; \
+                            pos.Top = cfg->win_pos.Y - data->curcfg.win_pos.Y; \
                             pos.Right = 0; \
-                            pos.Bottom = cfg->win_height - data->curcfg.win_height; \
+                            pos.Bottom = pos.Top + cfg->win_height - data->curcfg.win_height; \
                             SetConsoleWindowInfo(data->hConOut, FALSE, &pos);\
                         } while (0)
 
@@ -434,46 +416,46 @@ void     WINECON_SetConfig(struct inner_data* data, const struct config_data* cf
 
         if (TstSBfWidth())            
         {
-            if (TstWinWidth())
+            if (TstWinHPos())
             {
                 /* we're changing both at the same time, do it in the right order */
                 if (cfg->sb_width >= data->curcfg.win_width)
                 {
-                    ChgSBfWidth(); ChgWinWidth();
+                    ChgSBfWidth(); ChgWinHPos();
                 }
                 else
                 {
-                    ChgWinWidth(); ChgSBfWidth();
+                    ChgWinHPos(); ChgSBfWidth();
                 }
             }
             else ChgSBfWidth();
         }
-        else if (TstWinWidth()) ChgWinWidth();
+        else if (TstWinHPos()) ChgWinHPos();
         if (TstSBfHeight())
         {
-            if (TstWinHeight())
+            if (TstWinVPos())
             {
                 if (cfg->sb_height >= data->curcfg.win_height)
                 {
-                    ChgSBfHeight(); ChgWinHeight();
+                    ChgSBfHeight(); ChgWinVPos();
                 }
                 else
                 {
-                    ChgWinHeight(); ChgSBfHeight();
+                    ChgWinVPos(); ChgSBfHeight();
                 }
             }
             else ChgSBfHeight();
         }
-        else if (TstWinHeight()) ChgWinHeight();
+        else if (TstWinVPos()) ChgWinVPos();
     } while (0);
 #undef TstSBfWidth
-#undef TstWinWidth
+#undef TstWinHPos
 #undef ChgSBfWidth
-#undef ChgWinWidth
+#undef ChgWinHPos
 #undef TstSBfHeight
-#undef TstWinHeight
+#undef TstWinVPos
 #undef ChgSBfHeight
-#undef ChgWinHeight
+#undef ChgWinVPos
 
     data->curcfg.exit_on_die = cfg->exit_on_die;
     if (data->curcfg.edition_mode != cfg->edition_mode)




More information about the wine-patches mailing list