Allow ICS context menu to pop up a Chat Box on clicking handle
authorH.G. Muller <h.g.muller@hccnet.nl>
Wed, 10 Feb 2010 13:42:49 +0000 (14:42 +0100)
committerH.G. Muller <h.g.muller@hccnet.nl>
Fri, 19 Feb 2010 21:13:26 +0000 (22:13 +0100)
A command "chat" defined in the WinBoard icsMenu string will cause
ChatPopUp() to be called when it is clicked, with the clicked handle
(name) in the ChatPartner field, and focus on the input field.
ChatPopUp() had to get a parameter (the handle) to make this possible.
If that parameter is NULL (as when it is called from the Mode menu),
focus will still start on the (empty) ChatPartner field of the box.

winboard/wchat.c
winboard/winboard.c

index d6dc502..e762b19 100644 (file)
@@ -45,7 +45,7 @@ extern char chatPartner[MAX_CHAT][MSG_SIZ];
 HANDLE chatHandle[MAX_CHAT];\r
 \r
 void SendToICS P((char *s));\r
-void ChatPopUp();\r
+void ChatPopUp P((char *s));\r
 void ChatPopDown();\r
 \r
 /* Imports from backend.c */\r
@@ -150,9 +150,14 @@ LRESULT CALLBACK ChatProc( HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam
                sprintf(buf, "Chat Window %s", first.tidy);\r
                SetWindowText(hDlg, buf);\r
         }\r
-       chatPartner[partner][0] = 0;\r
-       filterHasFocus[partner] = FALSE;\r
-\r
+//     chatPartner[partner][0] = 0;\r
+       SendMessage( GetDlgItem(hDlg, IDC_ChatPartner), // [HGM] clickbox: initialize with requested handle\r
+                       WM_SETTEXT, 0, (LPARAM) chatPartner[partner] );\r
+       filterHasFocus[partner] = TRUE;\r
+       if(chatPartner[partner][0]) {\r
+           filterHasFocus[partner] = FALSE;\r
+           SetFocus( GetDlgItem(hDlg, OPT_ChatInput) );\r
+       }\r
         return FALSE;\r
 \r
     case WM_COMMAND:\r
@@ -246,13 +251,19 @@ LRESULT CALLBACK ChatProc( HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam
 }\r
 \r
 // front end\r
-void ChatPopUp()\r
+void ChatPopUp(char *icsHandle)\r
 {\r
   FARPROC lpProc;\r
+  int i, partner = -1;\r
   \r
   if(chatCount >= MAX_CHAT) return;\r
 \r
   CheckMenuItem(GetMenu(hwndMain), IDM_NewChat, MF_CHECKED);\r
+  for(i=0; i<MAX_CHAT; i++) if(chatHandle[i] == NULL) { partner = i; break; }\r
+  if(partner == -1) { DisplayError("No chat box available", 0); return; }\r
+  if(icsHandle) // [HGM] clickbox set handle in advance\r
+       strcpy(chatPartner[partner], icsHandle);\r
+  else chatPartner[partner][0] = NULLCHAR;\r
   chatCount++;\r
 \r
     lpProc = MakeProcInstance( (FARPROC) ChatProc, hInst );\r
index 03b1fc2..c082aac 100644 (file)
@@ -108,7 +108,7 @@ int FinishMove P((ChessMove moveType, int fromX, int fromY, int toX, int toY,
 void AnimateAtomicCapture(int fromX, int fromY, int toX, int toY, int nFrames);\r
 void DisplayMove P((int moveNumber));\r
 Boolean ParseFEN P((Board board, int *blackPlaysFirst, char *fen));\r
-void ChatPopUp P(());\r
+void ChatPopUp P((char *s));\r
 typedef struct {\r
   ChessSquare piece;  \r
   POINT pos;      /* window coordinates of current pos */\r
@@ -4422,7 +4422,7 @@ WndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
       break;\r
 \r
     case IDM_NewChat:\r
-      ChatPopUp();\r
+      ChatPopUp(NULL);\r
       break;\r
 \r
     case IDM_CopyPosition:\r
@@ -6388,6 +6388,7 @@ CommandX(HWND hwnd, char *command, BOOLEAN getname, BOOLEAN immediate)
     SetWindowText(hInput, buf);\r
     SendMessage(hInput, WM_CHAR, '\r', 0);\r
   } else {\r
+    if(!strcmp(command, "chat")) { ChatPopUp(name); return; }\r
     sprintf(buf, "%s %s ", command, name); /* trailing space */\r
     SetWindowText(hInput, buf);\r
     sel.cpMin = 999999;\r