static void test_cb(GntWidget *button, gpointer null) { PurpleSoundEventID id = GPOINTER_TO_INT(gnt_tree_get_selection_data(GNT_TREE(pref_dialog->events))); FinchSoundEvent * event = &sounds[id]; char *enabled, *file, *tmpfile, *volpref; gboolean temp_value; int volume; enabled = g_strdup_printf(FINCH_PREFS_ROOT "/sound/profiles/%s/enabled/%s", finch_sound_get_active_profile(), event->pref); file = g_strdup_printf(FINCH_PREFS_ROOT "/sound/profiles/%s/file/%s", finch_sound_get_active_profile(), event->pref); volpref = g_strdup(make_pref("/volume")); temp_value = purple_prefs_get_bool(enabled); tmpfile = g_strdup(purple_prefs_get_path(file)); volume = purple_prefs_get_int(volpref); purple_prefs_set_path(file, event->file); if (!temp_value) purple_prefs_set_bool(enabled, TRUE); purple_prefs_set_int(volpref, gnt_slider_get_value(GNT_SLIDER(pref_dialog->volume))); purple_sound_play_event(id, NULL); if (!temp_value) purple_prefs_set_bool(enabled, FALSE); purple_prefs_set_path(file, tmpfile); purple_prefs_set_int(volpref, volume); g_free(enabled); g_free(file); g_free(tmpfile); g_free(volpref); }
static gboolean dir_key_pressed(GntTree *tree, const char *key, GntFileSel *sel) { if (strcmp(key, "\r") == 0 || strcmp(key, "\n") == 0) { char *str = g_strdup(gnt_tree_get_selection_data(tree)); char *path, *dir; if (!str) return TRUE; path = g_build_filename(sel->current, str, NULL); dir = g_path_get_basename(sel->current); if (!gnt_file_sel_set_current_location(sel, path)) { gnt_tree_set_selected(tree, str); } else if (strcmp(str, "..") == 0) { gnt_tree_set_selected(tree, dir); } gnt_bindable_perform_action_named(GNT_BINDABLE(tree), "end-search", NULL); g_free(dir); g_free(str); g_free(path); return TRUE; } return FALSE; }
static gboolean toggle_tag_selection(GntBindable *bind, GList *null) { GntFileSel *sel = GNT_FILE_SEL(bind); char *str; GList *find; char *file; GntWidget *tree; if (!sel->multiselect) return FALSE; tree = sel->dirsonly ? sel->dirs : sel->files; if (!gnt_widget_has_focus(tree) || gnt_tree_is_searching(GNT_TREE(tree))) return FALSE; file = gnt_tree_get_selection_data(GNT_TREE(tree)); str = gnt_file_sel_get_selected_file(sel); if ((find = g_list_find_custom(sel->tags, str, (GCompareFunc)g_utf8_collate)) != NULL) { g_free(find->data); sel->tags = g_list_delete_link(sel->tags, find); gnt_tree_set_row_flags(GNT_TREE(tree), file, GNT_TEXT_FLAG_NORMAL); g_free(str); } else { sel->tags = g_list_prepend(sel->tags, str); gnt_tree_set_row_flags(GNT_TREE(tree), file, GNT_TEXT_FLAG_BOLD); } gnt_bindable_perform_action_named(GNT_BINDABLE(tree), "move-down", NULL); return TRUE; }
static void choose_cb(GntWidget *button, gpointer null) { GntWidget *w = gnt_file_sel_new(); GntFileSel *sel = GNT_FILE_SEL(w); PurpleSoundEventID id = GPOINTER_TO_INT(gnt_tree_get_selection_data(GNT_TREE(pref_dialog->events))); FinchSoundEvent * event = &sounds[id]; char *path = NULL; gnt_box_set_title(GNT_BOX(w), _("Select Sound File ...")); gnt_file_sel_set_current_location(sel, (event && event->file) ? (path = g_path_get_dirname(event->file)) : purple_home_dir()); g_signal_connect_swapped(G_OBJECT(sel->cancel), "activate", G_CALLBACK(gnt_widget_destroy), sel); g_signal_connect(G_OBJECT(sel), "file_selected", G_CALLBACK(file_cb), event); g_signal_connect_swapped(G_OBJECT(sel), "destroy", G_CALLBACK(g_nullify_pointer), &pref_dialog->selector); /* If there's an already open file-selector, close that one. */ if (pref_dialog->selector) gnt_widget_destroy(pref_dialog->selector); pref_dialog->selector = w; gnt_widget_show(w); g_free(path); }
static gboolean check_for_trigger(GntMenu *menu, char trigger) { /* check for a trigger key */ GList *iter; GList *find; GList *nth = g_list_find(menu->list, gnt_tree_get_selection_data(GNT_TREE(menu))); if (nth == NULL) return FALSE; find = find_item_with_trigger(nth->next, NULL, trigger); if (!find) find = find_item_with_trigger(menu->list, nth->next, trigger); if (!find) return FALSE; if (find != nth) { gnt_tree_set_selected(GNT_TREE(menu), find->data); iter = find_item_with_trigger(find->next, NULL, trigger); if (iter != NULL && iter != find) return TRUE; iter = find_item_with_trigger(menu->list, nth, trigger); if (iter != NULL && iter != find) return TRUE; } gnt_widget_activate(GNT_WIDGET(menu)); return TRUE; }
static void use_savedstatus_cb(GntWidget *widget, gpointer null) { g_return_if_fail(statuses.tree != NULL); purple_savedstatus_activate(gnt_tree_get_selection_data(GNT_TREE(statuses.tree))); }
static void edit_savedstatus_cb(GntWidget *widget, gpointer null) { g_return_if_fail(statuses.tree != NULL); finch_savedstatus_edit(gnt_tree_get_selection_data(GNT_TREE(statuses.tree))); }
static void pounces_manager_modify_cb(GntButton *button, gpointer user_data) { PouncesManager *dialog = user_data; PurplePounce *pounce = gnt_tree_get_selection_data(GNT_TREE(dialog->tree)); if (pounce) finch_pounce_editor_show(NULL, NULL, pounce); }
static void remove_button_cb(GntButton *button) { PurpleXfer *selected_xfer = gnt_tree_get_selection_data(GNT_TREE(xfer_dialog->tree)); if (selected_xfer && (purple_xfer_is_completed(selected_xfer) || purple_xfer_is_canceled(selected_xfer))) { finch_xfer_dialog_remove_xfer(selected_xfer); } }
static void hide_popup(GntComboBox *box, gboolean set) { gnt_widget_set_size(box->dropdown, box->dropdown->priv.width - 1, box->dropdown->priv.height); if (set) set_selection(box, gnt_tree_get_selection_data(GNT_TREE(box->dropdown))); else gnt_tree_set_selected(GNT_TREE(box->dropdown), box->selected); gnt_widget_hide(box->dropdown->parent); }
static void reset_cb(GntWidget *button, gpointer null) { /* Don't dereference this pointer ! */ gpointer key = gnt_tree_get_selection_data(GNT_TREE(pref_dialog->events)); FinchSoundEvent * event = &sounds[GPOINTER_TO_INT(key)]; g_free(event->file); event->file = NULL; gnt_tree_change_text(GNT_TREE(pref_dialog->events), key, 1, _("(default)")); }
static void update_location(GntFileSel *sel) { char *old; const char *tmp; tmp = sel->suggest ? sel->suggest : (const char*)gnt_tree_get_selection_data(sel->dirsonly ? GNT_TREE(sel->dirs) : GNT_TREE(sel->files)); old = g_strdup_printf("%s%s%s", SAFE(sel->current), SAFE(sel->current)[1] ? G_DIR_SEPARATOR_S : "", tmp ? tmp : ""); gnt_entry_set_text(GNT_ENTRY(sel->location), old); g_free(old); }
static void stop_button_cb(GntButton *button) { PurpleXfer *selected_xfer = gnt_tree_get_selection_data(GNT_TREE(xfer_dialog->tree)); PurpleXferStatusType status; if (!selected_xfer) return; status = purple_xfer_get_status(selected_xfer); if (status != PURPLE_XFER_STATUS_CANCEL_LOCAL && status != PURPLE_XFER_STATUS_CANCEL_REMOTE && status != PURPLE_XFER_STATUS_DONE) purple_xfer_cancel_local(selected_xfer); }
static void ask_before_delete(GntWidget *button, gpointer null) { char *ask; PurpleSavedStatus *saved; g_return_if_fail(statuses.tree != NULL); saved = gnt_tree_get_selection_data(GNT_TREE(statuses.tree)); ask = g_strdup_printf(_("Are you sure you want to delete \"%s\""), purple_savedstatus_get_title(saved)); purple_request_action(saved, _("Delete Status"), ask, NULL, 0, NULL, NULL, NULL, saved, 2, _("Delete"), really_delete_status, _("Cancel"), NULL); g_free(ask); }
static void gnt_menu_activate(GntWidget *widget) { GntMenu *menu = GNT_MENU(widget); GntMenuItem *item; if (menu->type == GNT_MENU_TOPLEVEL) { item = g_list_nth_data(menu->list, menu->selected); } else { item = gnt_tree_get_selection_data(GNT_TREE(menu)); } if (item) { if (GNT_IS_MENU_ITEM_CHECK(item)) gnt_menu_toggled(GNT_TREE(widget), item); else menuitem_activate(menu, item); } }
static void roomlist_activated(GntWidget *widget) { PurpleRoomlistRoom *room = gnt_tree_get_selection_data(GNT_TREE(widget)); if (!room) return; switch (purple_roomlist_room_get_type(room)) { case PURPLE_ROOMLIST_ROOMTYPE_ROOM: purple_roomlist_room_join(froomlist.roomlist, room); break; case PURPLE_ROOMLIST_ROOMTYPE_CATEGORY: if (!room->expanded_once) { purple_roomlist_expand_category(froomlist.roomlist, room); room->expanded_once = TRUE; } break; } gnt_tree_set_expanded(GNT_TREE(widget), room, TRUE); }
static void fl_add_chat(GntWidget *button, gpointer null) { char *name; PurpleRoomlistRoom *room = gnt_tree_get_selection_data(GNT_TREE(froomlist.tree)); PurpleConnection *gc = purple_account_get_connection(froomlist.account); PurplePluginProtocolInfo *prpl_info = NULL; if (gc == NULL || room == NULL) return; prpl_info = PURPLE_PLUGIN_PROTOCOL_INFO(purple_connection_get_prpl(gc)); if(prpl_info != NULL && prpl_info->roomlist_room_serialize) name = prpl_info->roomlist_room_serialize(room); else name = g_strdup(purple_roomlist_room_get_name(room)); purple_blist_request_add_chat(froomlist.account, NULL, NULL, name); g_free(name); }
static void pounces_manager_delete_cb(GntButton *button, gpointer user_data) { PouncesManager *dialog = user_data; PurplePounce *pounce; PurpleAccount *account; const char *pouncer, *pouncee; char *buf; pounce = (PurplePounce *)gnt_tree_get_selection_data(GNT_TREE(dialog->tree)); if (pounce == NULL) return; account = purple_pounce_get_pouncer(pounce); pouncer = purple_account_get_username(account); pouncee = purple_pounce_get_pouncee(pounce); buf = g_strdup_printf(_("Are you sure you want to delete the pounce on %s for %s?"), pouncee, pouncer); purple_request_action(pounce, NULL, buf, NULL, 0, account, pouncee, NULL, pounce, 2, _("Delete"), pounces_manager_delete_confirm_cb, _("Cancel"), NULL); g_free(buf); }
void finch_plugins_show_all(void) { GntWidget *window, *tree, *box, *aboot, *button; GList *plugin_list, *iter; GList *seen; if (plugins.window) { gnt_window_present(plugins.window); return; } purple_plugins_refresh(); plugins.window = window = gnt_vbox_new(FALSE); gnt_box_set_toplevel(GNT_BOX(window), TRUE); gnt_box_set_title(GNT_BOX(window), _("Plugins")); gnt_box_set_pad(GNT_BOX(window), 0); gnt_box_set_alignment(GNT_BOX(window), GNT_ALIGN_MID); gnt_box_add_widget(GNT_BOX(window), gnt_label_new(_("You can (un)load plugins from the following list."))); gnt_box_add_widget(GNT_BOX(window), gnt_hline_new()); box = gnt_hbox_new(FALSE); gnt_box_add_widget(GNT_BOX(window), box); gnt_box_add_widget(GNT_BOX(window), gnt_hline_new()); gnt_box_set_pad(GNT_BOX(box), 0); plugins.tree = tree = gnt_tree_new(); gnt_tree_set_compare_func(GNT_TREE(tree), (GCompareFunc)plugin_compare); GNT_WIDGET_SET_FLAGS(tree, GNT_WIDGET_NO_BORDER); gnt_box_add_widget(GNT_BOX(box), tree); gnt_box_add_widget(GNT_BOX(box), gnt_vline_new()); plugins.aboot = aboot = gnt_text_view_new(); gnt_text_view_set_flag(GNT_TEXT_VIEW(aboot), GNT_TEXT_VIEW_TOP_ALIGN); gnt_widget_set_size(aboot, 40, 20); gnt_box_add_widget(GNT_BOX(box), aboot); seen = purple_prefs_get_path_list("/finch/plugins/seen"); plugin_list = purple_plugins_find_all(); for (iter = plugin_list; iter; iter = iter->next) { PurplePlugin *plug = PURPLE_PLUGIN(iter->data); if (purple_plugin_is_internal(plug)) continue; gnt_tree_add_choice(GNT_TREE(tree), plug, gnt_tree_create_row(GNT_TREE(tree), purple_plugin_info_get_name(purple_plugin_get_info(plug))), NULL, NULL); gnt_tree_set_choice(GNT_TREE(tree), plug, purple_plugin_is_loaded(plug)); if (!g_list_find_custom(seen, purple_plugin_get_filename(plug), (GCompareFunc)strcmp)) gnt_tree_set_row_flags(GNT_TREE(tree), plug, GNT_TEXT_FLAG_BOLD); } g_list_free(plugin_list); gnt_tree_set_col_width(GNT_TREE(tree), 0, 30); g_signal_connect(G_OBJECT(tree), "toggled", G_CALLBACK(plugin_toggled_cb), NULL); g_signal_connect(G_OBJECT(tree), "selection_changed", G_CALLBACK(selection_changed), NULL); g_object_set_data(G_OBJECT(tree), "seen-list", seen); box = gnt_hbox_new(FALSE); gnt_box_add_widget(GNT_BOX(window), box); #if 0 button = gnt_button_new(_("Install Plugin...")); gnt_box_add_widget(GNT_BOX(box), button); gnt_util_set_trigger_widget(GNT_WIDGET(tree), GNT_KEY_INS, button); g_signal_connect(G_OBJECT(button), "activate", G_CALLBACK(install_plugin_cb), NULL); #endif button = gnt_button_new(_("Close")); gnt_box_add_widget(GNT_BOX(box), button); g_signal_connect_swapped(G_OBJECT(button), "activate", G_CALLBACK(gnt_widget_destroy), window); plugins.conf = button = gnt_button_new(_("Configure Plugin")); gnt_box_add_widget(GNT_BOX(box), button); g_signal_connect(G_OBJECT(button), "activate", G_CALLBACK(configure_plugin_cb), NULL); g_signal_connect(G_OBJECT(window), "destroy", G_CALLBACK(reset_plugin_window), NULL); gnt_widget_show(window); decide_conf_button(gnt_tree_get_selection_data(GNT_TREE(tree))); }
static void configure_plugin_cb(GntWidget *button, gpointer null) { PurplePlugin *plugin; PurplePluginInfo *info; FinchPluginInfoPrivate *priv = NULL; FinchPluginUiData *ui_data; g_return_if_fail(plugins.tree != NULL); plugin = gnt_tree_get_selection_data(GNT_TREE(plugins.tree)); if (!purple_plugin_is_loaded(plugin)) { purple_notify_error(plugin, _("Error"), _("Plugin need to be loaded before you can configure it."), NULL, NULL); return; } info = purple_plugin_get_info(plugin); if (purple_plugin_info_get_ui_data(info)) return; ui_data = g_new0(FinchPluginUiData, 1); purple_plugin_info_set_ui_data(info, ui_data); if (FINCH_IS_PLUGIN_INFO(info)) priv = FINCH_PLUGIN_INFO_GET_PRIVATE(info); if (priv && priv->pref_frame_cb != NULL) { GntWidget *window = gnt_vbox_new(FALSE); GntWidget *box, *button; gnt_box_set_toplevel(GNT_BOX(window), TRUE); gnt_box_set_title(GNT_BOX(window), purple_plugin_info_get_name(info)); gnt_box_set_alignment(GNT_BOX(window), GNT_ALIGN_MID); box = priv->pref_frame_cb(); gnt_box_add_widget(GNT_BOX(window), box); box = gnt_hbox_new(FALSE); gnt_box_add_widget(GNT_BOX(window), box); button = gnt_button_new(_("Close")); gnt_box_add_widget(GNT_BOX(box), button); g_signal_connect_swapped(G_OBJECT(button), "activate", G_CALLBACK(gnt_widget_destroy), window); g_signal_connect(G_OBJECT(window), "destroy", G_CALLBACK(remove_confwin), plugin); gnt_widget_show(window); ui_data->type = FINCH_PLUGIN_UI_DATA_TYPE_WINDOW; ui_data->u.window = window; } else if (purple_plugin_info_get_pref_request_cb(info)) { PurplePluginPrefRequestCb pref_request_cb = purple_plugin_info_get_pref_request_cb(info); gpointer handle; ui_data->type = FINCH_PLUGIN_UI_DATA_TYPE_REQUEST; ui_data->u.request_handle = handle = pref_request_cb(plugin); purple_request_add_close_notify(handle, purple_callback_set_zero, &info->ui_data); purple_request_add_close_notify(handle, g_free, ui_data); } else if (purple_plugin_info_get_pref_frame_cb(info)) { PurplePluginPrefFrameCb pref_frame_cb = purple_plugin_info_get_pref_frame_cb(info); GntWidget *win = process_pref_frame(pref_frame_cb(plugin)); g_signal_connect(G_OBJECT(win), "destroy", G_CALLBACK(remove_confwin), plugin); ui_data->type = FINCH_PLUGIN_UI_DATA_TYPE_WINDOW; ui_data->u.window = win; } else { purple_notify_info(plugin, _("Error"), _("No configuration " "options for this plugin."), NULL, NULL); g_free(ui_data); purple_plugin_info_set_ui_data(info, NULL); } }
static gboolean gnt_entry_key_pressed(GntWidget *widget, const char *text) { GntEntry *entry = GNT_ENTRY(widget); if (text[0] == 27) { if (text[1] == 0) { destroy_suggest(entry); return TRUE; } return FALSE; } if ((text[0] == '\r' || text[0] == ' ' || text[0] == '\n') && entry->ddown) { char *text = g_strdup(gnt_tree_get_selection_data(GNT_TREE(entry->ddown))); destroy_suggest(entry); complete_suggest(entry, text); g_free(text); update_kill_ring(entry, ENTRY_JAIL, NULL, 0); entry_text_changed(entry); return TRUE; } if (!iscntrl(text[0])) { const char *str, *next; for (str = text; *str; str = next) { int len; next = g_utf8_find_next_char(str, NULL); len = next - str; /* Valid input? */ /* XXX: Is it necessary to use _unichar_ variants here? */ if (ispunct(*str) && (entry->flag & GNT_ENTRY_FLAG_NO_PUNCT)) continue; if (isspace(*str) && (entry->flag & GNT_ENTRY_FLAG_NO_SPACE)) continue; if (isalpha(*str) && !(entry->flag & GNT_ENTRY_FLAG_ALPHA)) continue; if (isdigit(*str) && !(entry->flag & GNT_ENTRY_FLAG_INT)) continue; /* Reached the max? */ if (entry->max && g_utf8_pointer_to_offset(entry->start, entry->end) >= entry->max) continue; if (entry->end + len - entry->start >= entry->buffer) { /* This will cause the buffer to grow */ char *tmp = g_strdup(entry->start); gnt_entry_set_text_internal(entry, tmp); g_free(tmp); } memmove(entry->cursor + len, entry->cursor, entry->end - entry->cursor + 1); entry->end += len; while (str < next) { if (*str == '\r' || *str == '\n') *entry->cursor = ' '; else *entry->cursor = *str; entry->cursor++; str++; } while (gnt_util_onscreen_width(entry->scroll, entry->cursor) >= widget->priv.width) entry->scroll = g_utf8_find_next_char(entry->scroll, NULL); if (entry->ddown) show_suggest_dropdown(entry); } update_kill_ring(entry, ENTRY_JAIL, NULL, 0); entry_redraw(widget); entry_text_changed(entry); return TRUE; } if (text[0] == '\r' || text[0] == '\n') { gnt_widget_activate(widget); return TRUE; } return FALSE; }
static void configure_plugin_cb(GntWidget *button, gpointer null) { PurplePlugin *plugin; FinchPluginFrame callback; g_return_if_fail(plugins.tree != NULL); plugin = gnt_tree_get_selection_data(GNT_TREE(plugins.tree)); if (!purple_plugin_is_loaded(plugin)) { purple_notify_error(plugin, _("Error"), _("Plugin need to be loaded before you can configure it."), NULL); return; } if (confwins && g_hash_table_lookup(confwins, plugin)) return; if (PURPLE_IS_GNT_PLUGIN(plugin) && (callback = FINCH_PLUGIN_UI_INFO(plugin)) != NULL) { GntWidget *window = gnt_vbox_new(FALSE); GntWidget *box, *button; gnt_box_set_toplevel(GNT_BOX(window), TRUE); gnt_box_set_title(GNT_BOX(window), plugin->info->name); gnt_box_set_alignment(GNT_BOX(window), GNT_ALIGN_MID); box = callback(); gnt_box_add_widget(GNT_BOX(window), box); box = gnt_hbox_new(FALSE); gnt_box_add_widget(GNT_BOX(window), box); button = gnt_button_new(_("Close")); gnt_box_add_widget(GNT_BOX(box), button); g_signal_connect_swapped(G_OBJECT(button), "activate", G_CALLBACK(gnt_widget_destroy), window); g_signal_connect(G_OBJECT(window), "destroy", G_CALLBACK(remove_confwin), plugin); gnt_widget_show(window); if (confwins == NULL) confwin_init(); g_hash_table_insert(confwins, plugin, window); } else if (plugin->info->prefs_info && plugin->info->prefs_info->get_plugin_pref_frame) { GntWidget *win = process_pref_frame(plugin->info->prefs_info->get_plugin_pref_frame(plugin)); if (confwins == NULL) confwin_init(); g_signal_connect(G_OBJECT(win), "destroy", G_CALLBACK(remove_confwin), plugin); g_hash_table_insert(confwins, plugin, win); return; } else { purple_notify_info(plugin, _("Error"), _("No configuration options for this plugin."), NULL); return; } }
static gboolean gnt_menu_key_pressed(GntWidget *widget, const char *text) { GntMenu *menu = GNT_MENU(widget); guint current = menu->selected; if (menu->submenu) { GntMenu *sub = menu; do sub = sub->submenu; while (sub->submenu); if (gnt_widget_key_pressed(GNT_WIDGET(sub), text)) return TRUE; if (menu->type != GNT_MENU_TOPLEVEL) return FALSE; } if ((text[0] == 27 && text[1] == 0) || (menu->type != GNT_MENU_TOPLEVEL && strcmp(text, GNT_KEY_LEFT) == 0)) { /* Escape closes menu */ GntMenu *par = menu->parentmenu; if (par != NULL) { par->submenu = NULL; gnt_widget_hide(widget); } else gnt_widget_hide(widget); if (par && par->type == GNT_MENU_TOPLEVEL) gnt_menu_key_pressed(GNT_WIDGET(par), text); return TRUE; } if (menu->type == GNT_MENU_TOPLEVEL) { GntMenuItem *item; GList *it; if (strcmp(text, GNT_KEY_LEFT) == 0) { do { if (menu->selected == 0) menu->selected = g_list_length(menu->list) - 1; else menu->selected--; it = g_list_nth(menu->list, menu->selected); item = it ? it->data : NULL; } while (!gnt_menuitem_is_visible(item)); } else if (strcmp(text, GNT_KEY_RIGHT) == 0) { do { menu->selected++; if (menu->selected >= g_list_length(menu->list)) menu->selected = 0; it = g_list_nth(menu->list, menu->selected); item = it ? it->data : NULL; } while (!gnt_menuitem_is_visible(item)); } else if (strcmp(text, GNT_KEY_ENTER) == 0 || strcmp(text, GNT_KEY_DOWN) == 0) { gnt_widget_activate(widget); } if (current != menu->selected) { GntMenu *sub = menu->submenu; if (sub) gnt_widget_hide(GNT_WIDGET(sub)); show_submenu(menu); gnt_widget_draw(widget); return TRUE; } } else { if (text[1] == '\0') { if (check_for_trigger(menu, text[0])) return TRUE; } else if (strcmp(text, GNT_KEY_RIGHT) == 0) { GntMenuItem *item = gnt_tree_get_selection_data(GNT_TREE(menu)); if (item && item->submenu) { menuitem_activate(menu, item); return TRUE; } } if (gnt_bindable_perform_action_key(GNT_BINDABLE(widget), text)) return TRUE; return org_key_pressed(widget, text); } return gnt_bindable_perform_action_key(GNT_BINDABLE(widget), text); }
static gboolean popup_substatus(GntTree *tree, const char *key, EditStatus *edit) { if (key[0] == ' ' && key[1] == 0) { EditSubStatus *sub; GntWidget *window, *combo, *entry, *box, *button, *l; PurpleSavedStatusSub *substatus = NULL; GList *iter; char *name; RowInfo *selected = gnt_tree_get_selection_data(tree); PurpleAccount *account = selected->account; if (gnt_tree_get_choice(tree, selected)) { /* There was a savedstatus for this account. Now remove it. */ g_free(selected->message); selected->type = NULL; selected->message = NULL; /* XXX: should we really be saving it right now? */ purple_savedstatus_unset_substatus(edit->saved, account); gnt_tree_change_text(tree, account, 1, NULL); gnt_tree_change_text(tree, account, 2, NULL); return FALSE; } if (g_hash_table_lookup(edit->hash, account)) return TRUE; if (edit->saved) substatus = purple_savedstatus_get_substatus(edit->saved, account); sub = g_new0(EditSubStatus, 1); sub->parent = edit; sub->key = selected; sub->window = window = gnt_vbox_new(FALSE); gnt_box_set_toplevel(GNT_BOX(window), TRUE); gnt_box_set_title(GNT_BOX(window), _("Substatus")); /* XXX: a better title */ gnt_box_set_alignment(GNT_BOX(window), GNT_ALIGN_MID); box = gnt_hbox_new(FALSE); gnt_box_add_widget(GNT_BOX(box), gnt_label_new(_("Account:"))); name = g_strdup_printf("%s (%s)", purple_account_get_username(account), purple_account_get_protocol_name(account)); gnt_box_add_widget(GNT_BOX(box), gnt_label_new(name)); g_free(name); gnt_box_add_widget(GNT_BOX(window), box); box = gnt_hbox_new(FALSE); gnt_box_add_widget(GNT_BOX(box), (l = gnt_label_new(_("Status:")))); gnt_widget_set_size(l, 0, 1); /* I don't like having to do this */ sub->type = combo = gnt_combo_box_new(); gnt_box_add_widget(GNT_BOX(box), combo); gnt_box_add_widget(GNT_BOX(window), box); for (iter = purple_account_get_status_types(account); iter; iter = iter->next) { PurpleStatusType *type = iter->data; if (!purple_status_type_is_user_settable(type)) continue; gnt_combo_box_add_data(GNT_COMBO_BOX(combo), type, purple_status_type_get_name(type)); } box = gnt_hbox_new(FALSE); gnt_box_add_widget(GNT_BOX(box), gnt_label_new(_("Message:"))); sub->message = entry = gnt_entry_new(substatus ? purple_savedstatus_substatus_get_message(substatus) : NULL); gnt_box_add_widget(GNT_BOX(box), entry); gnt_box_add_widget(GNT_BOX(window), box); box = gnt_hbox_new(FALSE); button = gnt_button_new(_("Cancel")); g_signal_connect_swapped(G_OBJECT(button), "activate", G_CALLBACK(gnt_widget_destroy), window); gnt_box_add_widget(GNT_BOX(box), button); button = gnt_button_new(_("Save")); g_signal_connect(G_OBJECT(button), "activate", G_CALLBACK(save_substatus_cb), sub); gnt_box_add_widget(GNT_BOX(box), button); gnt_box_add_widget(GNT_BOX(window), box); gnt_widget_show(window); g_hash_table_insert(edit->hash, account, sub); g_signal_connect(G_OBJECT(window), "destroy", G_CALLBACK(substatus_window_destroy_cb), sub); return TRUE; } return FALSE; }