info.c

来自「Gqview,Linux下基于GTK+库写成的轻量级而能丰富的图像浏览程序。」· C语言 代码 · 共 772 行 · 第 1/2 页

C
772
字号
/* * GQview * (C) 2004 John Ellis * * Author: John Ellis * * This software is released under the GNU General Public License (GNU GPL). * Please read the included file COPYING for more information. * This software comes with no warranty of any kind, use at your own risk! */#include "gqview.h"#include "info.h"#include "bar_info.h"#include "bar_exif.h"#include "dnd.h"#include "filelist.h"#include "image.h"#include "image-load.h"#include "pixbuf-renderer.h"#include "ui_bookmark.h"#include "ui_fileops.h"#include "ui_misc.h"#include <pwd.h>#include <grp.h>#define IMAGE_SIZE_W 200#define IMAGE_SIZE_H 200#define DEF_PROPERTY_WIDTH  510#define DEF_PROPERTY_HEIGHT 390typedef struct _TabData TabData;struct _TabData{	void (*func_free)(gpointer data);	void (*func_sync)(InfoData *id, gpointer data);	void (*func_image)(InfoData *id, gpointer data);	gpointer data;};/* *------------------------------------------------------------------- * table utils *------------------------------------------------------------------- */GtkWidget *table_add_line(GtkWidget *table, gint x, gint y,			  const gchar *description, const gchar *text){	GtkWidget *label;	if (!text) text = "";	label = pref_table_label(table, x, y, description, 1.0);	pref_label_bold(label, TRUE, FALSE);	label = pref_table_label(table, x + 1, y, text, 0.0);	return label;}/* *------------------------------------------------------------------- * EXIF tab *------------------------------------------------------------------- */static void info_tab_exif_image(InfoData *id, gpointer data){	GtkWidget *bar = data;	const gchar *path;	if (id->image->unknown)		{		path = NULL;		}	else       		{		path = id->image->image_path;		}	bar_exif_set(bar, path);}static void info_tab_exif_sync(InfoData *id, gpointer data){	GtkWidget *bar = data;	bar_exif_set(bar, NULL);}static TabData *info_tab_exif_new(InfoData *id){	TabData *td;	GtkWidget *bar;	GtkWidget *label;	bar = bar_exif_new(FALSE, NULL, FALSE, NULL);	gtk_container_set_border_width(GTK_CONTAINER(bar), PREF_PAD_BORDER);	label = gtk_label_new(_("Exif"));	gtk_notebook_append_page(GTK_NOTEBOOK(id->notebook), bar, label);	gtk_widget_show(bar);	/* register */	td = g_new0(TabData, 1);	td->func_free = NULL;	td->func_sync = info_tab_exif_sync;	td->func_image = info_tab_exif_image;	td->data = bar;	return td;}/* *------------------------------------------------------------------- * file attributes tab *------------------------------------------------------------------- */typedef struct _InfoTabMeta InfoTabMeta;struct _InfoTabMeta{	GtkWidget *bar_info;};static void info_tab_meta_free(gpointer data){	InfoTabMeta *tab = data;	g_free(tab);}static void info_tab_meta_sync(InfoData *id, gpointer data){	InfoTabMeta *tab = data;	bar_info_set(tab->bar_info, id->path);}static GList *info_tab_meta_list_cb(gpointer data){	InfoData *id = data;	return path_list_copy(id->list);}static TabData *info_tab_meta_new(InfoData *id){	TabData *td;	InfoTabMeta *tab;	GtkWidget *label;	tab = g_new0(InfoTabMeta, 1);	tab->bar_info = bar_info_new(NULL, TRUE, NULL);	bar_info_set_selection_func(tab->bar_info, info_tab_meta_list_cb, id);	bar_info_selection(tab->bar_info, g_list_length(id->list) - 1);	gtk_container_set_border_width(GTK_CONTAINER(tab->bar_info), PREF_PAD_BORDER);	label = gtk_label_new(_("Keywords"));	gtk_notebook_append_page(GTK_NOTEBOOK(id->notebook), tab->bar_info, label);	gtk_widget_show(tab->bar_info);	/* register */	td = g_new0(TabData, 1);	td->func_free = info_tab_meta_free;	td->func_sync = info_tab_meta_sync;	td->func_image = NULL;	td->data = tab;	return td;}/* *------------------------------------------------------------------- * general tab *------------------------------------------------------------------- */typedef struct _InfoTabGeneral InfoTabGeneral;struct _InfoTabGeneral{	GtkWidget *label_file_time;	GtkWidget *label_file_size;	GtkWidget *label_dimensions;	GtkWidget *label_transparent;	GtkWidget *label_image_size;	GtkWidget *label_compression;	GtkWidget *label_mime_type;	GtkWidget *label_user;	GtkWidget *label_group;	GtkWidget *label_perms;	gint compression_done;	gint64 byte_size;};static void info_tab_general_image(InfoData *id, gpointer data){	InfoTabGeneral *tab = data;	gchar *buf;	guint mem_size;	gint has_alpha;	GdkPixbuf *pixbuf;	gint width, height;	if (id->image->unknown) return;	pixbuf_renderer_get_image_size(PIXBUF_RENDERER(id->image->pr), &width, &height);	buf = g_strdup_printf("%d x %d", width, height);	gtk_label_set_text(GTK_LABEL(tab->label_dimensions), buf);	g_free(buf);	pixbuf = image_get_pixbuf(id->image);	if (pixbuf)		{		has_alpha = gdk_pixbuf_get_has_alpha(pixbuf);		}	else		{		has_alpha = FALSE;		}	gtk_label_set_text(GTK_LABEL(tab->label_transparent), has_alpha ? _("yes") : _("no"));	mem_size = width * height * ((has_alpha) ? 4 : 3);	buf = text_from_size_abrev(mem_size);	gtk_label_set_text(GTK_LABEL(tab->label_image_size), buf);	g_free(buf);	if (!tab->compression_done && mem_size > 0)		{		buf = g_strdup_printf("%.1f%%", (double)tab->byte_size / mem_size * 100.0);		gtk_label_set_text(GTK_LABEL(tab->label_compression), buf);		g_free(buf);		tab->compression_done = TRUE;		}	buf = image_loader_get_format(id->image->il);	if (buf)	gtk_label_set_text(GTK_LABEL(tab->label_mime_type), buf);	g_free(buf);}static gchar *mode_number(mode_t m){	int mb, mu, mg, mo;	mb = mu = mg = mo = 0;	if (m & S_ISUID) mb |= 4;	if (m & S_ISGID) mb |= 2;	if (m & S_ISVTX) mb |= 1;	if (m & S_IRUSR) mu |= 4;	if (m & S_IWUSR) mu |= 2;	if (m & S_IXUSR) mu |= 1;	if (m & S_IRGRP) mg |= 4;	if (m & S_IWGRP) mg |= 2;	if (m & S_IXGRP) mg |= 1;	if (m & S_IROTH) mo |= 4;	if (m & S_IWOTH) mo |= 2;	if (m & S_IXOTH) mo |= 1;	return g_strdup_printf("%d%d%d%d", mb, mu, mg, mo);}static void info_tab_general_sync_perm(InfoTabGeneral *tab, InfoData *id){	struct stat st;	if (!stat_utf8(id->path, &st))		{		gtk_label_set_text(GTK_LABEL(tab->label_user), "");		gtk_label_set_text(GTK_LABEL(tab->label_group), "");		gtk_label_set_text(GTK_LABEL(tab->label_perms), "");		}	else		{		struct passwd *user;		struct group *grp;		gchar pbuf[12];		gchar *pmod;		gchar *buf;		user = getpwuid(st.st_uid);		gtk_label_set_text(GTK_LABEL(tab->label_user), (user) ? user->pw_name : "");		grp = getgrgid(st.st_gid);		gtk_label_set_text(GTK_LABEL(tab->label_group), (grp) ? grp->gr_name : "");		pbuf[0] = (st.st_mode & S_IRUSR) ? 'r' : '-';		pbuf[1] = (st.st_mode & S_IWUSR) ? 'w' : '-';		pbuf[2] = (st.st_mode & S_IXUSR) ? 'x' : '-';		pbuf[3] = (st.st_mode & S_IRGRP) ? 'r' : '-';		pbuf[4] = (st.st_mode & S_IWGRP) ? 'w' : '-';		pbuf[5] = (st.st_mode & S_IXGRP) ? 'x' : '-';		pbuf[6] = (st.st_mode & S_IROTH) ? 'r' : '-';		pbuf[7] = (st.st_mode & S_IWOTH) ? 'w' : '-';		pbuf[8] = (st.st_mode & S_IXOTH) ? 'x' : '-';		pbuf[9] = '\0';		pmod = mode_number(st.st_mode);		buf = g_strdup_printf("%s (%s)", pbuf, pmod);		gtk_label_set_text(GTK_LABEL(tab->label_perms), buf);		g_free(buf);		g_free(pmod);		}}static void info_tab_general_sync(InfoData *id, gpointer data){	InfoTabGeneral *tab = data;	gchar *buf;	gtk_label_set_text(GTK_LABEL(tab->label_file_time), text_from_time(filetime(id->path)));	tab->byte_size = filesize(id->path);	buf = text_from_size(tab->byte_size);	gtk_label_set_text(GTK_LABEL(tab->label_file_size), buf);	g_free(buf);	gtk_label_set_text(GTK_LABEL(tab->label_dimensions), "");	gtk_label_set_text(GTK_LABEL(tab->label_transparent), "");	gtk_label_set_text(GTK_LABEL(tab->label_image_size), "");	gtk_label_set_text(GTK_LABEL(tab->label_compression), "");	gtk_label_set_text(GTK_LABEL(tab->label_mime_type), "");	info_tab_general_sync_perm(tab, id);	tab->compression_done = FALSE;}static void info_tab_general_free(gpointer data){	InfoTabGeneral *tab = data;	g_free(tab);}static TabData *info_tab_general_new(InfoData *id){	TabData *td;	InfoTabGeneral *tab;	GtkWidget *table;	GtkWidget *label;	tab = g_new0(InfoTabGeneral, 1);	table = pref_table_new(NULL, 2, 11, FALSE, FALSE);	gtk_container_set_border_width(GTK_CONTAINER(table), PREF_PAD_BORDER);	tab->label_file_time = table_add_line(table, 0, 0, _("File date:"), NULL);	tab->label_file_size = table_add_line(table, 0, 1, _("File size:"), NULL);	tab->label_dimensions = table_add_line(table, 0, 2, _("Dimensions:"), NULL);	tab->label_transparent = table_add_line(table, 0, 3, _("Transparent:"), NULL);	tab->label_image_size = table_add_line(table, 0, 4, _("Image size:"), NULL);	tab->label_compression = table_add_line(table, 0, 5, _("Compress ratio:"), NULL);	tab->label_mime_type = table_add_line(table, 0, 6, _("File type:"), NULL);	tab->label_user = table_add_line(table, 0, 7, _("Owner:"), NULL);	tab->label_group = table_add_line(table, 0, 8, _("Group:"), NULL);	tab->label_perms = table_add_line(table, 0, 9, "", NULL);	label = gtk_label_new(_("General"));	gtk_notebook_append_page(GTK_NOTEBOOK(id->notebook), table, label);	gtk_widget_show(table);	/* register */	td = g_new0(TabData, 1);	td->func_free = info_tab_general_free;

⌨️ 快捷键说明

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