⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 callbacks.c

📁 Linux 下察看 Chm 文件 的 源码
💻 C
字号:
/*************************************************************************** *   Copyright (C) 2003 by zhong                                           * *   zhongz@163.com                                                        * *                                                                         * *   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.                                   * ***************************************************************************/#include <time.h>#include <stdio.h>#include <string.h>#include <gtk/gtk.h>#include <gdk/gdkx.h>#include "interface.h"#include "callbacks.h"#include "html.h"#include "exchm.h"#include "hhc.h"#include "topuri.h"#include "chmsee_config.h"#include "bookmarks.h"static GtkWidget *chmfilew = NULL;static const gchar *MainWindowKey = "MainWindowKey";static gchar *chmsee_tmpdir_new(void);static void on_open_chmfile_ok (GtkButton *button, gpointer user_data);static void on_open_chmfile_cancel (GtkButton *button, gpointer user_data);static gboolean on_open_filesel_delete_event(GtkWidget *widget, GdkEvent *event, gpointer user_data);static void create_errord();static void load_file( ChmSee *window, const gchar *str_uri );void command_delete_tmpdir (char *s_path){	if (!g_file_test (s_path, G_FILE_TEST_EXISTS)) {		return;	}	if (s_path != NULL) {		char *argv[4];				argv[0] = "rm";		argv[1] = "-rf";		argv[2] = s_path;		argv[3] = NULL;		g_spawn_async (g_get_tmp_dir (), argv, NULL, 			      G_SPAWN_SEARCH_PATH, 			      NULL, NULL, NULL,				  NULL);/*		g_spawn_sync (g_get_tmp_dir (), argv, NULL, 			      G_SPAWN_SEARCH_PATH, 			      NULL, NULL, 			      NULL, NULL, NULL,			      NULL);*/	}}static void create_errord(){	GtkWidget *dialog;	dialog = gtk_message_dialog_new (NULL,                                  GTK_DIALOG_DESTROY_WITH_PARENT,                                  GTK_MESSAGE_ERROR,                                  GTK_BUTTONS_CLOSE,                                  "打开文件失败");	g_signal_connect_swapped (GTK_OBJECT (dialog), "response",                           G_CALLBACK (gtk_widget_destroy),                           GTK_OBJECT (dialog));	gtk_widget_show(dialog);}static gchar *chmsee_tmpdir_new(void) {	gchar	*get_tmpdir;	struct tm *ptr;	time_t lt;		lt = time(NULL);	ptr = localtime(&lt);	get_tmpdir = g_strdup_printf("%s/chmsee_tmp-%s/%d%d%d%d%d%d", 								g_get_tmp_dir(),								g_get_user_name(),								ptr->tm_year,								ptr->tm_mon,								ptr->tm_mday,								ptr->tm_hour,								ptr->tm_min,								ptr->tm_sec);	return (get_tmpdir);}void chmsee_init (ChmSee *window) {	gtk_window_set_title (GTK_WINDOW (window->chmsee_window), "ChmSee");	gtk_widget_set_sensitive (window->chmsee_toolbar_back, FALSE);	gtk_widget_set_sensitive (window->chmsee_toolbar_forward, FALSE);	gtk_widget_set_sensitive (window->chmsee_toolbar_small, FALSE);	gtk_widget_set_sensitive (window->chmsee_toolbar_reset, FALSE);	gtk_widget_set_sensitive (window->chmsee_toolbar_big, FALSE);	gtk_widget_set_sensitive (window->chmsee_toolbar_search, FALSE);	gtk_widget_hide (window->chmsee_toolbar_home);	window->link = NULL;	window->link_pos = 0;	window->current_link = NULL;	window->current_codeset = "GB18030";	window->home_url = NULL;	window->tmpdir = g_strdup_printf("%s", chmsee_tmpdir_new());	window->hhc_name = NULL;	window->chm_name = NULL;	window->bookmark_title = NULL;	window->bookmark_uri = NULL;	}voidgo_home(GtkWidget *widget, gpointer data){	ChmSee *window = (ChmSee *) data;	load_file(window, window->home_url);}static void load_file( ChmSee *window, const gchar *str_uri ) {	gchar 	*full_link;//	gchar	*ms_its;	gchar	*ch;	if ( g_strcasecmp("nolink", str_uri) == 0 ) {		return;	} else {		// MS-ITS --> MS-ITS:this-chm::/link		if ((ch = g_strrstr (str_uri, ":"))) {				str_uri = g_strdup (ch + 1);				g_print("%s\n", str_uri);		}		if (str_uri[0] == '/') {			full_link = g_strdup_printf("%s%s", window->tmpdir, str_uri);		} else {			full_link = g_strdup_printf("%s/%s", window->tmpdir, str_uri);		}		chm_html_open_uri(window, full_link, 0);	}		if (full_link != str_uri) {		g_free (full_link);	}}void bookmark_entry_setext(ChmSee *window) {	gtk_entry_set_text(GTK_ENTRY(window->nb_bookmark_entry), window->bookmark_title);}void bookmark_selection_cb (GtkTreeView       *tree_view,				 			GtkTreePath       *path,				 			GtkTreeViewColumn *column,				 			gpointer           user_data ){	ChmSee *window = (ChmSee *) user_data;	GtkTreeModel		*model = gtk_tree_view_get_model (tree_view);	GtkTreeIter			iter;	gchar				*author;	gtk_tree_model_get_iter (model, &iter, path);	gtk_tree_model_get (model, &iter, FILENAME_COLUMN, &author, -1);	load_file (window, author);}void contents_row_cb(GtkTreeView		*tree_view,				 	GtkTreePath			*path,				 	GtkTreeViewColumn	*column,				 	gpointer			user_data ){	ChmSee *window = (ChmSee *) user_data;	GtkTreeModel		*model = gtk_tree_view_get_model (tree_view);	GtkTreeIter			iter;	gchar				*author;	gtk_tree_model_get_iter (model, &iter, path);	gtk_tree_model_get (model, &iter, FILENAME_COLUMN, &author, -1);	load_file (window, author);}voidcontents_selection_cb (GtkTreeSelection *selection, gpointer user_data){	GtkTreeIter		iter;	ChmSee			*window = (ChmSee *) user_data;	GtkTreeView		*tree = GTK_TREE_VIEW(window->chm_tree);	GtkTreeModel	*model = gtk_tree_view_get_model (tree);	GValue			title_value = {0,};	GValue			uri_value = {0,};	gchar			*bm_title;	gchar			*bm_uri;		if (gtk_tree_selection_get_selected (selection, NULL, &iter)) {		gtk_tree_model_get_value (model, &iter, FILENAME_COLUMN, &uri_value);		bm_uri = g_strdup_printf("%s", g_value_get_string (&uri_value));		window->bookmark_uri = bm_uri;		gtk_tree_model_get_value (model, &iter, TITLE_COLUMN, &title_value);		bm_title = g_strdup_printf("%s", g_value_get_string (&title_value));		window->bookmark_title = bm_title;		bookmark_entry_setext(window);		load_file (window, bm_uri);		g_value_unset (&title_value);		g_value_unset (&uri_value);	}}void chmsee_go_ex_chm_file(ChmSee *window, const gchar *filename){	gchar *chmfile;	gchar *title;	gchar *title_utf8;	gchar *chmdir;	chmfile = g_strdup_printf( "%s", g_strrstr ( g_path_get_basename( filename ), "." ) );		if (!chmfile) {		chmfile = g_strdup_printf( "%s", g_strrstr ( filename , "." ) );	}	if ( g_strcasecmp(".chm", g_strdown(chmfile)) == 0 ) {		ex_chm_file ( window, filename );				if (window->hhc_name != NULL) {			open_hhc_file (window);		} else {			window->hhc_name = get_topurl(window);			if (window->hhc_name) {				load_file (window, window->hhc_name );				window->home_url = g_strdup(window->hhc_name);				gtk_widget_show (window->chmsee_toolbar_home);			} else {				create_errord();				return;			}		}			title = g_convert(filename, -1, "UTF-8", "GB18030", NULL, NULL, NULL);		if (title) {			title_utf8 = g_strdup_printf( "%s", title );		} else {			title_utf8 = g_strdup_printf( "%s", filename );		}		title_utf8 = g_strdup_printf( "%s", g_path_get_basename( title_utf8 ));				if (title_utf8) {			title_utf8 = g_strdup_printf( "ChmSee - %s", title_utf8 );	    	gtk_window_set_title( GTK_WINDOW (window->chmsee_window), title_utf8 );		} else {			title_utf8 = g_strdup_printf( "ChmSee - %s", filename );			gtk_window_set_title( GTK_WINDOW (window->chmsee_window), title_utf8 );		}		window->chm_name = g_strdup_printf("%s", filename);		chmdir = g_strdup_printf( "%s", g_path_get_dirname( filename ) );		chmsee_save_last_chm_dir(window, chmdir);		g_free( title );		g_free(title_utf8);		g_free(chmfile);		g_free(chmdir);		gtk_widget_grab_focus (window->chm_tree);		gtk_widget_set_sensitive (window->chmsee_toolbar_small, TRUE);		gtk_widget_set_sensitive (window->chmsee_toolbar_reset, TRUE);		gtk_widget_set_sensitive (window->chmsee_toolbar_big, TRUE);		gtk_widget_set_sensitive (window->chmsee_toolbar_search, TRUE);		chmsee_load_bookmarks(window);	}}/*************************************************************************** * Open File Selection Dialog. ***************************************************************************/static voidon_open_chmfile_ok (GtkButton *button, gpointer user_data){	ChmSee *window = (ChmSee *) user_data;	GtkTreeView		*tree = GTK_TREE_VIEW(window->chm_tree);	GtkTreeModel	*model = gtk_tree_view_get_model (tree);	GtkTreeView		*bookmarktree = GTK_TREE_VIEW(window->nb_bookmark_treeview);	GtkTreeModel	*bookmarkmodel = gtk_tree_view_get_model (bookmarktree);	GtkWidget *filesel;	const gchar *filename;	filesel = gtk_widget_get_toplevel (GTK_WIDGET (button));	filename = (gchar *) gtk_file_selection_get_filename (GTK_FILE_SELECTION (filesel));	filename = g_strdup_printf(filename);	gtk_widget_hide (filesel);		if (g_file_test(filename, G_FILE_TEST_IS_REGULAR)) {		gtk_tree_store_clear (GTK_TREE_STORE (model));		gtk_tree_store_clear (GTK_TREE_STORE (bookmarkmodel));		command_delete_tmpdir( window->tmpdir );		chmsee_init(window);		chmsee_html_load_empty(window);		chmsee_go_ex_chm_file(window, filename);	}}static voidon_open_chmfile_cancel  (GtkButton *button, gpointer user_data){	gtk_widget_hide (gtk_widget_get_toplevel (GTK_WIDGET(button)));}static gbooleanon_open_filesel_delete_event           (GtkWidget       *widget,                                        GdkEvent        *event,                                        gpointer         user_data){  gtk_widget_hide (gtk_widget_get_toplevel (widget));  return TRUE;}voidon_open_chmfile_filesel( GtkWidget *widget, gpointer user_data ){	ChmSee *chmfile = (ChmSee *) user_data;	GtkWidget	*w = chmfile->chmsee_window;		if (chmfilew == NULL) {  		GtkWidget *ok_button;  		GtkWidget *cancel_button;		chmfilew = gtk_file_selection_new ("选择要打开的CHM文件");		gtk_container_set_border_width (GTK_CONTAINER (chmfilew), 10);		gchar *dir_name;		dir_name = chmsee_load_last_chm_dir(chmfile);				if (dir_name) {			gtk_file_selection_set_filename (GTK_FILE_SELECTION (chmfilew), dir_name);		}		ok_button = GTK_FILE_SELECTION (chmfilew)->ok_button;		gtk_widget_show (ok_button);		GTK_WIDGET_SET_FLAGS (ok_button, GTK_CAN_DEFAULT);		cancel_button = GTK_FILE_SELECTION (chmfilew)->cancel_button;		gtk_widget_show (cancel_button);		GTK_WIDGET_SET_FLAGS (cancel_button, GTK_CAN_DEFAULT);		g_signal_connect ((gpointer) chmfilew, "delete_event",                    	G_CALLBACK (on_open_filesel_delete_event),                    	NULL);		g_signal_connect ((gpointer) ok_button, "clicked",                    	G_CALLBACK (on_open_chmfile_ok),                    	chmfile);		g_signal_connect ((gpointer) cancel_button, "clicked",                    	G_CALLBACK (on_open_chmfile_cancel),                    	NULL);		gtk_widget_show(chmfilew);		gtk_window_set_transient_for (GTK_WINDOW (chmfilew), 							GTK_WINDOW (w));	}			gtk_object_set_data (GTK_OBJECT (chmfilew), MainWindowKey, w);	gtk_window_present (GTK_WINDOW (chmfilew));}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -