Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
32 commits
Select commit Hold shift + click to select a range
bc6d5d3
gwl: Add initial overflow support through sliding
anaximeno Jan 10, 2026
c6d8ccb
gwl: Scroll to focused app when a new one is added or when changing w…
anaximeno Jan 11, 2026
f7d01cb
gwl: Avoid trying to remove slide timer multiple times
anaximeno Jan 11, 2026
a79bb46
gwl: Properly integrate with the scroll-behavior settings
anaximeno Jan 11, 2026
6f440aa
gwl: Avoid trying to remove the scroll to focused app deboucer timer …
anaximeno Jan 11, 2026
9839b65
gwl: Listen to the scrollBox allocation signal to update the scroll b…
anaximeno Jan 11, 2026
c0798a7
gwl: Make sure to scroll to the focused app group on workspace switched
anaximeno Jan 11, 2026
9a5efcc
gwl: Refactor the scroll logic to its own class
anaximeno Jan 17, 2026
a86bdc8
gwl: Improve scroll to item implementation
anaximeno Jan 17, 2026
6b737e3
gwl: Extract app group scroll box to its own module
anaximeno Jan 17, 2026
c3039af
gwl: Disable actions if panel edit mode is enabled and update classe…
anaximeno Jan 17, 2026
82630e9
gwl: Debounce calls to updateScrollVisibility to avoid it being calle…
anaximeno Jan 18, 2026
051b7ec
gwl: Define style in proper cinnamon theme file instead of in-code
anaximeno Jan 18, 2026
8895d86
gwl: Update scroll button theme
anaximeno Jan 19, 2026
b0bdc3c
gwl: Implementation using the native St.ScrollView
anaximeno Jan 21, 2026
ece5b29
gwl: Update scroll police depending on the orientation and make sure …
anaximeno Jan 21, 2026
d2caa0d
gwl: Fix handleDragOver positioning for the scrollview based implemen…
anaximeno Jan 21, 2026
dc16a31
Update scrollbox vfade/hfade theme defaults
anaximeno Jan 31, 2026
f70951b
gwl: Adjust min_size setting for lateral panels
anaximeno Feb 9, 2026
8198512
gwl: Only set appGroup focus if app actually has focus
anaximeno Feb 16, 2026
162eb58
gwl: Improve the scroll to last focused app
anaximeno Feb 16, 2026
ed01ce7
gwl: Remove important attr from the scrollbox style
anaximeno Feb 17, 2026
7290024
gwl: Improve scroll to last focused
anaximeno Feb 17, 2026
13deb3b
gwl: Improve scroll handling to work better with previous scroll options
anaximeno Feb 23, 2026
2101b6b
Merge branch 'master' into gwl/add-support-for-slide-on-overflow
anaximeno Feb 25, 2026
9299515
gwl: Remove unused import
anaximeno Feb 25, 2026
1b0f268
gwl: Bring back slider buttons
anaximeno Mar 7, 2026
9955b7d
gwl: Fix scroll handling and workspace scrollbox destroy process
anaximeno Mar 12, 2026
9f894c8
gwl: Improve edge slide area and style handling
anaximeno Mar 12, 2026
37c4932
gwl: Add option to enable/disable slide to focused app button
anaximeno Mar 12, 2026
473aa16
gwl: Use xsi-pan icons instead of the arrow icons
anaximeno Mar 12, 2026
8316441
gwl: Handle possible undefined or null this.state cases
anaximeno Mar 17, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
29 changes: 29 additions & 0 deletions data/theme/cinnamon-sass/widgets/_windowlist.scss
Original file line number Diff line number Diff line change
Expand Up @@ -107,6 +107,35 @@
&-notifications-badge-label {
font-size: 12px;
}

&-scrollbox {
&-scrollview {
&.vfade {
-st-vfade-offset: 68px;
-st-hfade-offset: 0;
}
&.hfade {
-st-hfade-offset: 68px;
-st-vfade-offset: 0;
}
}

&-button {
&-start,
&-end,
&-up,
&-down {
margin: 0;
padding: 0;
min-width: 15px;
min-height: 20px;
}

&-icon {
icon-size: $scalable_icon_size;
}
}
}
}

// classic window list
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -375,10 +375,6 @@ var AppGroup = class AppGroup {
getPreferredWidth(actor, forHeight, alloc) {
const [iconMinSize, iconNaturalSize] = this.iconBox.get_preferred_width(forHeight);
const [labelMinSize, labelNaturalSize] = this.label.get_preferred_width(forHeight);
// The label text starts in the center of the icon, so we should allocate the space
// needed for the icon plus the space needed for(label - icon/2)
alloc.min_size = 1 * global.ui_scale;

const {appId} = this.groupState;

const allocateForLabel = this.labelVisiblePref ||
Expand All @@ -393,16 +389,18 @@ var AppGroup = class AppGroup {
} else {
alloc.natural_size = iconNaturalSize + 6 * global.ui_scale;
}
alloc.min_size = alloc.natural_size;
} else {
alloc.natural_size = this.state.trigger('getPanelHeight');
alloc.min_size = 1 * global.ui_scale;
}
}

getPreferredHeight(actor, forWidth, alloc) {
let [iconMinSize, iconNaturalSize] = this.iconBox.get_preferred_height(forWidth);
let [labelMinSize, labelNaturalSize] = this.label.get_preferred_height(forWidth);
alloc.min_size = Math.min(iconMinSize, labelMinSize);
alloc.natural_size = Math.max(iconNaturalSize, labelNaturalSize);
alloc.min_size = alloc.natural_size;
}

allocate(actor, box, flags) {
Expand Down Expand Up @@ -555,7 +553,7 @@ var AppGroup = class AppGroup {
}

onEnter() {
if (this.state.panelEditMode) return false;
if (this.state.panelEditMode || this.state.scrollActive) return false;

this.actor.add_style_pseudo_class('hover');

Expand Down Expand Up @@ -642,7 +640,7 @@ var AppGroup = class AppGroup {
const {appId, metaWindows, lastFocused} = this.groupState;

if (hasFocus === undefined) {
hasFocus = this.workspaceState.lastFocusedApp === appId;
hasFocus = this.workspaceState.lastFocusedApp === appId && getFocusState(lastFocused);
}

// If any of the windows associated with our app have focus,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -110,7 +110,7 @@ class PinnedFavs {
const currentWorkspace = this.params.state.trigger('getCurrentWorkspace');
const newFavorites = [];
let refActorFound = false;
currentWorkspace.actor.get_children().forEach( (actor, i) => {
currentWorkspace.container.get_children().forEach( (actor, i) => {
const appGroup = currentWorkspace.appGroups.find( appGroup => appGroup.actor === actor );
if (!appGroup) return;
const {app, appId, isFavoriteApp} = appGroup.groupState;
Expand Down Expand Up @@ -254,6 +254,7 @@ class GroupedWindowListApplet extends Applet.Applet {
removeFavorite: (id) => this.pinnedFavorites.removeFavorite(id),
getFavorites: () => this.pinnedFavorites._favorites,
cycleWindows: (e, source) => this.handleScroll(e, source),
handleScroll: (e) => this.handleScroll(e),
openAbout: () => this.openAbout(),
configureApplet: () => this.configureApplet(),
removeApplet: (event) => this.confirmRemoveApplet(event)
Expand Down Expand Up @@ -300,7 +301,7 @@ class GroupedWindowListApplet extends Applet.Applet {
bindSettings() {
const settingsProps = [
{key: 'group-apps', value: 'groupApps', cb: this.refreshAllWorkspaces},
{key: 'scroll-behavior', value: 'scrollBehavior', cb: null},
{key: 'list-scroll-behavior', value: 'scrollBehavior', cb: null},
{key: 'left-click-action', value: 'leftClickAction', cb: null},
{key: 'middle-click-action', value: 'middleClickAction', cb: null},
{key: 'show-all-workspaces', value: 'showAllWorkspaces', cb: this.refreshAllWorkspaces},
Expand All @@ -314,6 +315,7 @@ class GroupedWindowListApplet extends Applet.Applet {
{key: 'enable-window-count-badges', value: 'enableWindowCountBadges', cb: this.onEnableWindowCountBadgeChange},
{key: 'enable-notification-badges', value: 'enableNotificationBadges', cb: this.onEnableNotificationsChange},
{key: 'enable-app-button-dragging', value: 'enableDragging', cb: this.draggableSettingChanged},
{key: 'enable-slide-to-focused-app-button', value: 'enableSlideToFocusedAppButton', cb: null},
{key: 'thumbnail-scroll-behavior', value: 'thumbnailScrollBehavior', cb: null},
{key: 'show-thumbnails', value: 'showThumbs', cb: this.updateVerticalThumbnailState},
{key: 'animate-thumbnails', value: 'animateThumbs', cb: null},
Expand Down Expand Up @@ -794,14 +796,26 @@ class GroupedWindowListApplet extends Applet.Applet {
&& St.Widget.get_default_direction () === St.TextDirection.RTL;

const axis = this.state.isHorizontal ? [x, 'x2'] : [y, 'y2'];

let adjustmentValue = 0;
if (currentWorkspace.scrollBox) {
const adjustment = this.state.isHorizontal ?
currentWorkspace.scrollBox.scrollView.get_hscroll_bar().get_adjustment() :
currentWorkspace.scrollBox.scrollView.get_vscroll_bar().get_adjustment();
adjustmentValue = adjustment.get_value();
}

// Add scroll position to current coordinate
axis[0] += adjustmentValue;

if(rtl_horizontal)
axis[0] = this.actor.width - axis[0];

// save data on drag start
if(this.state.dragging.posList === null){
this.state.dragging.isForeign = !(source instanceof AppGroup);
this.state.dragging.posList = [];
currentWorkspace.actor.get_children().forEach( child => {
currentWorkspace.container.get_children().forEach( child => {
let childPos;
if(rtl_horizontal)
childPos = this.actor.width - child.get_allocation_box()['x1'];
Expand All @@ -815,7 +829,7 @@ class GroupedWindowListApplet extends Applet.Applet {
let pos = 0;
while(pos < this.state.dragging.posList.length && axis[0] > this.state.dragging.posList[pos])
pos++;

let favLength = 0;
for (const appGroup of currentWorkspace.appGroups) {
if(appGroup.groupState.isFavoriteApp)
Expand All @@ -835,21 +849,21 @@ class GroupedWindowListApplet extends Applet.Applet {

if(this.state.dragging.isForeign) {
if (this.state.dragging.dragPlaceholder)
currentWorkspace.actor.set_child_at_index(this.state.dragging.dragPlaceholder.actor, pos);
currentWorkspace.container.set_child_at_index(this.state.dragging.dragPlaceholder.actor, pos);
else {
const iconSize = this.getPanelIconSize() * global.ui_scale;
this.state.dragging.dragPlaceholder = new DND.GenericDragPlaceholderItem();
this.state.dragging.dragPlaceholder.child.width = iconSize;
this.state.dragging.dragPlaceholder.child.height = iconSize;
currentWorkspace.actor.insert_child_at_index(
currentWorkspace.container.insert_child_at_index(
this.state.dragging.dragPlaceholder.actor,
this.state.dragging.pos
);
this.state.dragging.dragPlaceholder.animateIn();
}
}
else
currentWorkspace.actor.set_child_at_index(source.actor, pos);
currentWorkspace.container.set_child_at_index(source.actor, pos);
}

if(this.state.dragging.isForeign)
Expand Down
Loading
Loading