From 082c1ce38909ba5cd85d8de84329f7f82dd0a77f Mon Sep 17 00:00:00 2001 From: Nikias Bassen Date: Wed, 16 Dec 2009 12:53:44 +0100 Subject: Replaced dock.png with a full screen background.png Also included the picture in the autofoo stuff. --- .gitignore | 1 + Makefile.am | 2 +- configure.ac | 2 ++ data/Makefile.am | 7 +++++++ data/background.png | Bin 0 -> 19869 bytes data/data.h.in | 1 + src/dock.png | Bin 15852 -> 0 bytes src/sbmanager.c | 8 +++++--- 8 files changed, 17 insertions(+), 4 deletions(-) create mode 100644 data/Makefile.am create mode 100644 data/background.png create mode 100644 data/data.h.in delete mode 100644 src/dock.png diff --git a/.gitignore b/.gitignore index 3c6c3a8..58b2f17 100644 --- a/.gitignore +++ b/.gitignore @@ -31,3 +31,4 @@ libtool stamp-h1 src/.libs src/sbmanager +data/data.h diff --git a/Makefile.am b/Makefile.am index 4c3e7c3..9166b4a 100644 --- a/Makefile.am +++ b/Makefile.am @@ -1,4 +1,4 @@ AUTOMAKE_OPTIONS = foreign ACLOCAL_AMFLAGS = -I m4 -SUBDIRS = src +SUBDIRS = src data diff --git a/configure.ac b/configure.ac index f90dd41..52da2ca 100644 --- a/configure.ac +++ b/configure.ac @@ -49,5 +49,7 @@ m4_ifdef([AM_SILENT_RULES],[AM_SILENT_RULES([yes])]) AC_OUTPUT([ Makefile src/Makefile +data/data.h +data/Makefile ]) diff --git a/data/Makefile.am b/data/Makefile.am new file mode 100644 index 0000000..fe8325a --- /dev/null +++ b/data/Makefile.am @@ -0,0 +1,7 @@ +pixmapdir = $(pkgdatadir) + +PIX = background.png + +pixmap_DATA = $(PIX) + +EXTRA_DIST = $(pixmap_DATA) diff --git a/data/background.png b/data/background.png new file mode 100644 index 0000000..7077fa1 Binary files /dev/null and b/data/background.png differ diff --git a/data/data.h.in b/data/data.h.in new file mode 100644 index 0000000..3c7e521 --- /dev/null +++ b/data/data.h.in @@ -0,0 +1 @@ +#define BGPIC "@prefix@/share/sbmanager/background.png" diff --git a/src/dock.png b/src/dock.png deleted file mode 100644 index 9e4d49c..0000000 Binary files a/src/dock.png and /dev/null differ diff --git a/src/sbmanager.c b/src/sbmanager.c index ad17a92..5ca4637 100644 --- a/src/sbmanager.c +++ b/src/sbmanager.c @@ -32,6 +32,8 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA #include #include +#include "../data/data.h" + #define ITEM_FONT "Sans Bold 7" typedef struct { @@ -509,16 +511,16 @@ int main(int argc, char **argv) /* dock background */ GError *err = NULL; - actor = clutter_texture_new_from_file("./dock.png", &err); + actor = clutter_texture_new_from_file(BGPIC, &err); if (err) { g_error_free(err); } if (actor) { - clutter_actor_set_position(actor, 0, clutter_actor_get_height(stage) - clutter_actor_get_height(actor)); + clutter_actor_set_position(actor, 0, 0); clutter_actor_show(actor); clutter_group_add (CLUTTER_GROUP(stage), actor); } else { - fprintf(stderr, "could not load dock.png\n"); + fprintf(stderr, "could not load background.png\n"); } /* clock widget */ -- cgit v1.1-32-gdbae From b7d4e230d7f5cf394c6dcb0147a317ac061de7d6 Mon Sep 17 00:00:00 2001 From: Nikias Bassen Date: Wed, 16 Dec 2009 13:13:50 +0100 Subject: changed font to FreeSans and font sizes using px --- src/sbmanager.c | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/src/sbmanager.c b/src/sbmanager.c index 5ca4637..409e851 100644 --- a/src/sbmanager.c +++ b/src/sbmanager.c @@ -34,7 +34,7 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA #include "../data/data.h" -#define ITEM_FONT "Sans Bold 7" +#define ITEM_FONT "FreeSans Bold 10px" typedef struct { GtkWidget *window; @@ -49,7 +49,7 @@ typedef struct { ClutterActor *stage = NULL; ClutterActor *clock_label = NULL; -ClutterColor text_color = {255, 255, 255, 255}; +ClutterColor text_color = {255, 255, 255, 210}; GMutex *selected_mutex = NULL; ClutterActor *selected = NULL; @@ -319,7 +319,7 @@ static gboolean item_button_release (ClutterActor *actor, ClutterButtonEvent *ev if (children) { ClutterActor *icon = g_list_nth_data(children, 0); ClutterActor *label = g_list_nth_data(children, 1); - clutter_actor_set_y(label, clutter_actor_get_y(icon) + 69.0); + clutter_actor_set_y(label, clutter_actor_get_y(icon) + 67.0); g_list_free(children); } } @@ -360,7 +360,7 @@ static void redraw_icons(SBManagerApp *app) g_signal_connect(actor, "button-release-event", G_CALLBACK (item_button_release), item); clutter_actor_show(actor); actor = item->label; - clutter_actor_set_position(actor, xpos+(59.0 - clutter_actor_get_width(actor))/2, ypos+69.0); + clutter_actor_set_position(actor, xpos+(59.0 - clutter_actor_get_width(actor))/2, ypos+67.0); clutter_actor_show(actor); clutter_container_add_actor(CLUTTER_CONTAINER(grp), actor); clutter_container_add_actor(CLUTTER_CONTAINER(stage), grp); @@ -524,7 +524,7 @@ int main(int argc, char **argv) } /* clock widget */ - actor = clutter_text_new_full ("Sans Bold 9", "00:00\nblah", &text_color); + actor = clutter_text_new_full ("FreeSans Bold 12px", "00:00", &text_color); gint xpos = (clutter_actor_get_width(stage)-clutter_actor_get_width(actor))/2; clutter_actor_set_position(actor, xpos, 2); clutter_actor_show(actor); -- cgit v1.1-32-gdbae From 038844ec78d3fd3edaff0f929b948fbe3a694cda Mon Sep 17 00:00:00 2001 From: Nikias Bassen Date: Wed, 16 Dec 2009 13:44:44 +0100 Subject: Set text colors in redraw_icon instead of directly after creation --- src/sbmanager.c | 16 ++++++++++++---- 1 file changed, 12 insertions(+), 4 deletions(-) diff --git a/src/sbmanager.c b/src/sbmanager.c index 409e851..039f8e8 100644 --- a/src/sbmanager.c +++ b/src/sbmanager.c @@ -34,7 +34,12 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA #include "../data/data.h" -#define ITEM_FONT "FreeSans Bold 10px" +const char CLOCK_FONT[] = "FreeSans Bold 12px"; +ClutterColor clock_text_color = {255, 255, 255, 210}; + +const char ITEM_FONT[] = "FreeSans Bold 10px"; +ClutterColor item_text_color = {255, 255, 255, 210}; +ClutterColor dock_item_text_color = {255, 255, 255, 255}; typedef struct { GtkWidget *window; @@ -49,7 +54,6 @@ typedef struct { ClutterActor *stage = NULL; ClutterActor *clock_label = NULL; -ClutterColor text_color = {255, 255, 255, 210}; GMutex *selected_mutex = NULL; ClutterActor *selected = NULL; @@ -114,7 +118,7 @@ static void get_icon_for_node(plist_t node, GList **list, sbservices_client_t sb if (nn && (plist_get_node_type(nn) == PLIST_STRING)) { char *txtval = NULL; plist_get_string_val(nn, &txtval); - actor = clutter_text_new_full(ITEM_FONT, txtval, &text_color); + actor = clutter_text_new_with_text(ITEM_FONT, txtval); di->label = actor; } *list = g_list_append(*list, di); @@ -279,6 +283,7 @@ static gboolean item_button_press (ClutterActor *actor, ClutterButtonEvent *even if (children) { ClutterActor *icon = g_list_nth_data(children, 0); ClutterActor *label = g_list_nth_data(children, 1); + clutter_text_set_color(CLUTTER_TEXT(label), &item_text_color); clutter_actor_set_y(label, clutter_actor_get_y(icon) + 62.0); g_list_free(children); } @@ -319,6 +324,7 @@ static gboolean item_button_release (ClutterActor *actor, ClutterButtonEvent *ev if (children) { ClutterActor *icon = g_list_nth_data(children, 0); ClutterActor *label = g_list_nth_data(children, 1); + clutter_text_set_color(CLUTTER_TEXT(label), &dock_item_text_color); clutter_actor_set_y(label, clutter_actor_get_y(icon) + 67.0); g_list_free(children); } @@ -361,6 +367,7 @@ static void redraw_icons(SBManagerApp *app) clutter_actor_show(actor); actor = item->label; clutter_actor_set_position(actor, xpos+(59.0 - clutter_actor_get_width(actor))/2, ypos+67.0); + clutter_text_set_color(CLUTTER_TEXT(actor), &dock_item_text_color); clutter_actor_show(actor); clutter_container_add_actor(CLUTTER_CONTAINER(grp), actor); clutter_container_add_actor(CLUTTER_CONTAINER(stage), grp); @@ -388,6 +395,7 @@ static void redraw_icons(SBManagerApp *app) g_signal_connect(actor, "button-release-event", G_CALLBACK (item_button_release), item); clutter_actor_show(actor); actor = item->label; + clutter_text_set_color(CLUTTER_TEXT(actor), &item_text_color); clutter_actor_set_position(actor, xpos+(59.0 - clutter_actor_get_width(actor))/2, ypos+62.0); clutter_actor_show(actor); clutter_container_add_actor(CLUTTER_CONTAINER(grp), actor); @@ -524,7 +532,7 @@ int main(int argc, char **argv) } /* clock widget */ - actor = clutter_text_new_full ("FreeSans Bold 12px", "00:00", &text_color); + actor = clutter_text_new_full (CLOCK_FONT, "00:00", &clock_text_color); gint xpos = (clutter_actor_get_width(stage)-clutter_actor_get_width(actor))/2; clutter_actor_set_position(actor, xpos, 2); clutter_actor_show(actor); -- cgit v1.1-32-gdbae From efaeb6ac047303fdae102c59256366feeeb8c7fb Mon Sep 17 00:00:00 2001 From: Nikias Bassen Date: Wed, 16 Dec 2009 14:39:32 +0100 Subject: add a dock group for easier centering of the icons in the dock --- src/sbmanager.c | 25 +++++++++++++++++++++---- 1 file changed, 21 insertions(+), 4 deletions(-) diff --git a/src/sbmanager.c b/src/sbmanager.c index 039f8e8..2402af3 100644 --- a/src/sbmanager.c +++ b/src/sbmanager.c @@ -53,6 +53,7 @@ typedef struct { } SBItem; ClutterActor *stage = NULL; +ClutterActor *thedock = NULL; ClutterActor *clock_label = NULL; GMutex *selected_mutex = NULL; @@ -287,6 +288,7 @@ static gboolean item_button_press (ClutterActor *actor, ClutterButtonEvent *even clutter_actor_set_y(label, clutter_actor_get_y(icon) + 62.0); g_list_free(children); } + clutter_actor_raise_top(thedock); } clutter_actor_set_scale_full(sc, 1.2, 1.2, clutter_actor_get_x(actor) + clutter_actor_get_width(actor)/2, clutter_actor_get_y(actor) + clutter_actor_get_height(actor)/2); clutter_actor_raise_top(sc); @@ -350,8 +352,16 @@ static void redraw_icons(SBManagerApp *app) gfloat xpos; if (dockitems) { - ypos = 398.0; - xpos = 16.0; + /* draw items into the dock area */ + gfloat start = 16.0; + gfloat step = 16.0; + if (g_list_length(dockitems) > 4) { + // this is for 5 item dock + step = 3.0; + start = 4.0; + } + ypos = 8.0; + xpos = start; printf("%s: drawing dock icons\n", __func__); for (i = 0; i < g_list_length(dockitems); i++) { SBItem *item = (SBItem*)g_list_nth_data(dockitems, i); @@ -370,9 +380,10 @@ static void redraw_icons(SBManagerApp *app) clutter_text_set_color(CLUTTER_TEXT(actor), &dock_item_text_color); clutter_actor_show(actor); clutter_container_add_actor(CLUTTER_CONTAINER(grp), actor); - clutter_container_add_actor(CLUTTER_CONTAINER(stage), grp); + clutter_container_add_actor(CLUTTER_CONTAINER(thedock), grp); + xpos += (60.0 + step); + clutter_actor_set_position(thedock, (320 - xpos)/2, 390.0); } - xpos += 76; } } clutter_stage_ensure_redraw(CLUTTER_STAGE(stage)); @@ -539,6 +550,12 @@ int main(int argc, char **argv) clutter_group_add (CLUTTER_GROUP (stage), actor); clock_label = actor; + /* dock widget */ + thedock = clutter_group_new(); + clutter_actor_show (thedock); + clutter_actor_set_position(thedock, 0.0, 390.0); + clutter_group_add (CLUTTER_GROUP (stage), thedock); + /* Show the stage: */ clutter_actor_show (stage); -- cgit v1.1-32-gdbae From b25ee6c596280fed211d8c2550c61865c91f9816 Mon Sep 17 00:00:00 2001 From: Nikias Bassen Date: Wed, 16 Dec 2009 15:49:56 +0100 Subject: Added dock icon alignment function and dock icon motion detection --- src/sbmanager.c | 65 +++++++++++++++++++++++++++++++++++++++++++++------------ 1 file changed, 52 insertions(+), 13 deletions(-) diff --git a/src/sbmanager.c b/src/sbmanager.c index 2402af3..adf5e62 100644 --- a/src/sbmanager.c +++ b/src/sbmanager.c @@ -52,6 +52,8 @@ typedef struct { gboolean is_dock_item; } SBItem; +const ClutterActorBox dock_area = {0.0, 390.0, 320.0, 480.0}; + ClutterActor *stage = NULL; ClutterActor *thedock = NULL; ClutterActor *clock_label = NULL; @@ -345,6 +347,36 @@ static gboolean item_button_release (ClutterActor *actor, ClutterButtonEvent *ev return TRUE; } +static void dock_align_icons() +{ + if (!thedock) return; + gint count = clutter_group_get_n_children(CLUTTER_GROUP(thedock)); + if (count == 0) { + return; + } + gfloat spacing = 16.0; + gfloat ypos = 8.0; + gfloat xpos = 0.0; + gint i = 0; + if (count > 4) { + spacing = 3.0; + } + for (i = 0; i < count; i++) { + ClutterActor *icon = clutter_group_get_nth_child(CLUTTER_GROUP(thedock), i); + if (!icon) { + continue; + } + clutter_actor_set_position(icon, xpos, ypos); + xpos += 60; + if (i < count-1) { + xpos += spacing; + } + } + // center the whole dock + clutter_actor_set_width(thedock, xpos); + clutter_actor_set_position(thedock, (320 - xpos)/2, 390.0); +} + static void redraw_icons(SBManagerApp *app) { guint i; @@ -353,15 +385,8 @@ static void redraw_icons(SBManagerApp *app) if (dockitems) { /* draw items into the dock area */ - gfloat start = 16.0; - gfloat step = 16.0; - if (g_list_length(dockitems) > 4) { - // this is for 5 item dock - step = 3.0; - start = 4.0; - } - ypos = 8.0; - xpos = start; + xpos = 0.0; + ypos = 0.0; printf("%s: drawing dock icons\n", __func__); for (i = 0; i < g_list_length(dockitems); i++) { SBItem *item = (SBItem*)g_list_nth_data(dockitems, i); @@ -381,8 +406,7 @@ static void redraw_icons(SBManagerApp *app) clutter_actor_show(actor); clutter_container_add_actor(CLUTTER_CONTAINER(grp), actor); clutter_container_add_actor(CLUTTER_CONTAINER(thedock), grp); - xpos += (60.0 + step); - clutter_actor_set_position(thedock, (320 - xpos)/2, 390.0); + dock_align_icons(); } } } @@ -440,10 +464,25 @@ static gboolean stage_motion (ClutterActor *actor, ClutterMotionEvent *event, gp start_x = event->x; start_y = event->y; + gfloat center_x = 0.0; + gfloat center_y = 0.0; + clutter_actor_get_scale_center(selected, ¢er_x, ¢er_y); + center_x += clutter_actor_get_x(selected); + center_y += clutter_actor_get_y(selected); + + if (selected_item->is_dock_item) { - printf("an icon from the dock is moving\n"); + if (center_y < 0) { + printf("icon from dock moving outside the dock!\n"); + } else { + printf("icon from dock moving inside the dock!\n"); + } } else { - printf("a regular icon is moving\n"); + if (clutter_actor_box_contains(&dock_area, center_x, center_y)) { + printf("regular icon is moving inside the dock!\n"); + } else { + printf("regular icon is moving!\n"); + } } return TRUE; -- cgit v1.1-32-gdbae From 80b133f2977443c00fb629ed4dd458d62ca9ebe7 Mon Sep 17 00:00:00 2001 From: Nikias Bassen Date: Thu, 17 Dec 2009 04:45:21 +0100 Subject: Revert "Added dock icon alignment function and dock icon motion detection" This reverts commit b25ee6c596280fed211d8c2550c61865c91f9816. --- src/sbmanager.c | 65 ++++++++++++--------------------------------------------- 1 file changed, 13 insertions(+), 52 deletions(-) diff --git a/src/sbmanager.c b/src/sbmanager.c index adf5e62..2402af3 100644 --- a/src/sbmanager.c +++ b/src/sbmanager.c @@ -52,8 +52,6 @@ typedef struct { gboolean is_dock_item; } SBItem; -const ClutterActorBox dock_area = {0.0, 390.0, 320.0, 480.0}; - ClutterActor *stage = NULL; ClutterActor *thedock = NULL; ClutterActor *clock_label = NULL; @@ -347,36 +345,6 @@ static gboolean item_button_release (ClutterActor *actor, ClutterButtonEvent *ev return TRUE; } -static void dock_align_icons() -{ - if (!thedock) return; - gint count = clutter_group_get_n_children(CLUTTER_GROUP(thedock)); - if (count == 0) { - return; - } - gfloat spacing = 16.0; - gfloat ypos = 8.0; - gfloat xpos = 0.0; - gint i = 0; - if (count > 4) { - spacing = 3.0; - } - for (i = 0; i < count; i++) { - ClutterActor *icon = clutter_group_get_nth_child(CLUTTER_GROUP(thedock), i); - if (!icon) { - continue; - } - clutter_actor_set_position(icon, xpos, ypos); - xpos += 60; - if (i < count-1) { - xpos += spacing; - } - } - // center the whole dock - clutter_actor_set_width(thedock, xpos); - clutter_actor_set_position(thedock, (320 - xpos)/2, 390.0); -} - static void redraw_icons(SBManagerApp *app) { guint i; @@ -385,8 +353,15 @@ static void redraw_icons(SBManagerApp *app) if (dockitems) { /* draw items into the dock area */ - xpos = 0.0; - ypos = 0.0; + gfloat start = 16.0; + gfloat step = 16.0; + if (g_list_length(dockitems) > 4) { + // this is for 5 item dock + step = 3.0; + start = 4.0; + } + ypos = 8.0; + xpos = start; printf("%s: drawing dock icons\n", __func__); for (i = 0; i < g_list_length(dockitems); i++) { SBItem *item = (SBItem*)g_list_nth_data(dockitems, i); @@ -406,7 +381,8 @@ static void redraw_icons(SBManagerApp *app) clutter_actor_show(actor); clutter_container_add_actor(CLUTTER_CONTAINER(grp), actor); clutter_container_add_actor(CLUTTER_CONTAINER(thedock), grp); - dock_align_icons(); + xpos += (60.0 + step); + clutter_actor_set_position(thedock, (320 - xpos)/2, 390.0); } } } @@ -464,25 +440,10 @@ static gboolean stage_motion (ClutterActor *actor, ClutterMotionEvent *event, gp start_x = event->x; start_y = event->y; - gfloat center_x = 0.0; - gfloat center_y = 0.0; - clutter_actor_get_scale_center(selected, ¢er_x, ¢er_y); - center_x += clutter_actor_get_x(selected); - center_y += clutter_actor_get_y(selected); - - if (selected_item->is_dock_item) { - if (center_y < 0) { - printf("icon from dock moving outside the dock!\n"); - } else { - printf("icon from dock moving inside the dock!\n"); - } + printf("an icon from the dock is moving\n"); } else { - if (clutter_actor_box_contains(&dock_area, center_x, center_y)) { - printf("regular icon is moving inside the dock!\n"); - } else { - printf("regular icon is moving!\n"); - } + printf("a regular icon is moving\n"); } return TRUE; -- cgit v1.1-32-gdbae From 4c9c5ddc99bb8a54f5f0b33f37f86b610e5267c4 Mon Sep 17 00:00:00 2001 From: Nikias Bassen Date: Thu, 17 Dec 2009 04:45:43 +0100 Subject: Revert "add a dock group for easier centering of the icons in the dock" This reverts commit efaeb6ac047303fdae102c59256366feeeb8c7fb. --- src/sbmanager.c | 25 ++++--------------------- 1 file changed, 4 insertions(+), 21 deletions(-) diff --git a/src/sbmanager.c b/src/sbmanager.c index 2402af3..039f8e8 100644 --- a/src/sbmanager.c +++ b/src/sbmanager.c @@ -53,7 +53,6 @@ typedef struct { } SBItem; ClutterActor *stage = NULL; -ClutterActor *thedock = NULL; ClutterActor *clock_label = NULL; GMutex *selected_mutex = NULL; @@ -288,7 +287,6 @@ static gboolean item_button_press (ClutterActor *actor, ClutterButtonEvent *even clutter_actor_set_y(label, clutter_actor_get_y(icon) + 62.0); g_list_free(children); } - clutter_actor_raise_top(thedock); } clutter_actor_set_scale_full(sc, 1.2, 1.2, clutter_actor_get_x(actor) + clutter_actor_get_width(actor)/2, clutter_actor_get_y(actor) + clutter_actor_get_height(actor)/2); clutter_actor_raise_top(sc); @@ -352,16 +350,8 @@ static void redraw_icons(SBManagerApp *app) gfloat xpos; if (dockitems) { - /* draw items into the dock area */ - gfloat start = 16.0; - gfloat step = 16.0; - if (g_list_length(dockitems) > 4) { - // this is for 5 item dock - step = 3.0; - start = 4.0; - } - ypos = 8.0; - xpos = start; + ypos = 398.0; + xpos = 16.0; printf("%s: drawing dock icons\n", __func__); for (i = 0; i < g_list_length(dockitems); i++) { SBItem *item = (SBItem*)g_list_nth_data(dockitems, i); @@ -380,10 +370,9 @@ static void redraw_icons(SBManagerApp *app) clutter_text_set_color(CLUTTER_TEXT(actor), &dock_item_text_color); clutter_actor_show(actor); clutter_container_add_actor(CLUTTER_CONTAINER(grp), actor); - clutter_container_add_actor(CLUTTER_CONTAINER(thedock), grp); - xpos += (60.0 + step); - clutter_actor_set_position(thedock, (320 - xpos)/2, 390.0); + clutter_container_add_actor(CLUTTER_CONTAINER(stage), grp); } + xpos += 76; } } clutter_stage_ensure_redraw(CLUTTER_STAGE(stage)); @@ -550,12 +539,6 @@ int main(int argc, char **argv) clutter_group_add (CLUTTER_GROUP (stage), actor); clock_label = actor; - /* dock widget */ - thedock = clutter_group_new(); - clutter_actor_show (thedock); - clutter_actor_set_position(thedock, 0.0, 390.0); - clutter_group_add (CLUTTER_GROUP (stage), thedock); - /* Show the stage: */ clutter_actor_show (stage); -- cgit v1.1-32-gdbae From f70a0e9ddb6d8df5ed6690685d572bbe06356b4a Mon Sep 17 00:00:00 2001 From: Nikias Bassen Date: Thu, 17 Dec 2009 04:47:58 +0100 Subject: New dock icon aligment function and dock icon motion detection --- src/sbmanager.c | 59 ++++++++++++++++++++++++++++++++++++++++++++++++++++----- 1 file changed, 54 insertions(+), 5 deletions(-) diff --git a/src/sbmanager.c b/src/sbmanager.c index 039f8e8..f133e16 100644 --- a/src/sbmanager.c +++ b/src/sbmanager.c @@ -49,9 +49,12 @@ typedef struct { plist_t node; ClutterActor *texture; ClutterActor *label; + ClutterActor *icon; gboolean is_dock_item; } SBItem; +const ClutterActorBox dock_area = {0.0, 390.0, 320.0, 480.0}; + ClutterActor *stage = NULL; ClutterActor *clock_label = NULL; @@ -343,6 +346,36 @@ static gboolean item_button_release (ClutterActor *actor, ClutterButtonEvent *ev return TRUE; } +static void dock_align_icons() +{ + if (!dockitems) return; + gint count = g_list_length(dockitems); + if (count == 0) { + return; + } + gfloat spacing = 16.0; + gfloat ypos = dock_area.y1 + 8.0; + gfloat xpos = 0.0; + gint i = 0; + if (count > 4) { + spacing = 3.0; + } + gfloat totalwidth = count*60.0 + spacing*(count-1); + xpos = (320.0 - totalwidth)/2.0; + for (i = 0; i < count; i++) { + SBItem *item = g_list_nth_data(dockitems, i); + ClutterActor *icon = item->icon; + if (!icon) { + continue; + } + clutter_actor_set_position(icon, xpos, ypos); + xpos += 60; + if (i < count-1) { + xpos += spacing; + } + } +} + static void redraw_icons(SBManagerApp *app) { guint i; @@ -350,8 +383,8 @@ static void redraw_icons(SBManagerApp *app) gfloat xpos; if (dockitems) { - ypos = 398.0; - xpos = 16.0; + xpos = 0.0; + ypos = 0.0; printf("%s: drawing dock icons\n", __func__); for (i = 0; i < g_list_length(dockitems); i++) { SBItem *item = (SBItem*)g_list_nth_data(dockitems, i); @@ -371,8 +404,9 @@ static void redraw_icons(SBManagerApp *app) clutter_actor_show(actor); clutter_container_add_actor(CLUTTER_CONTAINER(grp), actor); clutter_container_add_actor(CLUTTER_CONTAINER(stage), grp); + item->icon = grp; + dock_align_icons(); } - xpos += 76; } } clutter_stage_ensure_redraw(CLUTTER_STAGE(stage)); @@ -429,10 +463,25 @@ static gboolean stage_motion (ClutterActor *actor, ClutterMotionEvent *event, gp start_x = event->x; start_y = event->y; + gfloat center_x = 0.0; + gfloat center_y = 0.0; + clutter_actor_get_scale_center(selected, ¢er_x, ¢er_y); + center_x += clutter_actor_get_x(selected); + center_y += clutter_actor_get_y(selected); + + if (selected_item->is_dock_item) { - printf("an icon from the dock is moving\n"); + if (clutter_actor_box_contains(&dock_area, center_x, center_y)) { + printf("icon from dock moving inside the dock!\n"); + } else { + printf("icon from dock moving outside the dock!\n"); + } } else { - printf("a regular icon is moving\n"); + if (clutter_actor_box_contains(&dock_area, center_x, center_y)) { + printf("regular icon is moving inside the dock!\n"); + } else { + printf("regular icon is moving!\n"); + } } return TRUE; -- cgit v1.1-32-gdbae From 55a6a48079b304e71ca0020da93236ab4da37095 Mon Sep 17 00:00:00 2001 From: Nikias Bassen Date: Thu, 17 Dec 2009 04:52:27 +0100 Subject: Better support for 5-icon-dock when using 4 icons or less --- src/sbmanager.c | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/src/sbmanager.c b/src/sbmanager.c index f133e16..5eb7585 100644 --- a/src/sbmanager.c +++ b/src/sbmanager.c @@ -91,16 +91,18 @@ static void sbpage_free(GList *sbitems) } } -static void get_icon_for_node(plist_t node, GList **list, sbservices_client_t sbc) +static void get_icon_for_node(plist_t node, GList **list, sbservices_client_t sbc, gboolean skip_empty) { char *png = NULL; uint64_t pngsize = 0; SBItem *di = NULL; plist_t valuenode = NULL; if (plist_get_node_type(node) != PLIST_DICT) { - di = g_new0(SBItem, 1); - *list = g_list_append(*list, di); - return; + if (!skip_empty) { + di = g_new0(SBItem, 1); + *list = g_list_append(*list, di); + return; + } } valuenode = plist_dict_get_item(node, "displayIdentifier"); if (valuenode && (plist_get_node_type(valuenode) == PLIST_STRING)) { @@ -203,7 +205,7 @@ static void get_icons(const char *uuid) count = plist_array_get_size(dock); for (i = 0; i < count; i++) { plist_t node = plist_array_get_item(dock, i); - get_icon_for_node(node, &dockitems, sbc); + get_icon_for_node(node, &dockitems, sbc, TRUE); } if (total > 1) { /* get all icons for the other pages */ @@ -227,7 +229,7 @@ static void get_icons(const char *uuid) count = plist_array_get_size(nrow); for (i = 0; i < count; i++) { plist_t node = plist_array_get_item(nrow, i); - get_icon_for_node(node, &page, sbc); + get_icon_for_node(node, &page, sbc, FALSE); } } if (page) { -- cgit v1.1-32-gdbae From 1b5c9bf41b28d0832f2078899e35eec0b62821f5 Mon Sep 17 00:00:00 2001 From: Nikias Bassen Date: Thu, 17 Dec 2009 14:39:39 +0100 Subject: Removed multiple selected state variables and improved dock item alignment --- src/sbmanager.c | 66 ++++++++++++++++++++++++++++++++++++++++----------------- 1 file changed, 46 insertions(+), 20 deletions(-) diff --git a/src/sbmanager.c b/src/sbmanager.c index 5eb7585..ad736c4 100644 --- a/src/sbmanager.c +++ b/src/sbmanager.c @@ -49,7 +49,6 @@ typedef struct { plist_t node; ClutterActor *texture; ClutterActor *label; - ClutterActor *icon; gboolean is_dock_item; } SBItem; @@ -59,7 +58,6 @@ ClutterActor *stage = NULL; ClutterActor *clock_label = NULL; GMutex *selected_mutex = NULL; -ClutterActor *selected = NULL; SBItem *selected_item = NULL; gfloat start_x = 0.0; @@ -71,6 +69,8 @@ GList *sbpages = NULL; GList *this_page = NULL; int current_page = 0; +static void dock_align_icons(); + static void sbitem_free(SBItem *a) { if (a) { @@ -264,6 +264,16 @@ static void clock_cb (ClutterTimeline *timeline, gint msecs, SBManagerApp *app) g_free(ctext); } +static void actor_get_abs_center(ClutterActor *actor, gfloat *center_x, gfloat *center_y) +{ + *center_x = 0.0; + *center_y = 0.0; + if (!actor) return; + clutter_actor_get_scale_center(actor, center_x, center_y); + *center_x += clutter_actor_get_x(actor); + *center_y += clutter_actor_get_y(actor); +} + static gboolean item_button_press (ClutterActor *actor, ClutterButtonEvent *event, gpointer user_data) { if (!user_data) { @@ -296,7 +306,6 @@ static gboolean item_button_press (ClutterActor *actor, ClutterButtonEvent *even clutter_actor_set_scale_full(sc, 1.2, 1.2, clutter_actor_get_x(actor) + clutter_actor_get_width(actor)/2, clutter_actor_get_y(actor) + clutter_actor_get_height(actor)/2); clutter_actor_raise_top(sc); clutter_actor_set_opacity(sc, 160); - selected = sc; selected_item = item; start_x = event->x; start_y = event->y; @@ -338,8 +347,8 @@ static gboolean item_button_release (ClutterActor *actor, ClutterButtonEvent *ev clutter_actor_set_opacity(sc, 255); } - selected = NULL; selected_item = NULL; + dock_align_icons(); start_x = 0.0; start_y = 0.0; @@ -364,13 +373,33 @@ static void dock_align_icons() } gfloat totalwidth = count*60.0 + spacing*(count-1); xpos = (320.0 - totalwidth)/2.0; + + gfloat cx = 0.0; + gfloat cy = 0.0; + if (selected_item) { + actor_get_abs_center(clutter_actor_get_parent(selected_item->texture), &cx, &cy); + } for (i = 0; i < count; i++) { SBItem *item = g_list_nth_data(dockitems, i); - ClutterActor *icon = item->icon; + ClutterActor *icon = clutter_actor_get_parent(item->texture); if (!icon) { continue; } - clutter_actor_set_position(icon, xpos, ypos); + + if (item != selected_item) { + ClutterActorBox box; + clutter_actor_get_allocation_box(icon, &box); + //printf("box: %f,%f, %f,%f\n", box.x1,box.y1, box.x2,box.y2); + if (clutter_actor_box_contains(&box, cx+(60.0-spacing), cy)) { + printf("move item %d\n", i); + xpos += 60.0; + xpos += spacing; + } else { + printf("no!\n"); + } + clutter_actor_set_position(icon, xpos, ypos); + } + xpos += 60; if (i < count-1) { xpos += spacing; @@ -406,7 +435,6 @@ static void redraw_icons(SBManagerApp *app) clutter_actor_show(actor); clutter_container_add_actor(CLUTTER_CONTAINER(grp), actor); clutter_container_add_actor(CLUTTER_CONTAINER(stage), grp); - item->icon = grp; dock_align_icons(); } } @@ -451,33 +479,31 @@ static void redraw_icons(SBManagerApp *app) static gboolean stage_motion (ClutterActor *actor, ClutterMotionEvent *event, gpointer user_data) { /* check if an item has been raised */ - if (!selected || !selected_item) { + if (!selected_item) { return FALSE; } -/* gfloat oldx = clutter_actor_get_x(selected); - gfloat oldy = clutter_actor_get_y(selected); - - clutter_actor_set_position(selected, oldx + (event->x - start_x), oldy + (event->y - start_y)); -*/ - clutter_actor_move_by(selected, (event->x - start_x), event->y - start_y); + clutter_actor_move_by(clutter_actor_get_parent(selected_item->texture), (event->x - start_x), event->y - start_y); start_x = event->x; start_y = event->y; - gfloat center_x = 0.0; - gfloat center_y = 0.0; - clutter_actor_get_scale_center(selected, ¢er_x, ¢er_y); - center_x += clutter_actor_get_x(selected); - center_y += clutter_actor_get_y(selected); - + gfloat center_x; + gfloat center_y; + actor_get_abs_center(clutter_actor_get_parent(selected_item->texture), ¢er_x, ¢er_y); if (selected_item->is_dock_item) { if (clutter_actor_box_contains(&dock_area, center_x, center_y)) { printf("icon from dock moving inside the dock!\n"); + GList *found = g_list_find(dockitems, selected_item); + if (!found) { + dockitems = g_list_insert(dockitems, selected_item, 3); + } } else { printf("icon from dock moving outside the dock!\n"); + dockitems = g_list_remove(dockitems, selected_item); } + dock_align_icons(); } else { if (clutter_actor_box_contains(&dock_area, center_x, center_y)) { printf("regular icon is moving inside the dock!\n"); -- cgit v1.1-32-gdbae From ad12235cf974e5c2b5fe7caf8ff95f784a05ec20 Mon Sep 17 00:00:00 2001 From: Nikias Bassen Date: Thu, 17 Dec 2009 15:52:46 +0100 Subject: Only peform realignment of dock items when an item is selected --- src/sbmanager.c | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/src/sbmanager.c b/src/sbmanager.c index ad736c4..ceeafab 100644 --- a/src/sbmanager.c +++ b/src/sbmanager.c @@ -387,15 +387,15 @@ static void dock_align_icons() } if (item != selected_item) { - ClutterActorBox box; - clutter_actor_get_allocation_box(icon, &box); - //printf("box: %f,%f, %f,%f\n", box.x1,box.y1, box.x2,box.y2); - if (clutter_actor_box_contains(&box, cx+(60.0-spacing), cy)) { - printf("move item %d\n", i); - xpos += 60.0; - xpos += spacing; - } else { - printf("no!\n"); + if (selected_item) { + ClutterActorBox box; + clutter_actor_get_allocation_box(icon, &box); + //printf("box: %f,%f, %f,%f\n", box.x1,box.y1, box.x2,box.y2); + if (clutter_actor_box_contains(&box, cx+(60.0-spacing), cy)) { + printf("move item %d\n", i); + xpos += 60.0; + xpos += spacing; + } } clutter_actor_set_position(icon, xpos, ypos); } -- cgit v1.1-32-gdbae From 3bdf2556cb9c19fb4ee332f272bec74d73caf5d3 Mon Sep 17 00:00:00 2001 From: Martin Szulecki Date: Thu, 17 Dec 2009 18:27:37 +0100 Subject: Name saved icon filenames by bundle and load textures asynchronously Signed-off-by: Nikias Bassen --- src/sbmanager.c | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-) diff --git a/src/sbmanager.c b/src/sbmanager.c index ceeafab..e814396 100644 --- a/src/sbmanager.c +++ b/src/sbmanager.c @@ -107,14 +107,19 @@ static void get_icon_for_node(plist_t node, GList **list, sbservices_client_t sb valuenode = plist_dict_get_item(node, "displayIdentifier"); if (valuenode && (plist_get_node_type(valuenode) == PLIST_STRING)) { char *value = NULL; + char *icon_filename = NULL; plist_get_string_val(valuenode, &value); printf("retrieving icon for '%s'\n", value); if ((sbservices_get_icon_pngdata(sbc, value, &png, &pngsize) == SBSERVICES_E_SUCCESS) && (pngsize > 0)) { - FILE *f = fopen("/tmp/temp.png", "w"); + icon_filename = g_strdup_printf("/tmp/%s.png", value); + FILE *f = fopen(icon_filename, "w"); GError *err = NULL; fwrite(png, 1, pngsize, f); fclose(f); - ClutterActor *actor = clutter_texture_new_from_file("/tmp/temp.png", &err); + ClutterActor *actor = clutter_texture_new(); + clutter_texture_set_load_async(CLUTTER_TEXTURE(actor), TRUE); + clutter_texture_set_from_file(CLUTTER_TEXTURE(actor), icon_filename, &err); + g_free(icon_filename); if (actor) { plist_t nn = plist_dict_get_item(node, "displayName"); di = g_new0(SBItem, 1); @@ -596,7 +601,9 @@ int main(int argc, char **argv) /* dock background */ GError *err = NULL; - actor = clutter_texture_new_from_file(BGPIC, &err); + actor = clutter_texture_new(); + clutter_texture_set_load_async(CLUTTER_TEXTURE(actor), TRUE); + clutter_texture_set_from_file(CLUTTER_TEXTURE(actor), BGPIC, &err); if (err) { g_error_free(err); } -- cgit v1.1-32-gdbae From c3e4f89834c7e57edc1f4f4c89bb3e1f35347e7e Mon Sep 17 00:00:00 2001 From: Martin Szulecki Date: Thu, 17 Dec 2009 18:39:19 +0100 Subject: Retrieve icons in idle loop instead of blocking the UI at startup Signed-off-by: Nikias Bassen --- src/sbmanager.c | 21 +++++++++++++++------ 1 file changed, 15 insertions(+), 6 deletions(-) diff --git a/src/sbmanager.c b/src/sbmanager.c index e814396..65afd6d 100644 --- a/src/sbmanager.c +++ b/src/sbmanager.c @@ -43,6 +43,7 @@ ClutterColor dock_item_text_color = {255, 255, 255, 255}; typedef struct { GtkWidget *window; + char *uuid; } SBManagerApp; typedef struct { @@ -70,6 +71,7 @@ GList *this_page = NULL; int current_page = 0; static void dock_align_icons(); +static void redraw_icons(SBManagerApp *app); static void sbitem_free(SBItem *a) { @@ -144,8 +146,9 @@ static void get_icon_for_node(plist_t node, GList **list, sbservices_client_t sb } } -static void get_icons(const char *uuid) +static gboolean get_icons(gpointer data) { + SBManagerApp *app = (SBManagerApp*)data; iphone_device_t phone = NULL; lockdownd_client_t client = NULL; sbservices_client_t sbc = NULL; @@ -163,9 +166,9 @@ static void get_icons(const char *uuid) dockitems = NULL; } - if (IPHONE_E_SUCCESS != iphone_device_new(&phone, uuid)) { + if (IPHONE_E_SUCCESS != iphone_device_new(&phone, app->uuid)) { fprintf(stderr, "No iPhone found, is it plugged in?\n"); - return; + return FALSE; } if (LOCKDOWN_E_SUCCESS != lockdownd_client_new(phone, &client)) { @@ -244,6 +247,8 @@ static void get_icons(const char *uuid) } } + redraw_icons(app); + leave_cleanup: if (iconstate) { plist_free(iconstate); @@ -256,7 +261,7 @@ leave_cleanup: } iphone_device_free(phone); - return; + return FALSE; } static void clock_cb (ClutterTimeline *timeline, gint msecs, SBManagerApp *app) @@ -562,6 +567,9 @@ int main(int argc, char **argv) return -1; } + /* TODO: Read uuid from command line */ + app->uuid = NULL; + if (gtk_clutter_init (&argc, &argv) != CLUTTER_INIT_SUCCESS) { g_error ("Unable to initialize GtkClutter"); } @@ -569,8 +577,6 @@ int main(int argc, char **argv) if (!g_thread_supported()) g_thread_init(NULL); - get_icons(NULL); - /* Create the window and some child widgets: */ app->window = gtk_window_new (GTK_WINDOW_TOPLEVEL); gtk_window_set_title (GTK_WINDOW(app->window), "SpringBoard Manager"); @@ -648,6 +654,9 @@ int main(int argc, char **argv) selected_mutex = g_mutex_new(); + /* Load icons in an idle loop */ + g_idle_add((GSourceFunc)get_icons, app); + /* Start the main loop, so we can respond to events: */ gtk_main (); -- cgit v1.1-32-gdbae From 7002637e69617e796b90099c9b9295c358fd2ab7 Mon Sep 17 00:00:00 2001 From: Martin Szulecki Date: Thu, 17 Dec 2009 18:39:57 +0100 Subject: Refactor clock update logic to avoid jumping clock position Signed-off-by: Nikias Bassen --- src/sbmanager.c | 27 ++++++++++++++++----------- 1 file changed, 16 insertions(+), 11 deletions(-) diff --git a/src/sbmanager.c b/src/sbmanager.c index 65afd6d..cb69606 100644 --- a/src/sbmanager.c +++ b/src/sbmanager.c @@ -264,16 +264,20 @@ leave_cleanup: return FALSE; } -static void clock_cb (ClutterTimeline *timeline, gint msecs, SBManagerApp *app) +static void clock_set_time(ClutterActor *label, time_t t) { - time_t t = time(NULL); struct tm *curtime = localtime(&t); gchar *ctext = g_strdup_printf("%02d:%02d", curtime->tm_hour, curtime->tm_min); - clutter_text_set_text(CLUTTER_TEXT(clock_label), ctext); - clutter_actor_set_position(clock_label, (clutter_actor_get_width(stage)-clutter_actor_get_width(clock_label)) / 2, 2); + clutter_text_set_text(CLUTTER_TEXT(label), ctext); + clutter_actor_set_position(label, (clutter_actor_get_width(stage)-clutter_actor_get_width(label)) / 2, 2); g_free(ctext); } +static void clock_update_cb (ClutterTimeline *timeline, gint msecs, SBManagerApp *app) +{ + clock_set_time(clock_label, time(NULL)); +} + static void actor_get_abs_center(ClutterActor *actor, gfloat *center_x, gfloat *center_y) { *center_x = 0.0; @@ -623,9 +627,6 @@ int main(int argc, char **argv) /* clock widget */ actor = clutter_text_new_full (CLOCK_FONT, "00:00", &clock_text_color); - gint xpos = (clutter_actor_get_width(stage)-clutter_actor_get_width(actor))/2; - clutter_actor_set_position(actor, xpos, 2); - clutter_actor_show(actor); clutter_group_add (CLUTTER_GROUP (stage), actor); clock_label = actor; @@ -637,14 +638,11 @@ int main(int argc, char **argv) clutter_timeline_set_loop(timeline, TRUE); /* have it loop */ /* fire a callback for frame change */ - g_signal_connect(timeline, "completed", G_CALLBACK (clock_cb), app); + g_signal_connect(timeline, "completed", G_CALLBACK (clock_update_cb), app); /* and start it */ clutter_timeline_start (timeline); - /* Show the window: */ - gtk_widget_show_all (GTK_WIDGET (app->window)); - g_signal_connect(stage, "motion-event", G_CALLBACK (stage_motion), app); g_signal_connect( G_OBJECT(app->window), "map-event", G_CALLBACK (form_map), app); @@ -654,6 +652,13 @@ int main(int argc, char **argv) selected_mutex = g_mutex_new(); + /* Show the window. This also sets the stage's bounding box. */ + gtk_widget_show_all (GTK_WIDGET (app->window)); + + /* Position and update the clock */ + clock_set_time(actor, time(NULL)); + clutter_actor_show(clock_label); + /* Load icons in an idle loop */ g_idle_add((GSourceFunc)get_icons, app); -- cgit v1.1-32-gdbae From 1fb844bdadb3d25f6818da256840653439e940a4 Mon Sep 17 00:00:00 2001 From: Nikias Bassen Date: Thu, 17 Dec 2009 18:40:18 +0100 Subject: Added AUTHORS. --- AUTHORS | 2 ++ 1 file changed, 2 insertions(+) create mode 100644 AUTHORS diff --git a/AUTHORS b/AUTHORS new file mode 100644 index 0000000..19b1bed --- /dev/null +++ b/AUTHORS @@ -0,0 +1,2 @@ +Nikias Bassen +Martin Szulecki -- cgit v1.1-32-gdbae From 34161d4922ed768bf62079e83494c01d90e08ec4 Mon Sep 17 00:00:00 2001 From: Martin Szulecki Date: Thu, 17 Dec 2009 18:40:46 +0100 Subject: Use defines to set stage width and height where appropriate Signed-off-by: Nikias Bassen --- src/sbmanager.c | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/src/sbmanager.c b/src/sbmanager.c index cb69606..ced6083 100644 --- a/src/sbmanager.c +++ b/src/sbmanager.c @@ -34,6 +34,10 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA #include "../data/data.h" +#define STAGE_WIDTH 320 +#define STAGE_HEIGHT 480 +#define DOCK_HEIGHT 90 + const char CLOCK_FONT[] = "FreeSans Bold 12px"; ClutterColor clock_text_color = {255, 255, 255, 210}; @@ -53,7 +57,7 @@ typedef struct { gboolean is_dock_item; } SBItem; -const ClutterActorBox dock_area = {0.0, 390.0, 320.0, 480.0}; +const ClutterActorBox dock_area = {0.0, STAGE_HEIGHT - DOCK_HEIGHT, STAGE_WIDTH, STAGE_HEIGHT}; ClutterActor *stage = NULL; ClutterActor *clock_label = NULL; @@ -386,7 +390,7 @@ static void dock_align_icons() spacing = 3.0; } gfloat totalwidth = count*60.0 + spacing*(count-1); - xpos = (320.0 - totalwidth)/2.0; + xpos = (STAGE_WIDTH - totalwidth)/2.0; gfloat cx = 0.0; gfloat cy = 0.0; @@ -602,7 +606,7 @@ int main(int argc, char **argv) /* Set the size of the widget, because we should not set the size of its * stage when using GtkClutterEmbed. */ - gtk_widget_set_size_request (clutter_widget, 320, 480); + gtk_widget_set_size_request (clutter_widget, STAGE_WIDTH, STAGE_HEIGHT); /* Get the stage and set its size and color: */ stage = gtk_clutter_embed_get_stage (GTK_CLUTTER_EMBED (clutter_widget)); -- cgit v1.1-32-gdbae From 7102c8c3add8b0cc4ab2cbdb4f6a0874d68d1735 Mon Sep 17 00:00:00 2001 From: Nikias Bassen Date: Thu, 17 Dec 2009 19:36:28 +0100 Subject: Support for writing icon state back to device The reordering of the icons is not yet implemented, but the function is definitely working ;) --- src/sbmanager.c | 132 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 132 insertions(+) diff --git a/src/sbmanager.c b/src/sbmanager.c index ced6083..4a190b0 100644 --- a/src/sbmanager.c +++ b/src/sbmanager.c @@ -71,6 +71,8 @@ gfloat start_y = 0.0; GList *dockitems = NULL; GList *sbpages = NULL; +guint num_dock_items = 0; + GList *this_page = NULL; int current_page = 0; @@ -215,6 +217,7 @@ static gboolean get_icons(gpointer data) goto leave_cleanup; } count = plist_array_get_size(dock); + num_dock_items = count; for (i = 0; i < count; i++) { plist_t node = plist_array_get_item(dock, i); get_icon_for_node(node, &dockitems, sbc, TRUE); @@ -562,6 +565,133 @@ static gboolean form_focus_change(GtkWidget *widget, GdkEventFocus *event, gpoin return TRUE; } +static gboolean set_icons(gpointer data) +{ + SBManagerApp *app = (SBManagerApp*)data; + + iphone_device_t phone = NULL; + lockdownd_client_t client = NULL; + sbservices_client_t sbc = NULL; + int port = 0; + + gboolean result = FALSE; + plist_t iconstate = NULL; + plist_t pdockarray = NULL; + plist_t pdockitems = NULL; + guint i; + + if (!dockitems || !sbpages) { + printf("missing dockitems or sbpages\n"); + return result; + } + + printf("About to uploaded new iconstate...\n"); + + guint count = g_list_length(dockitems); + pdockitems = plist_new_array(); + for (i = 0; i < count; i++) { + SBItem *item = g_list_nth_data(dockitems, i); + if (!item) { + continue; + } + plist_t valuenode = plist_dict_get_item(item->node, "displayIdentifier"); + if (!valuenode) { + printf("could not get displayIdentifier\n"); + continue; + } + + plist_t pitem = plist_new_dict(); + plist_dict_insert_item(pitem, "displayIdentifier", plist_copy(valuenode)); + plist_array_append_item(pdockitems, pitem); + } + for (i = count; i < num_dock_items; i++) { + plist_array_append_item(pdockitems, plist_new_bool(0)); + } + pdockarray = plist_new_array(); + plist_array_append_item(pdockarray, pdockitems); + + iconstate = plist_new_array(); + plist_array_append_item(iconstate, pdockarray); + + for (i = 0; i < g_list_length(sbpages); i++) { + GList *page = g_list_nth_data(sbpages, i); + if (page) { + guint j; + plist_t ppage = plist_new_array(); + plist_t row = NULL; + for (j = 0; j < g_list_length(page); j++) { + SBItem *item = g_list_nth_data(page, j); + if ((j % 4) == 0) { + row = plist_new_array(); + plist_array_append_item(ppage, row); + } + if (item->node) { + plist_t valuenode = plist_dict_get_item(item->node, "displayIdentifier"); + if (!valuenode) { + printf("could not get displayIdentifier\n"); + continue; + } + + plist_t pitem = plist_new_dict(); + plist_dict_insert_item(pitem, "displayIdentifier", plist_copy(valuenode)); + plist_array_append_item(row, pitem); + } else { + plist_array_append_item(row, plist_new_bool(0)); + } + } + plist_array_append_item(iconstate, plist_copy(ppage)); + plist_free(ppage); + } + } + + if (IPHONE_E_SUCCESS != iphone_device_new(&phone, app->uuid)) { + fprintf(stderr, "No iPhone found, is it plugged in?\n"); + return result; + } + + if (LOCKDOWN_E_SUCCESS != lockdownd_client_new(phone, &client)) { + fprintf(stderr, "Could not connect to lockdownd. Exiting.\n"); + goto leave_cleanup; + } + + if ((lockdownd_start_service(client, "com.apple.springboardservices", &port) != LOCKDOWN_E_SUCCESS) || !port) { + fprintf(stderr, "Could not start com.apple.springboardservices service! Remind that this feature is only supported in OS 3.1 and later!\n"); + goto leave_cleanup; + } + if (sbservices_client_new(phone, port, &sbc) != SBSERVICES_E_SUCCESS) { + fprintf(stderr, "Could not connect to springboardservices!\n"); + goto leave_cleanup; + } + if (sbservices_set_icon_state(sbc, iconstate) != SBSERVICES_E_SUCCESS) { + fprintf(stderr, "ERROR: Could not set new icon state!\n"); + goto leave_cleanup; + } + + printf("Successfully uploaded new iconstate\n"); + result = TRUE; + +leave_cleanup: + if (iconstate) { + plist_free(iconstate); + } + if (sbc) { + sbservices_client_free(sbc); + } + if (client) { + lockdownd_client_free(client); + } + iphone_device_free(phone); + + return result; +} + +static gboolean button_clicked(GtkButton *button, gpointer user_data) +{ + set_icons(user_data); + + return TRUE; +} + int main(int argc, char **argv) { SBManagerApp *app; @@ -595,6 +725,8 @@ int main(int argc, char **argv) gtk_box_pack_end (GTK_BOX (vbox), button, FALSE, FALSE, 0); gtk_widget_show (button); + g_signal_connect (button, "clicked", G_CALLBACK (button_clicked), app); + /* Stop the application when the window is closed: */ g_signal_connect (app->window, "hide", G_CALLBACK (gtk_main_quit), app); -- cgit v1.1-32-gdbae From b2efbc32555c80b20284347e43c7b19f64d88fe1 Mon Sep 17 00:00:00 2001 From: Nikias Bassen Date: Thu, 17 Dec 2009 19:41:02 +0100 Subject: Added Martin to Copyright notice --- src/sbmanager.c | 1 + 1 file changed, 1 insertion(+) diff --git a/src/sbmanager.c b/src/sbmanager.c index 4a190b0..ed07797 100644 --- a/src/sbmanager.c +++ b/src/sbmanager.c @@ -2,6 +2,7 @@ sbmanager -- Manage iPhone/iPod Touch SpringBoard icons from your computer! Copyright (C) 2009 Nikias Bassen +Copyright (C) 2009 Martin Szulecki 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 -- cgit v1.1-32-gdbae From daa544ed2fd89674c06e6889ac556c22e8163102 Mon Sep 17 00:00:00 2001 From: Nikias Bassen Date: Thu, 17 Dec 2009 19:52:59 +0100 Subject: Do not call redraw_icons inside form_map. --- src/sbmanager.c | 4 ---- 1 file changed, 4 deletions(-) diff --git a/src/sbmanager.c b/src/sbmanager.c index ed07797..cc4a4bd 100644 --- a/src/sbmanager.c +++ b/src/sbmanager.c @@ -542,10 +542,6 @@ static gboolean form_map(GtkWidget *widget, GdkEvent *event, SBManagerApp *app) printf("%s: mapped\n", __func__); clutter_stage_ensure_redraw(CLUTTER_STAGE(stage)); - redraw_icons(app); - - clutter_stage_ensure_redraw(CLUTTER_STAGE(stage)); - return TRUE; } -- cgit v1.1-32-gdbae From dfe4f22ae5f86cb6e23ce7aae78a8fe54e9419ae Mon Sep 17 00:00:00 2001 From: Nikias Bassen Date: Fri, 18 Dec 2009 14:03:34 +0100 Subject: Added page indicator dots Somehow, they don't react on the button-press-event so page switching does not yet work. --- data/Makefile.am | 2 +- data/data.h.in | 1 + data/dot.png | Bin 0 -> 210 bytes src/sbmanager.c | 75 +++++++++++++++++++++++++++++++++++++++++++++++++------ 4 files changed, 70 insertions(+), 8 deletions(-) create mode 100644 data/dot.png diff --git a/data/Makefile.am b/data/Makefile.am index fe8325a..ff4596b 100644 --- a/data/Makefile.am +++ b/data/Makefile.am @@ -1,6 +1,6 @@ pixmapdir = $(pkgdatadir) -PIX = background.png +PIX = background.png dot.png pixmap_DATA = $(PIX) diff --git a/data/data.h.in b/data/data.h.in index 3c7e521..9faaea0 100644 --- a/data/data.h.in +++ b/data/data.h.in @@ -1 +1,2 @@ #define BGPIC "@prefix@/share/sbmanager/background.png" +#define PAGE_DOT "@prefix@/share/sbmanager/dot.png" diff --git a/data/dot.png b/data/dot.png new file mode 100644 index 0000000..d7b61ad Binary files /dev/null and b/data/dot.png differ diff --git a/src/sbmanager.c b/src/sbmanager.c index cc4a4bd..58b2967 100644 --- a/src/sbmanager.c +++ b/src/sbmanager.c @@ -62,6 +62,8 @@ const ClutterActorBox dock_area = {0.0, STAGE_HEIGHT - DOCK_HEIGHT, STAGE_WIDTH, ClutterActor *stage = NULL; ClutterActor *clock_label = NULL; +ClutterActor *page_indicator = NULL; +ClutterActor *page_indicator_group = NULL; GMutex *selected_mutex = NULL; SBItem *selected_item = NULL; @@ -78,7 +80,7 @@ GList *this_page = NULL; int current_page = 0; static void dock_align_icons(); -static void redraw_icons(SBManagerApp *app); +static void redraw_icons(); static void sbitem_free(SBItem *a) { @@ -153,6 +155,37 @@ static void get_icon_for_node(plist_t node, GList **list, sbservices_client_t sb } } +static void page_indicator_group_align() +{ + gint count = clutter_group_get_n_children(CLUTTER_GROUP(page_indicator_group)); + gint i; + gfloat xpos = 0.0; + + if (count <= 0) return; + + for (i = 0; i < count; i++) { + ClutterActor *dot = clutter_group_get_nth_child(CLUTTER_GROUP(page_indicator_group), i); + clutter_actor_set_position(dot, xpos, 0.0); + if (i == current_page) { + clutter_actor_set_opacity(dot, 200); + } else { + clutter_actor_set_opacity(dot, 100); + } + xpos += clutter_actor_get_width(dot); + } + + clutter_actor_set_x(page_indicator_group, (STAGE_WIDTH - xpos) / 2.0); +} + +static gboolean page_indicator_clicked(ClutterActor *actor, ClutterEvent *event, gpointer data) +{ + printf("page indicator clicked\n"); + current_page = GPOINTER_TO_UINT(data); + redraw_icons(); + + return TRUE; +} + static gboolean get_icons(gpointer data) { SBManagerApp *app = (SBManagerApp*)data; @@ -250,12 +283,19 @@ static gboolean get_icons(gpointer data) } if (page) { sbpages = g_list_append(sbpages, page); + if (page_indicator) { + ClutterActor *actor = clutter_clone_new(page_indicator); + clutter_actor_reparent(actor, page_indicator_group); + g_signal_connect(actor, "button-press-event", G_CALLBACK(page_indicator_clicked), GUINT_TO_POINTER(p)); + clutter_container_add_actor(CLUTTER_CONTAINER(page_indicator_group), actor); + page_indicator_group_align(); + } } } } } - redraw_icons(app); + redraw_icons(); leave_cleanup: if (iconstate) { @@ -429,7 +469,7 @@ static void dock_align_icons() } } -static void redraw_icons(SBManagerApp *app) +static void redraw_icons() { guint i; gfloat ypos; @@ -749,6 +789,7 @@ int main(int argc, char **argv) clutter_texture_set_from_file(CLUTTER_TEXTURE(actor), BGPIC, &err); if (err) { g_error_free(err); + err = NULL; } if (actor) { clutter_actor_set_position(actor, 0, 0); @@ -759,9 +800,29 @@ int main(int argc, char **argv) } /* clock widget */ - actor = clutter_text_new_full (CLOCK_FONT, "00:00", &clock_text_color); - clutter_group_add (CLUTTER_GROUP (stage), actor); - clock_label = actor; + clock_label = clutter_text_new_full (CLOCK_FONT, "00:00", &clock_text_color); + clutter_group_add (CLUTTER_GROUP (stage), clock_label); + + /* page indicator group for holding the page indicator dots */ + page_indicator_group = clutter_group_new(); + clutter_group_add (CLUTTER_GROUP(stage), page_indicator_group); + + /* alignment will be done when new indicators are added */ + clutter_actor_set_position(page_indicator_group, 0, STAGE_HEIGHT - DOCK_HEIGHT - 18); + + /* page indicator (dummy), will be cloned when the pages are created */ + page_indicator = clutter_texture_new(); + clutter_texture_set_load_async(CLUTTER_TEXTURE(page_indicator), TRUE); + clutter_texture_set_from_file(CLUTTER_TEXTURE(page_indicator), PAGE_DOT, &err); + if (err) { + fprintf(stderr, "Could not load texture " PAGE_DOT ": %s\n", err->message); + g_error_free(err); + err = NULL; + } + if (page_indicator) { + clutter_actor_hide(page_indicator); + clutter_container_add_actor(CLUTTER_CONTAINER(stage), page_indicator); + } /* Show the stage: */ clutter_actor_show (stage); @@ -789,7 +850,7 @@ int main(int argc, char **argv) gtk_widget_show_all (GTK_WIDGET (app->window)); /* Position and update the clock */ - clock_set_time(actor, time(NULL)); + clock_set_time(clock_label, time(NULL)); clutter_actor_show(clock_label); /* Load icons in an idle loop */ -- cgit v1.1-32-gdbae From 0e0f269e9ef77d7a562fb7545de47ee6eeb49d42 Mon Sep 17 00:00:00 2001 From: Nikias Bassen Date: Sat, 19 Dec 2009 23:07:21 +0100 Subject: Make page indicator dots reactive, but icon drawing needs some rework --- src/sbmanager.c | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/sbmanager.c b/src/sbmanager.c index 58b2967..2734a45 100644 --- a/src/sbmanager.c +++ b/src/sbmanager.c @@ -285,8 +285,9 @@ static gboolean get_icons(gpointer data) sbpages = g_list_append(sbpages, page); if (page_indicator) { ClutterActor *actor = clutter_clone_new(page_indicator); - clutter_actor_reparent(actor, page_indicator_group); - g_signal_connect(actor, "button-press-event", G_CALLBACK(page_indicator_clicked), GUINT_TO_POINTER(p)); + clutter_actor_unparent(actor); + clutter_actor_set_reactive(actor, TRUE); + g_signal_connect(actor, "button-press-event", G_CALLBACK(page_indicator_clicked), GUINT_TO_POINTER(p-1)); clutter_container_add_actor(CLUTTER_CONTAINER(page_indicator_group), actor); page_indicator_group_align(); } -- cgit v1.1-32-gdbae From eba58b103fa938a32a814a082cb17645146ac5a5 Mon Sep 17 00:00:00 2001 From: Nikias Bassen Date: Sun, 20 Dec 2009 20:06:33 +0100 Subject: Several fixes plus page switching now working. This one also adds groups for dock and non-dock icons to better distinguish between them. --- src/sbmanager.c | 111 ++++++++++++++++++++++++++++++++++++++------------------ 1 file changed, 75 insertions(+), 36 deletions(-) diff --git a/src/sbmanager.c b/src/sbmanager.c index 2734a45..a9304ea 100644 --- a/src/sbmanager.c +++ b/src/sbmanager.c @@ -60,7 +60,11 @@ typedef struct { const ClutterActorBox dock_area = {0.0, STAGE_HEIGHT - DOCK_HEIGHT, STAGE_WIDTH, STAGE_HEIGHT}; +const ClutterActorBox sb_area = {0.0, 16.0, STAGE_WIDTH, STAGE_HEIGHT-DOCK_HEIGHT-16.0}; + ClutterActor *stage = NULL; +ClutterActor *the_dock = NULL; +ClutterActor *the_sb = NULL; ClutterActor *clock_label = NULL; ClutterActor *page_indicator = NULL; ClutterActor *page_indicator_group = NULL; @@ -76,7 +80,6 @@ GList *sbpages = NULL; guint num_dock_items = 0; -GList *this_page = NULL; int current_page = 0; static void dock_align_icons(); @@ -181,8 +184,12 @@ static gboolean page_indicator_clicked(ClutterActor *actor, ClutterEvent *event, { printf("page indicator clicked\n"); current_page = GPOINTER_TO_UINT(data); - redraw_icons(); - + + page_indicator_group_align(); + + /* TODO: Add animation here */ + clutter_actor_set_x(the_sb, -(current_page * STAGE_WIDTH)); + return TRUE; } @@ -343,6 +350,11 @@ static gboolean item_button_press (ClutterActor *actor, ClutterButtonEvent *even return FALSE; } + if (selected_item) { + /* do not allow a button_press event without a prior release */ + return FALSE; + } + SBItem *item = (SBItem*)user_data; char *strval = NULL; @@ -355,6 +367,8 @@ static gboolean item_button_press (ClutterActor *actor, ClutterButtonEvent *even printf("%s: %s mouse pressed\n", __func__, strval); if (actor) { + gfloat diffx = 0.0; + gfloat diffy = 0.0; ClutterActor *sc = clutter_actor_get_parent(actor); if (item->is_dock_item) { GList *children = clutter_container_get_children(CLUTTER_CONTAINER(sc)); @@ -365,9 +379,16 @@ static gboolean item_button_press (ClutterActor *actor, ClutterButtonEvent *even clutter_actor_set_y(label, clutter_actor_get_y(icon) + 62.0); g_list_free(children); } + diffx = dock_area.x1; + diffy = dock_area.y1; + } else { + diffx = sb_area.x1; + diffy = sb_area.y1; } - clutter_actor_set_scale_full(sc, 1.2, 1.2, clutter_actor_get_x(actor) + clutter_actor_get_width(actor)/2, clutter_actor_get_y(actor) + clutter_actor_get_height(actor)/2); + clutter_actor_reparent(sc, stage); + clutter_actor_set_position(sc, clutter_actor_get_x(sc) + diffx, clutter_actor_get_y(sc) + diffy); clutter_actor_raise_top(sc); + clutter_actor_set_scale_full(sc, 1.2, 1.2, clutter_actor_get_x(actor) + clutter_actor_get_width(actor)/2, clutter_actor_get_y(actor) + clutter_actor_get_height(actor)/2); clutter_actor_set_opacity(sc, 160); selected_item = item; start_x = event->x; @@ -396,6 +417,8 @@ static gboolean item_button_release (ClutterActor *actor, ClutterButtonEvent *ev if (actor) { ClutterActor *sc = clutter_actor_get_parent(actor); + clutter_actor_set_scale_full(sc, 1.0, 1.0, clutter_actor_get_x(actor) + clutter_actor_get_width(actor)/2, clutter_actor_get_y(actor) + clutter_actor_get_height(actor)/2); + clutter_actor_set_opacity(sc, 255); if (item->is_dock_item) { GList *children = clutter_container_get_children(CLUTTER_CONTAINER(sc)); if (children) { @@ -405,9 +428,12 @@ static gboolean item_button_release (ClutterActor *actor, ClutterButtonEvent *ev clutter_actor_set_y(label, clutter_actor_get_y(icon) + 67.0); g_list_free(children); } + clutter_actor_reparent(sc, the_dock); + clutter_actor_set_position(sc, clutter_actor_get_x(sc) - dock_area.x1, clutter_actor_get_y(sc) - dock_area.y1); + } else { + clutter_actor_reparent(sc, the_sb); + clutter_actor_set_position(sc, clutter_actor_get_x(sc) - sb_area.x1, clutter_actor_get_y(sc) - sb_area.y1); } - clutter_actor_set_scale_full(sc, 1.0, 1.0, clutter_actor_get_x(actor) + clutter_actor_get_width(actor)/2, clutter_actor_get_y(actor) + clutter_actor_get_height(actor)/2); - clutter_actor_set_opacity(sc, 255); } selected_item = NULL; @@ -428,7 +454,7 @@ static void dock_align_icons() return; } gfloat spacing = 16.0; - gfloat ypos = dock_area.y1 + 8.0; + gfloat ypos = 8.0; gfloat xpos = 0.0; gint i = 0; if (count > 4) { @@ -473,6 +499,7 @@ static void dock_align_icons() static void redraw_icons() { guint i; + guint j; gfloat ypos; gfloat xpos; @@ -497,42 +524,44 @@ static void redraw_icons() clutter_text_set_color(CLUTTER_TEXT(actor), &dock_item_text_color); clutter_actor_show(actor); clutter_container_add_actor(CLUTTER_CONTAINER(grp), actor); - clutter_container_add_actor(CLUTTER_CONTAINER(stage), grp); + clutter_container_add_actor(CLUTTER_CONTAINER(the_dock), grp); dock_align_icons(); } } } clutter_stage_ensure_redraw(CLUTTER_STAGE(stage)); if (sbpages) { - ypos = 32.0; - xpos = 16.0; printf("%s: %d pages\n", __func__, g_list_length(sbpages)); - printf("%s: drawing page icons for page %d\n", __func__, current_page); - this_page = g_list_nth_data(sbpages, current_page); - for (i = 0; i < g_list_length(this_page); i++) { - SBItem *item = (SBItem*)g_list_nth_data(this_page, i); - if (item && item->texture && item->node) { - item->is_dock_item = FALSE; - ClutterActor *grp = clutter_group_new(); - ClutterActor *actor = item->texture; - clutter_container_add_actor(CLUTTER_CONTAINER(grp), actor); - clutter_actor_set_position(actor, xpos, ypos); - clutter_actor_set_reactive(actor, TRUE); - g_signal_connect(actor, "button-press-event", G_CALLBACK (item_button_press), item); - g_signal_connect(actor, "button-release-event", G_CALLBACK (item_button_release), item); - clutter_actor_show(actor); - actor = item->label; - clutter_text_set_color(CLUTTER_TEXT(actor), &item_text_color); - clutter_actor_set_position(actor, xpos+(59.0 - clutter_actor_get_width(actor))/2, ypos+62.0); - clutter_actor_show(actor); - clutter_container_add_actor(CLUTTER_CONTAINER(grp), actor); - clutter_container_add_actor(CLUTTER_CONTAINER(stage), grp); - } - if (((i+1) % 4) == 0) { - xpos = 16.0; - ypos += 88.0; - } else { - xpos += 76.0; + for (j = 0; j < g_list_length(sbpages); j++) { + GList *cpage = g_list_nth_data(sbpages, j); + ypos = 16.0; + xpos = 16.0 + (j * STAGE_WIDTH); + printf("%s: drawing page icons for page %d\n", __func__, j); + for (i = 0; i < g_list_length(cpage); i++) { + SBItem *item = (SBItem*)g_list_nth_data(cpage, i); + if (item && item->texture && item->node) { + item->is_dock_item = FALSE; + ClutterActor *grp = clutter_group_new(); + ClutterActor *actor = item->texture; + clutter_container_add_actor(CLUTTER_CONTAINER(grp), actor); + clutter_actor_set_position(actor, xpos, ypos); + clutter_actor_set_reactive(actor, TRUE); + g_signal_connect(actor, "button-press-event", G_CALLBACK (item_button_press), item); + g_signal_connect(actor, "button-release-event", G_CALLBACK (item_button_release), item); + clutter_actor_show(actor); + actor = item->label; + clutter_text_set_color(CLUTTER_TEXT(actor), &item_text_color); + clutter_actor_set_position(actor, xpos+(59.0 - clutter_actor_get_width(actor))/2, ypos+62.0); + clutter_actor_show(actor); + clutter_container_add_actor(CLUTTER_CONTAINER(grp), actor); + clutter_container_add_actor(CLUTTER_CONTAINER(the_sb), grp); + } + if (((i+1) % 4) == 0) { + xpos = 16.0 + (j * STAGE_WIDTH); + ypos += 88.0; + } else { + xpos += 76.0; + } } } } @@ -825,6 +854,16 @@ int main(int argc, char **argv) clutter_container_add_actor(CLUTTER_CONTAINER(stage), page_indicator); } + /* a group for the springboard icons */ + the_sb = clutter_group_new(); + clutter_group_add (CLUTTER_GROUP(stage), the_sb); + clutter_actor_set_position(the_sb, 0, 16); + + /* a group for the dock icons */ + the_dock = clutter_group_new(); + clutter_group_add (CLUTTER_GROUP(stage), the_dock); + clutter_actor_set_position(the_dock, dock_area.x1, dock_area.y1); + /* Show the stage: */ clutter_actor_show (stage); -- cgit v1.1-32-gdbae From d91d5953aa805ae833036abfe71d45ade63c6ba2 Mon Sep 17 00:00:00 2001 From: Nikias Bassen Date: Sun, 20 Dec 2009 20:58:03 +0100 Subject: Yes, page switch animation! --- src/sbmanager.c | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/src/sbmanager.c b/src/sbmanager.c index a9304ea..d070cca 100644 --- a/src/sbmanager.c +++ b/src/sbmanager.c @@ -182,13 +182,11 @@ static void page_indicator_group_align() static gboolean page_indicator_clicked(ClutterActor *actor, ClutterEvent *event, gpointer data) { - printf("page indicator clicked\n"); current_page = GPOINTER_TO_UINT(data); page_indicator_group_align(); - /* TODO: Add animation here */ - clutter_actor_set_x(the_sb, -(current_page * STAGE_WIDTH)); + clutter_actor_animate(the_sb, CLUTTER_EASE_IN_OUT_CUBIC, 400, "x", (gfloat)(-(current_page*STAGE_WIDTH)), NULL); return TRUE; } -- cgit v1.1-32-gdbae From c23e078c9ab974595b16ee4d519a1ec860ef3904 Mon Sep 17 00:00:00 2001 From: Nikias Bassen Date: Sun, 20 Dec 2009 22:24:23 +0100 Subject: Added some animation to dock_align_icons --- src/sbmanager.c | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-) diff --git a/src/sbmanager.c b/src/sbmanager.c index d070cca..4394ebd 100644 --- a/src/sbmanager.c +++ b/src/sbmanager.c @@ -435,7 +435,7 @@ static gboolean item_button_release (ClutterActor *actor, ClutterButtonEvent *ev } selected_item = NULL; - dock_align_icons(); + dock_align_icons(TRUE); start_x = 0.0; start_y = 0.0; @@ -444,7 +444,7 @@ static gboolean item_button_release (ClutterActor *actor, ClutterButtonEvent *ev return TRUE; } -static void dock_align_icons() +static void dock_align_icons(gboolean animated) { if (!dockitems) return; gint count = g_list_length(dockitems); @@ -484,7 +484,11 @@ static void dock_align_icons() xpos += spacing; } } - clutter_actor_set_position(icon, xpos, ypos); + if (animated) { + clutter_actor_animate(icon, CLUTTER_EASE_OUT_QUAD, 250, "x", xpos, "y", ypos, NULL); + } else { + clutter_actor_set_position(icon, xpos, ypos); + } } xpos += 60; @@ -523,7 +527,7 @@ static void redraw_icons() clutter_actor_show(actor); clutter_container_add_actor(CLUTTER_CONTAINER(grp), actor); clutter_container_add_actor(CLUTTER_CONTAINER(the_dock), grp); - dock_align_icons(); + dock_align_icons(FALSE); } } } @@ -593,7 +597,7 @@ static gboolean stage_motion (ClutterActor *actor, ClutterMotionEvent *event, gp printf("icon from dock moving outside the dock!\n"); dockitems = g_list_remove(dockitems, selected_item); } - dock_align_icons(); + dock_align_icons(TRUE); } else { if (clutter_actor_box_contains(&dock_area, center_x, center_y)) { printf("regular icon is moving inside the dock!\n"); -- cgit v1.1-32-gdbae From f9750383a70d85361ee32a6bcbf73a1fb630e4c5 Mon Sep 17 00:00:00 2001 From: Nikias Bassen Date: Mon, 21 Dec 2009 17:51:29 +0100 Subject: Made check for motion in dock_area only y-axis dependant. This prevents icons being detected 'outside the dock' when they are moved across the left, right, or bottom margin of the dock area. --- src/sbmanager.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/sbmanager.c b/src/sbmanager.c index 4394ebd..07b639f 100644 --- a/src/sbmanager.c +++ b/src/sbmanager.c @@ -587,7 +587,7 @@ static gboolean stage_motion (ClutterActor *actor, ClutterMotionEvent *event, gp actor_get_abs_center(clutter_actor_get_parent(selected_item->texture), ¢er_x, ¢er_y); if (selected_item->is_dock_item) { - if (clutter_actor_box_contains(&dock_area, center_x, center_y)) { + if (center_y >= dock_area.y1) { printf("icon from dock moving inside the dock!\n"); GList *found = g_list_find(dockitems, selected_item); if (!found) { @@ -599,7 +599,7 @@ static gboolean stage_motion (ClutterActor *actor, ClutterMotionEvent *event, gp } dock_align_icons(TRUE); } else { - if (clutter_actor_box_contains(&dock_area, center_x, center_y)) { + if (center_y >= dock_area.y1) { printf("regular icon is moving inside the dock!\n"); } else { printf("regular icon is moving!\n"); -- cgit v1.1-32-gdbae From 8f9eb21a383a83c57621b3aeb7be7e95c257f21a Mon Sep 17 00:00:00 2001 From: Martin Szulecki Date: Mon, 21 Dec 2009 23:58:29 +0100 Subject: Fix wrong signature of dock align function Signed-off-by: Nikias Bassen --- src/sbmanager.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/sbmanager.c b/src/sbmanager.c index 07b639f..267fb2a 100644 --- a/src/sbmanager.c +++ b/src/sbmanager.c @@ -82,7 +82,7 @@ guint num_dock_items = 0; int current_page = 0; -static void dock_align_icons(); +static void dock_align_icons(gboolean animated); static void redraw_icons(); static void sbitem_free(SBItem *a) -- cgit v1.1-32-gdbae From ddc57062079d37b10d8449a1987e174d4912ee24 Mon Sep 17 00:00:00 2001 From: Martin Szulecki Date: Mon, 21 Dec 2009 23:59:32 +0100 Subject: Fix icon movement for multiple pages Signed-off-by: Nikias Bassen --- src/sbmanager.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/sbmanager.c b/src/sbmanager.c index 267fb2a..82b6cbd 100644 --- a/src/sbmanager.c +++ b/src/sbmanager.c @@ -380,7 +380,7 @@ static gboolean item_button_press (ClutterActor *actor, ClutterButtonEvent *even diffx = dock_area.x1; diffy = dock_area.y1; } else { - diffx = sb_area.x1; + diffx = sb_area.x1 - (current_page*STAGE_WIDTH); diffy = sb_area.y1; } clutter_actor_reparent(sc, stage); @@ -430,7 +430,7 @@ static gboolean item_button_release (ClutterActor *actor, ClutterButtonEvent *ev clutter_actor_set_position(sc, clutter_actor_get_x(sc) - dock_area.x1, clutter_actor_get_y(sc) - dock_area.y1); } else { clutter_actor_reparent(sc, the_sb); - clutter_actor_set_position(sc, clutter_actor_get_x(sc) - sb_area.x1, clutter_actor_get_y(sc) - sb_area.y1); + clutter_actor_set_position(sc, clutter_actor_get_x(sc) + (current_page*STAGE_WIDTH) - sb_area.x1, clutter_actor_get_y(sc) - sb_area.y1); } } @@ -577,7 +577,7 @@ static gboolean stage_motion (ClutterActor *actor, ClutterMotionEvent *event, gp return FALSE; } - clutter_actor_move_by(clutter_actor_get_parent(selected_item->texture), (event->x - start_x), event->y - start_y); + clutter_actor_move_by(clutter_actor_get_parent(selected_item->texture), (event->x - start_x), (event->y - start_y)); start_x = event->x; start_y = event->y; -- cgit v1.1-32-gdbae From 057b15260ef360c05c8f4c54955ca6dd25766762 Mon Sep 17 00:00:00 2001 From: Martin Szulecki Date: Tue, 22 Dec 2009 00:04:51 +0100 Subject: Attempt to quickly fix springboard and dock icon exchange Signed-off-by: Nikias Bassen --- src/sbmanager.c | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/sbmanager.c b/src/sbmanager.c index 82b6cbd..9aae5b9 100644 --- a/src/sbmanager.c +++ b/src/sbmanager.c @@ -591,16 +591,19 @@ static gboolean stage_motion (ClutterActor *actor, ClutterMotionEvent *event, gp printf("icon from dock moving inside the dock!\n"); GList *found = g_list_find(dockitems, selected_item); if (!found) { + selected_item->is_dock_item = TRUE; dockitems = g_list_insert(dockitems, selected_item, 3); } } else { printf("icon from dock moving outside the dock!\n"); dockitems = g_list_remove(dockitems, selected_item); + selected_item->is_dock_item = FALSE; } dock_align_icons(TRUE); } else { if (center_y >= dock_area.y1) { printf("regular icon is moving inside the dock!\n"); + selected_item->is_dock_item = TRUE; } else { printf("regular icon is moving!\n"); } -- cgit v1.1-32-gdbae From 864738ad6cdc9cd816cc0e21c6906704b54d5c23 Mon Sep 17 00:00:00 2001 From: Nikias Bassen Date: Tue, 22 Dec 2009 22:00:32 +0100 Subject: Removed buggy dock alignment code --- src/sbmanager.c | 49 +++++++++++++++++++++++++++++-------------------- 1 file changed, 29 insertions(+), 20 deletions(-) diff --git a/src/sbmanager.c b/src/sbmanager.c index 9aae5b9..1175f8d 100644 --- a/src/sbmanager.c +++ b/src/sbmanager.c @@ -461,11 +461,9 @@ static void dock_align_icons(gboolean animated) gfloat totalwidth = count*60.0 + spacing*(count-1); xpos = (STAGE_WIDTH - totalwidth)/2.0; - gfloat cx = 0.0; - gfloat cy = 0.0; - if (selected_item) { - actor_get_abs_center(clutter_actor_get_parent(selected_item->texture), &cx, &cy); - } + /* 1. store the current icon positions (except the selected one) */ + gfloat *x_pos = g_new0(gfloat, count); + ClutterActor **actors = g_new0(ClutterActor*, count); for (i = 0; i < count; i++) { SBItem *item = g_list_nth_data(dockitems, i); ClutterActor *icon = clutter_actor_get_parent(item->texture); @@ -473,22 +471,12 @@ static void dock_align_icons(gboolean animated) continue; } + x_pos[i] = xpos; + if (item != selected_item) { - if (selected_item) { - ClutterActorBox box; - clutter_actor_get_allocation_box(icon, &box); - //printf("box: %f,%f, %f,%f\n", box.x1,box.y1, box.x2,box.y2); - if (clutter_actor_box_contains(&box, cx+(60.0-spacing), cy)) { - printf("move item %d\n", i); - xpos += 60.0; - xpos += spacing; - } - } - if (animated) { - clutter_actor_animate(icon, CLUTTER_EASE_OUT_QUAD, 250, "x", xpos, "y", ypos, NULL); - } else { - clutter_actor_set_position(icon, xpos, ypos); - } + actors[i] = icon; + } else { + sel_item = item; } xpos += 60; @@ -496,6 +484,27 @@ static void dock_align_icons(gboolean animated) xpos += spacing; } } + + if (sel_item && selected_item) { + /* perform position calculation */ + gfloat cx = 0.0; + gfloat cy = 0.0; + actor_get_abs_center(clutter_actor_get_parent(selected_item->texture), &cx, &cy); + } + + /* finally, set the positions */ + for (i = 0; i < count; i++) { + if (actors[i]) { + xpos = x_pos[i]; + if (animated) { + clutter_actor_animate(actors[i], CLUTTER_EASE_OUT_QUAD, 250, "x", xpos, "y", ypos, NULL); + } else { + clutter_actor_set_position(actors[i], xpos, ypos); + } + } + } + g_free(x_pos); + g_free(actors); } static void redraw_icons() -- cgit v1.1-32-gdbae From 219742cfc736911fc73f09bc2eba4e403d90a4e4 Mon Sep 17 00:00:00 2001 From: Nikias Bassen Date: Tue, 22 Dec 2009 22:31:15 +0100 Subject: Added missing declaration for sel_item --- src/sbmanager.c | 1 + 1 file changed, 1 insertion(+) diff --git a/src/sbmanager.c b/src/sbmanager.c index 1175f8d..2011f87 100644 --- a/src/sbmanager.c +++ b/src/sbmanager.c @@ -455,6 +455,7 @@ static void dock_align_icons(gboolean animated) gfloat ypos = 8.0; gfloat xpos = 0.0; gint i = 0; + SBItem *sel_item = NULL; if (count > 4) { spacing = 3.0; } -- cgit v1.1-32-gdbae From d356ed7d2bc39020669a4393a3657628a530fd1c Mon Sep 17 00:00:00 2001 From: Nikias Bassen Date: Wed, 23 Dec 2009 03:36:07 +0100 Subject: memory leak fix --- src/sbmanager.c | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/sbmanager.c b/src/sbmanager.c index 2011f87..6dc8bde 100644 --- a/src/sbmanager.c +++ b/src/sbmanager.c @@ -156,6 +156,9 @@ static void get_icon_for_node(plist_t node, GList **list, sbservices_client_t sb } free(value); } + if (png) { + free(png); + } } static void page_indicator_group_align() -- cgit v1.1-32-gdbae From b53a306ad6bb527cbafb0ed28282d68f8c7d2396 Mon Sep 17 00:00:00 2001 From: Nikias Bassen Date: Wed, 23 Dec 2009 03:52:02 +0100 Subject: Added sb_align_icons() to align the icons in the sb area --- src/sbmanager.c | 113 ++++++++++++++++++++++++++++++++++++++++++++++++++------ 1 file changed, 101 insertions(+), 12 deletions(-) diff --git a/src/sbmanager.c b/src/sbmanager.c index 6dc8bde..983db3d 100644 --- a/src/sbmanager.c +++ b/src/sbmanager.c @@ -83,6 +83,7 @@ guint num_dock_items = 0; int current_page = 0; static void dock_align_icons(gboolean animated); +static void sb_align_icons(guint page_num, gboolean animated); static void redraw_icons(); static void sbitem_free(SBItem *a) @@ -439,6 +440,7 @@ static gboolean item_button_release (ClutterActor *actor, ClutterButtonEvent *ev selected_item = NULL; dock_align_icons(TRUE); + sb_align_icons(current_page, TRUE); start_x = 0.0; start_y = 0.0; @@ -511,6 +513,87 @@ static void dock_align_icons(gboolean animated) g_free(actors); } +static void sb_align_icons(guint page_num, gboolean animated) +{ + if (!sbpages) return; + if (g_list_length(sbpages) == 0) { + printf("%s: no pages? that's strange...\n", __func__); + return; + } + GList *pageitems = g_list_nth_data(sbpages, page_num); + if (!pageitems) { + printf("%s: no items on page %d\n", __func__, page_num); + return; + } + gint count = g_list_length(pageitems); + + gfloat ypos = 16.0; + gfloat xpos = 16.0 + (page_num * STAGE_WIDTH); + gint i = 0; + SBItem *sel_item = NULL; + + /* store the current icon positions (except the selected one) */ + gfloat *x_pos = g_new0(gfloat, count); + gfloat *y_pos = g_new0(gfloat, count); + ClutterActor **actors = g_new0(ClutterActor*, count); + for (i = 0; i < count; i++) { + SBItem *item = g_list_nth_data(pageitems, i); + if (!item) { + printf("%s: item is null for i=%d\n", __func__, i); + continue; + } + if (!item->texture) { + printf("%s(%d,%d): i=%d item->texture is null\n", __func__, page_num, animated, i); + continue; + } + ClutterActor *icon = clutter_actor_get_parent(item->texture); + if (!icon) { + continue; + } + + x_pos[i] = xpos; + y_pos[i] = ypos; + + if (item != selected_item) { + actors[i] = icon; + } else { + sel_item = item; + } + + if (((i+1) % 4) == 0) { + xpos = 16.0 + (page_num * STAGE_WIDTH); + if (ypos+88.0 < sb_area.y2-sb_area.y1) { + ypos += 88.0; + } + } else { + xpos += 76; + } + } + + if (sel_item && selected_item) { + /* perform position calculation */ + gfloat cx = 0.0; + gfloat cy = 0.0; + actor_get_abs_center(clutter_actor_get_parent(selected_item->texture), &cx, &cy); + } + + /* finally, set the positions */ + for (i = 0; i < count; i++) { + if (actors[i]) { + xpos = x_pos[i]; + ypos = y_pos[i]; + if (animated) { + clutter_actor_animate(actors[i], CLUTTER_EASE_OUT_QUAD, 250, "x", xpos, "y", ypos, NULL); + } else { + clutter_actor_set_position(actors[i], xpos, ypos); + } + } + } + g_free(actors); + g_free(y_pos); + g_free(x_pos); +} + static void redraw_icons() { guint i; @@ -549,8 +632,8 @@ static void redraw_icons() printf("%s: %d pages\n", __func__, g_list_length(sbpages)); for (j = 0; j < g_list_length(sbpages); j++) { GList *cpage = g_list_nth_data(sbpages, j); - ypos = 16.0; - xpos = 16.0 + (j * STAGE_WIDTH); + ypos = 0.0; + xpos = 0.0; printf("%s: drawing page icons for page %d\n", __func__, j); for (i = 0; i < g_list_length(cpage); i++) { SBItem *item = (SBItem*)g_list_nth_data(cpage, i); @@ -570,12 +653,7 @@ static void redraw_icons() clutter_actor_show(actor); clutter_container_add_actor(CLUTTER_CONTAINER(grp), actor); clutter_container_add_actor(CLUTTER_CONTAINER(the_sb), grp); - } - if (((i+1) % 4) == 0) { - xpos = 16.0 + (j * STAGE_WIDTH); - ypos += 88.0; - } else { - xpos += 76.0; + sb_align_icons(j, FALSE); } } } @@ -590,14 +668,16 @@ static gboolean stage_motion (ClutterActor *actor, ClutterMotionEvent *event, gp return FALSE; } - clutter_actor_move_by(clutter_actor_get_parent(selected_item->texture), (event->x - start_x), (event->y - start_y)); + ClutterActor *icon = clutter_actor_get_parent(selected_item->texture); + + clutter_actor_move_by(icon, (event->x - start_x), (event->y - start_y)); start_x = event->x; start_y = event->y; gfloat center_x; gfloat center_y; - actor_get_abs_center(clutter_actor_get_parent(selected_item->texture), ¢er_x, ¢er_y); + actor_get_abs_center(icon, ¢er_x, ¢er_y); if (selected_item->is_dock_item) { if (center_y >= dock_area.y1) { @@ -605,22 +685,31 @@ static gboolean stage_motion (ClutterActor *actor, ClutterMotionEvent *event, gp GList *found = g_list_find(dockitems, selected_item); if (!found) { selected_item->is_dock_item = TRUE; - dockitems = g_list_insert(dockitems, selected_item, 3); + dockitems = g_list_append(dockitems, selected_item); } } else { printf("icon from dock moving outside the dock!\n"); dockitems = g_list_remove(dockitems, selected_item); selected_item->is_dock_item = FALSE; } - dock_align_icons(TRUE); } else { + GList *pageitems = g_list_nth_data(sbpages, current_page); + sbpages = g_list_remove(sbpages, pageitems); if (center_y >= dock_area.y1) { printf("regular icon is moving inside the dock!\n"); + pageitems = g_list_remove(pageitems, selected_item); selected_item->is_dock_item = TRUE; } else { printf("regular icon is moving!\n"); + GList *found = g_list_find(pageitems, selected_item); + if (!found) { + pageitems = g_list_append(pageitems, selected_item); + } } + sbpages = g_list_insert(sbpages, pageitems, current_page); } + dock_align_icons(TRUE); + sb_align_icons(current_page, TRUE); return TRUE; } -- cgit v1.1-32-gdbae From a15d32a1fd25d6f6018abe28ffe32459282fe0c7 Mon Sep 17 00:00:00 2001 From: Nikias Bassen Date: Wed, 23 Dec 2009 17:14:38 +0100 Subject: Make the icon align functions set the current positions only The repositioning will be done by another function, so let these align functions do what they where meant for, just align the icons in the current icon list. --- src/sbmanager.c | 76 +++++++++------------------------------------------------ 1 file changed, 12 insertions(+), 64 deletions(-) diff --git a/src/sbmanager.c b/src/sbmanager.c index 983db3d..8220e89 100644 --- a/src/sbmanager.c +++ b/src/sbmanager.c @@ -460,16 +460,13 @@ static void dock_align_icons(gboolean animated) gfloat ypos = 8.0; gfloat xpos = 0.0; gint i = 0; - SBItem *sel_item = NULL; if (count > 4) { spacing = 3.0; } gfloat totalwidth = count*60.0 + spacing*(count-1); xpos = (STAGE_WIDTH - totalwidth)/2.0; - /* 1. store the current icon positions (except the selected one) */ - gfloat *x_pos = g_new0(gfloat, count); - ClutterActor **actors = g_new0(ClutterActor*, count); + /* set positions */ for (i = 0; i < count; i++) { SBItem *item = g_list_nth_data(dockitems, i); ClutterActor *icon = clutter_actor_get_parent(item->texture); @@ -477,12 +474,12 @@ static void dock_align_icons(gboolean animated) continue; } - x_pos[i] = xpos; - if (item != selected_item) { - actors[i] = icon; - } else { - sel_item = item; + if (animated) { + clutter_actor_animate(icon, CLUTTER_EASE_OUT_QUAD, 250, "x", xpos, "y", ypos, NULL); + } else { + clutter_actor_set_position(icon, xpos, ypos); + } } xpos += 60; @@ -490,27 +487,6 @@ static void dock_align_icons(gboolean animated) xpos += spacing; } } - - if (sel_item && selected_item) { - /* perform position calculation */ - gfloat cx = 0.0; - gfloat cy = 0.0; - actor_get_abs_center(clutter_actor_get_parent(selected_item->texture), &cx, &cy); - } - - /* finally, set the positions */ - for (i = 0; i < count; i++) { - if (actors[i]) { - xpos = x_pos[i]; - if (animated) { - clutter_actor_animate(actors[i], CLUTTER_EASE_OUT_QUAD, 250, "x", xpos, "y", ypos, NULL); - } else { - clutter_actor_set_position(actors[i], xpos, ypos); - } - } - } - g_free(x_pos); - g_free(actors); } static void sb_align_icons(guint page_num, gboolean animated) @@ -530,12 +506,8 @@ static void sb_align_icons(guint page_num, gboolean animated) gfloat ypos = 16.0; gfloat xpos = 16.0 + (page_num * STAGE_WIDTH); gint i = 0; - SBItem *sel_item = NULL; - /* store the current icon positions (except the selected one) */ - gfloat *x_pos = g_new0(gfloat, count); - gfloat *y_pos = g_new0(gfloat, count); - ClutterActor **actors = g_new0(ClutterActor*, count); + /* set positions */ for (i = 0; i < count; i++) { SBItem *item = g_list_nth_data(pageitems, i); if (!item) { @@ -551,13 +523,12 @@ static void sb_align_icons(guint page_num, gboolean animated) continue; } - x_pos[i] = xpos; - y_pos[i] = ypos; - if (item != selected_item) { - actors[i] = icon; - } else { - sel_item = item; + if (animated) { + clutter_actor_animate(icon, CLUTTER_EASE_OUT_QUAD, 250, "x", xpos, "y", ypos, NULL); + } else { + clutter_actor_set_position(icon, xpos, ypos); + } } if (((i+1) % 4) == 0) { @@ -569,29 +540,6 @@ static void sb_align_icons(guint page_num, gboolean animated) xpos += 76; } } - - if (sel_item && selected_item) { - /* perform position calculation */ - gfloat cx = 0.0; - gfloat cy = 0.0; - actor_get_abs_center(clutter_actor_get_parent(selected_item->texture), &cx, &cy); - } - - /* finally, set the positions */ - for (i = 0; i < count; i++) { - if (actors[i]) { - xpos = x_pos[i]; - ypos = y_pos[i]; - if (animated) { - clutter_actor_animate(actors[i], CLUTTER_EASE_OUT_QUAD, 250, "x", xpos, "y", ypos, NULL); - } else { - clutter_actor_set_position(actors[i], xpos, ypos); - } - } - } - g_free(actors); - g_free(y_pos); - g_free(x_pos); } static void redraw_icons() -- cgit v1.1-32-gdbae From b2746ffddc755f1972a75c8d084af4d48bee8020 Mon Sep 17 00:00:00 2001 From: Nikias Bassen Date: Wed, 23 Dec 2009 18:12:59 +0100 Subject: Make icon exchange actually work (with some issues for sb area) --- src/sbmanager.c | 47 ++++++++++++++++++++++++++++++++++++----------- 1 file changed, 36 insertions(+), 11 deletions(-) diff --git a/src/sbmanager.c b/src/sbmanager.c index 8220e89..fea4dd9 100644 --- a/src/sbmanager.c +++ b/src/sbmanager.c @@ -609,6 +609,37 @@ static void redraw_icons() clutter_stage_ensure_redraw(CLUTTER_STAGE(stage)); } +static GList *insert_into_icon_list(GList *iconlist, SBItem *newitem, gfloat item_x, gfloat item_y) +{ + if (!newitem || !iconlist) { + return iconlist; + } + gint i; + gint count = g_list_length(iconlist); + gint newpos = count; + if (count <= 0) { + return iconlist; + } + + for (i = 0; i < count; i++) { + SBItem *item = g_list_nth_data(iconlist, i); + ClutterActor *icon = clutter_actor_get_parent(item->texture); + gfloat xpos = clutter_actor_get_x(icon); + gfloat ypos = clutter_actor_get_y(icon); + + if ((item_y > ypos+70) || (item_y < ypos-10)) { + /* this is not the row we are in */ + continue; + } + if (item_x < xpos+30) { + newpos = i; + break; + } + } + + return g_list_insert(iconlist, selected_item, newpos); +} + static gboolean stage_motion (ClutterActor *actor, ClutterMotionEvent *event, gpointer user_data) { /* check if an item has been raised */ @@ -628,31 +659,25 @@ static gboolean stage_motion (ClutterActor *actor, ClutterMotionEvent *event, gp actor_get_abs_center(icon, ¢er_x, ¢er_y); if (selected_item->is_dock_item) { + dockitems = g_list_remove(dockitems, selected_item); if (center_y >= dock_area.y1) { printf("icon from dock moving inside the dock!\n"); - GList *found = g_list_find(dockitems, selected_item); - if (!found) { - selected_item->is_dock_item = TRUE; - dockitems = g_list_append(dockitems, selected_item); - } + selected_item->is_dock_item = TRUE; + dockitems = insert_into_icon_list(dockitems, selected_item, (center_x - dock_area.x1), (center_y - dock_area.y1)); } else { printf("icon from dock moving outside the dock!\n"); - dockitems = g_list_remove(dockitems, selected_item); selected_item->is_dock_item = FALSE; } } else { GList *pageitems = g_list_nth_data(sbpages, current_page); sbpages = g_list_remove(sbpages, pageitems); + pageitems = g_list_remove(pageitems, selected_item); if (center_y >= dock_area.y1) { printf("regular icon is moving inside the dock!\n"); - pageitems = g_list_remove(pageitems, selected_item); selected_item->is_dock_item = TRUE; } else { printf("regular icon is moving!\n"); - GList *found = g_list_find(pageitems, selected_item); - if (!found) { - pageitems = g_list_append(pageitems, selected_item); - } + pageitems = insert_into_icon_list(pageitems, selected_item, (center_x - sb_area.x1), (center_y - sb_area.y1)); } sbpages = g_list_insert(sbpages, pageitems, current_page); } -- cgit v1.1-32-gdbae From bb103ac352db03b32c01f211d81a4ec921485a65 Mon Sep 17 00:00:00 2001 From: Martin Szulecki Date: Thu, 24 Dec 2009 16:42:53 +0100 Subject: Make battery level transparent in background image Signed-off-by: Nikias Bassen --- data/background.png | Bin 19869 -> 88647 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/data/background.png b/data/background.png index 7077fa1..dc5b050 100644 Binary files a/data/background.png and b/data/background.png differ -- cgit v1.1-32-gdbae From aadc7f0d37f1a56d98ac75101bbf937e97450969 Mon Sep 17 00:00:00 2001 From: Martin Szulecki Date: Thu, 24 Dec 2009 16:44:07 +0100 Subject: Implement showing real device battery level within icon area Signed-off-by: Nikias Bassen --- src/sbmanager.c | 97 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 97 insertions(+) diff --git a/src/sbmanager.c b/src/sbmanager.c index fea4dd9..e575c46 100644 --- a/src/sbmanager.c +++ b/src/sbmanager.c @@ -49,6 +49,7 @@ ClutterColor dock_item_text_color = {255, 255, 255, 255}; typedef struct { GtkWidget *window; char *uuid; + plist_t battery; } SBManagerApp; typedef struct { @@ -66,6 +67,7 @@ ClutterActor *stage = NULL; ClutterActor *the_dock = NULL; ClutterActor *the_sb = NULL; ClutterActor *clock_label = NULL; +ClutterActor *battery_level = NULL; ClutterActor *page_indicator = NULL; ClutterActor *page_indicator_group = NULL; @@ -839,6 +841,93 @@ static gboolean button_clicked(GtkButton *button, gpointer user_data) return TRUE; } +static guint battery_init(SBManagerApp *app) +{ + guint interval = 60; + iphone_device_t phone = NULL; + lockdownd_client_t client = NULL; + plist_t info_plist = NULL; + + if (IPHONE_E_SUCCESS != iphone_device_new(&phone, app->uuid)) { + fprintf(stderr, "No iPhone found, is it plugged in?\n"); + goto leave_cleanup; + } + + if (LOCKDOWN_E_SUCCESS != lockdownd_client_new(phone, &client)) { + fprintf(stderr, "Could not connect to lockdownd. Exiting.\n"); + goto leave_cleanup; + } + + lockdownd_get_value(client, "com.apple.mobile.iTunes", "BatteryPollInterval", &info_plist); + plist_get_uint_val(info_plist, (uint64_t*)&interval); + plist_free(info_plist); + + printf("Have to poll battery every %d seconds...\n", interval); + +leave_cleanup: + if (client) { + lockdownd_client_free(client); + } + iphone_device_free(phone); + + /* Let's default to the default */ + return interval; +} + +static guint battery_get_current_capacity(SBManagerApp *app) +{ + uint64_t current_capacity = 0; + plist_t node = NULL; + + if (app->battery == NULL) + return current_capacity; + + node = plist_dict_get_item(app->battery, "BatteryCurrentCapacity"); + if (node != NULL) + { + plist_get_uint_val(node, ¤t_capacity); + plist_free(node); + } + + return (guint)current_capacity; +} + +static gboolean battery_update_cb(gpointer data) +{ + SBManagerApp *app = (SBManagerApp*)data; + iphone_device_t phone = NULL; + lockdownd_client_t client = NULL; + guint capacity = 0; + + printf("Updating battery information...\n"); + + if (IPHONE_E_SUCCESS != iphone_device_new(&phone, app->uuid)) { + fprintf(stderr, "No iPhone found, is it plugged in?\n"); + goto leave_cleanup; + } + + if (LOCKDOWN_E_SUCCESS != lockdownd_client_new(phone, &client)) { + fprintf(stderr, "Could not connect to lockdownd. Exiting.\n"); + goto leave_cleanup; + } + + lockdownd_get_value(client, "com.apple.mobile.battery", NULL, &app->battery); + + capacity = battery_get_current_capacity(app); + printf("Battery capacity is at %d%%\n", capacity); + + clutter_actor_set_size(battery_level, (guint)(((double)(capacity)/100.0)*15), 6); + clutter_actor_set_position(battery_level, 298, 6); + +leave_cleanup: + if (client) { + lockdownd_client_free(client); + } + iphone_device_free(phone); + + return TRUE; +} + int main(int argc, char **argv) { SBManagerApp *app; @@ -973,6 +1062,14 @@ int main(int argc, char **argv) clock_set_time(clock_label, time(NULL)); clutter_actor_show(clock_label); + /* Load BatteryPollInterval and register battery state read timeout */ + g_timeout_add_seconds(battery_init(app), (GSourceFunc)battery_update_cb, app); + + /* battery capacity */ + battery_level = clutter_rectangle_new_with_color(clutter_color_new(0xff, 0xff, 0xff, 0x9f)); + battery_update_cb(app); + clutter_group_add (CLUTTER_GROUP (stage), battery_level); + /* Load icons in an idle loop */ g_idle_add((GSourceFunc)get_icons, app); -- cgit v1.1-32-gdbae From 4ac0168a04240972123e511c5832e381b9742610 Mon Sep 17 00:00:00 2001 From: Nikias Bassen Date: Thu, 24 Dec 2009 17:24:09 +0100 Subject: Removed 'SBManager' from background image --- data/background.png | Bin 88647 -> 19014 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/data/background.png b/data/background.png index dc5b050..be2ff18 100644 Binary files a/data/background.png and b/data/background.png differ -- cgit v1.1-32-gdbae From 8032d5f200f0da07b01029b09c32ef6a031c0ae6 Mon Sep 17 00:00:00 2001 From: Nikias Bassen Date: Thu, 24 Dec 2009 18:57:39 +0100 Subject: Write device name in top left corner instead of 'SBManager' --- src/sbmanager.c | 35 +++++++++++++++++++++++++++++++++++ 1 file changed, 35 insertions(+) diff --git a/src/sbmanager.c b/src/sbmanager.c index e575c46..637a5a7 100644 --- a/src/sbmanager.c +++ b/src/sbmanager.c @@ -66,6 +66,7 @@ const ClutterActorBox sb_area = {0.0, 16.0, STAGE_WIDTH, STAGE_HEIGHT-DOCK_HEIGH ClutterActor *stage = NULL; ClutterActor *the_dock = NULL; ClutterActor *the_sb = NULL; +ClutterActor *name_label = NULL; ClutterActor *clock_label = NULL; ClutterActor *battery_level = NULL; ClutterActor *page_indicator = NULL; @@ -928,6 +929,33 @@ leave_cleanup: return TRUE; } +static gchar *get_device_name(SBManagerApp *app) +{ + iphone_device_t phone = NULL; + lockdownd_client_t client = NULL; + gchar *devname = NULL; + + if (IPHONE_E_SUCCESS != iphone_device_new(&phone, app->uuid)) { + fprintf(stderr, "No iPhone found, is it plugged in?\n"); + goto leave_cleanup; + } + + if (LOCKDOWN_E_SUCCESS != lockdownd_client_new(phone, &client)) { + fprintf(stderr, "Could not connect to lockdownd. Exiting.\n"); + goto leave_cleanup; + } + + lockdownd_get_device_name(client, &devname); + +leave_cleanup: + if (client) { + lockdownd_client_free(client); + } + iphone_device_free(phone); + + return devname; +} + int main(int argc, char **argv) { SBManagerApp *app; @@ -998,6 +1026,13 @@ int main(int argc, char **argv) fprintf(stderr, "could not load background.png\n"); } + /* device name widget */ + gchar *devname = get_device_name(app); + name_label = clutter_text_new_full (CLOCK_FONT, devname, &clock_text_color); + clutter_group_add (CLUTTER_GROUP (stage), name_label); + clutter_actor_set_position(name_label, 2.0, 2.0); + g_free(devname); + /* clock widget */ clock_label = clutter_text_new_full (CLOCK_FONT, "00:00", &clock_text_color); clutter_group_add (CLUTTER_GROUP (stage), clock_label); -- cgit v1.1-32-gdbae