Author: post
Date: 2010-10-27 23:34:49 +0200 (Wed, 27 Oct 2010)
New Revision: 3592
Modified:
trunk/src/gtk-interface.c
trunk/src/rs-actions.c
Log:
Pop up a screen selection dialog for people with more than 2 monitors.
Stability fixes.
Modified: trunk/src/gtk-interface.c
===================================================================
--- trunk/src/gtk-interface.c 2010-10-27 18:12:27 UTC (rev 3591)
+++ trunk/src/gtk-interface.c 2010-10-27 21:34:49 UTC (rev 3592)
@@ -53,6 +53,7 @@
static GtkWidget *preview_fullscreen_filler = NULL;
GdkGC *dashed;
GdkGC *grid;
+static gboolean waiting_for_user_selects_screen = FALSE;
static gboolean open_photo(RS_BLOB *rs, const gchar *filename);
static void gui_preview_bg_color_changed(GtkColorButton *widget, RS_BLOB *rs);
@@ -371,6 +372,14 @@
static void
gui_enable_preview_screen(RS_BLOB *rs, const gchar *screen_name)
{
+ gboolean is_enabled;
+ if (rs_conf_get_boolean_with_default("fullscreen-preview", &is_enabled,
FALSE))
+ if (is_enabled)
+ return;
+
+ if (waiting_for_user_selects_screen)
+ return;
+
GdkDisplay *open_display = gdk_display_open(screen_name);
GdkScreen *open_screen = gdk_display_get_default_screen(open_display);
if (NULL == open_screen)
@@ -378,10 +387,13 @@
gui_status_notify(_("Unable to locate screen for offscreen
preview"));
return;
}
+
rs->window_preview_screen = gtk_window_new(GTK_WINDOW_TOPLEVEL);
gtk_window_set_screen(GTK_WINDOW(rs->window_preview_screen),
open_screen);
gtk_window_maximize(GTK_WINDOW(rs->window_preview_screen));
gtk_window_fullscreen(GTK_WINDOW(rs->window_preview_screen));
+
+ /* Make sure we don't grab focus from main window */
g_object_set(GTK_WINDOW(rs->window_preview_screen),
"accept-focus", FALSE,
NULL);
@@ -394,19 +406,72 @@
gtk_container_add(GTK_CONTAINER(frame_preview_toolbox),
preview_fullscreen_filler);
gtk_widget_show_all(rs->window_preview_screen);
+ rs_conf_set_boolean("fullscreen-preview", TRUE);
}
void
gui_disable_preview_screen(RS_BLOB *rs)
{
+ if (waiting_for_user_selects_screen)
+ return;
+ gboolean is_enabled;
+ if (rs_conf_get_boolean_with_default("fullscreen-preview", &is_enabled,
FALSE))
+ if (!is_enabled)
+ return;
gtk_container_remove(GTK_CONTAINER(frame_preview_toolbox),
preview_fullscreen_filler);
gtk_widget_reparent(rs->preview, frame_preview_toolbox);
gtk_widget_destroy(rs->window_preview_screen);
+ rs->window_preview_screen = NULL;
+ rs_conf_set_boolean("fullscreen-preview", FALSE);
}
+typedef struct
+{
+ GSList *all_window_widgets;
+ guint status;
+ RS_BLOB *rs;
+} ScreenWindowInfo;
+
+static void
+screen_selected(GtkEntry *entry, gint response_id, gpointer user_data)
+{
+ waiting_for_user_selects_screen = FALSE;
+ ScreenWindowInfo *info = (ScreenWindowInfo *)user_data;
+ gui_status_pop(info->status);
+ if (response_id == GTK_RESPONSE_OK)
+ {
+ GdkScreen *screen = gtk_window_get_screen(GTK_WINDOW(entry));
+ gchar *screen_name = gdk_screen_make_display_name(screen);
+ gui_enable_preview_screen(info->rs, screen_name);
+ g_free(screen_name);
+ }
+ else
+ {
+ /* We didn't activate after all */
+ GtkAction *action =
rs_core_action_group_get_action("FullscreenPreview");
+ gtk_toggle_action_set_active(GTK_TOGGLE_ACTION(action), FALSE);
+ }
+
+ GSList *iter = info->all_window_widgets;
+ do {
+ gtk_widget_destroy(GTK_WIDGET(iter->data));
+ iter = iter->next;
+ } while (iter);
+ g_slist_free(info->all_window_widgets);
+ g_free(info);
+}
+
void
gui_select_preview_screen(RS_BLOB *rs)
{
+ gboolean is_enabled;
+ if (rs_conf_get_boolean_with_default("fullscreen-preview", &is_enabled,
FALSE))
+ if (is_enabled)
+ return;
+
+ if (waiting_for_user_selects_screen)
+ return;
+
GdkDisplay *display = gdk_display_get_default();
int num_screens = gdk_display_get_n_screens(display);
@@ -422,8 +487,8 @@
gchar *main_screen_name = gdk_screen_make_display_name(main_screen);
/* If two displays, just open on the other */
-// if (num_screens == 2)
-// {
+ if (num_screens == 2)
+ {
GdkScreen *first_screen = gdk_display_get_screen(display, 0);
gchar *first_screen_name =
gdk_screen_make_display_name(first_screen);
GdkScreen *second_screen = gdk_display_get_screen(display, 1);
@@ -437,13 +502,44 @@
gui_enable_preview_screen(rs, first_screen_name);
}
else
- gui_status_notify(_("Unable to locate current display.
Cannot open offscreen preview"));
+ gui_status_notify(_("Unable to locate current display.
Cannot open fullscreen photo"));
g_free(first_screen_name);
g_free(second_screen_name);
-// }
-// else
-// /* Pop up selection box */
+ }
+ else
+ {
+ /* Pop up selection box */
+ ScreenWindowInfo *info = g_malloc(sizeof(ScreenWindowInfo));
+ GSList *screen_widgets = NULL;
+ info->status = gui_status_push(_("Select screen to open
fullscreen preview"));
+ info->rs = rs;
+ gint i;
+ waiting_for_user_selects_screen = TRUE;
+ for (i = 0; i < num_screens; i++)
+ {
+ GdkScreen *screen = gdk_display_get_screen(display, i);
+ gchar *screen_name =
gdk_screen_make_display_name(screen);
+ if (0 != g_strcmp0(screen_name, main_screen_name))
+ {
+ GtkWidget *dialog = gtk_dialog_new();
+ gtk_window_set_title(GTK_WINDOW(dialog),
_("Select Screen for fullscreen photo"));
+ gtk_window_set_screen(GTK_WINDOW(dialog),
screen);
+ g_signal_connect(dialog, "response",
G_CALLBACK(screen_selected), info);
+
gtk_dialog_set_has_separator(GTK_DIALOG(dialog), FALSE);
+ gtk_dialog_add_button(GTK_DIALOG(dialog),
GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL);
+ gtk_dialog_add_button(GTK_DIALOG(dialog),
GTK_STOCK_OK, GTK_RESPONSE_OK);
+
+ GtkWidget *content =
gtk_dialog_get_content_area(GTK_DIALOG(dialog));
+ GtkWidget *label = gtk_label_new(_("Select OK
to use this screen for fullscreen photo"));
+ gtk_box_pack_start(GTK_BOX(content), label,
TRUE, TRUE, 10);
+ gtk_widget_show_all(dialog);
+ screen_widgets = g_slist_append(screen_widgets,
dialog);
+ }
+ g_free(screen_name);
+ }
+ info->all_window_widgets = screen_widgets;
+ }
g_free(main_screen_name);
}
@@ -1293,6 +1389,7 @@
menubar = gui_make_menubar(rs);
/* Preview area */
+ rs_conf_set_boolean("fullscreen-preview", FALSE);
rs->preview = rs_preview_widget_new(tools);
rs_preview_widget_set_filter(RS_PREVIEW_WIDGET(rs->preview),
rs->filter_end, rs->filter_demosaic_cache);
Modified: trunk/src/rs-actions.c
===================================================================
--- trunk/src/rs-actions.c 2010-10-27 18:12:27 UTC (rev 3591)
+++ trunk/src/rs-actions.c 2010-10-27 21:34:49 UTC (rev 3592)
@@ -901,7 +901,6 @@
gui_disable_preview_screen(rs);
rs_core_action_group_set_sensivity("Lightsout",
!rs->window_fullscreen);
}
-// rs_conf_set_boolean(CONF_FULLSCREEN, rs->window_fullscreen);
}
TOGGLEACTION(exposure_mask)
@@ -1259,7 +1258,7 @@
{ "Iconbox", NULL, _("_Iconbox"), "<control>I", NULL,
ACTION_CB(iconbox), TRUE },
{ "Toolbox", NULL, _("_Toolbox"), "<control>T", NULL,
ACTION_CB(toolbox), TRUE },
{ "Fullscreen", GTK_STOCK_FULLSCREEN, _("_Fullscreen"), "F11", NULL,
ACTION_CB(fullscreen), FALSE },
- { "FullscreenPreview", GTK_STOCK_FULLSCREEN, _("_Show Preview On
Secondary Monitor"), "F10", NULL, ACTION_CB(fullscreen_preview), FALSE },
+ { "FullscreenPreview", GTK_STOCK_FULLSCREEN, _("_Show Photo On
Secondary Monitor"), "F10", NULL, ACTION_CB(fullscreen_preview), FALSE },
{ "ShowFilenames", NULL, _("Show Filenames in Iconbox"), NULL, NULL,
ACTION_CB(show_filenames), show_filenames },
{ "Load8Bit", NULL, _("Load non-RAW images"), NULL, NULL,
ACTION_CB(load_8bit), load_8bit },
{ "ExposureMask", NULL, _("_Exposure mask"), "<control>E", NULL,
ACTION_CB(exposure_mask), FALSE },
_______________________________________________
Rawstudio-commit mailing list
[email protected]
http://rawstudio.org/cgi-bin/mailman/listinfo/rawstudio-commit