Implement copy function in ICS Text Menu
authorH.G. Muller <h.g.muller@hccnet.nl>
Fri, 7 Feb 2014 10:22:44 +0000 (11:22 +0100)
committerH.G. Muller <h.g.muller@hccnet.nl>
Sun, 2 Mar 2014 18:04:46 +0000 (19:04 +0100)
A command consisting of the word $copy will place the clicked word on
the clipboard. When there was already text selected during the click,
that selected text will be used for $copy and $name, rather than the
right-clicked word.

dialogs.c
gtk/xoptions.c
xboard.conf.in

index 8dbcf04..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
@@ -1727,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
index 6cf117a..46b10ba 100644 (file)
@@ -661,15 +661,23 @@ MemoEvent(GtkWidget *widget, GdkEvent *event, gpointer gdata)
                ((ButtonCallback*) memo->target)(button == 1 ? memo->value : -memo->value);
                return TRUE;
            }
+           if(memo->value == 250 // kludge to recognize ICS Console and Chat panes
+            && gtk_text_buffer_get_selection_bounds(memo->handle, NULL, NULL) ) {
+printf("*** selected\n");
+               gtk_text_buffer_get_selection_bounds(memo->handle, &start, &end); // only return selected text
+               index = -1; // kludge to indicate omething was selected
+           } else {
 // GTK_TODO: is this really the most efficient way to get the character at the mouse cursor???
-           gtk_text_view_window_to_buffer_coords(GTK_TEXT_VIEW(widget), GTK_TEXT_WINDOW_WIDGET, w, h, &x, &y);
-           gtk_text_view_get_iter_at_location(GTK_TEXT_VIEW(widget), &start, x, y);
-           gtk_text_buffer_place_cursor(memo->handle, &start);
-           /* get cursor position into index */
-           g_object_get(memo->handle, "cursor-position", &index, NULL);
+               gtk_text_view_window_to_buffer_coords(GTK_TEXT_VIEW(widget), GTK_TEXT_WINDOW_WIDGET, w, h, &x, &y);
+               gtk_text_view_get_iter_at_location(GTK_TEXT_VIEW(widget), &start, x, y);
+               gtk_text_buffer_place_cursor(memo->handle, &start);
+               /* get cursor position into index */
+               g_object_get(memo->handle, "cursor-position", &index, NULL);
+               /* take complete contents */
+               gtk_text_buffer_get_start_iter (memo->handle, &start);
+               gtk_text_buffer_get_end_iter (memo->handle, &end);
+           }
            /* get text from textbuffer */
-           gtk_text_buffer_get_start_iter (memo->handle, &start);
-           gtk_text_buffer_get_end_iter (memo->handle, &end);
            val = gtk_text_buffer_get_text (memo->handle, &start, &end, FALSE);
            break;
        default:
index 2628979..74190e9 100644 (file)
@@ -119,6 +119,7 @@ Match (name);match $name;
 Tell (name);tell $name $input;
 Play (name);play $name;
 Message (name);message $name $input;
+Copy;$copy;
 Open Chat Box (name);$chat;
 }
 ;