summaryrefslogtreecommitdiff
path: root/src/effects.c
diff options
context:
space:
mode:
authorAnders Carlsson <andersca@gnu.org>2001-08-05 16:04:52 +0000
committerrhp <rhp>2001-08-05 16:04:52 +0000
commit971419c880265fa11cd6009077db5e8cf2ce0a92 (patch)
tree3a54ddc013f4c910b814495975a83d3a7039d3d2 /src/effects.c
parent0ee26a516825d0b6a980880631cfc076eabfa216 (diff)
downloadmetacity-971419c880265fa11cd6009077db5e8cf2ce0a92.tar.gz
metacity-971419c880265fa11cd6009077db5e8cf2ce0a92.tar.bz2
Add _NET_WM_ICON_GEOMETRY atom.
2001-08-05 Anders Carlsson <andersca@gnu.org> * src/display.h, src/display.c: Add _NET_WM_ICON_GEOMETRY atom. * src/window.c (meta_window_calc_showing): See if the window has an icon geometry and show a morphing animation from the window's coordinates to the icon's coordinates. (meta_window_get_icon_geometry): New function that fetches a window's icon geometry. * src/Makefile.am: Add effects.[ch]. * src/effects.c: New file with cool effects.
Diffstat (limited to 'src/effects.c')
-rw-r--r--src/effects.c124
1 files changed, 124 insertions, 0 deletions
diff --git a/src/effects.c b/src/effects.c
new file mode 100644
index 0000000..b5d7150
--- /dev/null
+++ b/src/effects.c
@@ -0,0 +1,124 @@
+/* Metacity animation effects */
+
+/*
+ * Copyright (C) 2001 Anders Carlsson, Havoc Pennington
+ *
+ * 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.
+ */
+
+#include "effects.h"
+#include "display.h"
+
+typedef struct
+{
+ MetaScreen *screen;
+
+ GC gc;
+
+ int step;
+ int steps;
+
+ double current_x, current_y;
+ double current_width, current_height;
+
+ double delta_x, delta_y;
+ double delta_width, delta_height;
+} BoxAnimationContext;
+
+static gboolean
+effects_draw_box_animation_timeout (BoxAnimationContext *context)
+{
+ if (context->step == 0)
+ {
+ /* It's our first time, grab the X server */
+ meta_display_grab (context->screen->display);
+ }
+ else
+ {
+ /* Restore the previously drawn background */
+ XDrawRectangle (context->screen->display->xdisplay,
+ context->screen->xroot,
+ context->gc,
+ context->current_x, context->current_y,
+ context->current_width, context->current_height);
+ }
+
+ /* Return if we're done */
+ if (context->step == context->steps)
+ {
+ meta_display_ungrab (context->screen->display);
+ XFreeGC (context->screen->display->xdisplay,
+ context->gc);
+ g_free (context);
+ return FALSE;
+ }
+
+ context->current_x += context->delta_x;
+ context->current_y += context->delta_y;
+ context->current_width += context->delta_width;
+ context->current_height += context->delta_height;
+
+ /* Draw the rectangle */
+ XDrawRectangle (context->screen->display->xdisplay,
+ context->screen->xroot,
+ context->gc,
+ context->current_x, context->current_y,
+ context->current_width, context->current_height);
+
+ context->step += 1;
+
+ return TRUE;
+}
+
+void
+meta_effects_draw_box_animation (MetaScreen *screen,
+ MetaRectangle *initial_rect,
+ MetaRectangle *destination_rect,
+ int steps,
+ int delay)
+{
+ BoxAnimationContext *context;
+ XGCValues gc_values;
+
+ /* Create the animation context */
+ context = g_new (BoxAnimationContext, 1);
+
+ gc_values.subwindow_mode = IncludeInferiors;
+ gc_values.function = GXinvert;
+
+ /* Create a gc for the root window */
+ context->screen = screen;
+ context->gc = XCreateGC (screen->display->xdisplay,
+ screen->xroot,
+ GCSubwindowMode | GCFunction,
+ &gc_values);
+ context->step = 0;
+ context->steps = steps;
+ context->delta_x = (destination_rect->x - initial_rect->x) / (double)steps;
+ context->delta_y = (destination_rect->y - initial_rect->y) / (double)steps;
+ context->delta_width = (destination_rect->width - initial_rect->width) / (double)steps;
+ context->delta_height = (destination_rect->height - initial_rect->height) / (double)steps;
+
+ context->current_x = initial_rect->x;
+ context->current_y = initial_rect->y;
+ context->current_width = initial_rect->width;
+ context->current_height = initial_rect->height;
+
+ /* Add the timeout */
+ g_timeout_add (delay,
+ (GSourceFunc)effects_draw_box_animation_timeout,
+ context);
+}