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 + -
显示快捷键?