Use new PiP icons when available

Use the new "pip-in" and "pip-out" GNOME symbolic icons if user theme has them for enter/leave floating mode button. When icon is unavailable on the host, old icon will be used instead.
This commit is contained in:
Rafał Dzięgiel
2021-06-23 14:24:59 +02:00
parent bad836cc6d
commit 5018b3a28a
3 changed files with 52 additions and 8 deletions

View File

@@ -1,4 +1,4 @@
const { Gio, GLib, GObject, Gtk } = imports.gi; const { Gio, GLib, GObject, Gdk, Gtk } = imports.gi;
const Debug = imports.src.debug; const Debug = imports.src.debug;
const FileOps = imports.src.fileOps; const FileOps = imports.src.fileOps;
const Misc = imports.src.misc; const Misc = imports.src.misc;
@@ -144,15 +144,26 @@ class ClapperAppBase extends Gtk.Application
_onIconThemeChanged(gtkSettings) _onIconThemeChanged(gtkSettings)
{ {
const iconTheme = gtkSettings.gtk_icon_theme_name; const iconThemeName = gtkSettings.gtk_icon_theme_name;
const window = this.active_window; const window = this.active_window;
const hasAdwIcons = window.has_css_class('adwicons'); const hasAdwIcons = window.has_css_class('adwicons');
if(iconTheme === 'Adwaita' || iconTheme === 'Default') { if(iconThemeName === 'Adwaita' || iconThemeName === 'Default') {
if(!hasAdwIcons) if(!hasAdwIcons)
window.add_css_class('adwicons'); window.add_css_class('adwicons');
} }
else if(hasAdwIcons) else if(hasAdwIcons)
window.remove_css_class('adwicons'); window.remove_css_class('adwicons');
const display = Gdk.Display.get_default();
if(!display) return;
const iconTheme = Gtk.IconTheme.get_for_display(display);
if(!iconTheme) return;
const { headerBar } = window.child.revealerTop;
if(!headerBar) return;
headerBar._onIconThemeChanged(iconTheme);
} }
}); });

View File

@@ -9,17 +9,20 @@ class ClapperHeaderBar extends HeaderBarBase
this.activate_action(`window.${action}`, null); this.activate_action(`window.${action}`, null);
} }
_onFloatButtonClicked() _onFloatButtonClicked(button)
{ {
const clapperWidget = this.root.child; const clapperWidget = this.root.child;
const { controlsRevealer } = clapperWidget;
clapperWidget.controlsRevealer.toggleReveal(); controlsRevealer.toggleReveal();
/* Reset timer to not disappear during click */ /* Reset timer to not disappear during click */
clapperWidget._setHideControlsTimeout(); clapperWidget._setHideControlsTimeout();
this._updateFloatIcon(!controlsRevealer.reveal_child);
} }
_onFullscreenButtonClicked() _onFullscreenButtonClicked(button)
{ {
this.root.fullscreen(); this.root.fullscreen();
} }

View File

@@ -22,6 +22,7 @@ class ClapperHeaderBarBase extends Gtk.Box
this.isMaximized = false; this.isMaximized = false;
this.isMenuOnLeft = true; this.isMenuOnLeft = true;
this.hasPipIcons = false;
const clapperPath = Misc.getClapperPath(); const clapperPath = Misc.getClapperPath();
const uiBuilder = Gtk.Builder.new_from_file( const uiBuilder = Gtk.Builder.new_from_file(
@@ -213,17 +214,46 @@ class ClapperHeaderBarBase extends Gtk.Box
return button; return button;
} }
_updateFloatIcon(isFloating)
{
const floatButton = this.extraButtonsBox.get_first_child();
if(!floatButton) return;
const iconName = (!this.hasPipIcons)
? 'go-bottom-symbolic'
: (isFloating)
? 'pip-out-symbolic'
: 'pip-in-symbolic';
if(floatButton.icon_name !== iconName)
floatButton.icon_name = iconName;
}
_onWindowButtonActivate(action) _onWindowButtonActivate(action)
{ {
} }
_onFloatButtonClicked() _onFloatButtonClicked(button)
{ {
} }
_onFullscreenButtonClicked() _onFullscreenButtonClicked(button)
{ {
} }
_onIconThemeChanged(iconTheme)
{
/* Those icons are relatively new,
* so check if theme has them */
this.hasPipIcons = (
iconTheme.has_icon('pip-in-symbolic')
&& iconTheme.has_icon('pip-out-symbolic')
);
const { controlsRevealer } = this.root.child;
this._updateFloatIcon(!controlsRevealer.reveal_child);
}
}); });
var HeaderBarPopover = GObject.registerClass( var HeaderBarPopover = GObject.registerClass(