From b5f68f48302a165bed1dd5f824373189eacd85b9 Mon Sep 17 00:00:00 2001 From: =?utf8?q?Kristian=20H=C3=B8gsberg?= Date: Sun, 11 Jun 2006 04:42:41 -0400 Subject: [PATCH] Add new akamaru example: a crazy icon dock. --- Makefile | 11 +- akamaru.c | 4 +- dock.c | 226 +++++ main.c | 2 +- svg/applications-office.svg | 614 ++++++++++++ svg/camera-video.svg | 1176 ++++++++++++++++++++++ svg/email.svg | 458 +++++++++ svg/firefox-logo.svg | 1718 +++++++++++++++++++++++++++++++++ svg/gnome-dev-disc-dvdrom.svg | 720 ++++++++++++++ svg/gnome-terminal.svg | 429 ++++++++ svg/help-browser.svg | 213 ++++ svg/internet-group-chat.svg | 198 ++++ 12 files changed, 5763 insertions(+), 6 deletions(-) create mode 100644 dock.c create mode 100644 svg/applications-office.svg create mode 100644 svg/camera-video.svg create mode 100644 svg/email.svg create mode 100644 svg/firefox-logo.svg create mode 100644 svg/gnome-dev-disc-dvdrom.svg create mode 100644 svg/gnome-terminal.svg create mode 100644 svg/help-browser.svg create mode 100644 svg/internet-group-chat.svg diff --git a/Makefile b/Makefile index dae1f08..c5e52eb 100644 --- a/Makefile +++ b/Makefile @@ -1,14 +1,19 @@ CFLAGS = -Wall -g -CPPFLAGS = $(shell pkg-config --cflags gtk+-2.0 cairo) -LDLIBS = $(shell pkg-config --libs gtk+-2.0 cairo) +CPPFLAGS = $(shell pkg-config --cflags gtk+-2.0 cairo librsvg-2.0) +LDLIBS = $(shell pkg-config --libs gtk+-2.0 cairo librsvg-2.0) LDFLAGS = -g target = akamaru objs = akamaru.o main.o +all : akamaru dock + $(target) : $(objs) -$(objs) : akamaru.h +dock : dock.o akamaru.o + +$(objs) dock.o : akamaru.h + clean : rm $(target) $(objs) diff --git a/akamaru.c b/akamaru.c index 8045454..88277f6 100644 --- a/akamaru.c +++ b/akamaru.c @@ -20,9 +20,9 @@ #include "akamaru.h" -const double elasticity = 0.7; +const double elasticity = 0.5; const double friction = 1; -const double gravity = 20; +const double gravity = 50; void object_init (Object *object, double x, double y, double mass) diff --git a/dock.c b/dock.c new file mode 100644 index 0000000..bc439ff --- /dev/null +++ b/dock.c @@ -0,0 +1,226 @@ +/* -*- mode: c; c-basic-offset: 2 -*- + */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "akamaru.h" + +typedef struct Closure Closure; +struct Closure { + Model model; + int num_icons; + GdkWindow **windows; + int drag_offset_x, drag_offset_y; + int anchor_x, anchor_y; + int spacing; +}; + +static gint +timeout_callback (gpointer data) +{ + Closure *closure = data; + int i; + + for (i = 0; i < closure->num_icons; i++) { + gdk_window_move (closure->windows[i], + closure->model.objects[i + 1].position.x + 0.5, + closure->model.objects[i + 1].position.y + 0.5); + } + + model_step (&closure->model, 0.1); + + return TRUE; +} + +static GdkWindow * +create_window (GdkScreen *screen, int x, int y, int width, int height) +{ + GdkWindowAttr attributes; + gint attributes_mask; + + attributes.wclass = GDK_INPUT_OUTPUT; + attributes.visual = gdk_screen_get_rgba_visual (screen); + attributes.colormap = gdk_screen_get_rgba_colormap (screen); + attributes.window_type = GDK_WINDOW_TEMP; + + attributes.x = x; + attributes.y = y; + attributes.width = width; + attributes.height = height; + attributes.event_mask |= + GDK_EXPOSURE_MASK | + GDK_BUTTON_PRESS_MASK | + GDK_BUTTON_RELEASE_MASK | + GDK_ENTER_NOTIFY_MASK | + GDK_LEAVE_NOTIFY_MASK | + GDK_POINTER_MOTION_HINT_MASK; + + attributes_mask = GDK_WA_X | GDK_WA_Y | GDK_WA_VISUAL | GDK_WA_COLORMAP; + + return gdk_window_new (gdk_screen_get_root_window (screen), + &attributes, attributes_mask); +} + +static void +model_init_dock (Model *model, int num_items, int x, int y, int spacing) +{ + const int num_objects = num_items + 1; + const int num_spacers = (num_objects - 1) * (num_objects - 2) / 2; + const int num_springs = num_objects - 1; + int i, j; + Object *object; + Spring *spring; + Spacer *spacer; + + memset (model, 0, sizeof *model); + model->objects = g_new (Object, num_objects); + model->num_objects = num_objects; + model->springs = g_new (Spring, num_springs); + model->num_springs = num_springs; + model->spacers = g_new (Spacer, num_spacers); + model->num_spacers = num_spacers; + model->anchors = g_new (Anchor, 1); + model->num_anchors = 1; + model->k = 0.1; + + model->polygons = g_new (Polygon, 1); + model->num_polygons = 1; + polygon_init_rectangle (&model->polygons[0], -4000, y, 4000, 2000); + + model->anchors[0].x = x; + model->anchors[0].y = y; + model->anchors[0].object = &model->objects[0]; + + object_init (&model->objects[0], x, y, 1); + + object = &model->objects[1]; + spring = model->springs; + spacer = model->spacers; + + for (i = 1; i < num_objects; i++, object++) { + object_init (&model->objects[i], 200 + i * spacing / 2, 300, 1); + spring_init (spring++, &model->objects[0], object, spacing); + for (j = 1; j < num_objects - i; j++) { + spacer_init (spacer++, object, object + j, spacing); + } + } +} + +static GdkFilterReturn +window_event (GdkXEvent *xevent, GdkEvent *event, gpointer data) +{ + Closure *closure = data; + GdkModifierType state; + XEvent *ev = (XEvent *) xevent; + int x, y, i; + Object *object; + + switch (ev->type) { + case ButtonPress: + closure->drag_offset_x = ev->xbutton.x; + closure->drag_offset_y = ev->xbutton.y; + for (i = 0; i < closure->num_icons; i++) { + if (closure->windows[i] == event->any.window) { + object = &closure->model.objects[i + 1]; + closure->model.mouse_anchor.x = object->position.x; + closure->model.mouse_anchor.y = object->position.y; + closure->model.mouse_anchor.object = object; + } + } + break; + + case ButtonRelease: + closure->model.mouse_anchor.object = NULL; + break; + + case MotionNotify: + gdk_window_get_pointer (gdk_get_default_root_window(), &x, &y, &state); + closure->model.mouse_anchor.x = x + 0.5 - closure->drag_offset_x; + closure->model.mouse_anchor.y = y + 0.5 - closure->drag_offset_y; + if (closure->model.mouse_anchor.y > closure->anchor_y) + closure->model.mouse_anchor.y = closure->anchor_y; + break; + + default: + break; + } + + return GDK_FILTER_CONTINUE; +} + +static const char *icons[] = { + "svg/applications-office.svg", + "svg/camera-video.svg", + "svg/email.svg", + "svg/firefox-logo.svg", + "svg/gnome-dev-disc-dvdrom.svg", + "svg/gnome-terminal.svg", + "svg/help-browser.svg", + "svg/internet-group-chat.svg" +}; + +int main (int argc, char *argv[]) +{ + Closure closure; + GdkScreen *screen; + const int num_icons = G_N_ELEMENTS (icons); + int x, y, width, height, i; + RsvgHandle *handle; + RsvgDimensionData dimension; + cairo_t *cr; + const int screen_width = 1024, screen_height = 768, spacing = 50; + + gtk_init (&argc, &argv); + + rsvg_init (); + + screen = gdk_screen_get_default (); + + closure.anchor_x = screen_width / 2; + closure.anchor_y = screen_height - 50; + closure.spacing = spacing; + closure.num_icons = num_icons; + closure.windows = g_new (GdkWindow *, num_icons); + for (i = 0; i < num_icons; i++) { + + handle = rsvg_handle_new_from_file (icons[i], NULL); + rsvg_handle_get_dimensions (handle, &dimension); + + x = (screen_width - spacing * num_icons) / 2 + i * spacing; + y = closure.anchor_y; + width = dimension.width; + height = dimension.height; + closure.windows[i] = create_window (screen, x, y, width, height); + + gdk_window_show (closure.windows[i]); + + cr = gdk_cairo_create (closure.windows[i]); + cairo_set_operator (cr, CAIRO_OPERATOR_CLEAR); + cairo_paint (cr); + cairo_set_operator (cr, CAIRO_OPERATOR_OVER); + rsvg_handle_render_cairo (handle, cr); + rsvg_handle_free (handle); + cairo_destroy (cr); + + gdk_window_add_filter (closure.windows[i], window_event, &closure); + } + + model_init_dock (&closure.model, num_icons, + closure.anchor_x, closure.anchor_y, spacing); + g_timeout_add (20, timeout_callback, &closure); + + gtk_main (); + + rsvg_term (); + + return 0; +} diff --git a/main.c b/main.c index 3b1d8d4..fd1318f 100644 --- a/main.c +++ b/main.c @@ -664,7 +664,7 @@ create_window (Closure *closure) GtkWidget *model_combo; window = gtk_window_new (GTK_WINDOW_TOPLEVEL); - gtk_window_set_title (GTK_WINDOW (window), "Akamaru"); + gtk_window_set_title (GTK_WINDOW (window), "赤丸"); g_signal_connect (window, "destroy", G_CALLBACK (gtk_main_quit), &window); diff --git a/svg/applications-office.svg b/svg/applications-office.svg new file mode 100644 index 0000000..a58268d --- /dev/null +++ b/svg/applications-office.svg @@ -0,0 +1,614 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + image/svg+xml + + + + Jakub Steiner + + + http://jimmac.musichall.cz + + Office Applications + + + office + applications + category + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/svg/camera-video.svg b/svg/camera-video.svg new file mode 100644 index 0000000..7eb6100 --- /dev/null +++ b/svg/camera-video.svg @@ -0,0 +1,1176 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + image/svg+xml + + Camera / Video + + + Jakub Steiner + + + http://jimmac.musichall.cz/ + + + camera + camcorder + video + cam + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/svg/email.svg b/svg/email.svg new file mode 100644 index 0000000..cfaed48 --- /dev/null +++ b/svg/email.svg @@ -0,0 +1,458 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + image/svg+xml + + Mail + + + Jakub Steiner + + + + + Andreas Nilsson + + + + + + mail + e-mail + MUA + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/svg/firefox-logo.svg b/svg/firefox-logo.svg new file mode 100644 index 0000000..051f0ac --- /dev/null +++ b/svg/firefox-logo.svg @@ -0,0 +1,1718 @@ + +image/svg+xml + + Firefox Logo + Firefox logo in SVG, authored by Jon Hicks, made in Adobe Illustrator (file format cleaned up and slightly modified by Doug Schepers) + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/svg/gnome-dev-disc-dvdrom.svg b/svg/gnome-dev-disc-dvdrom.svg new file mode 100644 index 0000000..e21643f --- /dev/null +++ b/svg/gnome-dev-disc-dvdrom.svg @@ -0,0 +1,720 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + image/svg+xml + + Media CD-ROM + + + Jakub Steiner + + + http://jimmac.musichall.cz + + + cdrom + media + removable + cd + audio + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/svg/gnome-terminal.svg b/svg/gnome-terminal.svg new file mode 100644 index 0000000..f926642 --- /dev/null +++ b/svg/gnome-terminal.svg @@ -0,0 +1,429 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + image/svg+xml + + Terminal + 2005-10-15 + + + Andreas Nilsson + + + + + terminal + emulator + term + command line + + + + + + Jakub Steiner + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/svg/help-browser.svg b/svg/help-browser.svg new file mode 100644 index 0000000..669dda3 --- /dev/null +++ b/svg/help-browser.svg @@ -0,0 +1,213 @@ + + + + + + + + + + + + + + + + + + + + + + + + + image/svg+xml + + Help Browser + 2005-11-06 + + + Tuomas Kuosmanen + + + + + help + browser + documentation + docs + man + info + + + + + + Jakub Steiner, Andreas Nilsson + + + http://tigert.com + + + + + + + + + + + + + + + + + + diff --git a/svg/internet-group-chat.svg b/svg/internet-group-chat.svg new file mode 100644 index 0000000..3790722 --- /dev/null +++ b/svg/internet-group-chat.svg @@ -0,0 +1,198 @@ + + + + + + + + + + + + + + + + + + + + + + image/svg+xml + + Group Chat + + + Jakub Steiner + + + + + + + + + + + group + chat + IRC + internet + network + + + + + + + + + + + + + + + + + + + + + + -- 2.43.0