diff --git a/examples/modifierTrackerExperiments.js b/examples/modifierTrackerExperiments.js new file mode 100644 index 0000000..db918cd --- /dev/null +++ b/examples/modifierTrackerExperiments.js @@ -0,0 +1,71 @@ +var Extension = imports.misc.extensionUtils.extensions['paperwm@hedning:matrix.org']; +var Utils = Extension.imports.utils; +var Me = Extension.imports.examples.modifierTrackerExperiments; +var ModifierTracker = Extension.imports.modifierTracker; + +var Tiling = Extension.imports.tiling; +var Mainloop = imports.mainloop; +var Tweener = imports.ui.tweener; + +var source = null; +var scale = 1; + +function startZoom() { + source = Mainloop.timeout_add(350, () => { + log("Zoom!") + let space = Tiling.spaces.spaceOfWindow(global.display.focus_window) + const zoomed = space.actor; + space.visible.forEach(w => { + w.get_compositor_private().hide(); + w.clone.show(); + }) + zoomed.show() + zoomed.set_pivot_point(0.5,0.5) + // scale *= 0.99; + scale = 0.8 + Tweener.addTween(zoomed, { + transition: 'easeInOutQuad', + scale_x: scale, + scale_y: scale, + time: 0.500 + }) + // zoomed.set_scale(scale, scale); + // zoomed.set_pivot_point(space.selectedWindow.clone.x/zoomed.width, 0.5) + // startZoom(); + + }) +} + +function resetZoom() { + let space = Tiling.spaces.spaceOfWindow(global.display.focus_window) + Mainloop.source_remove(source) + const zoomed = space.actor; + Tweener.removeTweens(zoomed) + Tweener.addTween(zoomed, { + transition: 'easeInOutQuad', + scale_x: 1, + scale_y: 1, + time: 0.250, + onComplete: () => { + space.visible.forEach(w => { + w.get_compositor_private().show(); + w.clone.hide(); + }) + Tiling.ensureViewport(space.selectedWindow, space, true) + } + }) + // zoomed.set_scale(1,1) + scale = 1.0; +} + +var signals = new Utils.Signals(); + +// for fun and giggles +function enable() { + signals.connect(ModifierTracker, 'modifier-down', Utils.dynamic_function_ref("startZoom", Me)) + signals.connect(ModifierTracker, 'modifier-up', Utils.dynamic_function_ref("resetZoom", Me)) +} + +function disable() { + signals.destroy(); +} diff --git a/modifierTracker.js b/modifierTracker.js new file mode 100644 index 0000000..abdab9b --- /dev/null +++ b/modifierTracker.js @@ -0,0 +1,59 @@ +var Extension = imports.misc.extensionUtils.extensions['paperwm@hedning:matrix.org']; +var Utils = Extension.imports.utils; +var Me = Extension.imports.modifierTracker; +var Gdk = imports.gi.Gdk; +var Signals = imports.signals; +var Meta = imports.gi.Meta; + + +var trackedModifiers = [ + ["Super", Gdk.ModifierType.MOD4_MASK] +]; + +var keymap; +var prevState = 0; + +function stateChangedHandler() { + let curState = keymap.get_modifier_state() + /// A maze of different kind of mask, can't find the right conversion.. :( + // Meta.VirtualModifier + // Gdk.ModifierType + // const mask = keymap.get_modifier_mask(Gdk.ModifierIntent.DEFAULT_MOD_MASK) + // let [suc, rawMask] = keymap.map_virtual_modifiers(curState) + // curState = rawMask; + // const withVirtual = keymap.add_virtual_modifiers(mask) + // curState = withVirtual; + const removed = prevState & ~curState + const added = curState & ~prevState + // log("Added/removed", added, removed) + trackedModifiers.forEach(([name, mask]) => { + if (removed & mask) { + // log(`Me.emit('modifier-up', ${name});`) + Me.emit('modifier-up', mask, name, added); + } + if (added & mask) { + // log(`Me.emit('modifier-down', ${name});`) + Me.emit('modifier-down', mask, name, removed); + } + }); + prevState = curState; +} + +var stateChangedId; + +function enable() { + Signals.addSignalMethods(Me) + keymap = Gdk.Keymap.get_default(); + stateChangedId = keymap.connect( + 'state-changed', + Utils.dynamic_function_ref(stateChangedHandler.name, Me) + ) + + // Me.connect('modifier-down', log.bind(log, "modifier-down")) + // Me.connect('modifier-up', log.bind(log, "modifier-up")) +} + +function disable() { + keymap.disconnect(stateChangedId); +} +