Author: post
Date: 2010-10-26 23:37:14 +0200 (Tue, 26 Oct 2010)
New Revision: 3589

Modified:
   trunk/src/application.h
   trunk/src/gtk-interface.c
   trunk/src/gtk-interface.h
   trunk/src/rs-actions.c
   trunk/src/rs-preview-widget.c
   trunk/src/ui.xml
Log:
Add fullscreen preview in secondary monitor. Works fine, but needs to remember 
settings and handle more than 2 monitors.

Modified: trunk/src/application.h
===================================================================
--- trunk/src/application.h     2010-10-26 00:17:03 UTC (rev 3588)
+++ trunk/src/application.h     2010-10-26 21:37:14 UTC (rev 3589)
@@ -70,6 +70,7 @@
        GtkWidget *tools;
        GtkWidget *toolbox;
        GtkWidget *preview;
+       GtkWidget *window_preview_screen;
 
        /* Generic filter chain */
        RSFilter *filter_input;

Modified: trunk/src/gtk-interface.c
===================================================================
--- trunk/src/gtk-interface.c   2010-10-26 00:17:03 UTC (rev 3588)
+++ trunk/src/gtk-interface.c   2010-10-26 21:37:14 UTC (rev 3589)
@@ -49,6 +49,8 @@
 GtkWindow *rawstudio_window;
 static gint busycount = 0;
 static GtkWidget *infobox = NULL;
+static GtkWidget *frame_preview_toolbox = NULL;
+static GtkWidget *preview_fullscreen_filler = NULL;
 GdkGC *dashed;
 GdkGC *grid;
 
@@ -367,6 +369,85 @@
 }
 
 static void
+gui_enable_preview_screen(RS_BLOB *rs, const gchar *screen_name)
+{
+       GdkDisplay *open_display = gdk_display_open(screen_name);
+       GdkScreen *open_screen = gdk_display_get_default_screen(open_display);
+       if (NULL == open_screen)
+       {
+               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));
+       g_object_set(GTK_WINDOW(rs->window_preview_screen),
+               "accept-focus", FALSE,
+               NULL);
+
+       /* Re-parent preview*/
+       gtk_widget_reparent(rs->preview, rs->window_preview_screen);
+
+       /* Add something to the preview area */
+       preview_fullscreen_filler = gtk_label_new(_("Press F10 to return 
preview to this window"));
+       gtk_container_add(GTK_CONTAINER(frame_preview_toolbox), 
preview_fullscreen_filler);
+
+       gtk_widget_show_all(rs->window_preview_screen);
+}
+
+void
+gui_disable_preview_screen(RS_BLOB *rs)
+{
+       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);
+}
+
+void
+gui_select_preview_screen(RS_BLOB *rs)
+{
+       GdkDisplay *display = gdk_display_get_default();
+       int num_screens = gdk_display_get_n_screens(display);
+
+       if (num_screens <= 1)
+       {
+               gui_status_notify(_("Unable to detect more than one display. 
Cannot open offscreen preview"));
+               return;
+       }
+
+       /* Get information about current screen */
+       GdkScreen *main_screen;
+       main_screen = gtk_window_get_screen(GTK_WINDOW(rs->window));
+       gchar *main_screen_name = gdk_screen_make_display_name(main_screen);
+
+       /* If two displays, just open on the other */
+//     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);
+               gchar *second_screen_name = 
gdk_screen_make_display_name(second_screen);
+               if (!g_strcmp0(first_screen_name, main_screen_name))
+               {
+                       gui_enable_preview_screen(rs, second_screen_name);
+               }
+               else if (!g_strcmp0(second_screen_name, main_screen_name))
+               {
+                       gui_enable_preview_screen(rs, first_screen_name);
+               }
+               else
+                       gui_status_notify(_("Unable to locate current display. 
Cannot open offscreen preview"));
+
+               g_free(first_screen_name);
+               g_free(second_screen_name);
+//     }
+//     else
+//  /* Pop up selection box */
+       g_free(main_screen_name);
+}
+
+static void
 gui_preference_use_system_theme(GtkToggleButton *togglebutton, gpointer 
user_data)
 {
        if (togglebutton->active)
@@ -1223,9 +1304,10 @@
 
        /* Split pane below iconbox */
        pane = gtk_hpaned_new ();
+       frame_preview_toolbox = gtk_frame_new(NULL);
+       gtk_container_add(GTK_CONTAINER(frame_preview_toolbox), rs->preview);
        g_signal_connect_after(G_OBJECT(pane), "notify::position", 
G_CALLBACK(pane_position), NULL);
-
-       gtk_paned_pack1 (GTK_PANED (pane), rs->preview, TRUE, TRUE);
+       gtk_paned_pack1 (GTK_PANED (pane), frame_preview_toolbox, TRUE, TRUE);
        gtk_paned_pack2 (GTK_PANED (pane), rs->toolbox, FALSE, TRUE);
 
        /* Vertical packing box */

Modified: trunk/src/gtk-interface.h
===================================================================
--- trunk/src/gtk-interface.h   2010-10-26 00:17:03 UTC (rev 3588)
+++ trunk/src/gtk-interface.h   2010-10-26 21:37:14 UTC (rev 3589)
@@ -40,6 +40,8 @@
 extern void gui_widget_show(GtkWidget *widget, gboolean show, const gchar 
*conf_fullscreen_key, const gchar *conf_windowed_key);
 extern void gui_make_preference_window(RS_BLOB *rs);
 extern void rs_window_set_title(const char *str);
+extern void gui_select_preview_screen(RS_BLOB *rs);
+extern void gui_disable_preview_screen(RS_BLOB *rs);
 
 extern GtkWindow *rawstudio_window;
 extern GdkGC *dashed;

Modified: trunk/src/rs-actions.c
===================================================================
--- trunk/src/rs-actions.c      2010-10-26 00:17:03 UTC (rev 3588)
+++ trunk/src/rs-actions.c      2010-10-26 21:37:14 UTC (rev 3589)
@@ -889,6 +889,21 @@
        rs_core_action_group_set_sensivity("Lightsout", !rs->window_fullscreen);
 }
 
+TOGGLEACTION(fullscreen_preview)
+{
+       if (gtk_toggle_action_get_active(toggleaction))
+       {
+               rs_core_action_group_set_sensivity("Lightsout", FALSE);
+               gui_select_preview_screen(rs);
+       }
+       else
+       {
+               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)
 {
        if (gtk_toggle_action_get_active(toggleaction))
@@ -1244,6 +1259,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 },
        { "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 },

Modified: trunk/src/rs-preview-widget.c
===================================================================
--- trunk/src/rs-preview-widget.c       2010-10-26 00:17:03 UTC (rev 3588)
+++ trunk/src/rs-preview-widget.c       2010-10-26 21:37:14 UTC (rev 3589)
@@ -1894,6 +1894,8 @@
        GdkWindow *window = GTK_WIDGET(preview->canvas)->window;
        const gint view = get_view_from_coord(preview, x, y);
        GtkUIManager *ui_manager = gui_get_uimanager();
+       GdkScreen *preview_screen = gtk_widget_get_screen(GTK_WIDGET(preview));
+       gint screen_number = gdk_screen_get_monitor_at_point(preview_screen, 
x,y);
        gint real_x, real_y;
        gint scaled_x, scaled_y;
        gboolean inside_image = get_image_coord(preview, view, x, y, &scaled_x, 
&scaled_y, &real_x, &real_y, NULL, NULL);
@@ -1922,11 +1924,15 @@
                if (view==0)
                {
                        GtkWidget *menu = gtk_ui_manager_get_widget 
(ui_manager, "/PreviewPopup");
+                       gtk_menu_set_screen(GTK_MENU(menu), preview_screen);
+                       gtk_menu_set_monitor(GTK_MENU(menu),screen_number);
                        gtk_menu_popup(GTK_MENU(menu), NULL, NULL, NULL, NULL, 
0, GDK_CURRENT_TIME);
                }
                else
                {
                        GtkWidget *menu = gtk_ui_manager_get_widget 
(ui_manager, "/PreviewPopupRight");
+                       gtk_menu_set_screen(GTK_MENU(menu), preview_screen);
+                       gtk_menu_set_monitor(GTK_MENU(menu),screen_number);
                        gtk_menu_popup(GTK_MENU(menu), NULL, NULL, NULL, NULL, 
0, GDK_CURRENT_TIME);
                }
        }

Modified: trunk/src/ui.xml
===================================================================
--- trunk/src/ui.xml    2010-10-26 00:17:03 UTC (rev 3588)
+++ trunk/src/ui.xml    2010-10-26 21:37:14 UTC (rev 3589)
@@ -68,6 +68,7 @@
    <menuitem action="Iconbox" />
    <menuitem action="Toolbox" />
    <menuitem action="Fullscreen" />
+   <menuitem action="FullscreenPreview" />
    <separator />
    <menuitem action="ShowFilenames" />
    <menuitem action="Load8Bit" />


_______________________________________________
Rawstudio-commit mailing list
[email protected]
http://rawstudio.org/cgi-bin/mailman/listinfo/rawstudio-commit

Reply via email to