[education/rkward] /: Suppress showing of new RK() windows during preview

Thomas Friedrichsmeier null at kde.org
Sun Aug 24 16:08:55 BST 2025


Git commit 1271a4df43f0674311673fd82b6e121481d0915d by Thomas Friedrichsmeier.
Committed on 24/08/2025 at 15:06.
Pushed by tfry into branch 'master'.

Suppress showing of new RK() windows during preview

M  +1    -1    VERSION.cmake
M  +3    -0    rkward/rbackend/rkrinterface.cpp
M  +6    -5    rkward/rbackend/rkwarddevice/rkgraphicsdevice.cpp
M  +3    -2    rkward/rbackend/rkwarddevice/rkgraphicsdevice.h
M  +5    -2    rkward/rbackend/rkwarddevice/rkgraphicsdevice_frontendtransmitter.cpp
M  +2    -0    rkward/rbackend/rkwarddevice/rkgraphicsdevice_frontendtransmitter.h
M  +1    -1    rkward/rbackend/rkwarddevice/rkgraphicsdevice_stubs.cpp
M  +1    -1    rkward/rbackend/rpackages/rkward/DESCRIPTION
M  +12   -7    rkward/rbackend/rpackages/rkward/R/rk.filename-functions.R
M  +16   -0    rkward/rbackend/rpackages/rkward/R/rk.workspace-functions.R

https://invent.kde.org/education/rkward/-/commit/1271a4df43f0674311673fd82b6e121481d0915d

diff --git a/VERSION.cmake b/VERSION.cmake
index db0a2b651..a0cf628f8 100644
--- a/VERSION.cmake
+++ b/VERSION.cmake
@@ -1,3 +1,3 @@
 # DO NOT CHANGE THIS FILE MANUALLY!
 # It will be overwritten by scripts/set_dist_version.sh
-SET(RKVERSION_NUMBER 0.8.1z+0.8.2+devel3)
+SET(RKVERSION_NUMBER 0.8.1z+0.8.2+devel4)
diff --git a/rkward/rbackend/rkrinterface.cpp b/rkward/rbackend/rkrinterface.cpp
index fde4601e9..95dba41f9 100644
--- a/rkward/rbackend/rkrinterface.cpp
+++ b/rkward/rbackend/rkrinterface.cpp
@@ -39,6 +39,7 @@ SPDX-License-Identifier: GPL-2.0-or-later
 #include "../windows/rkwindowcatcher.h"
 #include "../windows/rkworkplace.h"
 #include "rcommandstack.h"
+#include "rkwarddevice/rkgraphicsdevice_frontendtransmitter.h"
 #include "rkrbackendprotocol_frontend.h"
 #include "rksessionvars.h"
 
@@ -773,6 +774,8 @@ GenericRRequestResult RInterface::processRCallRequest(const QString &call, const
 		}
 	} else if (call == QLatin1String("set.window.placement.hint")) {
 		RKWorkplace::mainWorkplace()->setWindowPlacementOverrides(arglist.value(0), arglist.value(1), arglist.value(2));
+	} else if (call == QLatin1String("suppress.RK.windows")) {
+		RKGraphicsDeviceFrontendTransmitter::suppressShowingCreatedWindows(arglist.value(0) == u"on"_s);
 	} else if (call == QLatin1String("frontendSessionInfo")) {
 		return GenericRRequestResult(RKSessionVars::frontendSessionInfo());
 	} else if (call == QLatin1String("recordCommands")) {
diff --git a/rkward/rbackend/rkwarddevice/rkgraphicsdevice.cpp b/rkward/rbackend/rkwarddevice/rkgraphicsdevice.cpp
index 65ae0da90..49a635b80 100644
--- a/rkward/rbackend/rkwarddevice/rkgraphicsdevice.cpp
+++ b/rkward/rbackend/rkwarddevice/rkgraphicsdevice.cpp
@@ -30,14 +30,15 @@ using namespace Qt::Literals::StringLiterals;
 
 QHash<int, RKGraphicsDevice *> RKGraphicsDevice::devices;
 
-RKGraphicsDevice::RKGraphicsDevice(double width, double height, const QString &title, bool antialias) : QObject(),
+RKGraphicsDevice::RKGraphicsDevice(double width, double height, const QString &title, bool antialias, bool keep_hidden) : QObject(),
 #ifdef USE_QIMAGE_BUFFER
                                                                                                         area(qAbs(width) + 1, qAbs(height) + 1, QImage::Format_ARGB32),
 #else
                                                                                                         area(qAbs(width) + 1, qAbs(height) + 1),
 #endif
+                                                                                                        hidden(keep_hidden),
                                                                                                         base_title(title),
-                                                                                                        antialias(antialias) {
+                                                                                                        antialias(antialias && !keep_hidden) {
 	RK_TRACE(GRAPHICS_DEVICE);
 
 	interaction_opcode = -1;
@@ -191,7 +192,7 @@ void RKGraphicsDevice::updateNow() {
 #else
 	view->setPixmap(area);
 #endif
-	if (!view->isVisible()) {
+	if (!view->isVisible() && !hidden) { // NOTE: we still do all drawing, even while hidden, e.g. for capture
 		view->resize(area.size());
 		view->show();
 	}
@@ -210,14 +211,14 @@ void RKGraphicsDevice::checkSize() {
 	}
 }
 
-RKGraphicsDevice *RKGraphicsDevice::newDevice(int devnum, double width, double height, const QString &title, bool antialias, quint32 id) {
+RKGraphicsDevice *RKGraphicsDevice::newDevice(int devnum, double width, double height, const QString &title, bool antialias, bool hidden, quint32 id) {
 	RK_TRACE(GRAPHICS_DEVICE);
 
 	if (devices.contains(devnum)) {
 		RK_DEBUG(GRAPHICS_DEVICE, DL_ERROR, "Graphics device number %d already exists while trying to create it", devnum);
 		closeDevice(devnum);
 	}
-	RKGraphicsDevice *dev = new RKGraphicsDevice(width, height, title.isEmpty() ? i18n("Graphics Device Number %1", QString::number(devnum + 1)) : title, antialias);
+	RKGraphicsDevice *dev = new RKGraphicsDevice(width, height, title.isEmpty() ? i18n("Graphics Device Number %1", QString::number(devnum + 1)) : title, antialias, hidden);
 	dev->id = id;
 	devices.insert(devnum, dev);
 	return (dev);
diff --git a/rkward/rbackend/rkwarddevice/rkgraphicsdevice.h b/rkward/rbackend/rkwarddevice/rkgraphicsdevice.h
index 5dcfd227b..ff1ad78ea 100644
--- a/rkward/rbackend/rkwarddevice/rkgraphicsdevice.h
+++ b/rkward/rbackend/rkwarddevice/rkgraphicsdevice.h
@@ -39,11 +39,11 @@ class QDialog;
 class RKGraphicsDevice : public QObject {
 	Q_OBJECT
   protected:
-	RKGraphicsDevice(double width, double height, const QString &title, bool antialias);
+	RKGraphicsDevice(double width, double height, const QString &title, bool antialias, bool hidden);
 	~RKGraphicsDevice();
 
   public:
-	static RKGraphicsDevice *newDevice(int devnum, double width, double height, const QString &title, bool antialias, quint32 id);
+	static RKGraphicsDevice *newDevice(int devnum, double width, double height, const QString &title, bool antialias, bool keep_hidden, quint32 id);
 	static void closeDevice(int devnum);
 	static QHash<int, RKGraphicsDevice *> devices;
 
@@ -134,6 +134,7 @@ class RKGraphicsDevice : public QObject {
 #endif
 	QPainter painter;
 	QLabel *view;
+	bool hidden;
 	QString base_title;
 	QDialog *dialog;
 	QHash<int, QBrush> patterns;
diff --git a/rkward/rbackend/rkwarddevice/rkgraphicsdevice_frontendtransmitter.cpp b/rkward/rbackend/rkwarddevice/rkgraphicsdevice_frontendtransmitter.cpp
index 86f864927..9f9b38f1f 100644
--- a/rkward/rbackend/rkwarddevice/rkgraphicsdevice_frontendtransmitter.cpp
+++ b/rkward/rbackend/rkwarddevice/rkgraphicsdevice_frontendtransmitter.cpp
@@ -25,6 +25,7 @@ SPDX-License-Identifier: GPL-2.0-or-later
 
 #include "../../debug.h"
 
+bool RKGraphicsDeviceFrontendTransmitter::suppress_windows = false;
 double RKGraphicsDeviceFrontendTransmitter::lwdscale = 72.0 / 96; // NOTE: reinitialized more appropriately, later
 RKGraphicsDeviceFrontendTransmitter::RKGraphicsDeviceFrontendTransmitter() : QObject(), dpix(0), dpiy(0) {
 	RK_TRACE(GRAPHICS_DEVICE);
@@ -239,8 +240,10 @@ void RKGraphicsDeviceFrontendTransmitter::newData() {
 			bool antialias;
 			quint32 id;
 			streamer.instream >> width >> height >> title >> antialias >> id;
-			device = RKGraphicsDevice::newDevice(devnum, width, height, title, antialias, id);
-			RKWorkplace::mainWorkplace()->newRKWardGraphisWindow(device, devnum + 1);
+			device = RKGraphicsDevice::newDevice(devnum, width, height, title, antialias, suppress_windows, id);
+			if (!suppress_windows) {
+				RKWorkplace::mainWorkplace()->newRKWardGraphisWindow(device, devnum + 1);
+			}
 			connect(device, &RKGraphicsDevice::locatorDone, this, &RKGraphicsDeviceFrontendTransmitter::locatorDone);
 			connect(device, &RKGraphicsDevice::newPageConfirmDone, this, &RKGraphicsDeviceFrontendTransmitter::newPageConfirmDone);
 			connect(this, &RKGraphicsDeviceFrontendTransmitter::stopInteraction, device, &RKGraphicsDevice::stopInteraction);
diff --git a/rkward/rbackend/rkwarddevice/rkgraphicsdevice_frontendtransmitter.h b/rkward/rbackend/rkwarddevice/rkgraphicsdevice_frontendtransmitter.h
index 57f99635d..d1859115e 100644
--- a/rkward/rbackend/rkwarddevice/rkgraphicsdevice_frontendtransmitter.h
+++ b/rkward/rbackend/rkwarddevice/rkgraphicsdevice_frontendtransmitter.h
@@ -24,6 +24,7 @@ class RKGraphicsDeviceFrontendTransmitter : public QObject {
 	~RKGraphicsDeviceFrontendTransmitter();
 	QString serverName() const { return server_name; };
 	static double lwdscale;
+	static void suppressShowingCreatedWindows(bool suppress) { suppress_windows = suppress; };
   public Q_SLOTS:
 	void newData();
 	void newConnection();
@@ -40,6 +41,7 @@ class RKGraphicsDeviceFrontendTransmitter : public QObject {
 	QLocalServer *local_server;
 	RKAsyncDataStreamHelper<RKGraphicsDeviceTransmittionLengthType> streamer;
 	double dpix, dpiy;
+	static bool suppress_windows;
 };
 
 #endif
diff --git a/rkward/rbackend/rkwarddevice/rkgraphicsdevice_stubs.cpp b/rkward/rbackend/rkwarddevice/rkgraphicsdevice_stubs.cpp
index 40ca60133..8b5af5f8a 100644
--- a/rkward/rbackend/rkwarddevice/rkgraphicsdevice_stubs.cpp
+++ b/rkward/rbackend/rkwarddevice/rkgraphicsdevice_stubs.cpp
@@ -215,7 +215,7 @@ SEXP makeString(const char *string) {
 	return ret;
 }
 
-static void callHookFun(const char *what, pDevDesc dev, SEXP data=ROb(R_NilValue)) {
+static void callHookFun(const char *what, pDevDesc dev, SEXP data = ROb(R_NilValue)) {
 	static SEXP call_hook_fun = nullptr;
 	if (!call_hook_fun) {
 		SEXP rkn = makeString("rkward");
diff --git a/rkward/rbackend/rpackages/rkward/DESCRIPTION b/rkward/rbackend/rpackages/rkward/DESCRIPTION
index 3d1f2eebf..a642f4618 100755
--- a/rkward/rbackend/rpackages/rkward/DESCRIPTION
+++ b/rkward/rbackend/rpackages/rkward/DESCRIPTION
@@ -15,7 +15,7 @@ LazyLoad: yes
 Authors at R: c(person(given="Thomas", family="Friedrichsmeier", email="thomas.friedrichsmeier at kdemail.net", role=c("aut")), person(given="the RKWard", family="team",
                     email="rkward-devel at kde.org", role=c("cre","aut")))
 Version: 0.8.2
-Date: 2025-06-02
+Date: 2025-06-03
 RoxygenNote: 7.3.2
 Collate: 
     'base_overrides.R'
diff --git a/rkward/rbackend/rpackages/rkward/R/rk.filename-functions.R b/rkward/rbackend/rpackages/rkward/R/rk.filename-functions.R
index 9413b4f20..71755e9c8 100644
--- a/rkward/rbackend/rpackages/rkward/R/rk.filename-functions.R
+++ b/rkward/rbackend/rpackages/rkward/R/rk.filename-functions.R
@@ -317,13 +317,18 @@ rk.eval.as.preview <- function(infile, outfile, echo=TRUE, env=new.env(parent=gl
 	on.exit({
 		rk.set.output.html.file(output, silent=TRUE)
 	}, add=TRUE)
-	try(rk.flush.output(ask=FALSE, style="preview", silent=TRUE))
+	suppressWarnings(try(rk.flush.output(ask=FALSE, style="preview", silent=TRUE)))
 
 	## set up handling of generated graphics:
 	devs <- list()
 	prevdev <- NULL
 	oldopts <- options() # while at it, save _all_ options. Script might change some, too
 	options(device="RK") # just in case
+	# avoid flicker (and _some_ wasted CPU cycles), by suppressing display of plot windows created, here
+	oldsup <- .rk.suppress.RK.windows(TRUE)
+	on.exit({
+		.rk.suppress.RK.windows(oldsup)
+	}, add=TRUE)
 
 	# If a device already exists, let's open a new one to avoid touching it, unintentionally
 	# We don't want that to show in the preview, however, which may or may not plot anything at all
@@ -334,12 +339,12 @@ rk.eval.as.preview <- function(infile, outfile, echo=TRUE, env=new.env(parent=gl
 	}
 
 	hook <- RK.addHook(
-		after.create=function(devnum) {
-			.rk.cat.output("<div align=\"right\">Plot window created</div>");
+		after.create=function(devnum, ...) {
+			.rk.cat.output("<div align=\"right\">Plot window created</div>\n");
 			devs[[as.character(devnum)]] <<- RK.revision(devnum)
 		},
-		in.close=function(devnum) {
-			.rk.cat.output("<div align=\"right\">Plot window closed</div>");
+		in.close=function(devnum, ...) {
+			.rk.cat.output("<div align=\"right\">Plot window closed</div>\n");
 			devs[[as.character(devnum)]] <<- NULL
 		}
 	)
@@ -349,7 +354,7 @@ rk.eval.as.preview <- function(infile, outfile, echo=TRUE, env=new.env(parent=gl
 			currev <- RK.revision(as.numeric(devnum))
 			if (devs[[devnum]] < currev) {
 				cur <- dev.cur()
-				.rk.cat.output("<div align=\"right\"><details><summary>Plot updated (click to show)</summary><p>");
+				.rk.cat.output("<div align=\"right\"><details><summary>Plot updated (click to show)</summary><p>\n");
 				#rk.graph.on(width=200, height=200, pointsize=6)
 				rk.graph.on()
 				out <- dev.cur()
@@ -358,7 +363,7 @@ rk.eval.as.preview <- function(infile, outfile, echo=TRUE, env=new.env(parent=gl
 					dev.copy(which=out)
 				})
 				rk.graph.off()
-				.rk.cat.output("</p></details></div>");
+				.rk.cat.output("</p></details></div>\n");
 				dev.set(cur)
 				devs[[devnum]] <<- currev
 			}
diff --git a/rkward/rbackend/rpackages/rkward/R/rk.workspace-functions.R b/rkward/rbackend/rpackages/rkward/R/rk.workspace-functions.R
index 3c745dffa..1f06e86ad 100644
--- a/rkward/rbackend/rpackages/rkward/R/rk.workspace-functions.R
+++ b/rkward/rbackend/rpackages/rkward/R/rk.workspace-functions.R
@@ -133,3 +133,19 @@
 	eval.parent (expr)
 	invisible (NULL)
 }
+
+# Not exported
+# Keep RK() window from actually showing up on screen (for specific previews)
+# Returns previous setting (suppressed or not) to allow calling nested
+.rk.suppress.RK.windows <- function() {
+	.suppress <- FALSE
+	ret <- function(suppress) {
+		oldsuppress <- .suppress
+		.suppress <<- isTRUE(suppress)
+		.rk.call.async("suppress.RK.windows", ifelse(.suppress, "on", "off"))
+		invisible(oldsuppress)
+	}
+	ret
+}
+
+.rk.suppress.RK.windows <- .rk.suppress.RK.windows()



More information about the rkward-tracker mailing list