Trim trailing white spaces.
[geeqie.git] / src / fullscreen.c
index d195d31..4452734 100644 (file)
@@ -1,6 +1,7 @@
 /*
  * Geeqie
  * (C) 2004 John Ellis
+ * Copyright (C) 2008 - 2012 The Geeqie Team
  *
  * Author: John Ellis
  *
 #include "fullscreen.h"
 
 #include "image.h"
+#include "misc.h"
 #include "ui_fileops.h"
 #include "ui_menu.h"
 #include "ui_misc.h"
-
+#include "window.h"
+#include "image-load.h"
 
 enum {
        FULLSCREEN_CURSOR_HIDDEN = 1 << 0,
@@ -34,58 +37,51 @@ enum {
 
 static void clear_mouse_cursor(GtkWidget *widget, gint state)
 {
-       if (!widget->window) return;
+       GdkWindow *window = gtk_widget_get_window(widget);
+       if (!window) return;
 
        if (state & FULLSCREEN_CURSOR_BUSY)
                {
                GdkCursor *cursor;
 
                cursor = gdk_cursor_new(GDK_WATCH);
-               gdk_window_set_cursor (widget->window, cursor);
+               gdk_window_set_cursor(window, cursor);
                gdk_cursor_unref(cursor);
                }
        else if (state & FULLSCREEN_CURSOR_NORMAL)
                {
-               gdk_window_set_cursor (widget->window, NULL);
+               gdk_window_set_cursor(window, NULL);
                }
        else
                {
                GdkCursor *cursor;
-               GdkPixmap *p;
-
-               p = gdk_bitmap_create_from_data(widget->window, "\0\0\0", 1, 1);
-
-               cursor = gdk_cursor_new_from_pixmap(p, p,
-                                                   &widget->style->fg[GTK_STATE_ACTIVE],
-                                                   &widget->style->bg[GTK_STATE_ACTIVE],
-                                                   0, 0);
-
-               gdk_window_set_cursor (widget->window, cursor);
-
+               
+               cursor = gdk_cursor_new(GDK_BLANK_CURSOR);
+               gdk_window_set_cursor(window, cursor);
                gdk_cursor_unref(cursor);
-               g_object_unref(p);
                }
 }
 
-static gint fullscreen_hide_mouse_cb(gpointer data)
+static gboolean fullscreen_hide_mouse_cb(gpointer data)
 {
        FullScreenData *fs = data;
 
-       if (fs->hide_mouse_id == -1) return FALSE;
+       if (!fs->hide_mouse_id) return FALSE;
 
        fs->cursor_state &= ~FULLSCREEN_CURSOR_NORMAL;
        if (!(fs->cursor_state & FULLSCREEN_CURSOR_BUSY)) clear_mouse_cursor(fs->window, fs->cursor_state);
 
-       fs->hide_mouse_id = -1;
+       g_source_remove(fs->hide_mouse_id);
+       fs->hide_mouse_id = 0;
        return FALSE;
 }
 
 static void fullscreen_hide_mouse_disable(FullScreenData *fs)
 {
-       if (fs->hide_mouse_id != -1)
+       if (fs->hide_mouse_id)
                {
                g_source_remove(fs->hide_mouse_id);
-               fs->hide_mouse_id = -1;
+               fs->hide_mouse_id = 0;
                }
 }
 
@@ -95,7 +91,7 @@ static void fullscreen_hide_mouse_reset(FullScreenData *fs)
        fs->hide_mouse_id = g_timeout_add(FULL_SCREEN_HIDE_MOUSE_DELAY, fullscreen_hide_mouse_cb, fs);
 }
 
-static gint fullscreen_mouse_moved(GtkWidget *widget, GdkEventButton *bevent, gpointer data)
+static gboolean fullscreen_mouse_moved(GtkWidget *widget, GdkEventButton *bevent, gpointer data)
 {
        FullScreenData *fs = data;
 
@@ -111,18 +107,18 @@ static gint fullscreen_mouse_moved(GtkWidget *widget, GdkEventButton *bevent, gp
 
 static void fullscreen_busy_mouse_disable(FullScreenData *fs)
 {
-       if (fs->busy_mouse_id != -1)
+       if (fs->busy_mouse_id)
                {
                g_source_remove(fs->busy_mouse_id);
-               fs->busy_mouse_id = -1;
+               fs->busy_mouse_id = 0;
                }
 }
 
-static void fullscreen_mouse_set_busy(FullScreenData *fs, gint busy)
+static void fullscreen_mouse_set_busy(FullScreenData *fs, gboolean busy)
 {
        fullscreen_busy_mouse_disable(fs);
 
-       if ((fs->cursor_state & FULLSCREEN_CURSOR_BUSY) == (busy)) return;
+       if (!!(fs->cursor_state & FULLSCREEN_CURSOR_BUSY) == (busy)) return;
 
        if (busy)
                {
@@ -140,14 +136,14 @@ static gboolean fullscreen_mouse_set_busy_cb(gpointer data)
 {
        FullScreenData *fs = data;
 
-       fs->busy_mouse_id = -1;
+       fs->busy_mouse_id = 0;
        fullscreen_mouse_set_busy(fs, TRUE);
        return FALSE;
 }
 
 static void fullscreen_mouse_set_busy_idle(FullScreenData *fs)
 {
-       if (fs->busy_mouse_id == -1)
+       if (!fs->busy_mouse_id)
                {
                fs->busy_mouse_id = g_timeout_add(FULL_SCREEN_BUSY_MOUSE_DELAY,
                                                  fullscreen_mouse_set_busy_cb, fs);
@@ -159,13 +155,13 @@ static void fullscreen_image_update_cb(ImageWindow *imd, gpointer data)
        FullScreenData *fs = data;
 
        if (fs->imd->il &&
-           fs->imd->il->pixbuf != image_get_pixbuf(fs->imd))
+           image_loader_get_pixbuf(fs->imd->il) != image_get_pixbuf(fs->imd))
                {
                fullscreen_mouse_set_busy_idle(fs);
                }
 }
 
-static void fullscreen_image_complete_cb(ImageWindow *imd, gint preload, gpointer data)
+static void fullscreen_image_complete_cb(ImageWindow *imd, gboolean preload, gpointer data)
 {
        FullScreenData *fs = data;
 
@@ -177,8 +173,8 @@ static void fullscreen_image_complete_cb(ImageWindow *imd, gint preload, gpointe
 
 static void fullscreen_saver_deactivate(void)
 {
-       static gint checked = FALSE;
-       static gint found = FALSE;
+       static gboolean checked = FALSE;
+       static gboolean found = FALSE;
 
        if (!checked)
                {
@@ -188,7 +184,7 @@ static void fullscreen_saver_deactivate(void)
 
        if (found)
                {
-               system (XSCREENSAVER_COMMAND);
+               runcmd(XSCREENSAVER_COMMAND);
                }
 }
 
@@ -202,7 +198,7 @@ static gboolean fullscreen_saver_block_cb(gpointer data)
        return TRUE;
 }
 
-static gint fullscreen_delete_cb(GtkWidget *widget, GdkEventAny *event, gpointer data)
+static gboolean fullscreen_delete_cb(GtkWidget *widget, GdkEventAny *event, gpointer data)
 {
        FullScreenData *fs = data;
 
@@ -215,17 +211,15 @@ FullScreenData *fullscreen_start(GtkWidget *window, ImageWindow *imd,
 {
        FullScreenData *fs;
        GdkScreen *screen;
-       gint same;
        gint x, y;
        gint w, h;
        GdkGeometry geometry;
+       GdkWindow *gdkwin;
 
        if (!window || !imd) return NULL;
 
        fs = g_new0(FullScreenData, 1);
 
-       fs->hide_mouse_id = -1;
-       fs->busy_mouse_id = -1;
        fs->cursor_state = FULLSCREEN_CURSOR_HIDDEN;
 
        fs->normal_window = window;
@@ -234,9 +228,9 @@ FullScreenData *fullscreen_start(GtkWidget *window, ImageWindow *imd,
        fs->stop_func = stop_func;
        fs->stop_data = stop_data;
 
-       if (debug) printf("full screen requests screen %d\n", options->fullscreen.screen);
+       DEBUG_1("full screen requests screen %d", options->fullscreen.screen);
        fullscreen_prefs_get_geometry(options->fullscreen.screen, window, &x, &y, &w, &h,
-                                     &screen, &same);
+                                     &screen, &fs->same_region);
 
        fs->window = window_new(GTK_WINDOW_TOPLEVEL, "fullscreen", NULL, NULL, _("Full screen"));
 
@@ -250,15 +244,14 @@ FullScreenData *fullscreen_start(GtkWidget *window, ImageWindow *imd,
                 */
                gtk_window_fullscreen(GTK_WINDOW(fs->window));
                }
-       else if (options->fullscreen.above)
+       else
                {
-               /* request to be above other windows */
-               gtk_window_set_keep_above(GTK_WINDOW(fs->window), TRUE);
+               gtk_window_set_screen(GTK_WINDOW(fs->window), screen);
+               if (options->fullscreen.above)
+                       gtk_window_set_keep_above(GTK_WINDOW(fs->window), TRUE);
                }
 
        gtk_window_set_resizable(GTK_WINDOW(fs->window), FALSE);
-
-       gtk_window_set_screen(GTK_WINDOW(fs->window), screen);
        gtk_container_set_border_width(GTK_CONTAINER(fs->window), 0);
        g_signal_connect(G_OBJECT(fs->window), "delete_event",
                         G_CALLBACK(fullscreen_delete_cb), fs);
@@ -285,18 +278,19 @@ FullScreenData *fullscreen_start(GtkWidget *window, ImageWindow *imd,
        gtk_window_set_default_size(GTK_WINDOW(fs->window), w, h);
        gtk_window_move(GTK_WINDOW(fs->window), x, y);
 
+       gtk_widget_realize(fs->window);
+       gdkwin = gtk_widget_get_window(fs->window);
+       if (gdkwin != NULL)
+               gdk_window_set_override_redirect(gdkwin, TRUE);
+
        fs->imd = image_new(FALSE);
 
        gtk_container_add(GTK_CONTAINER(fs->window), fs->imd->widget);
 
-       if (options->user_specified_window_background)
-               {
-               image_background_set_color(fs->imd, &options->window_background_color);
-               }
-
+       image_background_set_color_from_options(fs->imd, TRUE);
        image_set_delay_flip(fs->imd, options->fullscreen.clean_flip);
-       image_auto_refresh(fs->imd, fs->normal_imd->auto_refresh_interval);
-
+       image_auto_refresh_enable(fs->imd, fs->normal_imd->auto_refresh);
+       
        if (options->fullscreen.clean_flip)
                {
                image_set_update_func(fs->imd, fullscreen_image_update_cb, fs);
@@ -305,7 +299,20 @@ FullScreenData *fullscreen_start(GtkWidget *window, ImageWindow *imd,
 
        gtk_widget_show(fs->imd->widget);
 
-       image_change_from_image(fs->imd, fs->normal_imd);
+       if (fs->same_region)
+               {
+               DEBUG_0("Original vindow is not visible, enabling std. fullscreen mode");
+               image_move_from_image(fs->imd, fs->normal_imd);
+               }
+       else
+               {
+               DEBUG_0("Original vindow is still visible, enabling presentation fullscreen mode");
+               image_copy_from_image(fs->imd, fs->normal_imd);
+               }
+
+       if (options->stereo.enable_fsmode) {
+               image_stereo_set(fs->imd, options->stereo.fsmode);
+       }
 
        gtk_widget_show(fs->window);
 
@@ -320,10 +327,13 @@ FullScreenData *fullscreen_start(GtkWidget *window, ImageWindow *imd,
        /* hide normal window
         * FIXME: properly restore this window on show
         */
+       if (fs->same_region)
+               {
 #ifdef HIDE_WINDOW_IN_FULLSCREEN
-       gtk_widget_hide(fs->normal_window);
+               gtk_widget_hide(fs->normal_window);
 #endif
-       image_change_fd(fs->normal_imd, NULL, image_zoom_get(fs->normal_imd));
+               image_change_fd(fs->normal_imd, NULL, image_zoom_get(fs->normal_imd));
+               }
 
        return fs;
 }
@@ -332,16 +342,25 @@ void fullscreen_stop(FullScreenData *fs)
 {
        if (!fs) return;
 
-       g_source_remove(fs->saver_block_id);
+       if (fs->saver_block_id) g_source_remove(fs->saver_block_id);
 
        fullscreen_hide_mouse_disable(fs);
        fullscreen_busy_mouse_disable(fs);
        gdk_keyboard_ungrab(GDK_CURRENT_TIME);
 
-       image_change_from_image(fs->normal_imd, fs->imd);
+       if (fs->same_region)
+               {
+               image_move_from_image(fs->normal_imd, fs->imd);
 #ifdef HIDE_WINDOW_IN_FULLSCREEN
-       gtk_widget_show(fs->normal_window);
+               gtk_widget_show(fs->normal_window);
 #endif
+               if (options->stereo.enable_fsmode)
+                       {
+                       image_stereo_set(fs->normal_imd, options->stereo.mode);
+                       }
+               }
+
+
        if (fs->stop_func) fs->stop_func(fs, fs->stop_data);
 
        gtk_widget_destroy(fs->window);
@@ -366,7 +385,7 @@ GList *fullscreen_prefs_list(void)
        display = gdk_display_get_default();
        number = gdk_display_get_n_screens(display);
 
-       for (i = 0; i < number ; i++)
+       for (i = 0; i < number; i++)
                {
                GdkScreen *screen;
                gint monitors;
@@ -395,7 +414,11 @@ GList *fullscreen_prefs_list(void)
                        else
                                {
                                gdk_screen_get_monitor_geometry(screen, j, &rect);
-                               subname = g_strdup_printf("%s %d", _("Monitor"), j + 1);
+                               subname = gdk_screen_get_monitor_plug_name(screen, j);
+                               if (subname == NULL)
+                                       {
+                                       subname = g_strdup_printf("%s %d", _("Monitor"), j + 1);
+                                       }
                                }
 
                        sd = g_new0(ScreenData, 1);
@@ -406,7 +429,7 @@ GList *fullscreen_prefs_list(void)
                        sd->width = rect.width;
                        sd->height = rect.height;
 
-                       if (debug) printf("Screen %d %30s %4d,%4d (%4dx%4d)\n",
+                       DEBUG_1("Screen %d %30s %4d,%4d (%4dx%4d)",
                                          sd->number, sd->description, sd->x, sd->y, sd->width, sd->height);
 
                        list = g_list_append(list, sd);
@@ -429,7 +452,7 @@ void fullscreen_prefs_list_free(GList *list)
                ScreenData *sd = work->data;
                work = work->next;
 
-               g_free(sd->description);        
+               g_free(sd->description);
                g_free(sd);
                }
 
@@ -464,7 +487,7 @@ ScreenData *fullscreen_prefs_list_find(GList *list, gint 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)
+                                  GdkScreen **dest_screen, gboolean *same_region)
 {
        GList *list;
        ScreenData *sd;
@@ -503,13 +526,13 @@ void fullscreen_prefs_get_geometry(gint screen, GtkWidget *widget, gint *x, gint
                if (height) *height = sd->height;
 
                if (dest_screen) *dest_screen = screen;
-               if (same_region) *same_region = (!widget || !widget->window ||
+               if (same_region) *same_region = (!widget || !gtk_widget_get_window(widget) ||
                                        (screen == gtk_widget_get_screen(widget) &&
                                        (sd->number%100 == 0 ||
-                                        sd->number%100 == gdk_screen_get_monitor_at_window(screen, widget->window)+1)));
+                                        sd->number%100 == gdk_screen_get_monitor_at_window(screen, gtk_widget_get_window(widget))+1)));
 
                }
-       else if (screen != 1 || !widget || !widget->window)
+       else if (screen != 1 || !widget || !gtk_widget_get_window(widget))
                {
                GdkScreen *screen;
 
@@ -537,7 +560,7 @@ void fullscreen_prefs_get_geometry(gint screen, GtkWidget *widget, gint *x, gint
                GdkRectangle rect;
 
                screen = gtk_widget_get_screen(widget);
-               monitor = gdk_screen_get_monitor_at_window(screen, widget->window);
+               monitor = gdk_screen_get_monitor_at_window(screen, gtk_widget_get_window(widget));
 
                gdk_screen_get_monitor_geometry(screen, monitor, &rect);
 
@@ -559,14 +582,14 @@ gint fullscreen_prefs_find_screen_for_widget(GtkWidget *widget)
        gint monitor;
        gint n;
 
-       if (!widget || !widget->window) return 0;
+       if (!widget || !gtk_widget_get_window(widget)) return 0;
 
        screen = gtk_widget_get_screen(widget);
-       monitor = gdk_screen_get_monitor_at_window(screen, widget->window);
+       monitor = gdk_screen_get_monitor_at_window(screen, gtk_widget_get_window(widget));
 
        n = (gdk_screen_get_number(screen)+1) * 100 + monitor + 1;
 
-       if (debug || TRUE) printf("Screen appears to be %d\n", n);
+       DEBUG_1("Screen appears to be %d", n);
 
        return n;
 }
@@ -607,7 +630,7 @@ static void fullscreen_prefs_selection_add(GtkListStore *store, const gchar *tex
                                         FS_MENU_COLUMN_VALUE, value, -1);
 }
 
-GtkWidget *fullscreen_prefs_selection_new(const gchar *text, gint *screen_value, gint *above_value)
+GtkWidget *fullscreen_prefs_selection_new(const gchar *text, gint *screen_value, gboolean *above_value)
 {
        GtkWidget *vbox;
        GtkWidget *hbox;
@@ -675,4 +698,4 @@ GtkWidget *fullscreen_prefs_selection_new(const gchar *text, gint *screen_value,
 
        return vbox;
 }
-
+/* vim: set shiftwidth=8 softtabstop=0 cindent cinoptions={1s: */