欢迎来到虫虫下载站 | 资源下载 资源专辑 关于我们
虫虫下载站

fullscreen.c

Gqview,Linux下基于GTK+库写成的轻量级而能丰富的图像浏览程序。
C
第 1 页 / 共 2 页
字号:
	gdk_keyboard_ungrab(GDK_CURRENT_TIME);	image_change_from_image(fs->normal_imd, fs->imd);#ifdef HIDE_WINDOW_IN_FULLSCREEN	gtk_widget_show(fs->normal_window);#endif	if (fs->stop_func) fs->stop_func(fs, fs->stop_data);	gtk_widget_destroy(fs->window);	g_free(fs);}/* *---------------------------------------------------------------------------- * full screen preferences and utils *---------------------------------------------------------------------------- */GList *fullscreen_prefs_list(void){	GList *list = NULL;	GdkDisplay *display;	gint number;	gint i;	display = gdk_display_get_default();	number = gdk_display_get_n_screens(display);	for (i = 0; i < number ; i++)		{		GdkScreen *screen;		gint monitors;		gint j;		screen = gdk_display_get_screen(display, i);		monitors = gdk_screen_get_n_monitors(screen);		for (j = -1; j < monitors; j++)			{			ScreenData *sd;			GdkRectangle rect;			gchar *name;			gchar *subname;			name = gdk_screen_make_display_name(screen);			if (j < 0)				{				rect.x = 0;				rect.y = 0;				rect.width = gdk_screen_get_width(screen);				rect.height = gdk_screen_get_height(screen);				subname = g_strdup(_("Full size"));				}			else				{				gdk_screen_get_monitor_geometry(screen, j, &rect);				subname = g_strdup_printf("%s %d", _("Monitor"), j + 1);				}			sd = g_new0(ScreenData, 1);			sd->number = (i+1) * 100 + j + 1;			sd->description = g_strdup_printf("%s %s, %s", _("Screen"), name, subname);			sd->x = rect.x;			sd->y = rect.y;			sd->width = rect.width;			sd->height = rect.height;			if (debug) printf("Screen %d %30s %4d,%4d (%4dx%4d)\n",					  sd->number, sd->description, sd->x, sd->y, sd->width, sd->height);			list = g_list_append(list, sd);			g_free(name);			g_free(subname);			}		}	return list;}void fullscreen_prefs_list_free(GList *list){	GList *work;	work = list;	while (work)		{		ScreenData *sd = work->data;		work = work->next;		g_free(sd->description);			g_free(sd);		}	g_list_free(list);}ScreenData *fullscreen_prefs_list_find(GList *list, gint screen){	GList *work;	work = list;	while (work)		{		ScreenData *sd = work->data;		work = work->next;		if (sd->number == screen) return sd;		}	return NULL;}/* screen is interpreted as such: *  -1  window manager determines size and position, fallback is (1) active monitor *   0  full size of screen containing widget *   1  size of monitor containing widget * 100  full size of screen 1 (screen, monitor counts start at 1) * 101  size of monitor 1 on screen 1 * 203  size of monitor 3 on screen 2 * returns: * dest_screen: screen to place widget [use gtk_window_set_screen()] * same_region: the returned region will overlap the current location of widget. */void fullscreen_prefs_get_geometry(gint screen, GtkWidget *widget, gint *x, gint *y, gint *width, gint *height,				   GdkScreen **dest_screen, gint *same_region){	GList *list;	ScreenData *sd;	list = fullscreen_prefs_list();	if (screen >= 100)		{		sd = fullscreen_prefs_list_find(list, screen);		}	else		{		sd = NULL;		if (screen < 0) screen = 1;		}	if (sd)		{		GdkDisplay *display;		GdkScreen *screen;		gint n;		display = gdk_display_get_default();		n = sd->number / 100 - 1;		if (n >= 0 && n < gdk_display_get_n_screens(display))			{			screen = gdk_display_get_screen(display, n);			}		else			{			screen = gdk_display_get_default_screen(display);			}		if (x) *x = sd->x;		if (y) *y = sd->y;		if (width) *width = sd->width;		if (height) *height = sd->height;		if (dest_screen) *dest_screen = screen;		if (same_region) *same_region = (!widget || !widget->window ||					(screen == gtk_widget_get_screen(widget) &&					(sd->number%100 == 0 ||					 sd->number%100 == gdk_screen_get_monitor_at_window(screen, widget->window)+1)));		}	else if (screen != 1 || !widget || !widget->window)		{		GdkScreen *screen;		if (widget)			{			screen = gtk_widget_get_screen(widget);			}		else			{			screen = gdk_screen_get_default();			}		if (x) *x = 0;		if (y) *y = 0;		if (width) *width = gdk_screen_get_width(screen);		if (height) *height = gdk_screen_get_height(screen);		if (dest_screen) *dest_screen = screen;		if (same_region) *same_region = TRUE;		}	else		{		GdkScreen *screen;		gint monitor;		GdkRectangle rect;		screen = gtk_widget_get_screen(widget);		monitor = gdk_screen_get_monitor_at_window(screen, widget->window);		gdk_screen_get_monitor_geometry(screen, monitor, &rect);		if (x) *x = rect.x;		if (y) *y = rect.y;		if (width) *width = rect.width;		if (height) *height = rect.height;		if (dest_screen) *dest_screen = screen;		if (same_region) *same_region = TRUE;		}	fullscreen_prefs_list_free(list);}gint fullscreen_prefs_find_screen_for_widget(GtkWidget *widget){	GdkScreen *screen;	gint monitor;	gint n;	if (!widget || !widget->window) return 0;	screen = gtk_widget_get_screen(widget);	monitor = gdk_screen_get_monitor_at_window(screen, widget->window);	n = (gdk_screen_get_number(screen)+1) * 100 + monitor + 1;	if (debug || TRUE) printf("Screen appears to be %d\n", n);	return n;}enum {	FS_MENU_COLUMN_NAME = 0,	FS_MENU_COLUMN_VALUE};#define BUTTON_ABOVE_KEY  "button_above"static void fullscreen_prefs_selection_cb(GtkWidget *combo, gpointer data){	gint *value = data;	GtkTreeModel *store;	GtkTreeIter iter;	GtkWidget *button;	if (!value) return;	store = gtk_combo_box_get_model(GTK_COMBO_BOX(combo));	if (!gtk_combo_box_get_active_iter(GTK_COMBO_BOX(combo), &iter)) return;	gtk_tree_model_get(store, &iter, FS_MENU_COLUMN_VALUE, value, -1);	button = g_object_get_data(G_OBJECT(combo), BUTTON_ABOVE_KEY);	if (button)		{		gtk_widget_set_sensitive(button, *value != -1);		}}static void fullscreen_prefs_selection_add(GtkListStore *store, const gchar *text, gint value){	GtkTreeIter iter;	gtk_list_store_append(store, &iter);	gtk_list_store_set(store, &iter, FS_MENU_COLUMN_NAME, text,					 FS_MENU_COLUMN_VALUE, value, -1);}GtkWidget *fullscreen_prefs_selection_new(const gchar *text, gint *screen_value, gint *above_value){	GtkWidget *vbox;	GtkWidget *hbox;	GtkWidget *combo;	GtkListStore *store;	GtkCellRenderer *renderer;	GtkWidget *button = NULL;	GList *list;	GList *work;	gint current = 0;	gint n;	if (!screen_value) return NULL;	vbox = gtk_vbox_new(FALSE, PREF_PAD_GAP);	hbox = pref_box_new(vbox, FALSE, GTK_ORIENTATION_HORIZONTAL, PREF_PAD_SPACE);	if (text) pref_label_new(hbox, text);	store = gtk_list_store_new(2, G_TYPE_STRING, G_TYPE_INT);	combo = gtk_combo_box_new_with_model(GTK_TREE_MODEL(store));	g_object_unref(store);	renderer = gtk_cell_renderer_text_new();	gtk_cell_layout_pack_start(GTK_CELL_LAYOUT(combo), renderer, TRUE);	gtk_cell_layout_set_attributes(GTK_CELL_LAYOUT(combo), renderer,				       "text", FS_MENU_COLUMN_NAME, NULL);	if (above_value)		{		button = pref_checkbox_new_int(vbox, _("Stay above other windows"),					       *above_value, above_value);		gtk_widget_set_sensitive(button, *screen_value != -1);		g_object_set_data(G_OBJECT(combo), BUTTON_ABOVE_KEY, button);		}	fullscreen_prefs_selection_add(store, _("Determined by Window Manager"), -1);	fullscreen_prefs_selection_add(store, _("Active screen"), 0);	if (*screen_value == 0) current = 1;	fullscreen_prefs_selection_add(store, _("Active monitor"), 1);	if (*screen_value == 1) current = 2;	n = 3;	list = fullscreen_prefs_list();	work = list;	while (work)		{		ScreenData *sd = work->data;		fullscreen_prefs_selection_add(store, sd->description, sd->number);		if (*screen_value == sd->number) current = n;		work = work->next;		n++;		}	fullscreen_prefs_list_free(list);	gtk_combo_box_set_active(GTK_COMBO_BOX(combo), current);	gtk_box_pack_start(GTK_BOX(hbox), combo, FALSE, FALSE, 0);	gtk_widget_show(combo);	g_signal_connect(G_OBJECT(combo), "changed",			 G_CALLBACK(fullscreen_prefs_selection_cb), screen_value);	return vbox;}

⌨️ 快捷键说明

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