From 25d581e9d21f19dc297f50b1faeac1f5d60b71fe Mon Sep 17 00:00:00 2001 From: H.G. Muller Date: Fri, 7 Feb 2014 11:22:44 +0100 Subject: [PATCH] Implement copy function in ICS Text Menu 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 | 21 ++++++++++++++------- gtk/xoptions.c | 22 +++++++++++++++------- xboard.conf.in | 1 + 3 files changed, 30 insertions(+), 14 deletions(-) diff --git a/dialogs.c b/dialogs.c index 8dbcf04..9c7a28a 100644 --- 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 diff --git a/gtk/xoptions.c b/gtk/xoptions.c index 6cf117a..46b10ba 100644 --- a/gtk/xoptions.c +++ b/gtk/xoptions.c @@ -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: diff --git a/xboard.conf.in b/xboard.conf.in index 2628979..74190e9 100644 --- a/xboard.conf.in +++ b/xboard.conf.in @@ -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; } ; -- 1.7.0.4