/* Copyright (C) 2001-2002 Kenichi Suto * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ #include "defs.h" #include "global.h" #include "eb.h" #include "selection.h" #include "misc.h" #include "popup.h" static gchar previous[256]; static gboolean auto_lookup_suspended = FALSE; extern GList *current_result; void selection_received (GtkWidget *widget, GtkSelectionData *data) { gchar *str; gchar **list; gint count; gchar *text=NULL; SEARCH_RESULT *rp; if((data == NULL) || (data->data == NULL) || (data->length < 0)){ goto END; } // STRING型ならば変換不要 if (data->type == GDK_TARGET_STRING){ data->data[data->length] = 0; str = data->data; // COMPOUND_TEXT型ならばカレントロケールのコード体系に変換する } else if ((data->type == gdk_atom_intern ("COMPOUND_TEXT", FALSE)) || (data->type == gdk_atom_intern ("TEXT", FALSE))){ count = gdk_text_property_to_text_list (data->type, data->format, data->data, data->length, &list); if((count == 0) || (list == NULL)){ goto END; } str = list[0]; } else { goto END; } str = strdup(str); remove_space(str); if((strcmp(previous, str) == 0) && (bauto_lookup == TRUE)){ // 前と同じだったら何もしない ; } else { if((strlen(str) <= auto_maxchar) && (strlen(str) >= auto_minchar)){ gtk_entry_set_text(GTK_ENTRY(word_entry), str); clear_tree(tree_root); clear_search_result(); ebook_search_auto(str); if(search_result){ if(bshow_popup){ // show_popup(result_head, FALSE); current_result = search_result; rp = (SEARCH_RESULT *)(search_result->data); current_book_info = rp->book_info; text = ebook_get_text(rp->book_info, rp->pos_text.page, rp->pos_text.offset); show_popup(rp->book_info, text); free(text); } else { show_result_tree(); } save_word_history(str); } else { current_result = NULL; current_book_info = NULL; if(bshow_popup){ // show_popup(NULL, _("No hit."), FALSE); beep(); } else { show_text(0, _("No hit.")); } } sprintf(previous, "%s", str); } } free(str); END: if(bauto_lookup){ if(tag_timeout != 0) gtk_timeout_remove(tag_timeout); tag_timeout = gtk_timeout_add(auto_interval, copy_clipboard,NULL); } return; } gint copy_clipboard(gpointer data){ static GdkAtom ctext_atom = GDK_NONE; /* xwindow = XGetSelectionOwner (gdk_display, GDK_SELECTION_PRIMARY); if (xwindow == None){ return(TRUE); } */ gtk_entry_set_text(GTK_ENTRY(hidden_entry), ""); // COMPOUND_TEXTを要求 if (ctext_atom == GDK_NONE) ctext_atom = gdk_atom_intern ("COMPOUND_TEXT", FALSE); gtk_selection_convert (hidden_entry, GDK_SELECTION_PRIMARY, ctext_atom, GDK_CURRENT_TIME); return (FALSE); } void auto_lookup_suspend() { if(bauto_lookup) { auto_lookup_suspended = TRUE; if(tag_timeout != 0) gtk_timeout_remove(tag_timeout); } } void auto_lookup_resume() { if(bauto_lookup && auto_lookup_suspended) { auto_lookup_suspended = FALSE; if(tag_timeout != 0) gtk_timeout_remove(tag_timeout); tag_timeout = gtk_timeout_add(auto_interval, copy_clipboard, NULL); } }