static void set_substatuses(EditStatus *edit) { GList *iter; for (iter = gnt_tree_get_rows(GNT_TREE(edit->tree)); iter; iter = iter->next) { RowInfo *key = iter->data; if (gnt_tree_get_choice(GNT_TREE(edit->tree), key)) { purple_savedstatus_set_substatus(edit->saved, key->account, key->type, key->message); } } }
/** * This method motivates Purple's Host (e.g. Pidgin) to update its UI * by using standard Purple's means of signals and saved statuses. * * Thus all UI elements get updated: Status Button with Note, docklet. * This is ablolutely important as both our status and note can come * inbound (roaming) or be updated programmatically (e.g. based on our * calendar data). */ void sipe_backend_status_and_note(struct sipe_core_public *sipe_public, guint activity, const gchar *message) { struct sipe_backend_private *purple_private = sipe_public->backend_private; PurpleAccount *account = purple_private->account; const gchar *status_id = sipe_purple_activity_to_token(activity); PurpleSavedStatus *saved_status; const PurpleStatusType *acct_status_type = purple_status_type_find_with_id(account->status_types, status_id); PurpleStatusPrimitive primitive = purple_status_type_get_primitive(acct_status_type); saved_status = purple_savedstatus_find_transient_by_type_and_message(primitive, message); if (saved_status) { purple_savedstatus_set_substatus(saved_status, account, acct_status_type, message); } /* If this type+message is unique then create a new transient saved status * Ref: gtkstatusbox.c */ if (!saved_status) { GList *tmp; GList *active_accts = purple_accounts_get_all_active(); saved_status = purple_savedstatus_new(NULL, primitive); purple_savedstatus_set_message(saved_status, message); for (tmp = active_accts; tmp != NULL; tmp = tmp->next) { purple_savedstatus_set_substatus(saved_status, (PurpleAccount *)tmp->data, acct_status_type, message); } g_list_free(active_accts); } /* Set the status for each account */ purple_savedstatus_activate(saved_status); }
static PurpleSavedStatus * create_transient_status(PurpleStatusPrimitive primitive, PurpleStatusType *status_type) { PurpleSavedStatus *saved_status = purple_savedstatus_new(NULL, primitive); if(status_type != NULL) { GList *tmp, *active_accts = purple_accounts_get_all_active(); for (tmp = active_accts; tmp != NULL; tmp = tmp->next) { purple_savedstatus_set_substatus(saved_status, (PurpleAccount*) tmp->data, status_type, NULL); } g_list_free(active_accts); } return saved_status; }
static void save_substatus_cb(GntWidget *widget, EditSubStatus *sub) { PurpleSavedStatus *saved = sub->parent->saved; RowInfo *row = sub->key; const char *message; PurpleStatusType *type; type = gnt_combo_box_get_selected_data(GNT_COMBO_BOX(sub->type)); message = gnt_entry_get_text(GNT_ENTRY(sub->message)); row->type = type; row->message = g_strdup(message); if (saved) /* Save the substatus if the savedstatus actually exists. */ purple_savedstatus_set_substatus(saved, row->account, type, message); gnt_tree_set_choice(GNT_TREE(sub->parent->tree), row, TRUE); gnt_tree_change_text(GNT_TREE(sub->parent->tree), row, 1, purple_status_type_get_name(type)); gnt_tree_change_text(GNT_TREE(sub->parent->tree), row, 2, message); gnt_widget_destroy(sub->window); }
///////////////////////////////////////////////////////////////////////////// // The window procedure. It handles WTS_SESSION_LOCK and WTS_SESSION_UNLOCK // messages sent to the LNR window. ///////////////////////////////////////////////////////////////////////////// static LRESULT CALLBACK LnrWindowProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam) { GList *accts, *iter; PurpleAccount *acct = NULL; PurpleStatusType *status_type = NULL; PurpleSavedStatus *saved_status = NULL; switch(uMsg) { case WM_WTSSESSION_CHANGE: switch(wParam) { case WTS_SESSION_LOCK: case WTS_REMOTE_DISCONNECT: saved_status = purple_savedstatus_new(NULL, purple_prefs_get_int(LNR_PREF_STATUS)); purple_savedstatus_set_message(saved_status, purple_prefs_get_string(LNR_PREF_MESSAGE)); iter = accts = purple_accounts_get_all_active(); for(; iter != NULL; iter = iter->next) { acct = (PurpleAccount*)iter->data; if(lnr_should_change_message(acct)) { status_type = purple_account_get_status_type_with_primitive(acct, purple_prefs_get_int(LNR_PREF_STATUS)); if(status_type != NULL) { // Set the substatus for this account purple_savedstatus_set_substatus(saved_status, acct, status_type, purple_prefs_get_string(LNR_PREF_MESSAGE)); lnr_accts = g_list_append(lnr_accts, acct); } } } if(g_list_length(lnr_accts)) { lnr_reactivate_status = purple_savedstatus_get_current(); purple_savedstatus_activate(saved_status); } else { lnr_reactivate_status = NULL; g_list_free(lnr_accts); lnr_accts = NULL; } g_list_free(accts); accts = NULL; break; case WTS_SESSION_UNLOCK: case WTS_REMOTE_CONNECT: if(lnr_accts != NULL) { if (lnr_reactivate_status != NULL) { purple_savedstatus_activate(lnr_reactivate_status); } else { saved_status = purple_savedstatus_new(NULL, PURPLE_STATUS_AVAILABLE); purple_savedstatus_set_message(saved_status, ""); for(iter = lnr_accts; iter != NULL; iter = iter->next) { acct = (PurpleAccount*)iter->data; // Set the status up with a generic "Available" message for each account status_type = purple_account_get_status_type_with_primitive(acct, PURPLE_STATUS_AVAILABLE); if(status_type != NULL) { purple_savedstatus_set_substatus(saved_status, acct, status_type, ""); } } purple_savedstatus_activate(saved_status); } lnr_reactivate_status = NULL; g_list_free(lnr_accts); lnr_accts = NULL; } break; } break; } return DefWindowProc(hwnd, uMsg, wParam, lParam); }