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

📄 layout.c

📁 Gqview,Linux下基于GTK+库写成的轻量级而能丰富的图像浏览程序。
💻 C
📖 第 1 页 / 共 3 页
字号:
{	if (!layout_valid(&lw)) return -1;	if (lw->vfl) return vflist_index_by_path(lw->vfl, path);	if (lw->vfi) return vficon_index_by_path(lw->vfi, path);	return -1;}void layout_list_sync_path(LayoutWindow *lw, const gchar *path){	if (!layout_valid(&lw)) return;	if (lw->vfl) vflist_select_by_path(lw->vfl, path);	if (lw->vfi) vficon_select_by_path(lw->vfi, path);}static void layout_list_sync_sort(LayoutWindow *lw){	if (!layout_valid(&lw)) return;	if (lw->vfl) vflist_sort_set(lw->vfl, lw->sort_method, lw->sort_ascend);	if (lw->vfi) vficon_sort_set(lw->vfi, lw->sort_method, lw->sort_ascend);}GList *layout_selection_list(LayoutWindow *lw){	if (!layout_valid(&lw)) return NULL;	if (layout_image_get_collection(lw, NULL))		{		const gchar *path;		path = layout_image_get_path(lw);		if (path) return g_list_append(NULL, g_strdup(path));		return NULL;		}	if (lw->vfl) return vflist_selection_get_list(lw->vfl);	if (lw->vfi) return vficon_selection_get_list(lw->vfi);	return NULL;}GList *layout_selection_list_by_index(LayoutWindow *lw){	if (!layout_valid(&lw)) return NULL;	if (lw->vfl) return vflist_selection_get_list_by_index(lw->vfl);	if (lw->vfi) return vficon_selection_get_list_by_index(lw->vfi);	return NULL;}gint layout_selection_count(LayoutWindow *lw, gint64 *bytes){	if (!layout_valid(&lw)) return 0;	if (lw->vfl) return vflist_selection_count(lw->vfl, bytes);	if (lw->vfi) return vficon_selection_count(lw->vfi, bytes);	return 0;}void layout_select_all(LayoutWindow *lw){	if (!layout_valid(&lw)) return;	if (lw->vfl) vflist_select_all(lw->vfl);	if (lw->vfi) vficon_select_all(lw->vfi);}void layout_select_none(LayoutWindow *lw){	if (!layout_valid(&lw)) return;	if (lw->vfl) vflist_select_none(lw->vfl);	if (lw->vfi) vficon_select_none(lw->vfi);}/* *----------------------------------------------------------------------------- * access *----------------------------------------------------------------------------- */const gchar *layout_get_path(LayoutWindow *lw){	if (!layout_valid(&lw)) return NULL;	return lw->path;}static void layout_sync_path(LayoutWindow *lw){	if (!lw->path) return;	lw->last_time = filetime(lw->path);	gtk_entry_set_text(GTK_ENTRY(lw->path_entry), lw->path);	if (lw->vdl) vdlist_set_path(lw->vdl, lw->path);	if (lw->vdt) vdtree_set_path(lw->vdt, lw->path);	if (lw->vfl) vflist_set_path(lw->vfl, lw->path);	if (lw->vfi) vficon_set_path(lw->vfi, lw->path);}gint layout_set_path(LayoutWindow *lw, const gchar *path){	gint have_file = FALSE;	if (!layout_valid(&lw)) return FALSE;	if (!path || !isname(path)) return FALSE;	if (lw->path && path && strcmp(path, lw->path) == 0)		{		return TRUE;		}	if (isdir(path))		{		g_free(lw->path);		lw->path = g_strdup(path);		}	else		{		gchar *base;		base = remove_level_from_path(path);		if (lw->path && strcmp(lw->path, base) == 0)			{			g_free(base);			}		else if (isdir(base))			{			g_free(lw->path);			lw->path = base;			}		else			{			g_free(base);			return FALSE;			}		if (isfile(path)) have_file = TRUE;		}	if (lw->path_entry) tab_completion_append_to_history(lw->path_entry, lw->path);	layout_sync_path(lw);	if (have_file)		{		gint row;		row = layout_list_get_index(lw, path);		if (row >= 0)			{			layout_image_set_index(lw, row);			}		else			{			layout_image_set_path(lw, path);			}		}	else if (!lazy_image_sync)		{		layout_image_set_index(lw, 0);		}	return TRUE;}static void layout_refresh_lists(LayoutWindow *lw){	if (lw->path) lw->last_time = filetime(lw->path);	if (lw->vdl) vdlist_refresh(lw->vdl);	if (lw->vdt) vdtree_refresh(lw->vdt);	if (lw->vfl) vflist_refresh(lw->vfl);	if (lw->vfi) vficon_refresh(lw->vfi);}static void layout_refresh_by_time(LayoutWindow *lw){	layout_refresh_lists(lw);	if (lw->image && filetime(layout_image_get_path(lw)) >= lw->last_time)		{		layout_image_refresh(lw);		}}void layout_refresh(LayoutWindow *lw){	if (!layout_valid(&lw)) return;	if (debug) printf("layout refresh\n");	layout_refresh_lists(lw);	if (lw->image) layout_image_refresh(lw);}static gint layout_check_for_update_cb(gpointer data){	LayoutWindow *lw = data;	if (!update_on_time_change) return TRUE;	if (lw->path)		{		time_t new_time;		new_time = filetime(lw->path);		if (new_time > 0 && new_time > lw->last_time)			{			if (debug) printf("layout path time changed, refreshing...\n");			layout_refresh_by_time(lw);			}		}	return TRUE;}void layout_thumb_set(LayoutWindow *lw, gint enable){	if (!layout_valid(&lw)) return;	if (lw->thumbs_enabled == enable) return;	lw->thumbs_enabled = enable;	layout_util_sync_thumb(lw);	layout_list_sync_thumb(lw);}gint layout_thumb_get(LayoutWindow *lw){	if (!layout_valid(&lw)) return FALSE;	return lw->thumbs_enabled;}void layout_sort_set(LayoutWindow *lw, SortType type, gint ascend){	if (!layout_valid(&lw)) return;	if (lw->sort_method == type && lw->sort_ascend == ascend) return;	lw->sort_method = type;	lw->sort_ascend = ascend;	if (lw->info_sort) gtk_label_set_text(GTK_LABEL(GTK_BIN(lw->info_sort)->child),					      sort_type_get_text(type));	layout_list_sync_sort(lw);}gint layout_sort_get(LayoutWindow *lw, SortType *type, gint *ascend){	if (!layout_valid(&lw)) return FALSE;	if (type) *type = lw->sort_method;	if (ascend) *ascend = lw->sort_ascend;	return TRUE;}gint layout_geometry_get(LayoutWindow *lw, gint *x, gint *y, gint *w, gint *h){	if (!layout_valid(&lw)) return FALSE;	gdk_window_get_root_origin(lw->window->window, x, y);	gdk_drawable_get_size(lw->window->window, w, h);	return TRUE;}gint layout_geometry_get_dividers(LayoutWindow *lw, gint *h, gint *v){	if (!layout_valid(&lw)) return FALSE;	if (lw->h_pane && GTK_PANED(lw->h_pane)->child1->allocation.x >= 0)		{		*h = GTK_PANED(lw->h_pane)->child1->allocation.width;		}	else if (h != &lw->div_h)		{		*h = lw->div_h;		}	if (lw->v_pane && GTK_PANED(lw->v_pane)->child1->allocation.x >= 0)		{		*v = GTK_PANED(lw->v_pane)->child1->allocation.height;		}	else if (v != &lw->div_v)		{		*v = lw->div_v;		}	return TRUE;}void layout_views_set(LayoutWindow *lw, gint tree, gint icons){	if (!layout_valid(&lw)) return;	if (lw->tree_view == tree && lw->icon_view == icons) return;	lw->tree_view = tree;	lw->icon_view = icons;	layout_style_set(lw, -1, NULL);}gint layout_views_get(LayoutWindow *lw, gint *tree, gint *icons){	if (!layout_valid(&lw)) return FALSE;	*tree = lw->tree_view;	*icons = lw->icon_view;	return TRUE;}/* *----------------------------------------------------------------------------- * location utils *----------------------------------------------------------------------------- */static gint layout_location_single(LayoutLocation l){	return (l == LAYOUT_LEFT ||		l == LAYOUT_RIGHT ||		l == LAYOUT_TOP ||		l == LAYOUT_BOTTOM);}static gint layout_location_vertical(LayoutLocation l){	return (l & LAYOUT_TOP ||		l & LAYOUT_BOTTOM);}static gint layout_location_first(LayoutLocation l){	return (l & LAYOUT_TOP ||		l & LAYOUT_LEFT);}static LayoutLocation layout_grid_compass(LayoutWindow *lw){	if (layout_location_single(lw->dir_location)) return lw->dir_location;	if (layout_location_single(lw->file_location)) return lw->file_location;	return lw->image_location;}static void layout_location_compute(LayoutLocation l1, LayoutLocation l2,				    GtkWidget *s1, GtkWidget *s2,				    GtkWidget **d1, GtkWidget **d2){	LayoutLocation l;	l = l1 & l2;	/* get common compass direction */	l = l1 - l;	/* remove it */	if (layout_location_first(l))		{		*d1 = s1;		*d2 = s2;		}	else		{		*d1 = s2;		*d2 = s1;		}}/* *----------------------------------------------------------------------------- * tools window (for floating/hidden) *----------------------------------------------------------------------------- */gint layout_geometry_get_tools(LayoutWindow *lw, gint *x, gint *y, gint *w, gint *h, gint *divider_pos){	if (!layout_valid(&lw)) return FALSE;	if (!lw->tools || !GTK_WIDGET_VISIBLE(lw->tools))		{		/* use the stored values (sort of breaks success return value) */		*divider_pos = lw->div_float;		return FALSE;		}	gdk_window_get_root_origin(lw->tools->window, x, y);	gdk_drawable_get_size(lw->tools->window, w, h);	if (GTK_IS_VPANED(lw->tools_pane))		{		*divider_pos = GTK_PANED(lw->tools_pane)->child1->allocation.height;		}	else		{		*divider_pos = GTK_PANED(lw->tools_pane)->child1->allocation.width;		}	return TRUE;}static void layout_tools_geometry_sync(LayoutWindow *lw){	layout_geometry_get_tools(lw, &float_window_x, &float_window_x,				  &float_window_w, &float_window_h, &lw->div_float);}static void layout_tools_hide(LayoutWindow *lw, gint hide){	if (!lw->tools) return;	if (hide)		{		if (GTK_WIDGET_VISIBLE(lw->tools))			{			layout_tools_geometry_sync(lw);			gtk_widget_hide(lw->tools);			}		}	else		{		if (!GTK_WIDGET_VISIBLE(lw->tools))			{			gtk_widget_show(lw->tools);			if (lw->vfi) vficon_refresh(lw->vfi);			}		}	lw->tools_hidden = hide;}static gint layout_tools_delete_cb(GtkWidget *widget, GdkEventAny *event, gpointer data){	LayoutWindow *lw = data;	layout_tools_float_toggle(lw);	return TRUE;}static void layout_tools_setup(LayoutWindow *lw, GtkWidget *tools, GtkWidget *files){	GtkWidget *vbox;	GtkWidget *w1, *w2;	gint vertical;	gint new_window = FALSE;	vertical = (layout_location_single(lw->image_location) && !layout_location_vertical(lw->image_location)) ||		   (!layout_location_single(lw->image_location) && layout_location_vertical(layout_grid_compass(lw)));#if 0	layout_location_compute(lw->dir_location, lw->file_location,				tools, files, &w1, &w2);#endif	/* for now, tools/dir are always first in order */	w1 = tools;	w2 = files;	if (!lw->tools)		{		GdkGeometry geometry;		GdkWindowHints hints;		lw->tools = gtk_window_new(GTK_WINDOW_TOPLEVEL);		g_signal_connect(G_OBJECT(lw->tools), "delete_event",				 G_CALLBACK(layout_tools_delete_cb), lw);		layout_keyboard_init(lw, lw->tools);		if (save_window_positions)			{			hints = GDK_HINT_USER_POS;			}		else			{			hints = 0;			}		geometry.min_width = 32;		geometry.min_height = 32;		geometry.base_width = TOOLWINDOW_DEF_WIDTH;		geometry.base_height = TOOLWINDOW_DEF_HEIGHT;		gtk_window_set_geometry_hints(GTK_WINDOW(lw->tools), NULL, &geometry,					      GDK_HINT_MIN_SIZE | GDK_HINT_BASE_SIZE | hints);	        gtk_window_set_resizable(GTK_WINDOW(lw->tools), TRUE);        	gtk_window_set_title(GTK_WINDOW(lw->tools), _("GQview Tools"));        	gtk_window_set_wmclass(GTK_WINDOW(lw->tools), "tools", "GQview");        	gtk_container_set_border_width(GTK_CONTAINER(lw->tools), 0);		window_set_icon(lw->tools, (const gchar **)tools_xpm, NULL);		new_window = TRUE;		}	else		{		layout_tools_geometry_sync(lw);		/* dump the contents */		gtk_widget_destroy(GTK_BIN(lw->tools)->child);		}	layout_actions_add_window(lw, lw->tools);	vbox = gtk_vbox_new(FALSE, 0);	gtk_container_add(GTK_CONTAINER(lw->tools), vbox);	gtk_widget_show(vbox);	layout_status_setup(lw, vbox, TRUE);	if (vertical)		{		lw->tools_pane = gtk_vpaned_new();		}	else		{		lw->tools_pane = gtk_hpaned_new();		}	gtk_box_pack_start(GTK_BOX(vbox), lw->tools_pane, TRUE, TRUE, 0);	gtk_widget_show(lw->tools_pane);	gtk_paned_pack1(GTK_PANED(lw->tools_pane), w1, FALSE, TRUE);	gtk_paned_pack2(GTK_PANED(lw->tools_pane), w2, TRUE, TRUE);	gtk_widget_show(tools);	gtk_widget_show(files);	if (new_window)		{		if (save_window_positions)			{			gtk_window_set_default_size(GTK_WINDOW(lw->tools), float_window_w, float_window_h);			gtk_window_move(GTK_WINDOW(lw->tools), float_window_x, float_window_y);        	        }		else			{			if (vertical)				{				gtk_window_set_default_size(GTK_WINDOW(lw->tools),							    TOOLWINDOW_DEF_WIDTH, TOOLWINDOW_DEF_HEIGHT);				}			else				{				gtk_window_set_default_size(GTK_WINDOW(lw->tools),							    TOOLWINDOW_DEF_HEIGHT, TOOLWINDOW_DEF_WIDTH);				}			}		}	if (!save_window_positions)		{		if (vertical)			{			lw->div_float = MAIN_WINDOW_DIV_VPOS;			}		else			{			lw->div_float = MAIN_WINDOW_DIV_HPOS;			}		}	gtk_paned_set_position(GTK_PANED(lw->tools_pane), lw->div_float);}/* *----------------------------------------------------------------------------- * glue (layout arrangement) *----------------------------------------------------------------------------- */static void layout_grid_compute(LayoutWindow *lw,				GtkWidget *image, GtkWidget *tools, GtkWidget *files,				GtkWidget **w1, GtkWidget **w2, GtkWidget **w3){	/* heh, this was fun */	if (layout_location_single(lw->dir_location))		{		if (layout_location_first(lw->dir_location))			{			*w1 = tools;			layout_location_compute(lw->file_location, lw->image_location, files, image, w2, w3);			}		else			{			*w3 = tools;			layout_location_compute(lw->file_location, lw->image_location, files, image, w1, w2);			}		}	else if (layout_location_single(lw->file_location))		{		if (layout_location_first(lw->file_location))			{			*w1 = files;			layout_location_compute(lw->dir_location, lw->image_location, tools, image, w2, w3);			}		else			{

⌨️ 快捷键说明

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