[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