/* 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 <pthread.h>
#include <sys/wait.h>
#ifdef HAVE_ICONV_H
#include <iconv.h>
#include <langinfo.h>
#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<nmenu_items ; i++){
tree_menu_items[i].path = _(tree_menu_items[i].path);
}
tree_item_factory = gtk_item_factory_new (GTK_TYPE_MENU, "<tree>",
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);
}
syntax highlighted by Code2HTML, v. 0.9.1