summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--src/sbmgr.c78
1 files changed, 77 insertions, 1 deletions
diff --git a/src/sbmgr.c b/src/sbmgr.c
index e534209..b115a1e 100644
--- a/src/sbmgr.c
+++ b/src/sbmgr.c
@@ -25,10 +25,12 @@
#include <glib.h>
#include <gtk/gtk.h>
+#include <plist/plist.h>
#include "sbmgr.h"
#include "device.h"
#include "gui.h"
+#include "utility.h"
static device_info_cb_t device_info_callback = NULL;
static finished_cb_t finished_callback = NULL;
@@ -60,6 +62,68 @@ void sbmgr_load(const char *uuid, device_info_cb_t info_cb, finished_cb_t finish
g_thread_create((GThreadFunc)gui_pages_load_cb, (gpointer)uuid, FALSE, NULL);
}
+static gboolean iconstate_changed(plist_t current_state, plist_t new_state)
+{
+ if (!current_state || !new_state) {
+ return FALSE;
+ }
+ /* compare new state with last saved state */
+ uint32_t cur_cnt = plist_array_get_size(current_state);
+ uint32_t new_cnt = plist_array_get_size(new_state);
+ debug_printf("%s: old %d, new %d\n", __func__, cur_cnt, new_cnt);
+ if (cur_cnt != new_cnt) {
+ /* number of pages has changed! */
+ debug_printf("%s: number of pages changed!\n", __func__);
+ return TRUE;
+ }
+
+ /* now dig deeper */
+ uint32_t i;
+ for (i = 0; i < new_cnt; i++) {
+ plist_t cur_pp = plist_array_get_item(current_state, i);
+ plist_t new_pp = plist_array_get_item(new_state, i);
+ uint32_t cur_row_cnt = plist_array_get_size(cur_pp);
+ uint32_t new_row_cnt = plist_array_get_size(new_pp);
+ if (cur_row_cnt != new_row_cnt) {
+ fprintf(stderr, "%s: number of rows on page %d changed: old %d, new %d, this is NOT expected!\n", __func__, i, cur_row_cnt, new_row_cnt);
+ return FALSE;
+ }
+ uint32_t j;
+ for (j = 0; j < cur_row_cnt; j++) {
+ plist_t cur_row = plist_array_get_item(cur_pp, j);
+ plist_t new_row = plist_array_get_item(new_pp, j);
+ uint32_t cur_item_cnt = plist_array_get_size(cur_row);
+ uint32_t new_item_cnt = plist_array_get_size(new_row);
+ if (cur_item_cnt != new_item_cnt) {
+ fprintf(stderr, "%s: number of items on page %d row %d changed: old %d, new %d, this is NOT expected!\n", __func__, i, j, cur_item_cnt, new_item_cnt);
+ return FALSE;
+ }
+ uint32_t k;
+ for (k = 0; k < cur_item_cnt; k++) {
+ plist_t cur_node = plist_array_get_item(cur_row, k);
+ plist_t new_node = plist_array_get_item(new_row, k);
+ if (plist_get_node_type(cur_node) != plist_get_node_type(new_node)) {
+ /* one is an icon, the other one empty. this is a change! */
+ return TRUE;
+ }
+ if (plist_get_node_type(cur_node) == PLIST_DICT) {
+ /* ok, compare the displayIdentifier */
+ plist_t cur_di = plist_dict_get_item(cur_node, "displayIdentifier");
+ plist_t new_di = plist_dict_get_item(new_node, "displayIdentifier");
+ if (plist_compare_node_value(cur_di, new_di) == FALSE) {
+ debug_printf("%s: page %d row %d item %d changed!\n", __func__, i, j, k);
+ return TRUE;
+ }
+ }
+ }
+ }
+ }
+
+ /* no change found */
+ debug_printf("%s: no change!\n", __func__);
+ return FALSE;
+}
+
void sbmgr_save(const char *uuid)
{
plist_t iconstate = gui_get_iconstate();
@@ -76,7 +140,19 @@ void sbmgr_save(const char *uuid)
}
if (sbc) {
- device_sbs_set_iconstate(sbc, iconstate, &error);
+ plist_t current_state = NULL;
+ device_sbs_get_iconstate(sbc, &current_state, &error);
+ if (error) {
+ g_printerr("%s", error->message);
+ g_error_free(error);
+ error = NULL;
+ }
+ if (iconstate_changed(current_state, iconstate) == TRUE) {
+ device_sbs_set_iconstate(sbc, iconstate, &error);
+ }
+ if (current_state) {
+ plist_free(current_state);
+ }
device_sbs_free(sbc);
}
plist_free(iconstate);