[Rawstudio-commit] r2224 - in trunk: . src

Anders Brander anders at brander.dk
Tue Feb 24 23:08:31 CET 2009


Author: abrander
Date: 2009-02-24 23:08:30 +0100 (Tue, 24 Feb 2009)
New Revision: 2224

Modified:
   trunk/TODO
   trunk/src/rs-actions.c
   trunk/src/rs-preview-widget.c
   trunk/src/rs-preview-widget.h
   trunk/src/ui.xml
Log:
Added (limited) lights-out mode.

Modified: trunk/TODO
===================================================================
--- trunk/TODO	2009-02-24 09:02:19 UTC (rev 2223)
+++ trunk/TODO	2009-02-24 22:08:30 UTC (rev 2224)
@@ -1,7 +1,6 @@
 General TODO
 ------------
 - native raw loader for CR2 and NEF
-- lightsout-mode
 - save tab A,B & C (selectable) as Layered TIFF
 
 Misc

Modified: trunk/src/rs-actions.c
===================================================================
--- trunk/src/rs-actions.c	2009-02-24 09:02:19 UTC (rev 2223)
+++ trunk/src/rs-actions.c	2009-02-24 22:08:30 UTC (rev 2224)
@@ -613,6 +613,11 @@
 	rs_preview_widget_set_split(RS_PREVIEW_WIDGET(rs->preview), gtk_toggle_action_get_active(toggleaction));
 }
 
+TOGGLEACTION(lightsout)
+{
+	rs_preview_widget_set_lightsout(RS_PREVIEW_WIDGET(rs->preview), gtk_toggle_action_get_active(toggleaction));
+}
+
 ACTION(add_to_batch)
 {
 	GString *gs = g_string_new("");
@@ -850,6 +855,7 @@
 	{ "Fullscreen", GTK_STOCK_FULLSCREEN, _("_Fullscreen"), "F11", NULL, ACTION_CB(fullscreen), FALSE },
 	{ "ExposureMask", NULL, _("_Exposure mask"), "<control>E", NULL, ACTION_CB(exposure_mask), FALSE },
 	{ "Split", NULL, _("_Split"), NULL, NULL, ACTION_CB(split), FALSE },
+	{ "Lightsout", NULL, _("_Lights out"), "F12", NULL, ACTION_CB(lightsout), FALSE },
 	};
 	static guint n_toggleentries = G_N_ELEMENTS (toggleentries);
 

Modified: trunk/src/rs-preview-widget.c
===================================================================
--- trunk/src/rs-preview-widget.c	2009-02-24 09:02:19 UTC (rev 2223)
+++ trunk/src/rs-preview-widget.c	2009-02-24 22:08:30 UTC (rev 2224)
@@ -151,6 +151,7 @@
 	RSColorTransform *rct[MAX_VIEWS];
 	gint dirty[MAX_VIEWS]; /* Dirty flag, used for multiple things */
 
+	GtkWidget *lightsout_window;
 	gboolean prev_inside_image; /* For motion and leave function*/
 };
 
@@ -329,6 +330,7 @@
 	g_signal_connect(G_OBJECT(preview), "realize", G_CALLBACK(realize), NULL);
 	g_signal_connect(G_OBJECT(preview->canvas), "scroll_event", G_CALLBACK (scroll), preview);
 
+	preview->lightsout_window = NULL;
 	preview->prev_inside_image = FALSE;
 }
 
@@ -519,7 +521,125 @@
 	redraw(preview, &rect);
 }
 
+static gboolean
+lightsout_window_on_expose(GtkWidget *widget, GdkEventExpose *do_not_use_this, RSPreviewWidget *preview)
+{
+	gint view;
+	gint x, y;
+	gint width, height;
+	cairo_t* cairo_context = NULL;
+
+	cairo_context = gdk_cairo_create (widget->window);
+	if (!cairo_context)
+		return FALSE;
+
+	gtk_window_get_size(GTK_WINDOW(widget), &width, &height);
+
+	cairo_set_source_rgba (cairo_context, 0.0f, 0.0f, 0.0f, 0.9f);
+	cairo_set_operator (cairo_context, CAIRO_OPERATOR_SOURCE);
+	cairo_paint (cairo_context);
+
+	/* Paint the images with alpha=0 */
+	for(view=0;view<preview->views;view++)
+	{
+		GdkRectangle rect;
+		get_placement(preview, view, &rect);
+
+		gdk_window_get_origin(GTK_WIDGET(preview->canvas)->window, &x, &y);
+		cairo_set_source_rgba(cairo_context, 0.0, 0.0, 0.0, 0.0);
+		cairo_rectangle (cairo_context, x+rect.x, y+rect.y, rect.width, rect.height);
+		cairo_fill (cairo_context);
+	}
+
+	cairo_destroy (cairo_context);
+
+	/* Set opacity to 100% when we're done drawing */
+	gtk_window_set_opacity(GTK_WINDOW(widget), 1.0);
+
+	return FALSE;
+}
+
 /**
+ * Enables or disables lights out mode
+ * @param preview A RSPreviewWidget
+ * @param lightsout Enables lights out mode if TRUE, disables if FALSE
+ */
+void
+rs_preview_widget_set_lightsout(RSPreviewWidget *preview, gboolean lightsout)
+{
+	/* FIXME: Make this follow the loaded image(s) somehow */
+	if (lightsout && !preview->lightsout_window)
+	{
+		GdkScreen *screen = gtk_widget_get_screen(GTK_WIDGET(preview->canvas));
+		gint width = gdk_screen_get_width(screen);
+		gint height = gdk_screen_get_height(screen);
+		GtkWidget *window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
+		GdkColormap* colormap = gdk_screen_get_rgba_colormap(screen);
+
+		/* Check if the system even supports composite - and bail out if needed */
+		if (!colormap || !gdk_display_supports_composite(gdk_display_get_default()))
+		{
+			GtkWidget *dialog = gui_dialog_make_from_text(
+				GTK_STOCK_DIALOG_ERROR,
+				_("Light out mode not available"),
+				_("Your setup doesn't seem to support RGBA visuals and/or compositing. Consult your operating system manual for enabling RGBA visuals and compositing.")
+			);
+			
+			GtkWidget *button = gtk_button_new_from_stock(GTK_STOCK_CLOSE);
+			gtk_dialog_add_action_widget(GTK_DIALOG(dialog), button, GTK_RESPONSE_ACCEPT);
+
+            gtk_widget_show_all(dialog);
+            gtk_dialog_run(GTK_DIALOG(dialog));
+            gtk_widget_destroy(dialog);
+			return;
+		}
+
+		/* Set our colormap to the RGBA colormap */
+		gtk_widget_set_colormap(window, colormap);
+
+		/* Cover whole screen */
+		gtk_window_resize(GTK_WINDOW(window), width, height);
+		gtk_window_move(GTK_WINDOW(window), 0, 0);
+
+		/* Set the input shape to a rectangle covering everything with alpha=0,
+		 * to let everything pass through */
+		GdkPixmap *bitmap = (GdkBitmap*) gdk_pixmap_new (NULL, width, height, 1);
+		cairo_t *cairo_context = gdk_cairo_create (bitmap);
+
+		cairo_scale (cairo_context, (double) width, (double) height);
+		cairo_set_source_rgba (cairo_context, 1.0f, 1.0f, 1.0f, 0.0f);
+		cairo_set_operator (cairo_context, CAIRO_OPERATOR_SOURCE);
+		cairo_paint (cairo_context);
+		cairo_destroy (cairo_context);
+
+		gtk_widget_input_shape_combine_mask (GTK_WIDGET(window), NULL, 0, 0);
+		gtk_widget_input_shape_combine_mask (GTK_WIDGET(window), bitmap, 0, 0);
+		g_object_unref(bitmap);
+
+		g_signal_connect (G_OBJECT (window), "expose-event", G_CALLBACK(lightsout_window_on_expose), preview);
+
+		gtk_widget_set_app_paintable (window, TRUE);
+		gtk_window_set_decorated (GTK_WINDOW (window), FALSE);
+		gtk_window_set_keep_above(GTK_WINDOW(window), TRUE);
+		gtk_window_set_accept_focus(GTK_WINDOW(window), FALSE);
+		gtk_window_set_deletable(GTK_WINDOW(window), FALSE);
+		gtk_window_set_skip_pager_hint(GTK_WINDOW(window), TRUE);
+		gtk_window_set_skip_taskbar_hint(GTK_WINDOW(window), TRUE);
+		gtk_window_set_title(GTK_WINDOW(window), "Rawstudio lights out helper");
+
+		/* Let the window be completely transparent for now to avoid initial flicker */
+		gtk_window_set_opacity(GTK_WINDOW(window), 0.0);
+		gtk_widget_show_all(window);
+		preview->lightsout_window = window;
+	}
+	else if (!lightsout && preview->lightsout_window)
+	{
+		gtk_widget_destroy(preview->lightsout_window);
+		preview->lightsout_window = NULL;
+	}
+}
+
+/**
  * Sets the active snapshot of a RSPreviewWidget
  * @param preview A RSPreviewWidget
  * @param view Which view to set (0..1)

Modified: trunk/src/rs-preview-widget.h
===================================================================
--- trunk/src/rs-preview-widget.h	2009-02-24 09:02:19 UTC (rev 2223)
+++ trunk/src/rs-preview-widget.h	2009-02-24 22:08:30 UTC (rev 2224)
@@ -108,6 +108,14 @@
 extern void rs_preview_widget_set_split(RSPreviewWidget *preview, gboolean split_screen);
 
 /**
+ * Enables or disables lights out mode
+ * @param preview A RSPreviewWidget
+ * @param lightsout Enables lights out mode if TRUE, disables if FALSE
+ */
+void
+rs_preview_widget_set_lightsout(RSPreviewWidget *preview, gboolean lightsout);
+
+/**
  * Sets the active snapshot of a RSPreviewWidget
  * @param preview A RSPreviewWidget
  * @param view Which view to set (0..1)

Modified: trunk/src/ui.xml
===================================================================
--- trunk/src/ui.xml	2009-02-24 09:02:19 UTC (rev 2223)
+++ trunk/src/ui.xml	2009-02-24 22:08:30 UTC (rev 2224)
@@ -58,6 +58,7 @@
    <separator />
    <menuitem action="ExposureMask" />
    <menuitem action="Split" />
+   <menuitem action="Lightsout" />
   </menu>
   <menu action="BatchMenu">
    <menuitem action="AddToBatch" />
@@ -80,6 +81,7 @@
   <separator />
   <menuitem action="ExposureMask" />
   <menuitem action="Split" />
+  <menuitem action="Lightsout" />
  </popup>
  <popup name="PreviewPopupRight" action="PreviewPopupRight">
   <menuitem action="RightA" />




More information about the Rawstudio-commit mailing list