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

📄 main_viewer.cpp

📁 嵌入式Linux + GTK
💻 CPP
字号:
#include <sys/types.h>
#include <dirent.h>
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <libintl.h>
#include <locale.h>
#include <sys/types.h>
#include <unistd.h>

#include <gtk/gtk.h>
#include <gdk/gdkkeysyms.h>

#define _(x) gettext(x)
#define PACKAGE "Viewer"
#define PACKAGE_LOCALE_DIR "/usr/local/share/locale"
#define FILE_TESTPROJECT	"/data/bin/testproject"

int matchindex = 0; 

GtkTextBuffer *g_buffer;
char *path = "/data/bin/helpdir";

/*
 * Convenience function for clearing the specified GtkTextBuffer.
 */
static void
clear_text_buffer(GtkTextBuffer * buffer)
{
	GtkTextIter start;
	GtkTextIter end;
	gtk_text_buffer_get_bounds (buffer, &start, &end);
	gtk_text_buffer_delete (buffer, &start, &end);
}

/*
 * append the specified buf into the text buffer.
 */
static void
append_text_buffer(GtkTextBuffer *text_buffer, gchar *buf)
{
	GtkTextMark * mark;
	GtkTextIter start, end;
	gtk_text_buffer_get_end_iter (text_buffer, &end);
	mark = gtk_text_buffer_create_mark (text_buffer, "blah", &end, TRUE);
	gtk_text_buffer_insert (text_buffer, &end, buf, -1);
	gtk_text_buffer_get_iter_at_mark (text_buffer, &start, mark);
	gtk_text_buffer_delete_mark (text_buffer, mark);
}

void
show_file_content(const char* filename)
{
	if(strlen(filename) == 0)
		return;
	const int arr_size = 2048;
	clear_text_buffer(g_buffer);

	char filepath[arr_size] = {0};
	strcpy(filepath, path);
	filepath[strlen(filepath)] = '/';
	strcpy(filepath + strlen(path) + 1, filename);

	FILE *fh = fopen(filepath, "r");
	if(fh == NULL)
	{
		append_text_buffer(g_buffer, _("Open File Error!"));
		return;
	}
	char ptr[arr_size] = {0};
	int re = 0;
	re = fread(ptr, 1, sizeof(ptr), fh);
	if(re >= 0)
	{
		char *ptr_utf8 = g_locale_to_utf8(ptr, -1, NULL, NULL, NULL);
		append_text_buffer(g_buffer, ptr_utf8);
		g_free(ptr_utf8);
	}
	
	fclose(fh);
}


void tree_view_row_activated( GtkWidget      *clist,
                     gint            row,
                     gint            column,
		     		 GdkEventButton *event,
                     gpointer        data )
{
	char *title = NULL;
	int ret = gtk_clist_get_text(GTK_CLIST(clist), row, column, &title);
	if (ret) {
		char *filename_locale = g_locale_from_utf8(title, -1, NULL, NULL, NULL);
		if(strlen(filename_locale) == 0)
			return;
		show_file_content((const char*)filename_locale);
		g_free(filename_locale);
	}
}

/* create an list */
GtkWidget *create_list( void )
{
	GtkWidget *scrolled_window;
	GtkWidget *item_clist;

	char *titles = _("Help Topic");

	scrolled_window = gtk_scrolled_window_new (NULL, NULL);
	gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (scrolled_window),
					GTK_POLICY_AUTOMATIC, 
					GTK_POLICY_AUTOMATIC);

	item_clist = gtk_clist_new_with_titles (1, &titles);

	g_signal_connect (G_OBJECT (item_clist), "select_row",
                      G_CALLBACK (tree_view_row_activated),
                      NULL);

	gtk_scrolled_window_add_with_viewport (GTK_SCROLLED_WINDOW (scrolled_window), item_clist);
	gtk_widget_show(item_clist);

	DIR * dir = NULL;
	struct dirent *pdirent = NULL;
	if((dir = opendir((const char *)path) ) == NULL) {
		return scrolled_window;
	}
	while ((pdirent = readdir(dir)) != NULL) {
		if (!strcmp(pdirent->d_name, ".") || !strcmp(pdirent->d_name, ".."))
				continue;	/* ignore dot and dot-dot */
		char *name_utf8 = g_locale_to_utf8(pdirent->d_name, -1, NULL, NULL, NULL);
		gtk_clist_append ((GtkCList *)item_clist, &name_utf8);
		g_free(name_utf8);
	}
	closedir(dir);

    return scrolled_window;
}

void 
init_text (GtkTextBuffer *buffer)
{
   GtkTextIter iter;
 
   gtk_text_buffer_get_iter_at_offset (buffer, &iter, 0);

   gtk_text_buffer_insert(buffer, &iter,
	   _("Select an item above to show the related help contents."),
	   -1);
}

GtkWidget *create_text( void )
{
	GtkWidget *scrolled_window;
	GtkWidget *view;
	
	view = gtk_text_view_new ();
	gtk_text_view_set_wrap_mode(GTK_TEXT_VIEW(view), GTK_WRAP_WORD);
	gtk_text_view_set_editable(GTK_TEXT_VIEW(view), FALSE);
	gtk_text_view_set_cursor_visible(GTK_TEXT_VIEW(view), FALSE);
	g_buffer = gtk_text_view_get_buffer (GTK_TEXT_VIEW (view));
	
	scrolled_window = gtk_scrolled_window_new (NULL, NULL);
	gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (scrolled_window),
		GTK_POLICY_NEVER,
		GTK_POLICY_AUTOMATIC);
	
	gtk_container_add (GTK_CONTAINER (scrolled_window), view);
    init_text (g_buffer);
	
	gtk_widget_show_all (scrolled_window);
	
	return scrolled_window;
}
   
int 
main( int argc, char *argv[] )
{
	setlocale (LC_ALL, "");
	bindtextdomain (PACKAGE, PACKAGE_LOCALE_DIR);
	bind_textdomain_codeset (PACKAGE, "UTF-8"); 
	textdomain (PACKAGE);

    gtk_init (&argc, &argv);
	
    GtkWidget *window;
    GtkWidget *vpaned;
    GtkWidget *list;
    GtkWidget *text;

    window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
    gtk_window_set_title (GTK_WINDOW (window), _("Viewer"));
    g_signal_connect (G_OBJECT (window), "destroy",
	              G_CALLBACK (gtk_main_quit), NULL);
    gtk_container_set_border_width (GTK_CONTAINER (window), 10);
    gtk_widget_set_size_request (GTK_WIDGET (window), 450, 400);
   
    vpaned = gtk_vpaned_new ();
    gtk_container_add (GTK_CONTAINER (window), vpaned);
    gtk_widget_show (vpaned);
   
    list = create_list ();
    gtk_paned_add1 (GTK_PANED (vpaned), list);
    gtk_widget_show (list);
   
    text = create_text ();
    gtk_paned_add2 (GTK_PANED (vpaned), text);
    gtk_widget_show (text);

	//Sets the position of the divider between the two panes.
	gtk_paned_set_position(GTK_PANED(vpaned), 100);

    gtk_widget_show (window);

    gtk_main ();

    return 0;
}

⌨️ 快捷键说明

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