diff --git a/js/js-resources.gresource.xml b/js/js-resources.gresource.xml index 4206f4cbd..c99189cfe 100644 --- a/js/js-resources.gresource.xml +++ b/js/js-resources.gresource.xml @@ -90,7 +90,6 @@ ui/windowAttentionHandler.js ui/windowMenu.js ui/windowManager.js - ui/wobbly.js ui/workspace.js ui/workspaceSwitcherPopup.js ui/workspaceThumbnail.js diff --git a/js/ui/windowManager.js b/js/ui/windowManager.js index 397af8958..101f9a8d7 100644 --- a/js/ui/windowManager.js +++ b/js/ui/windowManager.js @@ -17,7 +17,6 @@ const Main = imports.ui.main; const ModalDialog = imports.ui.modalDialog; const Tweener = imports.ui.tweener; const WindowMenu = imports.ui.windowMenu; -const Wobbly = imports.ui.wobbly; const SHELL_KEYBINDINGS_SCHEMA = 'org.gnome.shell.keybindings'; const MAXIMIZE_WINDOW_ANIMATION_TIME = 0.15; @@ -812,8 +811,6 @@ const WindowManager = new Lang.Class({ gesture = new AppSwitchAction(); gesture.connect('activated', Lang.bind(this, this._switchApp)); global.stage.add_action(gesture); - - this._wobblyWindows = new Wobbly.WobblyWindowManager(); }, _lookupIndex: function (windows, metaWindow) { diff --git a/js/ui/wobbly.js b/js/ui/wobbly.js deleted file mode 100644 index ad53fc66f..000000000 --- a/js/ui/wobbly.js +++ /dev/null @@ -1,130 +0,0 @@ -// -*- mode: js; js-indent-level: 4; indent-tabs-mode: nil -*- - -const Clutter = imports.gi.Clutter; -const Lang = imports.lang; -const Meta = imports.gi.Meta; -const Shell = imports.gi.Shell; - -function clampAbs(v, cap) { - if (v > cap) - v = cap; - if (v < -cap) - v = -cap; - return v; -} - -const ActorWobbler = new Lang.Class({ - Name: 'ActorWobbler', - - _init: function(actor) { - this._actor = actor; - this._effect = new Shell.WobblyEffect(); - this._actor.add_effect(this._effect); - this._actor._wobbler = this; - - this._currentBend = 0; - this._currentHeightOffset = 0; - this._running = false; - - this._allocationChangedId = this._actor.connect('allocation-changed', Lang.bind(this, this._allocationChanged)); - - this._timeline = new Clutter.Timeline({ duration: 100, repeat_count: -1 }); - this._timeline.connect('new-frame', Lang.bind(this, this._newFrame)); - this._timeline.start(); - }, - - start: function() { - this._running = true; - }, - - stop: function() { - this._running = false; - }, - - _destroy: function() { - this._timeline.run_dispose(); - this._timeline = null; - - this._actor.disconnect(this._allocationChangedId); - this._actor.scale_y = 1.0; - this._actor.remove_effect(this._effect); - this._actor._wobbler = null; - }, - - _newFrame: function() { - this._step(); - }, - - _step: function() { - const DAMPEN = 0.8; - this._currentBend *= DAMPEN; - if (Math.abs(this._currentBend) < 1) - this._currentBend = 0; - this._currentHeightOffset *= DAMPEN; - if (Math.abs(this._currentHeightOffset) < 1) - this._currentHeightOffset = 0; - - // Cap the bend to a 100px shift. - const BEND_CAP = 50; - this._currentBend = clampAbs(this._currentBend, BEND_CAP); - this._effect.set_bend_x(this._currentBend); - - // Cap the height change to 25px in either direction. - const HEIGHT_OFFSET_CAP = 25; - this._currentHeightOffset = clampAbs(this._currentHeightOffset, HEIGHT_OFFSET_CAP); - let [minHeight, natHeight] = this._actor.get_preferred_height(-1); - let scale = (natHeight + this._currentHeightOffset) / natHeight; - this._actor.scale_y = scale; - - if (!this._running && this._currentBend == 0 && this._currentHeightOffset == 0) - this._destroy(); - }, - - _allocationChanged: function(actor, box, flags) { - if (!this._running) - return; - - if (this._oldX) { - let deltaX = box.x1 - this._oldX; - // Every 2px the user moves the window, we bend it by 1px. - this._currentBend -= deltaX / 2; - } - - if (this._oldY) { - let deltaY = box.y1 - this._oldY; - // Every 2px the user moves the window, we scale it by 1px. - this._currentHeightOffset -= deltaY / 2; - } - - this._oldX = box.x1; - this._oldY = box.y1; - }, -}); - -const WobblyWindowManager = new Lang.Class({ - Name: 'WobblyWindowManager', - - _init: function() { - global.display.connect('grab-op-begin', Lang.bind(this, this._grabOpBegin)); - global.display.connect('grab-op-end', Lang.bind(this, this._grabOpEnd)); - }, - - _grabOpBegin: function(display, screen, window, op) { - if (op != Meta.GrabOp.MOVING) - return; - - let actor = window.get_compositor_private(); - if (!actor._wobbler) - new ActorWobbler(actor); - actor._wobbler.start(); - }, - - _grabOpEnd: function(display, screen, window, op) { - if (!window) - return; - - let actor = window.get_compositor_private(); - if (actor._wobbler) - actor._wobbler.stop(); - }, -}); diff --git a/src/Makefile.am b/src/Makefile.am index 98ec9d5ac..a73eaaedf 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -102,7 +102,6 @@ shell_public_headers_h = \ shell-util.h \ shell-window-tracker.h \ shell-wm.h \ - shell-wobbly-effect.h \ $(NULL) if HAVE_NETWORKMANAGER @@ -168,7 +167,6 @@ libgnome_shell_sources = \ shell-util.c \ shell-window-tracker.c \ shell-wm.c \ - shell-wobbly-effect.c \ $(NULL) libgnome_shell_built_sources = \ diff --git a/src/shell-wobbly-effect.c b/src/shell-wobbly-effect.c deleted file mode 100644 index eb1d87484..000000000 --- a/src/shell-wobbly-effect.c +++ /dev/null @@ -1,216 +0,0 @@ -/* -*- mode: C; c-file-style: "gnu"; indent-tabs-mode: nil; -*- */ - -/* - * Copyright (C) 2014 Endless Mobile - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License as - * published by the Free Software Foundation; either version 2 of the - * License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, but - * WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA - * 02111-1307, USA. - * - * Written by: - * Jasper St. Pierre - */ - -#include "config.h" - -#include "shell-wobbly-effect.h" - -struct _ShellWobblyEffectPrivate -{ - int bend_x; - - int tex_width, tex_height; - CoglPipeline *pipeline; - - int tex_width_uniform; - int bend_x_uniform; -}; -typedef struct _ShellWobblyEffectPrivate ShellWobblyEffectPrivate; - -G_DEFINE_TYPE_WITH_PRIVATE (ShellWobblyEffect, shell_wobbly_effect, CLUTTER_TYPE_OFFSCREEN_EFFECT); - -static const gchar *wobbly_decls = - "uniform int tex_width;\n" - "uniform int bend_x;\n"; -static const gchar *wobbly_pre = - "float bend_x_coord = (float(bend_x) / tex_width);\n" - "float interp = (1 - cos(cogl_tex_coord.y * 3.1415926)) / 2;\n" - "cogl_tex_coord.x -= (interp * bend_x_coord);\n"; - -/* XXX - clutter_effect_get_paint_volume is fucking terrible - * and I want to kill myself */ -static gboolean -shell_wobbly_effect_get_paint_volume (ClutterEffect *effect, - ClutterPaintVolume *volume) -{ - ShellWobblyEffect *self = SHELL_WOBBLY_EFFECT (effect); - ShellWobblyEffectPrivate *priv = shell_wobbly_effect_get_instance_private (self); - - float cur_width; - cur_width = clutter_paint_volume_get_width (volume); - cur_width += ABS (priv->bend_x); - clutter_paint_volume_set_width (volume, cur_width); - - /* Also modify the origin if it bends to the left. */ - if (priv->bend_x < 0) - { - ClutterVertex origin; - clutter_paint_volume_get_origin (volume, &origin); - origin.x += priv->bend_x; - clutter_paint_volume_set_origin (volume, &origin); - } - - return TRUE; -} - -static gboolean -shell_wobbly_effect_pre_paint (ClutterEffect *effect) -{ - ShellWobblyEffect *self = SHELL_WOBBLY_EFFECT (effect); - ShellWobblyEffectPrivate *priv = shell_wobbly_effect_get_instance_private (self); - - if (!clutter_actor_meta_get_enabled (CLUTTER_ACTOR_META (effect))) - return FALSE; - - /* If we're not doing any bending, we're not needed. */ - if (priv->bend_x == 0) - return FALSE; - - if (!clutter_feature_available (CLUTTER_FEATURE_SHADERS_GLSL)) - { - /* if we don't have support for GLSL shaders then we - * forcibly disable the ActorMeta - */ - g_warning ("Unable to use the ShellWobblyEffect: the " - "graphics hardware or the current GL driver does not " - "implement support for the GLSL shading language. The " - "effect will be disabled."); - clutter_actor_meta_set_enabled (CLUTTER_ACTOR_META (effect), FALSE); - return FALSE; - } - - if (!CLUTTER_EFFECT_CLASS (shell_wobbly_effect_parent_class)->pre_paint (effect)) - return FALSE; - - ClutterOffscreenEffect *offscreen_effect = CLUTTER_OFFSCREEN_EFFECT (effect); - CoglObject *texture; - - texture = clutter_offscreen_effect_get_texture (offscreen_effect); - cogl_pipeline_set_layer_texture (priv->pipeline, 0, texture); - - priv->tex_width = cogl_texture_get_width (texture); - priv->tex_height = cogl_texture_get_height (texture); - - cogl_pipeline_set_uniform_1i (priv->pipeline, priv->tex_width_uniform, priv->tex_width); - - return TRUE; -} - -static void -shell_wobbly_effect_paint_target (ClutterOffscreenEffect *effect) -{ - ShellWobblyEffect *self = SHELL_WOBBLY_EFFECT (effect); - ShellWobblyEffectPrivate *priv = shell_wobbly_effect_get_instance_private (self); - CoglFramebuffer *fb = cogl_get_draw_framebuffer (); - ClutterActor *actor; - guint8 paint_opacity; - - actor = clutter_actor_meta_get_actor (CLUTTER_ACTOR_META (effect)); - paint_opacity = clutter_actor_get_paint_opacity (actor); - - cogl_pipeline_set_color4ub (priv->pipeline, - paint_opacity, - paint_opacity, - paint_opacity, - paint_opacity); - - cogl_framebuffer_draw_rectangle (fb, priv->pipeline, - 0, 0, priv->tex_width, priv->tex_height); -} - -static void -shell_wobbly_effect_dispose (GObject *object) -{ - ShellWobblyEffect *self = SHELL_WOBBLY_EFFECT (object); - ShellWobblyEffectPrivate *priv = shell_wobbly_effect_get_instance_private (self); - - g_clear_pointer (&priv->pipeline, cogl_object_unref); - - G_OBJECT_CLASS (shell_wobbly_effect_parent_class)->dispose (object); -} - -static void -shell_wobbly_effect_class_init (ShellWobblyEffectClass *klass) -{ - GObjectClass *object_class = G_OBJECT_CLASS (klass); - ClutterEffectClass *effect_class = CLUTTER_EFFECT_CLASS (klass); - ClutterOffscreenEffectClass *offscreen_class = CLUTTER_OFFSCREEN_EFFECT_CLASS (klass); - - offscreen_class->paint_target = shell_wobbly_effect_paint_target; - effect_class->pre_paint = shell_wobbly_effect_pre_paint; - effect_class->get_paint_volume = shell_wobbly_effect_get_paint_volume; - object_class->dispose = shell_wobbly_effect_dispose; -} - -static void -update_uniforms (ShellWobblyEffect *self) -{ - ShellWobblyEffectPrivate *priv = shell_wobbly_effect_get_instance_private (self); - cogl_pipeline_set_uniform_1i (priv->pipeline, priv->bend_x_uniform, priv->bend_x); -} - -static void -shell_wobbly_effect_init (ShellWobblyEffect *self) -{ - static CoglPipeline *pipeline_template; - - ShellWobblyEffectPrivate *priv = shell_wobbly_effect_get_instance_private (self); - - if (G_UNLIKELY (pipeline_template == NULL)) - { - CoglSnippet *snippet; - CoglContext *ctx = clutter_backend_get_cogl_context (clutter_get_default_backend ()); - - pipeline_template = cogl_pipeline_new (ctx); - - snippet = cogl_snippet_new (COGL_SNIPPET_HOOK_TEXTURE_LOOKUP, wobbly_decls, NULL); - cogl_snippet_set_pre (snippet, wobbly_pre); - cogl_pipeline_add_layer_snippet (pipeline_template, 0, snippet); - cogl_object_unref (snippet); - - cogl_pipeline_set_layer_null_texture (pipeline_template, - 0, /* layer number */ - COGL_TEXTURE_TYPE_2D); - } - - priv->pipeline = cogl_pipeline_copy (pipeline_template); - priv->tex_width_uniform = cogl_pipeline_get_uniform_location (priv->pipeline, "tex_width"); - priv->bend_x_uniform = cogl_pipeline_get_uniform_location (priv->pipeline, "bend_x"); - - update_uniforms (self); -} - -void -shell_wobbly_effect_set_bend_x (ShellWobblyEffect *self, - int bend_x) -{ - ShellWobblyEffectPrivate *priv = shell_wobbly_effect_get_instance_private (self); - - if (priv->bend_x == bend_x) - return; - - priv->bend_x = bend_x; - update_uniforms (self); - clutter_effect_queue_repaint (CLUTTER_EFFECT (self)); -} diff --git a/src/shell-wobbly-effect.h b/src/shell-wobbly-effect.h deleted file mode 100644 index 6c02cea96..000000000 --- a/src/shell-wobbly-effect.h +++ /dev/null @@ -1,55 +0,0 @@ -/* -*- mode: C; c-file-style: "gnu"; indent-tabs-mode: nil; -*- */ - -/* - * Copyright (C) 2014 Endless Mobile - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License as - * published by the Free Software Foundation; either version 2 of the - * License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, but - * WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA - * 02111-1307, USA. - * - * Written by: - * Jasper St. Pierre - */ - -#include - -#ifndef __SHELL_WOBBLY_EFFECT_H__ -#define __SHELL_WOBBLY_EFFECT_H__ - -#define SHELL_TYPE_WOBBLY_EFFECT (shell_wobbly_effect_get_type ()) -#define SHELL_WOBBLY_EFFECT(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), SHELL_TYPE_WOBBLY_EFFECT, ShellWobblyEffect)) -#define SHELL_WOBBLY_EFFECT_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), SHELL_TYPE_WOBBLY_EFFECT, ShellWobblyEffectClass)) -#define SHELL_IS_WOBBLY_EFFECT(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), SHELL_TYPE_WOBBLY_EFFECT)) -#define SHELL_IS_WOBBLY_EFFECT_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), SHELL_TYPE_WOBBLY_EFFECT)) -#define SHELL_WOBBLY_EFFECT_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), SHELL_TYPE_WOBBLY_EFFECT, ShellWobblyEffectClass)) - -typedef struct _ShellWobblyEffect ShellWobblyEffect; -typedef struct _ShellWobblyEffectClass ShellWobblyEffectClass; - -struct _ShellWobblyEffect -{ - ClutterOffscreenEffect parent; -}; - -struct _ShellWobblyEffectClass -{ - ClutterOffscreenEffectClass parent_class; -}; - -GType shell_wobbly_effect_get_type (void) G_GNUC_CONST; - -void shell_wobbly_effect_set_bend_x (ShellWobblyEffect *self, - int bend_x); - -#endif /* __SHELL_WOBBLY_EFFECT_H__ */