]> git.cworth.org Git - akamaru/blobdiff - dock.c
Improve initial icon placement.
[akamaru] / dock.c
diff --git a/dock.c b/dock.c
index bc439ff0efe528c0c1e506aa666938c0cdee5d4a..782d5d2b9b43cd8aa0c887c9d8854225ca5b0ad5 100644 (file)
--- a/dock.c
+++ b/dock.c
@@ -56,12 +56,13 @@ create_window (GdkScreen *screen, int x, int y, int width, int height)
   attributes.y = y;
   attributes.width = width;
   attributes.height = height;
-  attributes.event_mask |=
+  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_MASK |
     GDK_POINTER_MOTION_HINT_MASK;
 
   attributes_mask = GDK_WA_X | GDK_WA_Y | GDK_WA_VISUAL | GDK_WA_COLORMAP;
@@ -76,7 +77,8 @@ 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;
+  const int spread = spacing + 20;
+  int i, j, left_edge;
   Object *object;
   Spring *spring;
   Spacer *spacer;
@@ -94,20 +96,21 @@ model_init_dock (Model *model, int num_items, int x, int y, int spacing)
 
   model->polygons = g_new (Polygon, 1);
   model->num_polygons = 1;
-  polygon_init_rectangle (&model->polygons[0], -4000, y, 4000, 2000);
+  polygon_init_enclosing_rectangle (&model->polygons[0], 0, 0, 1024 - 50, y);
 
   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_init (&model->objects[0], x, y, 0);
 
   object = &model->objects[1];
   spring = model->springs;
   spacer = model->spacers;
+  left_edge = (1024 - (num_items - 1) * spread) / 2;
 
   for (i = 1; i < num_objects; i++, object++) {
-    object_init (&model->objects[i], 200 + i * spacing / 2, 300, 1);
+    object_init (&model->objects[i], left_edge + (i - 1) * spread, y - 100, 1);
     spring_init (spring++, &model->objects[0], object, spacing);
     for (j = 1; j < num_objects - i; j++) {
       spacer_init (spacer++, object, object + j, spacing);
@@ -144,8 +147,8 @@ window_event (GdkXEvent *xevent, GdkEvent *event, gpointer data)
 
   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;
+    closure->model.mouse_anchor.x = x - closure->drag_offset_x;
+    closure->model.mouse_anchor.y = y - closure->drag_offset_y;
     if (closure->model.mouse_anchor.y > closure->anchor_y)
       closure->model.mouse_anchor.y = closure->anchor_y;
     break;
@@ -190,13 +193,17 @@ int main (int argc, char *argv[])
     closure.spacing = spacing;
     closure.num_icons = num_icons;
     closure.windows = g_new (GdkWindow *, num_icons);
+
+    model_init_dock (&closure.model, num_icons,
+                    closure.anchor_x, closure.anchor_y, spacing);
+
     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;
+      x = closure.model.objects[i + 1].position.x;
+      y = closure.model.objects[i + 1].position.y;
       width = dimension.width;
       height = dimension.height;
       closure.windows[i] = create_window (screen, x, y, width, height);
@@ -214,8 +221,6 @@ int main (int argc, char *argv[])
       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 ();