Merge lp:~dgadomski/compiz/remember-focus-improved into lp:compiz/0.9.12

Proposed by Dariusz Gadomski
Status: Needs review
Proposed branch: lp:~dgadomski/compiz/remember-focus-improved
Merge into: lp:compiz/0.9.12
Diff against target: 162 lines (+66/-0)
5 files modified
include/core/screen.h (+1/-0)
metadata/core.xml.in (+5/-0)
src/privatescreen.h (+17/-0)
src/screen.cpp (+42/-0)
src/window.cpp (+1/-0)
To merge this branch: bzr merge lp:~dgadomski/compiz/remember-focus-improved
Reviewer Review Type Date Requested Status
PS Jenkins bot (community) continuous-integration Needs Fixing
Brandon Schaefer (community) Needs Fixing
Marco Trevisan (Treviño) Needs Information
Compiz Maintainers Pending
Christopher Townsend Pending
Review via email: mp+245211@code.launchpad.net

This proposal supersedes a proposal from 2014-12-16.

Description of the change

Adds handling for the unity launcher initiated focusing. In CompWindow::activate() call the window id is cached for the appropriate viewport.

Additionally I have included Brandon's fix for LP: #1398512.

Fixes: LP: #1393020, LP: #1398512.

To post a comment you must log in.
Revision history for this message
Christopher Townsend (townsend) wrote : Posted in a previous version of this proposal

Please rebase to what's in lp:compiz now as there are 2 text conflicts when merging your branch. Once done, we'll continue reviewing.

review: Needs Fixing
Revision history for this message
Christopher Townsend (townsend) wrote : Posted in a previous version of this proposal

Also, I'm targeting bug #1125442 instead of the other two because those other two were fixed in reverting the original fix and this MP still fixes the original bug without (hopefully) causing any regressions.

Revision history for this message
Dariusz Gadomski (dgadomski) wrote :

Please find the rebased version of the patches.

Revision history for this message
Marco Trevisan (Treviño) (3v1n0) :
review: Needs Information
Revision history for this message
Brandon Schaefer (brandontschaefer) wrote :

One thing as well, new features like this need to be disabled by default. Though its a nice change it does still change the default behavior which means it needs to be false:

23 + <default>true</default>

review: Needs Fixing
Revision history for this message
Brandon Schaefer (brandontschaefer) wrote :

If i open an always on top window on the Top Left workspace then focus a window below, then move to the Top Right workspace. Then start moving randomly to any workspace (with out letting go) Doing this a few times and the always on top window gets focus... This seems to be not a wanted behavior.

review: Needs Fixing
Revision history for this message
PS Jenkins bot (ps-jenkins) wrote :

FAILED: Continuous integration, rev:3920
No commit message was specified in the merge proposal. Click on the following link and set the commit message (if you want a jenkins rebuild you need to trigger it yourself):
https://code.launchpad.net/~dgadomski/compiz/remember-focus-improved/+merge/245211/+edit-commit-message

http://jenkins.qa.ubuntu.com/job/compiz-ci/58/
Executed test runs:
    FAILURE: http://jenkins.qa.ubuntu.com/job/compiz-wily-amd64-ci/3/console
    FAILURE: http://jenkins.qa.ubuntu.com/job/compiz-wily-armhf-ci/3/console
    FAILURE: http://jenkins.qa.ubuntu.com/job/compiz-wily-i386-ci/3/console

Click here to trigger a rebuild:
http://s-jenkins.ubuntu-ci:8080/job/compiz-ci/58/rebuild

review: Needs Fixing (continuous-integration)
Revision history for this message
Sam Spilsbury (smspillaz) wrote :

Is this branch still in use today?

Unmerged revisions

3920. By Brandon Schaefer

When you move through a workspace, it ends up saving the ActiveWindow() under
that workspace. This is incorrect, since that window doesn't belong to that
workspace.

The fix, is simple to double check a window belong to the workspace we are
attempting to restore focus to.

Fixes: 1398512

3919. By Dariusz Gadomski

CompScreen: Fix "Remember Focus" interaction with Unity launcher.

Adds an additional Window caching on explicit window activation.

Fixes: 1393020

3918. By Dariusz Gadomski

CompScreen: Save focused window id before changing viewport.

This allows to restore focus after returning to one of the previous viewport positions.
Introduces a new setting (General Options / Focus & Raise Behaviour / Remember Focus)
Fixes: LP #1125442

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
1=== modified file 'include/core/screen.h'
2--- include/core/screen.h 2012-12-03 10:36:42 +0000
3+++ include/core/screen.h 2014-12-19 16:42:32 +0000
4@@ -417,6 +417,7 @@
5 virtual void setNextActiveWindow(Window id) = 0;
6 virtual Window getNextActiveWindow() const = 0;
7 virtual CompWindow * focusTopMostWindow () = 0;
8+ virtual void saveViewportFocus (const CompPoint& vp, Window id) = 0;
9 // End of "internal use only" functions
10
11 protected:
12
13=== modified file 'metadata/core.xml.in'
14--- metadata/core.xml.in 2014-12-02 19:37:10 +0000
15+++ metadata/core.xml.in 2014-12-19 16:42:32 +0000
16@@ -141,6 +141,11 @@
17 <_long>Focus prevention windows</_long>
18 <default>any</default>
19 </option>
20+ <option type="bool" name="remember_vp_focus">
21+ <_short>Remember Focus</_short>
22+ <_long>Remember Focus Per Workspace</_long>
23+ <default>true</default>
24+ </option>
25 </group>
26 <group>
27 <_short>Key bindings</_short>
28
29=== modified file 'src/privatescreen.h'
30--- src/privatescreen.h 2014-12-02 19:37:10 +0000
31+++ src/privatescreen.h 2014-12-19 16:42:32 +0000
32@@ -47,6 +47,7 @@
33
34 #include "core_options.h"
35
36+#include <map>
37 #include <set>
38
39 CompPlugin::VTable * getCoreVTable ();
40@@ -89,6 +90,17 @@
41 unsigned int viewportY;
42 };
43
44+// to allow using CompPoint as std::map keys
45+struct PointCompare
46+{
47+ bool operator () (const CompPoint& p1, const CompPoint& p2)
48+ {
49+ if (p1.x () == p2.x ())
50+ return p1.y () < p2.y ();
51+ return p1.x () < p2.x ();
52+ }
53+};
54+
55 namespace compiz
56 {
57 namespace core
58@@ -1071,6 +1083,7 @@
59 virtual void setNextActiveWindow(Window id);
60 virtual Window getNextActiveWindow() const;
61 virtual CompWindow * focusTopMostWindow ();
62+ virtual void saveViewportFocus (const CompPoint& vp, Window id);
63
64 public :
65
66@@ -1165,6 +1178,8 @@
67
68 bool handlePingTimeout();
69
70+ CompWindow * findViewportFocusCandidate ();
71+
72 Window below;
73 CompTimer autoRaiseTimer_;
74 Window autoRaiseWindow_;
75@@ -1175,6 +1190,8 @@
76 PrivateScreen privateScreen;
77 compiz::private_screen::WindowManager windowManager;
78 unsigned int showingDesktopMask_;
79+ typedef std::map<CompPoint, Window, PointCompare> FocusMap;
80+ FocusMap savedViewportFocus;
81 };
82
83 #endif
84
85=== modified file 'src/screen.cpp'
86--- src/screen.cpp 2014-12-02 19:37:10 +0000
87+++ src/screen.cpp 2014-12-19 16:42:32 +0000
88@@ -2688,6 +2688,11 @@
89 }
90 }
91 }
92+ else
93+ {
94+ // check if there was a focused window stored
95+ focus = findViewportFocusCandidate ();
96+ }
97
98 if (!focus)
99 {
100@@ -3784,6 +3789,8 @@
101 if (!tx && !ty)
102 return;
103
104+ saveViewportFocus (privateScreen.viewPort.vp, activeWindow ());
105+
106 privateScreen.viewPort.vp.setX (privateScreen.viewPort.vp.x () + tx);
107 privateScreen.viewPort.vp.setY (privateScreen.viewPort.vp.y () + ty);
108
109@@ -5155,6 +5162,41 @@
110 return true;
111 }
112
113+void
114+CompScreenImpl::saveViewportFocus (const CompPoint& vp, Window id)
115+{
116+ if (privateScreen.optionGetRememberVpFocus () &&
117+ (privateScreen.optionGetHsize () * privateScreen.optionGetVsize () > 1))
118+ {
119+ if (id != None)
120+ {
121+ savedViewportFocus[vp] = id;
122+ }
123+ }
124+}
125+
126+CompWindow *
127+CompScreenImpl::findViewportFocusCandidate ()
128+{
129+ if (privateScreen.optionGetRememberVpFocus () &&
130+ (privateScreen.optionGetHsize () * privateScreen.optionGetVsize () > 1))
131+ {
132+ FocusMap::iterator it = savedViewportFocus.find (privateScreen.viewPort.vp);
133+ if (it != savedViewportFocus.end ())
134+ {
135+ Window id = it->second;
136+ CompWindow *const w = findWindow (id);
137+ savedViewportFocus.erase (it);
138+
139+ if (w->defaultViewport () != privateScreen.viewPort.vp)
140+ return NULL;
141+
142+ return findWindow (id);
143+ }
144+ }
145+ return NULL;
146+}
147+
148 CompScreenImpl::~CompScreenImpl ()
149 {
150 privateScreen.startupSequence.removeAllSequences ();
151
152=== modified file 'src/window.cpp'
153--- src/window.cpp 2014-09-16 19:37:23 +0000
154+++ src/window.cpp 2014-12-19 16:42:32 +0000
155@@ -4484,6 +4484,7 @@
156 priv->ensureWindowVisibility ();
157 updateAttributes (CompStackingUpdateModeAboveFullscreen);
158 moveInputFocusTo ();
159+ screen->saveViewportFocus (defaultViewport (), id ());
160 }
161
162 #define PVertResizeInc (1 << 0)

Subscribers

People subscribed via source and target branches