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

📄 layout.c

📁 Gqview,Linux下基于GTK+库写成的轻量级而能丰富的图像浏览程序。
💻 C
📖 第 1 页 / 共 3 页
字号:
			*w3 = files;			layout_location_compute(lw->dir_location, lw->image_location, tools, image, w1, w2);			}		}	else		{		/* image */		if (layout_location_first(lw->image_location))			{			*w1 = image;			layout_location_compute(lw->file_location, lw->dir_location, files, tools, w2, w3);			}		else			{			*w3 = image;			layout_location_compute(lw->file_location, lw->dir_location, files, tools, w1, w2);			}		}}static void layout_grid_setup(LayoutWindow *lw){	gint priority_location;	GtkWidget *h;	GtkWidget *v;	GtkWidget *w1, *w2, *w3;	GtkWidget *image;	GtkWidget *tools;	GtkWidget *files;	layout_actions_setup(lw);	layout_actions_add_window(lw, lw->window);	lw->group_box = gtk_vbox_new(FALSE, 0);	gtk_box_pack_start(GTK_BOX(lw->main_box), lw->group_box, TRUE, TRUE, 0);	gtk_widget_show(lw->group_box);	priority_location = layout_grid_compass(lw);	image = layout_image_new(lw, NULL);	tools = layout_tools_new(lw);	files = layout_list_new(lw);	image = layout_bars_prepare(lw, image);	if (lw->tools_float || lw->tools_hidden)		{		gtk_box_pack_start(GTK_BOX(lw->group_box), image, TRUE, TRUE, 0);		gtk_widget_show(image);		layout_tools_setup(lw, tools, files);		gtk_widget_grab_focus(lw->image->widget);		return;		}	else if (lw->tools)		{		layout_tools_geometry_sync(lw);		gtk_widget_destroy(lw->tools);		lw->tools = NULL;		lw->tools_pane = NULL;		}	layout_status_setup(lw, lw->group_box, FALSE);	layout_grid_compute(lw, image, tools, files, &w1, &w2, &w3);	v = lw->v_pane = gtk_vpaned_new();	h = lw->h_pane = gtk_hpaned_new();	if (!layout_location_vertical(priority_location))		{		GtkWidget *tmp;		tmp = v;		v = h;		h = tmp;		}	gtk_box_pack_start(GTK_BOX(lw->group_box), v, TRUE, TRUE, 0);	if (!layout_location_first(priority_location))		{		gtk_paned_pack1(GTK_PANED(v), h, FALSE, TRUE);		gtk_paned_pack2(GTK_PANED(v), w3, TRUE, TRUE);		gtk_paned_pack1(GTK_PANED(h), w1, FALSE, TRUE);		gtk_paned_pack2(GTK_PANED(h), w2, TRUE, TRUE);		}	else		{		gtk_paned_pack1(GTK_PANED(v), w1, FALSE, TRUE);		gtk_paned_pack2(GTK_PANED(v), h, TRUE, TRUE);		gtk_paned_pack1(GTK_PANED(h), w2, FALSE, TRUE);		gtk_paned_pack2(GTK_PANED(h), w3, TRUE, TRUE);		}	gtk_widget_show(image);	gtk_widget_show(tools);	gtk_widget_show(files);	gtk_widget_show(v);	gtk_widget_show(h);	/* fix to have image pane visible when it is left and priority widget */	if (lw->div_h == -1 &&	    w1 == image &&	    !layout_location_vertical(priority_location) &&	    layout_location_first(priority_location))		{		gtk_widget_set_size_request(image, 200, -1);		}	gtk_paned_set_position(GTK_PANED(lw->h_pane), lw->div_h);	gtk_paned_set_position(GTK_PANED(lw->v_pane), lw->div_v);	gtk_widget_grab_focus(lw->image->widget);}void layout_style_set(LayoutWindow *lw, gint style, const gchar *order){	gchar *path;	ImageWindow *old_image;	if (!layout_valid(&lw)) return;	if (style != -1)		{		LayoutLocation d, f, i;		layout_config_parse(style, order, &d,  &f, &i);		if (lw->dir_location == d &&		    lw->file_location == f &&		    lw->image_location == i) return;		lw->dir_location = d;		lw->file_location = f;		lw->image_location = i;		}	/* remember state */	layout_image_slideshow_stop(lw);	layout_image_full_screen_stop(lw);	path = lw->path;	lw->path = NULL;	old_image = lw->image;	lw->image = NULL;	lw->utility_box = NULL;	layout_geometry_get_dividers(lw, &lw->div_h, &lw->div_v);	/* clear it all */	gtk_widget_hide(old_image->widget);	gtk_widget_ref(old_image->widget);	gtk_container_remove(GTK_CONTAINER(old_image->widget->parent), old_image->widget);	lw->h_pane = NULL;	lw->v_pane = NULL;	lw->toolbar = NULL;	lw->thumb_button = NULL;	lw->path_entry = NULL;	lw->dir_view = NULL;	lw->vdl = NULL;	lw->vdt = NULL;	lw->file_view = NULL;	lw->vfl = NULL;	lw->vfi = NULL;	lw->info_box = NULL;	lw->info_progress_bar = NULL;	lw->info_sort = NULL;	lw->info_status = NULL;	lw->info_details = NULL;	lw->info_zoom = NULL;	if (lw->ui_manager) g_object_unref(lw->ui_manager);	lw->ui_manager = NULL;	lw->action_group = NULL;	gtk_container_remove(GTK_CONTAINER(lw->main_box), lw->group_box);	lw->group_box = NULL;	/* re-fill */	layout_grid_setup(lw);	layout_tools_hide(lw, lw->tools_hidden);	layout_list_sync_sort(lw);	layout_util_sync(lw);	layout_status_update_all(lw);	/* sync */	if (image_get_path(old_image))		{		layout_set_path(lw, image_get_path(old_image));		}	else		{		layout_set_path(lw, path);		}	image_change_from_image(lw->image, old_image);	image_top_window_set_sync(lw->image, (lw->tools_float || lw->tools_hidden));	/* clean up */	gtk_widget_unref(old_image->widget);	g_free(path);}void layout_styles_update(void){	GList *work;	work = layout_window_list;	while (work)		{		LayoutWindow *lw = work->data;		work = work->next;		layout_style_set(lw, layout_style, layout_order);		}}void layout_colors_update(void){	GList *work;	work = layout_window_list;	while (work)		{		LayoutWindow *lw = work->data;		work = work->next;		if (lw->image) image_background_set_black(lw->image, black_window_background);		}}void layout_tools_float_toggle(LayoutWindow *lw){	gint popped;	if (!lw) return;	if (!lw->tools_hidden)		{		popped = !lw->tools_float;		}	else		{		popped = TRUE;		}	if (lw->tools_float == popped)		{		if (popped && lw->tools_hidden)			{			layout_tools_float_set(lw, popped, FALSE);			}		}	else		{		if (lw->tools_float)			{			layout_tools_float_set(lw, FALSE, FALSE);			}		else			{			layout_tools_float_set(lw, TRUE, FALSE);			}		}}void layout_tools_hide_toggle(LayoutWindow *lw){	if (!lw) return;	layout_tools_float_set(lw, lw->tools_float, !lw->tools_hidden);}void layout_tools_float_set(LayoutWindow *lw, gint popped, gint hidden){	if (!layout_valid(&lw)) return;	if (lw->tools_float == popped && lw->tools_hidden == hidden) return;	if (lw->tools_float == popped && lw->tools_float && lw->tools)		{		layout_tools_hide(lw, hidden);		return;		}	lw->tools_float = popped;	lw->tools_hidden = hidden;	layout_style_set(lw, -1, NULL);}gint layout_tools_float_get(LayoutWindow *lw, gint *popped, gint *hidden){	if (!layout_valid(&lw)) return FALSE;	*popped = lw->tools_float;	*hidden = lw->tools_hidden;	return TRUE;}void layout_toolbar_toggle(LayoutWindow *lw){	if (!layout_valid(&lw)) return;	if (!lw->toolbar) return;	lw->toolbar_hidden = !lw->toolbar_hidden;	if (lw->toolbar_hidden)		{		if (GTK_WIDGET_VISIBLE(lw->toolbar)) gtk_widget_hide(lw->toolbar);		}	else		{		if (!GTK_WIDGET_VISIBLE(lw->toolbar)) gtk_widget_show(lw->toolbar);		}}gint layout_toolbar_hidden(LayoutWindow *lw){	if (!layout_valid(&lw)) return TRUE;	return lw->toolbar_hidden;}/* *----------------------------------------------------------------------------- * base *----------------------------------------------------------------------------- */void layout_close(LayoutWindow *lw){	if (layout_window_list && layout_window_list->next)		{		layout_free(lw);		}	else		{		exit_gqview();		}}void layout_free(LayoutWindow *lw){	if (!lw) return;	layout_window_list = g_list_remove(layout_window_list, lw);	if (lw->last_time_id != -1)		{		g_source_remove(lw->last_time_id);		}	layout_bars_close(lw);	gtk_widget_destroy(lw->window);	g_free(lw->path);	g_free(lw);}static gint layout_delete_cb(GtkWidget *widget, GdkEventAny *event, gpointer data){	LayoutWindow *lw = data;	layout_close(lw);	return TRUE;}LayoutWindow *layout_new(const gchar *path, gint popped, gint hidden){	LayoutWindow *lw;	GdkGeometry geometry;	GdkWindowHints hints;	lw = g_new0(LayoutWindow, 1);	lw->thumbs_enabled = thumbnails_enabled;	lw->sort_method = SORT_NAME;	lw->sort_ascend = TRUE;	lw->tools_float = popped;	lw->tools_hidden = hidden;	lw->toolbar_hidden = toolbar_hidden;	lw->utility_box = NULL;	lw->bar_sort = NULL;	lw->bar_sort_enabled = FALSE;	lw->bar_exif = NULL;	lw->bar_exif_enabled = FALSE;	lw->bar_exif_size = -1;	lw->bar_exif_advanced = FALSE;	lw->full_screen_overlay_id = -1;	lw->full_screen_overlay_on = FALSE;	/* default layout */	layout_config_parse(layout_style, layout_order,			    &lw->dir_location,  &lw->file_location, &lw->image_location);	lw->tree_view = layout_view_tree;	lw->icon_view = layout_view_icons;	/* divider positions */	if (save_window_positions)		{		lw->div_h = window_hdivider_pos;		lw->div_v = window_vdivider_pos;		lw->div_float = float_window_divider;		}	else		{		lw->div_h = MAIN_WINDOW_DIV_HPOS;		lw->div_v = MAIN_WINDOW_DIV_VPOS;		lw->div_float = MAIN_WINDOW_DIV_VPOS;		}	/* window */	lw->window = gtk_window_new(GTK_WINDOW_TOPLEVEL);	gtk_window_set_resizable(GTK_WINDOW(lw->window), TRUE);	gtk_window_set_title(GTK_WINDOW(lw->window), "GQview");	gtk_window_set_wmclass(GTK_WINDOW(lw->window), "gqview", "GQview");	gtk_container_set_border_width(GTK_CONTAINER(lw->window), 0);	window_set_icon(lw->window, NULL, NULL);	if (save_window_positions)		{		hints = GDK_HINT_USER_POS;		}	else		{		hints = 0;		}	geometry.min_width = 32;	geometry.min_height = 32;	geometry.base_width = MAINWINDOW_DEF_WIDTH;	geometry.base_height = MAINWINDOW_DEF_HEIGHT;	gtk_window_set_geometry_hints(GTK_WINDOW(lw->window), NULL, &geometry,				      GDK_HINT_MIN_SIZE | GDK_HINT_BASE_SIZE | hints);	if (save_window_positions)		{		gtk_window_set_default_size(GTK_WINDOW(lw->window), main_window_w, main_window_h);		if (!layout_window_list)			{			gtk_window_move(GTK_WINDOW(lw->window), main_window_x, main_window_y);			if (main_window_maximized) gtk_window_maximize(GTK_WINDOW(lw->window));			}		}	else		{		gtk_window_set_default_size(GTK_WINDOW(lw->window), MAINWINDOW_DEF_WIDTH, MAINWINDOW_DEF_HEIGHT);		}	g_signal_connect(G_OBJECT(lw->window), "delete_event",			 G_CALLBACK(layout_delete_cb), lw);	layout_keyboard_init(lw, lw->window);	lw->main_box = gtk_vbox_new(FALSE, 0);	gtk_container_add(GTK_CONTAINER(lw->window), lw->main_box);	gtk_widget_show(lw->main_box);	layout_grid_setup(lw);	image_top_window_set_sync(lw->image, (lw->tools_float || lw->tools_hidden));	layout_util_sync(lw);	layout_status_update_all(lw);	if (path)		{		layout_set_path(lw, path);		}	else		{		GdkPixbuf *pixbuf;		pixbuf = pixbuf_inline(PIXBUF_INLINE_LOGO);		image_change_pixbuf(lw->image, pixbuf, 1.0);		gdk_pixbuf_unref(pixbuf);		}	/* set up the time stat timeout */	lw->last_time = 0;	lw->last_time_id = g_timeout_add(5000, layout_check_for_update_cb, lw);	gtk_widget_show(lw->window);	layout_tools_hide(lw, lw->tools_hidden);	layout_window_list = g_list_append(layout_window_list, lw);	return lw;}/* *----------------------------------------------------------------------------- * maintenance (for rename, move, remove) *----------------------------------------------------------------------------- */static void layout_real_time_update(LayoutWindow *lw){	/* this resets the last time stamp of path so that a refresh does not occur	 * from an internal file operation.	 */	if (lw->path) lw->last_time = filetime(lw->path);}static void layout_real_renamed(LayoutWindow *lw, const gchar *source, const gchar *dest){	gint update = FALSE;	if (lw->image) layout_image_maint_renamed(lw, source, dest);	if (lw->vfl) update |= vflist_maint_renamed(lw->vfl, source, dest);	if (lw->vfi) update |= vficon_maint_renamed(lw->vfi, source, dest);	if (update) layout_real_time_update(lw);}static void layout_real_removed(LayoutWindow *lw, const gchar *path, GList *ignore_list){	gint update = FALSE;	if (lw->image) layout_image_maint_removed(lw, path);	if (lw->vfl) update |= vflist_maint_removed(lw->vfl, path, ignore_list);	if (lw->vfi) update |= vficon_maint_removed(lw->vfi, path, ignore_list);	if (update) layout_real_time_update(lw);}static void layout_real_moved(LayoutWindow *lw, const gchar *source, const gchar *dest, GList *ignore_list){	gint update = FALSE;	if (lw->image) layout_image_maint_moved(lw, source, dest);	if (lw->vfl) update |= vflist_maint_moved(lw->vfl, source, dest, ignore_list);	if (lw->vfi) update |= vficon_maint_moved(lw->vfi, source, dest, ignore_list);	if (update) layout_real_time_update(lw);}void layout_maint_renamed(const gchar *source, const gchar *dest){	GList *work = layout_window_list;	while (work)		{		LayoutWindow *lw = work->data;		work = work->next;		layout_real_renamed(lw, source, dest);		}}void layout_maint_removed(const gchar *path, GList *ignore_list){	GList *work = layout_window_list;	while (work)		{		LayoutWindow *lw = work->data;		work = work->next;		layout_real_removed(lw, path, ignore_list);		}}void layout_maint_moved(const gchar *source, const gchar *dest, GList *ignore_list){	GList *work = layout_window_list;	while (work)		{		LayoutWindow *lw = work->data;		work = work->next;		layout_real_moved(lw, source, dest, ignore_list);		}}

⌨️ 快捷键说明

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