windowManager: Implement tile previews
Mutter now delegates tile previews to compositor plugins, so add a simple implementation based on the UI previously provided by mutter. https://bugzilla.gnome.org/show_bug.cgi?id=665758
This commit is contained in:
parent
2663e1be5d
commit
6d93c8b3fd
@ -1877,6 +1877,27 @@ StScrollBar StButton#vhandle:active {
|
|||||||
border-radius: 8px;
|
border-radius: 8px;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Tile previews */
|
||||||
|
.tile-preview {
|
||||||
|
background-color: rgba(74, 144, 217, 0.35);
|
||||||
|
border: 1px solid #4a90d9; /* Adwaita selected bg color */
|
||||||
|
}
|
||||||
|
|
||||||
|
.tile-preview-left.on-primary {
|
||||||
|
/* keep in sync with -panel-corner-radius */
|
||||||
|
border-radius: 6px 0 0 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
.tile-preview-right.on-primary {
|
||||||
|
/* keep in sync with -panel-corner-radius */
|
||||||
|
border-radius: 0 6px 0 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
.tile-preview-left.tile-preview-right.on-primary {
|
||||||
|
/* keep in sync with -panel-corner-radius */
|
||||||
|
border-radius: 6px 6px 0 0;
|
||||||
|
}
|
||||||
|
|
||||||
/* Modal Dialogs */
|
/* Modal Dialogs */
|
||||||
|
|
||||||
/* Dialog Subject Text Style */
|
/* Dialog Subject Text Style */
|
||||||
|
@ -358,6 +358,55 @@ const WorkspaceTracker = new Lang.Class({
|
|||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
|
const TilePreview = new Lang.Class({
|
||||||
|
Name: 'TilePreview',
|
||||||
|
|
||||||
|
_init: function() {
|
||||||
|
this.actor = new St.Widget({ visible: false });
|
||||||
|
global.window_group.add_actor(this.actor);
|
||||||
|
|
||||||
|
this._showing = false;
|
||||||
|
},
|
||||||
|
|
||||||
|
show: function(window, tileRect, monitorIndex) {
|
||||||
|
let windowActor = window.get_compositor_private();
|
||||||
|
if (!windowActor)
|
||||||
|
return;
|
||||||
|
|
||||||
|
global.window_group.set_child_below_sibling(this.actor, windowActor);
|
||||||
|
|
||||||
|
this._updateStyle(monitorIndex, tileRect);
|
||||||
|
|
||||||
|
this.actor.set_size(tileRect.width, tileRect.height);
|
||||||
|
this.actor.set_position(tileRect.x, tileRect.y);
|
||||||
|
|
||||||
|
this._showing = true;
|
||||||
|
this.actor.show();
|
||||||
|
},
|
||||||
|
|
||||||
|
hide: function() {
|
||||||
|
if (!this._showing)
|
||||||
|
return;
|
||||||
|
|
||||||
|
this._showing = false;
|
||||||
|
this.actor.hide();
|
||||||
|
},
|
||||||
|
|
||||||
|
_updateStyle: function(monitorIndex, tileRect) {
|
||||||
|
let monitor = Main.layoutManager.monitors[monitorIndex];
|
||||||
|
|
||||||
|
let styles = ['tile-preview'];
|
||||||
|
if (monitorIndex == Main.layoutManager.primaryIndex)
|
||||||
|
styles.push('on-primary');
|
||||||
|
if (tileRect.x == monitor.x)
|
||||||
|
styles.push('tile-preview-left');
|
||||||
|
if (tileRect.x + tileRect.width == monitor.x + monitor.width)
|
||||||
|
styles.push('tile-preview-right');
|
||||||
|
|
||||||
|
this.actor.style_class = styles.join(' ');
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
const WindowManager = new Lang.Class({
|
const WindowManager = new Lang.Class({
|
||||||
Name: 'WindowManager',
|
Name: 'WindowManager',
|
||||||
|
|
||||||
@ -388,6 +437,8 @@ const WindowManager = new Lang.Class({
|
|||||||
}));
|
}));
|
||||||
|
|
||||||
this._shellwm.connect('switch-workspace', Lang.bind(this, this._switchWorkspace));
|
this._shellwm.connect('switch-workspace', Lang.bind(this, this._switchWorkspace));
|
||||||
|
this._shellwm.connect('show-tile-preview', Lang.bind(this, this._showTilePreview));
|
||||||
|
this._shellwm.connect('hide-tile-preview', Lang.bind(this, this._hideTilePreview));
|
||||||
this._shellwm.connect('minimize', Lang.bind(this, this._minimizeWindow));
|
this._shellwm.connect('minimize', Lang.bind(this, this._minimizeWindow));
|
||||||
this._shellwm.connect('maximize', Lang.bind(this, this._maximizeWindow));
|
this._shellwm.connect('maximize', Lang.bind(this, this._maximizeWindow));
|
||||||
this._shellwm.connect('unmaximize', Lang.bind(this, this._unmaximizeWindow));
|
this._shellwm.connect('unmaximize', Lang.bind(this, this._unmaximizeWindow));
|
||||||
@ -397,6 +448,8 @@ const WindowManager = new Lang.Class({
|
|||||||
this._shellwm.connect('confirm-display-change', Lang.bind(this, this._confirmDisplayChange));
|
this._shellwm.connect('confirm-display-change', Lang.bind(this, this._confirmDisplayChange));
|
||||||
|
|
||||||
this._workspaceSwitcherPopup = null;
|
this._workspaceSwitcherPopup = null;
|
||||||
|
this._tilePreview = null;
|
||||||
|
|
||||||
this.setCustomKeybindingHandler('switch-to-workspace-left',
|
this.setCustomKeybindingHandler('switch-to-workspace-left',
|
||||||
Shell.KeyBindingMode.NORMAL |
|
Shell.KeyBindingMode.NORMAL |
|
||||||
Shell.KeyBindingMode.OVERVIEW,
|
Shell.KeyBindingMode.OVERVIEW,
|
||||||
@ -1046,6 +1099,18 @@ const WindowManager = new Lang.Class({
|
|||||||
shellwm.completed_switch_workspace();
|
shellwm.completed_switch_workspace();
|
||||||
},
|
},
|
||||||
|
|
||||||
|
_showTilePreview: function(shellwm, window, tileRect, monitorIndex) {
|
||||||
|
if (!this._tilePreview)
|
||||||
|
this._tilePreview = new TilePreview();
|
||||||
|
this._tilePreview.show(window, tileRect, monitorIndex);
|
||||||
|
},
|
||||||
|
|
||||||
|
_hideTilePreview: function(shellwm) {
|
||||||
|
if (!this._tilePreview)
|
||||||
|
return;
|
||||||
|
this._tilePreview.hide();
|
||||||
|
},
|
||||||
|
|
||||||
_startAppSwitcher : function(display, screen, window, binding) {
|
_startAppSwitcher : function(display, screen, window, binding) {
|
||||||
/* prevent a corner case where both popups show up at once */
|
/* prevent a corner case where both popups show up at once */
|
||||||
if (this._workspaceSwitcherPopup != null)
|
if (this._workspaceSwitcherPopup != null)
|
||||||
|
@ -68,6 +68,12 @@ static void gnome_shell_plugin_kill_window_effects (MetaPlugin *plugin,
|
|||||||
MetaWindowActor *actor);
|
MetaWindowActor *actor);
|
||||||
static void gnome_shell_plugin_kill_switch_workspace (MetaPlugin *plugin);
|
static void gnome_shell_plugin_kill_switch_workspace (MetaPlugin *plugin);
|
||||||
|
|
||||||
|
static void gnome_shell_plugin_show_tile_preview (MetaPlugin *plugin,
|
||||||
|
MetaWindow *window,
|
||||||
|
MetaRectangle *tile_rect,
|
||||||
|
int tile_monitor);
|
||||||
|
static void gnome_shell_plugin_hide_tile_preview (MetaPlugin *plugin);
|
||||||
|
|
||||||
|
|
||||||
static gboolean gnome_shell_plugin_xevent_filter (MetaPlugin *plugin,
|
static gboolean gnome_shell_plugin_xevent_filter (MetaPlugin *plugin,
|
||||||
XEvent *event);
|
XEvent *event);
|
||||||
@ -132,6 +138,9 @@ gnome_shell_plugin_class_init (GnomeShellPluginClass *klass)
|
|||||||
plugin_class->kill_window_effects = gnome_shell_plugin_kill_window_effects;
|
plugin_class->kill_window_effects = gnome_shell_plugin_kill_window_effects;
|
||||||
plugin_class->kill_switch_workspace = gnome_shell_plugin_kill_switch_workspace;
|
plugin_class->kill_switch_workspace = gnome_shell_plugin_kill_switch_workspace;
|
||||||
|
|
||||||
|
plugin_class->show_tile_preview = gnome_shell_plugin_show_tile_preview;
|
||||||
|
plugin_class->hide_tile_preview = gnome_shell_plugin_hide_tile_preview;
|
||||||
|
|
||||||
plugin_class->xevent_filter = gnome_shell_plugin_xevent_filter;
|
plugin_class->xevent_filter = gnome_shell_plugin_xevent_filter;
|
||||||
plugin_class->keybinding_filter = gnome_shell_plugin_keybinding_filter;
|
plugin_class->keybinding_filter = gnome_shell_plugin_keybinding_filter;
|
||||||
|
|
||||||
@ -319,6 +328,21 @@ gnome_shell_plugin_kill_switch_workspace (MetaPlugin *plugin)
|
|||||||
_shell_wm_kill_switch_workspace (get_shell_wm());
|
_shell_wm_kill_switch_workspace (get_shell_wm());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
gnome_shell_plugin_show_tile_preview (MetaPlugin *plugin,
|
||||||
|
MetaWindow *window,
|
||||||
|
MetaRectangle *tile_rect,
|
||||||
|
int tile_monitor)
|
||||||
|
{
|
||||||
|
_shell_wm_show_tile_preview (get_shell_wm (), window, tile_rect, tile_monitor);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
gnome_shell_plugin_hide_tile_preview (MetaPlugin *plugin)
|
||||||
|
{
|
||||||
|
_shell_wm_hide_tile_preview (get_shell_wm ());
|
||||||
|
}
|
||||||
|
|
||||||
static gboolean
|
static gboolean
|
||||||
gnome_shell_plugin_xevent_filter (MetaPlugin *plugin,
|
gnome_shell_plugin_xevent_filter (MetaPlugin *plugin,
|
||||||
XEvent *xev)
|
XEvent *xev)
|
||||||
|
@ -35,6 +35,12 @@ void _shell_wm_kill_window_effects (ShellWM *wm,
|
|||||||
MetaWindowActor *actor);
|
MetaWindowActor *actor);
|
||||||
void _shell_wm_kill_switch_workspace (ShellWM *wm);
|
void _shell_wm_kill_switch_workspace (ShellWM *wm);
|
||||||
|
|
||||||
|
void _shell_wm_show_tile_preview (ShellWM *wm,
|
||||||
|
MetaWindow *window,
|
||||||
|
MetaRectangle *tile_rect,
|
||||||
|
int tile_monitor);
|
||||||
|
void _shell_wm_hide_tile_preview (ShellWM *wm);
|
||||||
|
|
||||||
gboolean _shell_wm_filter_keybinding (ShellWM *wm,
|
gboolean _shell_wm_filter_keybinding (ShellWM *wm,
|
||||||
MetaKeyBinding *binding);
|
MetaKeyBinding *binding);
|
||||||
|
|
||||||
|
@ -26,6 +26,8 @@ enum
|
|||||||
SWITCH_WORKSPACE,
|
SWITCH_WORKSPACE,
|
||||||
KILL_SWITCH_WORKSPACE,
|
KILL_SWITCH_WORKSPACE,
|
||||||
KILL_WINDOW_EFFECTS,
|
KILL_WINDOW_EFFECTS,
|
||||||
|
SHOW_TILE_PREVIEW,
|
||||||
|
HIDE_TILE_PREVIEW,
|
||||||
FILTER_KEYBINDING,
|
FILTER_KEYBINDING,
|
||||||
CONFIRM_DISPLAY_CHANGE,
|
CONFIRM_DISPLAY_CHANGE,
|
||||||
|
|
||||||
@ -117,6 +119,22 @@ shell_wm_class_init (ShellWMClass *klass)
|
|||||||
NULL, NULL, NULL,
|
NULL, NULL, NULL,
|
||||||
G_TYPE_NONE, 1,
|
G_TYPE_NONE, 1,
|
||||||
META_TYPE_WINDOW_ACTOR);
|
META_TYPE_WINDOW_ACTOR);
|
||||||
|
shell_wm_signals[SHOW_TILE_PREVIEW] =
|
||||||
|
g_signal_new ("show-tile-preview",
|
||||||
|
G_TYPE_FROM_CLASS (klass),
|
||||||
|
G_SIGNAL_RUN_LAST,
|
||||||
|
0, NULL, NULL, NULL,
|
||||||
|
G_TYPE_NONE, 3,
|
||||||
|
META_TYPE_WINDOW,
|
||||||
|
META_TYPE_RECTANGLE,
|
||||||
|
G_TYPE_INT);
|
||||||
|
shell_wm_signals[HIDE_TILE_PREVIEW] =
|
||||||
|
g_signal_new ("hide-tile-preview",
|
||||||
|
G_TYPE_FROM_CLASS (klass),
|
||||||
|
G_SIGNAL_RUN_LAST,
|
||||||
|
0,
|
||||||
|
NULL, NULL, NULL,
|
||||||
|
G_TYPE_NONE, 0);
|
||||||
shell_wm_signals[FILTER_KEYBINDING] =
|
shell_wm_signals[FILTER_KEYBINDING] =
|
||||||
g_signal_new ("filter-keybinding",
|
g_signal_new ("filter-keybinding",
|
||||||
G_TYPE_FROM_CLASS (klass),
|
G_TYPE_FROM_CLASS (klass),
|
||||||
@ -254,6 +272,22 @@ _shell_wm_kill_window_effects (ShellWM *wm,
|
|||||||
g_signal_emit (wm, shell_wm_signals[KILL_WINDOW_EFFECTS], 0, actor);
|
g_signal_emit (wm, shell_wm_signals[KILL_WINDOW_EFFECTS], 0, actor);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
_shell_wm_show_tile_preview (ShellWM *wm,
|
||||||
|
MetaWindow *window,
|
||||||
|
MetaRectangle *tile_rect,
|
||||||
|
int tile_monitor)
|
||||||
|
{
|
||||||
|
g_signal_emit (wm, shell_wm_signals[SHOW_TILE_PREVIEW], 0,
|
||||||
|
window, tile_rect, tile_monitor);
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
_shell_wm_hide_tile_preview (ShellWM *wm)
|
||||||
|
{
|
||||||
|
g_signal_emit (wm, shell_wm_signals[HIDE_TILE_PREVIEW], 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
void
|
void
|
||||||
_shell_wm_minimize (ShellWM *wm,
|
_shell_wm_minimize (ShellWM *wm,
|
||||||
|
Loading…
Reference in New Issue
Block a user