diff -urN dist.orig/add_window.c dist/add_window.c
--- dist.orig/add_window.c	2021-04-12 06:42:31.000000000 +0000
+++ dist/add_window.c	2021-10-23 07:56:35.398352529 +0000
@@ -745,7 +745,26 @@
 	 * functions, for extra readability...
 	 */
 	if(HandlingEvents && ask_user && !restoredFromPrevSession) {
-		if((Scr->RandomPlacement == RP_ALL) ||
+		if(Scr->CentrePlacement == CP_ON) {
+#ifdef DEBUG
+			fprintf(stderr,
+			        "DEBUG[CentrePlacement]: win: %dx%d+%d+%d, screen: %dx%d, title height: %d, centre: +%d+%d\n",
+			        tmp_win->attr.width, tmp_win->attr.height,
+			        tmp_win->attr.x, tmp_win->attr.y,
+			        Scr->rootw, Scr->rooth,
+			        tmp_win->title_height,
+			        Scr->rootw/2, Scr->rooth/2);
+#endif
+			if (tmp_win->attr.width >= Scr->rootw || tmp_win->attr.height >= Scr->rooth) {
+				tmp_win->attr.x = 0;
+				tmp_win->attr.y = tmp_win->title_height;
+			} else {
+				tmp_win->attr.x = (Scr->rootw - tmp_win->attr.width) / 2;
+				tmp_win->attr.y = (Scr->rooth - (tmp_win->attr.height - tmp_win->title_height)) / 2;
+			}
+			random_placed = true;	/* reuse */
+		}
+		else if((Scr->RandomPlacement == RP_ALL) ||
 		                ((Scr->RandomPlacement == RP_UNMAPPED) &&
 		                 ((tmp_win->wmhints->initial_state == IconicState) ||
 		                  (! visible(tmp_win))))) {
diff -urN dist.orig/ctwm.h dist/ctwm.h
--- dist.orig/ctwm.h	2021-04-11 10:11:57.000000000 +0000
+++ dist/ctwm.h	2021-10-23 06:15:25.659593182 +0000
@@ -226,6 +226,12 @@
 } RegGravity;
 
 
+/* CentrePlacement bits */
+typedef enum {
+	CP_OFF,
+	CP_ON
+} CntrPlac;
+
 /* RandomPlacement bits */
 typedef enum {
 	RP_OFF,
diff -urN dist.orig/ctwm_main.c dist/ctwm_main.c
--- dist.orig/ctwm_main.c	2021-04-11 08:36:52.000000000 +0000
+++ dist/ctwm_main.c	2021-10-23 06:19:46.944116519 +0000
@@ -1096,6 +1096,7 @@
 	scr->IconManagerDontShow = false;
 	scr->BackingStore = false;
 	scr->SaveUnder = true;
+	scr->CentrePlacement = CP_OFF;
 	scr->RandomPlacement = RP_ALL;
 	scr->RandomDisplacementX = 30;
 	scr->RandomDisplacementY = 30;
diff -urN dist.orig/parse_be.c dist/parse_be.c
--- dist.orig/parse_be.c	2021-04-11 08:36:52.000000000 +0000
+++ dist/parse_be.c	2021-10-23 07:28:15.860308371 +0000
@@ -35,6 +35,7 @@
 #include "gram.tab.h"
 
 
+static int ParseCentrePlacement(const char *s);
 static int ParseRandomPlacement(const char *s);
 static int ParseButtonStyle(const char *s);
 static int ParseUsePPosition(const char *s);
@@ -140,6 +141,7 @@
 #define kws_MaxWindowSize               9
 #define kws_PixmapDirectory             10
 /* RandomPlacement moved because it's now a string string keyword */
+#define kws_CentrePlacement             11
 #define kws_IconJustification           12
 #define kws_TitleJustification          13
 #define kws_IconRegionJustification     14
@@ -253,6 +255,8 @@
 	{ "c",                      CONTROL, 0 },
 	{ "center",                 SIJENUM, SIJ_CENTER },
 	{ "centerfeedbackwindow",   KEYWORD, kw0_CenterFeedbackWindow },
+	{ "centerplacement",        SKEYWORD, kws_CentrePlacement },
+	{ "centreplacement",        SKEYWORD, kws_CentrePlacement },
 	{ "changeworkspacefunction", CHANGE_WORKSPACE_FUNCTION, 0 },
 	{ "clearshadowcontrast",    NKEYWORD, kwn_ClearShadowContrast },
 	{ "clicktofocus",           KEYWORD, kw0_ClickToFocus },
@@ -906,6 +910,7 @@
 			}
 			else {
 				Scr->RandomPlacement = rp;
+				Scr->CentrePlacement = CP_OFF;
 			}
 
 			/* If no geom, we're done */
@@ -948,6 +953,20 @@
 do_string_keyword(int keyword, char *s)
 {
 	switch(keyword) {
+		case kws_CentrePlacement: {
+			int cp = ParseCentrePlacement(s);
+			if(cp < 0) {
+				twmrc_error_prefix();
+				fprintf(stderr,
+					"ignoring invalid CentrePlacement argument \"%s\"\n", s);
+			}
+			else {
+				Scr->CentrePlacement = cp;
+				Scr->RandomPlacement = RP_OFF;
+			}
+			return true;
+		}
+
 		case kws_UsePPosition: {
 			int ppos = ParseUsePPosition(s);
 			if(ppos < 0) {
@@ -1677,6 +1696,25 @@
 
 
 /*
+ * CentrePlacement "on" or "off"
+ */
+static int
+ParseCentrePlacement(const char *s)
+{
+	if(s == NULL) {
+		return -1;
+	}
+	if(strlen(s) == 0) {
+		return -1;
+	}
+
+	if(strcasecmp(s, "off") == 0)		return CP_OFF;
+	else if(strcasecmp(s, "on") == 0)	return CP_ON;
+
+	return -1;
+}
+
+/*
  * RandomPlacement [...] parse
  */
 static int
diff -urN dist.orig/screen.h dist/screen.h
--- dist.orig/screen.h	2021-04-11 10:11:58.000000000 +0000
+++ dist/screen.h	2021-10-23 06:18:11.236715461 +0000
@@ -831,6 +831,7 @@
 	bool DontPaintRootWindow;    ///< DontPaintRootWindow config var
 	bool BackingStore; ///< BackingStore config var
 	bool SaveUnder;    ///< NoSaveUnders config var (inverse)
+	CntrPlac CentrePlacement;  ///< CentrePlacement config var (on/off)
 	RandPlac RandomPlacement;  ///< RandomPlacement config var (1st arg)
 	short RandomDisplacementX; ///< RandomPlacement config var (2nd arg)
 	short RandomDisplacementY; ///< RandomPlacement config var (2nd arg)
