Skip to content

Commit 445b750

Browse files
authored
Bring back window placement-mode (#649)
* Bring back window placement-mode to allow pointer and manual window placement. * Mark center-new-windows option as obsolete.
1 parent fac8bad commit 445b750

File tree

7 files changed

+113
-20
lines changed

7 files changed

+113
-20
lines changed

data/org.cinnamon.muffin.gschema.xml.in

Lines changed: 27 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,13 @@
55
<value value="2" nick="blend"/>
66
</enum>
77

8+
<enum id="placement_mode">
9+
<value value="0" nick="automatic"/>
10+
<value value="1" nick="pointer"/>
11+
<value value="2" nick="manual"/>
12+
<value value="3" nick="center"/>
13+
</enum>
14+
815
<schema id="org.cinnamon.muffin" path="/org/cinnamon/muffin/"
916
gettext-domain="@GETTEXT_DOMAIN@">
1017

@@ -131,10 +138,27 @@
131138

132139
<key name="center-new-windows" type="b">
133140
<default>false</default>
134-
<summary>Place new windows in the center</summary>
141+
<summary>Obsolete — not used</summary>
142+
</key>
143+
144+
<key name="placement-mode" enum="placement_mode">
145+
<default>'automatic'</default>
146+
<summary>Window placement mode</summary>
135147
<description>
136-
When true, the new windows will always be put in the center of the
137-
active screen of the monitor.
148+
The window placement mode indicates how new windows are positioned.
149+
150+
• “automatic” — the system chooses a location automatically based on
151+
the space available on the desktop, or by a simple
152+
cascade if there is no space
153+
154+
• “pointer” — new windows are placed according to the mouse pointer
155+
position
156+
157+
• “manual” — the user must manually place the new window with the
158+
mouse or keyboard.
159+
160+
• “center” — new windows are always put in the center of the active
161+
screen of the monitor
138162
</description>
139163
</key>
140164

src/core/place.c

Lines changed: 41 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -75,6 +75,32 @@ northwestcmp (gconstpointer a, gconstpointer b)
7575
return 0;
7676
}
7777

78+
79+
static gboolean
80+
place_by_pointer(MetaWindow *window,
81+
MetaPlacementMode placement_mode,
82+
int *new_x,
83+
int *new_y)
84+
{
85+
MetaBackend *backend = meta_get_backend ();
86+
MetaCursorTracker *cursor_tracker = meta_backend_get_cursor_tracker (backend);
87+
int root_x, root_y;
88+
89+
meta_cursor_tracker_get_pointer (cursor_tracker, &root_x, &root_y, NULL);
90+
91+
MetaRectangle frame_rect;
92+
meta_window_get_frame_rect (window, &frame_rect);
93+
94+
*new_x = root_x - frame_rect.width / 2;
95+
*new_y = root_y - frame_rect.height / 2;
96+
97+
if (placement_mode == META_PLACEMENT_MODE_MANUAL)
98+
window->move_after_placement = TRUE;
99+
100+
return TRUE;
101+
}
102+
103+
78104
static void
79105
find_next_cascade (MetaWindow *window,
80106
/* visible windows on relevant workspaces */
@@ -323,7 +349,8 @@ window_place_centered (MetaWindow *window)
323349
return (type == META_WINDOW_DIALOG ||
324350
type == META_WINDOW_MODAL_DIALOG ||
325351
type == META_WINDOW_SPLASHSCREEN ||
326-
(type == META_WINDOW_NORMAL && meta_prefs_get_center_new_windows ()));
352+
(type == META_WINDOW_NORMAL &&
353+
meta_prefs_get_new_window_placement_mode () == META_PLACEMENT_MODE_CENTER));
327354
}
328355

329356
static void
@@ -668,6 +695,7 @@ meta_window_place (MetaWindow *window,
668695
MetaBackend *backend = meta_get_backend ();
669696
GList *windows = NULL;
670697
MetaLogicalMonitor *logical_monitor;
698+
MetaPlacementMode placement_mode;
671699

672700
meta_topic (META_DEBUG_PLACEMENT, "Placing window %s\n", window->desc);
673701

@@ -884,6 +912,18 @@ meta_window_place (MetaWindow *window,
884912
x = logical_monitor->rect.x;
885913
y = logical_monitor->rect.y;
886914

915+
916+
/* Placement based on pointer position */
917+
placement_mode = meta_prefs_get_new_window_placement_mode();
918+
919+
if (placement_mode == META_PLACEMENT_MODE_POINTER ||
920+
placement_mode == META_PLACEMENT_MODE_MANUAL)
921+
{
922+
if (place_by_pointer (window, placement_mode, &x, &y))
923+
goto done_check_denied_focus;
924+
}
925+
926+
887927
if (find_first_fit (window, windows,
888928
logical_monitor,
889929
x, y, &x, &y))

src/core/prefs.c

Lines changed: 13 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -93,7 +93,7 @@ static MetaKeyCombo locate_pointer_key_combo = { 0, 0, 0 };
9393
static CDesktopFocusMode focus_mode = C_DESKTOP_FOCUS_MODE_CLICK;
9494
static CDesktopFocusNewWindows focus_new_windows = C_DESKTOP_FOCUS_NEW_WINDOWS_SMART;
9595
static gboolean raise_on_click = TRUE;
96-
static gboolean center_new_windows = FALSE;
96+
static MetaPlacementMode new_window_placement_mode = META_PLACEMENT_MODE_AUTOMATIC;
9797
static gboolean attach_modal_dialogs = FALSE;
9898
static int num_workspaces = 4;
9999
static gboolean workspace_cycle = FALSE;
@@ -270,6 +270,13 @@ static MetaEnumPreference preferences_enum[] =
270270
},
271271
&focus_mode,
272272
},
273+
{
274+
{ "placement-mode",
275+
SCHEMA_MUFFIN,
276+
META_PREF_NEW_WINDOW_PLACEMENT_MODE,
277+
},
278+
&new_window_placement_mode,
279+
},
273280
{
274281
{ "visual-bell-type",
275282
SCHEMA_GENERAL,
@@ -324,13 +331,6 @@ static MetaBoolPreference preferences_bool[] =
324331
},
325332
&attach_modal_dialogs,
326333
},
327-
{
328-
{ "center-new-windows",
329-
SCHEMA_MUFFIN,
330-
META_PREF_CENTER_NEW_WINDOWS,
331-
},
332-
&center_new_windows,
333-
},
334334
{
335335
{ "raise-on-click",
336336
SCHEMA_GENERAL,
@@ -1311,10 +1311,10 @@ meta_prefs_get_focus_new_windows (void)
13111311
return focus_new_windows;
13121312
}
13131313

1314-
gboolean
1315-
meta_prefs_get_center_new_windows (void)
1314+
MetaPlacementMode
1315+
meta_prefs_get_new_window_placement_mode (void)
13161316
{
1317-
return center_new_windows;
1317+
return new_window_placement_mode;
13181318
}
13191319

13201320
gboolean
@@ -1850,8 +1850,8 @@ meta_preference_to_string (MetaPreference pref)
18501850
case META_PREF_FOCUS_NEW_WINDOWS:
18511851
return "FOCUS_NEW_WINDOWS";
18521852

1853-
case META_PREF_CENTER_NEW_WINDOWS:
1854-
return "CENTER_NEW_WINDOWS";
1853+
case META_PREF_NEW_WINDOW_PLACEMENT_MODE:
1854+
return "NEW_WINDOW_PLACEMENT_MODE";
18551855

18561856
case META_PREF_ATTACH_MODAL_DIALOGS:
18571857
return "ATTACH_MODAL_DIALOGS";

src/core/window-private.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -238,6 +238,7 @@ struct _MetaWindow
238238
guint maximize_horizontally_after_placement : 1;
239239
guint maximize_vertically_after_placement : 1;
240240
guint minimize_after_placement : 1;
241+
guint move_after_placement : 1;
241242

242243
/* The current tile mode */
243244
MetaTileMode tile_mode;

src/core/window.c

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1127,6 +1127,7 @@ _meta_window_shared_new (MetaDisplay *display,
11271127
window->maximize_horizontally_after_placement = FALSE;
11281128
window->maximize_vertically_after_placement = FALSE;
11291129
window->minimize_after_placement = FALSE;
1130+
window->move_after_placement = FALSE;
11301131
window->fullscreen = FALSE;
11311132
window->require_fully_onscreen = TRUE;
11321133
window->require_on_single_monitor = TRUE;
@@ -2631,6 +2632,14 @@ meta_window_show (MetaWindow *window)
26312632
timestamp = meta_display_get_current_time_roundtrip (window->display);
26322633

26332634
meta_window_focus (window, timestamp);
2635+
2636+
if (window->move_after_placement)
2637+
{
2638+
timestamp = meta_display_get_current_time_roundtrip (window->display);
2639+
meta_window_begin_grab_op(window, META_GRAB_OP_KEYBOARD_MOVING,
2640+
FALSE, timestamp);
2641+
window->move_after_placement = FALSE;
2642+
}
26342643
}
26352644
else if (display->x11_display)
26362645
{

src/meta/common.h

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -548,6 +548,25 @@ typedef enum
548548
META_LAYER_LAST = 8
549549
} MetaStackLayer;
550550

551+
552+
/**
553+
* MetaPlacementMode:
554+
* @META_PLACEMENT_MODE_AUTOMATIC: Automatic
555+
* @META_PLACEMENT_MODE_POINTER: Pointer
556+
* @META_PLACEMENT_MODE_MANUAL: Manual
557+
* @META_PLACEMENT_MODE_CENTER: Center
558+
*
559+
* How new windows should be placed.
560+
*/
561+
typedef enum
562+
{
563+
META_PLACEMENT_MODE_AUTOMATIC,
564+
META_PLACEMENT_MODE_POINTER,
565+
META_PLACEMENT_MODE_MANUAL,
566+
META_PLACEMENT_MODE_CENTER
567+
} MetaPlacementMode;
568+
569+
551570
/* MetaGravity: (skip)
552571
*
553572
* Identical to the corresponding gravity value macros from libX11.

src/meta/prefs.h

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -65,7 +65,7 @@
6565
* @META_PREF_WORKSPACES_ONLY_ON_PRIMARY: workspaces only on primary
6666
* @META_PREF_DRAGGABLE_BORDER_WIDTH: draggable border width
6767
* @META_PREF_AUTO_MAXIMIZE: auto-maximize
68-
* @META_PREF_CENTER_NEW_WINDOWS: center new windows
68+
* @META_PREF_NEW_WINDOW_PLACEMENT_MODE: new window placement mode
6969
* @META_PREF_DRAG_THRESHOLD: drag threshold
7070
* @META_PREF_LOCATE_POINTER: show pointer location
7171
* @META_PREF_GTK_THEME: gtk theme name
@@ -110,7 +110,7 @@ typedef enum
110110
META_PREF_WORKSPACES_ONLY_ON_PRIMARY,
111111
META_PREF_DRAGGABLE_BORDER_WIDTH,
112112
META_PREF_AUTO_MAXIMIZE,
113-
META_PREF_CENTER_NEW_WINDOWS,
113+
META_PREF_NEW_WINDOW_PLACEMENT_MODE,
114114
META_PREF_DRAG_THRESHOLD,
115115
META_PREF_LOCATE_POINTER,
116116
META_PREF_CHECK_ALIVE_TIMEOUT,
@@ -211,7 +211,7 @@ META_EXPORT
211211
gboolean meta_prefs_get_auto_maximize (void);
212212

213213
META_EXPORT
214-
gboolean meta_prefs_get_center_new_windows (void);
214+
MetaPlacementMode meta_prefs_get_new_window_placement_mode (void);
215215

216216
META_EXPORT
217217
gboolean meta_prefs_get_show_fallback_app_menu (void);

0 commit comments

Comments
 (0)