/* 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 "statusbar.h" #include #include #ifdef HAVE_ICONV_H #include #include #endif #define MAX_ENGINES 100 void go_home(); void web_search(); void split_word(gchar *word, gchar **keywords); static GtkWidget *web_tree; static GtkCTreeNode *current_node; static GtkItemFactory *tree_item_factory; static GtkItemFactoryEntry tree_menu_items[] = { { N_("/Go Home"), NULL, go_home, 0, NULL }, { N_("/Search"), NULL, web_search, 0, NULL }, }; extern GdkPixmap *book_open_pixmap; extern GdkPixmap *book_closed_pixmap; extern GdkBitmap *book_open_mask; extern GdkBitmap *book_closed_mask; extern GtkWidget *dict_viewport; extern GtkWidget *dict_scroll; extern GtkWidget *progress_web; extern GList *web_list; struct _engine { gchar *group; gchar *title; gchar *url; gchar *delimit; gchar *rest; }; struct _engine engines[MAX_ENGINES]; static unsigned char *any_to_sjis(unsigned char *str) { iconv_t cd; const char* icode = "euc-jp"; // const char* ocode = "iso-2022-jp"; const char* ocode = "shift_jis"; int r = 0; size_t isize; size_t osize; char *outbuf; char *result; char *lang; strdup(str); lang = getenv("LANG"); if(lang == NULL) { lang = getenv("LC_ALL"); if(lang == NULL){ fprintf(stderr, "Failed to get current locale.\n"); exit(1); } } if((strcmp(lang, "ja_JP.eucJP") == 0) || (strcmp(lang, "ja_JP.EUC") == 0) || (strcmp(lang, "ja_JP.ujis") == 0)){ icode = "euc-jp"; } else if(strcmp(lang, "ja_JP.SJIS") == 0){ icode = "shift_jis"; } else { return(NULL); } // p = gdk_wcstombs(wc_buff); cd = iconv_open( ocode, icode ); if( (int)cd == -1 ) return(NULL); isize = strlen(str) + 1; osize = isize*2; result = outbuf = (char*)malloc(osize); r = iconv(cd, (const char **)&str, &isize, &outbuf, &osize); iconv_close(cd); // free(result); return(result); } static unsigned char *codeconv(unsigned char *str, const char *ocode) { iconv_t cd; const char* icode; int r = 0; size_t isize; size_t osize; char *outbuf; char *result; g_assert(str != NULL); if(ocode == NULL) return(strdup(str)); if((strcmp(ocode, "euc-jp") != 0) && (strcmp(ocode, "shift_jis") != 0) && (strcmp(ocode, "iso-2022-jp") != 0) && (strcmp(ocode, "utf-8") != 0)) return(strdup(str)); icode = nl_langinfo(CODESET); if (strcasecmp(icode, "EUCJP") == 0){ icode = "euc-jp"; } if(strcasecmp(icode, ocode) == 0){ return(strdup(str)); } cd = iconv_open( ocode, icode ); if( (int)cd == -1 ) return(NULL); isize = strlen(str) + 1; osize = isize*2; result = outbuf = (char*)malloc(osize); r = iconv(cd, (char **)&str, &isize, &outbuf, &osize); iconv_close(cd); return(result); } //void do_web_search(GtkWidget *widget, gpointer data){ void web_search() { gchar url[512]; pid_t pid; gint i, j; unsigned char c; gchar *keywords[EB_MAX_KEYWORDS + 1]; unsigned char *kanji_str; gint status; char *words[128]; gchar *p; gchar *cmd_template; gchar cmd[512]; WEB_MEMBER *member; char *word; if(current_node == NULL){ warning(_("Please select web site")); return; } word = gtk_entry_get_text(GTK_ENTRY(word_entry)); member = gtk_ctree_node_get_row_data(GTK_CTREE(web_tree), current_node); if(member == NULL){ warning(_("Please select web site")); return; } if(strlen(word) == 0) return; split_word(word, keywords); status_message("Lanuching web browser..."); switch(pid = fork()){ case -1: perror("fork"); status_message("Lanuching web browser...failed."); return; case 0: url[0] = '\0'; strcat(url, member->pre); for(i=0 ; ; i++){ if(keywords[i] == NULL) break; if((i != 0) &&(member->glue)) strcat(url, member->glue); #ifdef HAVE_ICONV_H // kanji_str = any_to_sjis(keywords[i]); kanji_str = codeconv(keywords[i], member->charcode); #else kanji_str = keywords[i]; #endif for(j=0 ; j < strlen(kanji_str) ; j ++){ c = kanji_str[j]; sprintf(url, "%s%%%02X", url, c); } #ifdef HAVE_ICONV_H free(kanji_str); #endif } if(member->post) strcat(url, member->post); cmd_template = strdup(browser_template); p = strstr(cmd_template, "%f"); if(p != NULL){ *p = '%'; p++; *p = 's'; } sprintf(cmd, cmd_template, url); // system(cmd); split_word(cmd, words); if(execvp(words[0], words) == -1){ perror("exec"); _exit(1); } free(cmd_template); _exit(0); break; default: waitpid(pid, &status, 0); break; } status_message("Lanuching web browser...done."); } void go_home() { gchar url[512]; pid_t pid; gint status; char *words[128]; gchar *p; gchar *cmd_template; gchar cmd[512]; WEB_MEMBER *member; if(current_node == NULL){ fprintf(stderr, "Please select Web site.\n"); return; } member = gtk_ctree_node_get_row_data(GTK_CTREE(web_tree), current_node); switch(pid = fork()){ case -1: perror("fork"); return; case 0: url[0] = '\0'; strcat(url, member->home); cmd_template = strdup(browser_template); p = strstr(cmd_template, "%f"); if(p != NULL){ *p = '%'; p++; *p = 's'; } sprintf(cmd, cmd_template, url); // system(cmd); split_word(cmd, words); if(execvp(words[0], words) == -1){ perror("exec"); gtk_main_quit(); _exit(1); } free(cmd_template); _exit(0); break; default: waitpid(pid, &status, 0); break; } } void web_select_row(GtkWidget *widget, gint row, gint column, GdkEventButton *bevent, gpointer user_data) { current_node = gtk_ctree_node_nth(GTK_CTREE(web_tree), row); if (bevent) { switch (bevent->type) { case GDK_BUTTON_PRESS: break; case GDK_2BUTTON_PRESS: // embeded_load_url(moz_embed, member->home); web_search(); break; default: break; } } return; } gint web_button_press(GtkWidget *widget, GdkEventButton *event) { if ((event->type == GDK_BUTTON_PRESS) && ((event->button == 2) || (event->button == 3))){ gtk_item_factory_popup (GTK_ITEM_FACTORY (tree_item_factory), event->x_root, event->y_root, event->button, event->time); return(TRUE); } return(FALSE); } void web_unselect_row(GtkWidget *widget, gint row, gint column, GdkEventButton *bevent, gpointer user_data) { g_return_if_fail (GTK_IS_CLIST (widget)); current_node = NULL; return; } GtkWidget *create_web_tree() { GtkWidget *node=NULL; GtkWidget *leaf; GtkWidget *web_box; gint i; char *text[1]; GList *group_item; GList *member_item; WEB_GROUP *group; WEB_MEMBER *member; gint nmenu_items; web_box = gtk_scrolled_window_new (NULL, NULL); web_tree = gtk_ctree_new(1, 0); gtk_clist_set_row_height(GTK_CLIST(web_tree),HEADING_HEIGHT+2); gtk_ctree_set_line_style(GTK_CTREE(web_tree),GTK_CTREE_LINES_NONE); gtk_signal_connect (GTK_OBJECT(web_tree), "select_row", GTK_SIGNAL_FUNC(web_select_row), web_tree); gtk_signal_connect (GTK_OBJECT(web_tree), "unselect_row", GTK_SIGNAL_FUNC(web_unselect_row), web_tree); gtk_signal_connect (GTK_OBJECT(web_tree), "button_press_event", GTK_SIGNAL_FUNC(web_button_press), NULL); gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (web_box), GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC); // gtk_clist_set_selection_mode(GTK_CLIST(web_tree), // GTK_SELECTION_SINGLE); gtk_clist_set_reorderable(GTK_CLIST(web_tree), FALSE); // gtk_widget_set_usize(GTK_WIDGET(web_tree), 200, 350); gtk_container_add (GTK_CONTAINER (web_box), web_tree); group_item = g_list_first(web_list); while(group_item != NULL){ group = (WEB_GROUP *)(group_item->data); text[0] = group->name; node = (GtkWidget *)gtk_ctree_insert_node(GTK_CTREE(web_tree), NULL, //parent NULL, //sibling text, //text 0, //spacing html_pixmap, //pixmap closed html_mask, //mask closed html_pixmap, //pixmap opened html_mask, //mask opened FALSE,//is leaf FALSE);//expanded member_item = g_list_first(group->member); while(member_item != NULL){ member = (WEB_MEMBER *)(member_item->data); text[0] = member->name; leaf = (GtkWidget *)gtk_ctree_insert_node(GTK_CTREE(web_tree), GTK_CTREE_NODE(node), //parent NULL, //sibling text, //text 2, //spacing NULL, //pixmap closed NULL, //mask closed NULL, //pixmap opened NULL, //mask opened TRUE,//is leaf TRUE);//expanded /* leaf = (GtkWidget *)gtk_ctree_insert_node(GTK_CTREE(web_tree), GTK_CTREE_NODE(node), //parent NULL, //sibling text, //text 2, //spacing html_pixmap, //pixmap closed html_mask, //mask closed html_pixmap, //pixmap opened html_mask, //mask opened TRUE,//is leaf TRUE);//expanded */ gtk_ctree_node_set_row_data(GTK_CTREE(web_tree), GTK_CTREE_NODE(leaf), (gpointer)member); member_item = g_list_next(member_item); } group_item = g_list_next(group_item); } nmenu_items = sizeof (tree_menu_items) / sizeof (tree_menu_items[0]); for(i=0 ; i", NULL); gtk_item_factory_create_items (tree_item_factory, nmenu_items, tree_menu_items, NULL); gtk_clist_set_column_width(GTK_CLIST(web_tree), 0, 640); return(web_box); }