Implement copy function in ICS Text Menu
[xboard.git] / dialogs.c
index da4fb71..9c7a28a 100644 (file)
--- a/dialogs.c
+++ b/dialogs.c
@@ -979,6 +979,9 @@ SendString (char *p)
        snprintf(buf2 + (q-p), MSG_SIZ -(q-p), "%s%s", clickedWord, q+5);
         p = buf2;
     }
+    if(!strcmp(p, "$copy")) { // special case for copy selection
+        CopySomething(clickedWord);
+    } else
     if(!strcmp(p, "$chat")) { // special case for opening chat
         NewChat(clickedWord);
     } else
@@ -1707,7 +1710,8 @@ PromotionPopUp (char choice)
 //---------------------------- Chat Windows ----------------------------------------------
 
 static char *line, *memo, *chatMemo, *partner, *texts[MAX_CHAT], dirty[MAX_CHAT], *inputs[MAX_CHAT], *icsLine, *tmpLine;
-static int activePartner, hidden = 1;
+static int activePartner;
+int hidden = 1;
 
 void ChatSwitch P((int n));
 int  ChatOK P((int n));
@@ -1726,16 +1730,20 @@ WindowPlacement wpTextMenu;
 int
 ContextMenu (Option *opt, int button, int x, int y, char *text, int index)
 { // callback for ICS-output clicks; handles button 3, passes on other events
-  char *start, *end;
   int h;
   if(button == -3) return TRUE; // supress default GTK context menu on up-click
   if(button != 3) return FALSE;
-  start = end = text + index; // figure out what text was clicked
-  while(isalnum(*end)) end++;
-  while(start > text && isalnum(start[-1])) start--;
-  clickedWord[0] = NULLCHAR;
-  if(end-start >= 80) end = start + 80; // intended for small words and numbers
-  strncpy(clickedWord, start, end-start); clickedWord[end-start] = NULLCHAR;
+  if(index == -1) { // pre-existing selection in memo
+    strncpy(clickedWord, text, MSG_SIZ);
+  } else { // figure out what word was clicked
+    char *start, *end;
+    start = end = text + index;
+    while(isalnum(*end)) end++;
+    while(start > text && isalnum(start[-1])) start--;
+    clickedWord[0] = NULLCHAR;
+    if(end-start >= 80) end = start + 80; // intended for small words and numbers
+    strncpy(clickedWord, start, end-start); clickedWord[end-start] = NULLCHAR;
+  }
   click = !shellUp[TextMenuDlg]; // request auto-popdown of textmenu when we popped it up
   h = wpTextMenu.height; // remembered height of text menu
   if(h <= 0) h = 65;     // when not available, position w.r.t. top
@@ -1861,7 +1869,7 @@ ChatOK (int n)
        // from here on it could be back-end
        if(line[strlen(line)-1] == '\n') line[strlen(line)-1] = NULLCHAR;
        SaveInHistory(line);
-       if(hidden) snprintf(buf, MSG_SIZ, "%s\n", line); else // command for ICS
+       if(hidden || !*chatPartner[activePartner]) snprintf(buf, MSG_SIZ, "%s\n", line); else // command for ICS
        if(!strcmp("whispers", chatPartner[activePartner]))
              snprintf(buf, MSG_SIZ, "whisper %s\n", line); // WHISPER box uses "whisper" to send
        else if(!strcmp("shouts", chatPartner[activePartner]))
@@ -1972,7 +1980,7 @@ ChatProc ()
     if(GenericPopUp(chatOptions, _("ICS Interaction"), ChatDlg, BoardWindow, NONMODAL, appData.topLevel))
        AddHandler(&chatOptions[CHAT_PARTNER], ChatDlg, 2), AddHandler(&chatOptions[CHAT_IN], ChatDlg, 2); // treats return as OK
     Show(&chatOptions[CHAT_PANE], hidden = 1); // hide
-    HardSetFocus(&chatOptions[CHAT_IN], 0);
+//    HardSetFocus(&chatOptions[CHAT_IN], 0);
     MarkMenu("View.OpenChatWindow", ChatDlg);
     CursorAtEnd(&chatOptions[CHAT_IN]);
 }