Pop up ICS text menu with default item under mouse pointer
[xboard.git] / winboard / wchat.c
index db9ebf1..eb5179f 100644 (file)
@@ -3,6 +3,8 @@
  *\r
  * Author: H.G.Muller (August 2009)\r
  *\r
+ * Copyright 2009, 2010 Free Software Foundation, Inc. \r
+ *\r
  * ------------------------------------------------------------------------\r
  *\r
  * GNU XBoard is free software: you can redistribute it and/or modify\r
@@ -32,8 +34,8 @@
 #include <dlgs.h>\r
 \r
 #include "common.h"\r
-#include "winboard.h"\r
 #include "frontend.h"\r
+#include "winboard.h"\r
 #include "backend.h"\r
 \r
 #include "wsnap.h"\r
@@ -43,11 +45,10 @@ 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
-char * SavePart(char *str);\r
 extern int opponentKibitzes;\r
 \r
 /* Imports from winboard.c */\r
@@ -137,6 +138,7 @@ LRESULT CALLBACK ChatProc( HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam
     static SnapData sd;\r
     char buf[MSG_SIZ], mess[MSG_SIZ];\r
     int partner = -1, i;\r
+    static BOOL filterHasFocus[MAX_CHAT];\r
 \r
     for(i=0; i<MAX_CHAT; i++) if(hDlg == chatHandle[i]) { partner = i; break; }\r
 \r
@@ -148,11 +150,39 @@ 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
-\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
+      /* \r
+        [AS]\r
+        If <Enter> is pressed while editing the filter, it's better to apply\r
+        the filter rather than selecting the current game.\r
+      */\r
+      if( LOWORD(wParam) == IDC_ChatPartner ) {\r
+          switch( HIWORD(wParam) ) {\r
+          case EN_SETFOCUS:\r
+              filterHasFocus[partner] = TRUE;\r
+              break;\r
+          case EN_KILLFOCUS:\r
+              filterHasFocus[partner] = FALSE;\r
+              break;\r
+          }\r
+      }\r
+\r
+      if( filterHasFocus[partner] && (LOWORD(wParam) == IDC_Send) ) {\r
+         SetFocus(GetDlgItem(hDlg, OPT_ChatInput));\r
+          wParam = IDC_Change;\r
+      }\r
+      /* [AS] End command replacement */\r
+\r
         switch (LOWORD(wParam)) {\r
 \r
        case IDCANCEL:\r
@@ -180,7 +210,8 @@ LRESULT CALLBACK ChatProc( HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam
                if(!atoi(chatPartner[partner])) {\r
                    sprintf(buf, "> %s\n", mess); // echo only tells to handle, not channel\r
                InsertIntoMemo(hDlg, buf);\r
-               }\r
+               sprintf(buf, "xtell %s %s\n", chatPartner[partner], mess);\r
+               } else\r
                sprintf(buf, "tell %s %s\n", chatPartner[partner], mess);\r
            }\r
            SendToICS(buf);\r
@@ -220,13 +251,17 @@ 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("You first have to close a Chat Box\nbefore you can open a new one", 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