-
Notifications
You must be signed in to change notification settings - Fork 80
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Fix some remaining corner cases in the walk_window_list function.
- Loading branch information
Showing
1 changed file
with
48 additions
and
21 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -6699,38 +6699,65 @@ function gui_raise_window(cid) { | |
}); | ||
} | ||
|
||
// Unfortunately DOM window.focus doesn't actually focus the window, so we | ||
// have to use the chrome API | ||
function gui_raise_pd_window() { | ||
pd_window.window.focus(); | ||
} | ||
|
||
// [email protected] 2022-11-09: reimplemented this function to make it | ||
// work with newer nw.js (should also work with older ones) | ||
|
||
// ag: reworked again to deal with all pesky corner cases were some | ||
// entries in the patchwin array may not actually point to existing | ||
// windows anymore | ||
function walk_window_list(cid, offset) { | ||
/* | ||
post("walk_window_list patchwin=" + patchwin + | ||
" data[cid]=" + patchwin[cid] + | ||
" length=" + Object.keys(patchwin).length + | ||
" value_at_index_0=" + Object.keys(patchwin)[0]); | ||
*/ | ||
var i, next, match = -1; | ||
var win_array_length = Object.keys(patchwin).length; | ||
for (i = 0; i < win_array_length; i++) { | ||
if (Object.keys(patchwin)[i] === cid) { | ||
match = i; | ||
break; | ||
var keys = Object.keys(patchwin); | ||
var len = keys.length; | ||
|
||
function find_window(cid) { | ||
for (var i = 0; i < len; i++) { | ||
if (keys[i] === cid) { | ||
return i; | ||
} | ||
} | ||
return -1; | ||
} | ||
|
||
function next(i) { | ||
// cycle through all indices | ||
return ((i+offset) % len + len) % len; | ||
} | ||
|
||
function find_next_window(i) { | ||
var found = false; | ||
var count = 0; | ||
while (!found && count < len) { | ||
// check that the window actually exists | ||
gui(keys[i]).get_nw_window(function(nw_win) { | ||
found = true; | ||
}); | ||
if (found) { | ||
return i; | ||
} | ||
// if it doesn't, check the next one | ||
i = next(i); | ||
count++; | ||
} | ||
// if we come here, we cycled through all the entries and none | ||
// of the windows still existed, bail out with failure | ||
return -1; | ||
} | ||
|
||
var match = find_window(cid); | ||
if (match !== -1) { | ||
next = (((match + offset) % win_array_length) // modulo... | ||
+ win_array_length) % win_array_length; // handle negatives | ||
gui_raise_window(Object.keys(patchwin)[next]); | ||
var next = find_next_window(next(match)); | ||
//post("match: "+match+" next: "+next+" cid: "+keys[next]); | ||
gui_raise_window(keys[next]); | ||
} else if (cid === "pd_window" && Object.keys(patchwin).length > 0) { | ||
// for Windows and Linux, fall back here if we are passing | ||
// "pd_window" from the main window (see pd_m.win.nextwin in index.js) | ||
gui_raise_window(Object.keys(patchwin) | ||
[(offset === 1 ? 0 : Object.keys(patchwin).length - 1)]) | ||
// go to first or last window if invoked from the main window | ||
var match = offset === 1 ? 0 : len-1; | ||
next = find_next_window(match); | ||
//post("match: : pd_window next: "+next+" cid: "+keys[next]); | ||
gui_raise_window(keys[next]); | ||
} else { | ||
post("error: cannot find last focused window."); | ||
} | ||
|