X-Git-Url: http://geeqie.org/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=src%2Ffullscreen.c;h=21dc4f409231c06108a7ec97b2d847eef68fdf44;hb=a40d8f1e7f4bace37758d6f0bc4f598652b77b69;hp=a44537b6a7f1f9ad6b46efaeb12663bb74ae0120;hpb=2167314197590c1a13c1f2d13e3b5cb018d17de1;p=geeqie.git diff --git a/src/fullscreen.c b/src/fullscreen.c index a44537b6..21dc4f40 100644 --- a/src/fullscreen.c +++ b/src/fullscreen.c @@ -1,6 +1,7 @@ /* * Geeqie * (C) 2004 John Ellis + * Copyright (C) 2008 - 2012 The Geeqie Team * * Author: John Ellis * @@ -14,10 +15,12 @@ #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, @@ -32,66 +35,53 @@ enum { *---------------------------------------------------------------------------- */ -void set_default_fullscreen_info(ConfOptions *options) -{ - if (options->fullscreen.info) g_free(options->fullscreen.info); - options->fullscreen.info = g_strdup(DEFAULT_OVERLAY_INFO); -} - 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; } } @@ -101,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; @@ -117,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) { @@ -146,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); @@ -165,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; @@ -183,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) { @@ -194,7 +184,7 @@ static void fullscreen_saver_deactivate(void) if (found) { - system (XSCREENSAVER_COMMAND); + runcmd(XSCREENSAVER_COMMAND); } } @@ -208,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; @@ -221,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; @@ -240,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")); @@ -256,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); @@ -291,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->image.use_custom_border_color) - { - image_background_set_color(fs->imd, &options->image.border_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); @@ -311,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); @@ -326,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; } @@ -338,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); @@ -372,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; @@ -401,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); @@ -412,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); @@ -435,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); } @@ -470,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; @@ -509,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; @@ -543,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); @@ -565,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; } @@ -613,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; @@ -681,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: */