static void conversation_delete_cb(PurpleConversation *conv) { PidginWindow *win = pidgin_conv_get_window(PIDGIN_CONVERSATION(conv)); /* If it is the last conversation in the window, cleanup */ if (win != NULL && pidgin_conv_window_get_gtkconv_count(win) == 1) cleanup_conv_window(win); }
static void conv_updated_cb(PurpleConversation *conv, PurpleConvUpdateType type) { PidginConversation *pconv = PIDGIN_CONVERSATION(conv); PidginWindow *win = pidgin_conv_get_window(pconv); if (type == PURPLE_CONV_UPDATE_UNSEEN && !pidgin_conv_is_hidden(pconv) && pconv->unseen_state == PIDGIN_UNSEEN_NONE && pidgin_conv_window_get_gtkconv_count(win) == 1) { GtkWidget *window = win->window; gboolean has_focus; g_object_get(G_OBJECT(window), "has-toplevel-focus", &has_focus, NULL); if (!has_focus || !purple_prefs_get_bool(OPT_WINTRANS_IM_ONFOCUS)) set_conv_window_trans(NULL, win); if (g_signal_handler_find(G_OBJECT(window), G_SIGNAL_MATCH_FUNC, 0, 0, NULL, G_CALLBACK(focus_conv_win_cb), NULL) == 0) { g_signal_connect(G_OBJECT(window), "focus_in_event", G_CALLBACK(focus_conv_win_cb), window); g_signal_connect(G_OBJECT(window), "focus_out_event", G_CALLBACK(focus_conv_win_cb), window); } } }
static void detach_from_conv(PurpleConversation *conv, gpointer null) { PidginConversation *gtkconv = PIDGIN_CONVERSATION(conv); GtkWidget *box, *counter = NULL, *sep = NULL; g_signal_handlers_disconnect_by_func(G_OBJECT(gtkconv->entry_buffer), (GFunc) insert_text_cb, conv); g_signal_handlers_disconnect_by_func(G_OBJECT(gtkconv->entry_buffer), (GFunc) delete_text_cb, conv); box = gtkconv->toolbar; /* remove counter */ counter = g_object_get_data(G_OBJECT(box), PLUGIN_ID "-counter"); if(counter) { gtk_container_remove(GTK_CONTAINER(box), counter); g_object_unref(counter); g_object_set_data(G_OBJECT(box), PLUGIN_ID "-counter", NULL); } /* remove separator */ sep = g_object_get_data(G_OBJECT(box), PLUGIN_ID "-sep"); if(sep) { gtk_container_remove(GTK_CONTAINER(box), sep); g_object_unref(sep); g_object_set_data(G_OBJECT(box), PLUGIN_ID "-sep", NULL); } gtk_widget_queue_draw(pidgin_conv_get_window(gtkconv)->window); }
static void close_offline_tabs_cb(GtkWidget *w, GObject *menu) { GList *iter; PidginConversation *gtkconv, *gconv; PidginWindow *win; PurpleConversation *purpconv; PurpleAccount *account; PurpleBuddy *buddy; gtkconv = g_object_get_data(menu, "clicked_tab"); if (!gtkconv) return; win = pidgin_conv_get_window(gtkconv); for (iter = pidgin_conv_window_get_gtkconvs(win); iter; ) { gconv = iter->data; iter = iter->next; purpconv = gconv->active_conv; account = purpconv->account; buddy = purple_find_buddy(account, purpconv->name); if(!PURPLE_BUDDY_IS_ONLINE(buddy)){ close_conv_cb(NULL, gconv); } } }
/** * A callback for when a conversation is opened * * This will simply remove the instructions tab when a conversation is opened * in a notebook that is displaying it. * * @param[in] conv The new conversation **/ static void conversation_created_cb(PurpleConversation *conv) { PidginConversation *gtkconv; /*< The new Pidgin conversation */ PidginBuddyList *gtkblist; /*< The Buddy List associated with conv */ PidginWindow *gtkconvwin; /*< The conversation window that owns conv */ if (conv == NULL) return; gtkconv = PIDGIN_CONVERSATION(conv); gtkconvwin = pidgin_conv_get_window(gtkconv); gtkblist = pwm_convs_get_blist(gtkconvwin); /* Sanity check: This callback should only continue for merged windows. */ if (gtkblist == NULL) return; /* If there is a tab in addition to the instructions tab, remove it. */ if (pidgin_conv_window_get_gtkconv_count(gtkconvwin) > 1) { pwm_hide_dummy_conversation(gtkblist); pwm_set_conv_menus_visible(gtkblist, TRUE); /* Process queued focus events, and focus the conversation entry * field. */ while (gtk_events_pending()) gtk_main_iteration(); gtk_widget_grab_focus(gtkconv->entry); } }
/** * A callback for when a conversation is being closed * * This is only used to display help, hide conversation menu items, and reset * the window title when the last conversation in the Buddy List window is * being closed. * * @param[in] conv The conversation on its way out the door **/ static void deleting_conversation_cb(PurpleConversation *conv) { PidginBuddyList *gtkblist; /*< The Buddy List associated with conv */ PidginWindow *gtkconvwin; /*< The conversation window that owns conv */ if (conv == NULL) return; gtkconvwin = pidgin_conv_get_window(PIDGIN_CONVERSATION(conv)); gtkblist = pwm_convs_get_blist(gtkconvwin); /* Sanity check: This callback should only continue for merged windows. */ if (gtkblist == NULL) return; /* If the last conv is being deleted, reset help, icons, title, and * menu. */ if (pidgin_conv_window_get_gtkconv_count(gtkconvwin) <= 1) { pwm_show_dummy_conversation(gtkblist); gtk_window_set_icon_list(GTK_WINDOW(gtkblist->window), NULL); gtk_window_set_title(GTK_WINDOW(gtkblist->window), pwm_fetch(gtkblist, "title")); pwm_set_conv_menus_visible(gtkblist, FALSE); } }
static void reorder_tabs(PurpleConversation *purpleConv) { PidginConversation *pidginConv; PidginWindow *win; if (!purpleConv) { return; } pidginConv = PIDGIN_CONVERSATION(purpleConv); if (!pidginConv || !pidginConv->tab_cont) { return; } win = pidgin_conv_get_window(pidginConv); if (!win || !win->notebook) { return; } int count_tabs = gtk_notebook_get_n_pages(GTK_NOTEBOOK(win->notebook)); const char* tablist[count_tabs]; for (int i = 0; i < count_tabs; i++) { tablist[i] = get_tab_title(i, win); } qsort(tablist, sizeof(tablist)/sizeof(char *), sizeof(char *), compare); for (int i = 0; i < count_tabs; i++) { //printf("Sorted: %s\n", tablist[i]); gtk_notebook_reorder_child(GTK_NOTEBOOK(win->notebook), get_tab_by_title(tablist[i], win), i); } }
static void attach_to_conv(PurpleConversation *conv, gpointer null) { PidginConversation *gtkconv = PIDGIN_CONVERSATION(conv); GtkWidget *box, *sep, *counter, *menus; GtkIMHtml *imhtml; box = gtkconv->toolbar; imhtml = GTK_IMHTML(gtkconv->imhtml); /* Disable widgets that decorate or add link to composing text * because Twitter cannot receive marked up string. For lean-view * and wide-view, see pidgin/gtkimhtmltoolbar.c. */ menus = g_object_get_data(G_OBJECT(box), "lean-view"); if(menus) { gtk_widget_set_sensitive(GTK_WIDGET(menus), FALSE); } menus = g_object_get_data(G_OBJECT(box), "wide-view"); if(menus) { gtk_widget_set_sensitive(GTK_WIDGET(menus), FALSE); } purple_conversation_set_features( gtkconv->active_conv, purple_conversation_get_features(gtkconv->active_conv) & ~PURPLE_CONNECTION_HTML); /* check if the counter is enabled */ if(!purple_prefs_get_bool(OPT_COUNTER)) return; /* get counter object */ counter = g_object_get_data(G_OBJECT(box), PLUGIN_ID "-counter"); g_return_if_fail(counter == NULL); /* make counter object */ counter = gtk_label_new(NULL); gtk_widget_set_name(counter, "counter_label"); gtk_label_set_text(GTK_LABEL(counter), "0"); gtk_box_pack_end(GTK_BOX(box), counter, FALSE, FALSE, 0); gtk_widget_show_all(counter); g_object_set_data(G_OBJECT(box), PLUGIN_ID "-counter", counter); /* make separator object */ sep = gtk_vseparator_new(); gtk_box_pack_end(GTK_BOX(box), sep, FALSE, FALSE, 0); gtk_widget_show_all(sep); g_object_set_data(G_OBJECT(box), PLUGIN_ID "-sep", sep); /* connect to signals */ g_signal_connect(G_OBJECT(gtkconv->entry_buffer), "insert_text", G_CALLBACK(insert_text_cb), conv); g_signal_connect(G_OBJECT(gtkconv->entry_buffer), "delete_range", G_CALLBACK(delete_text_cb), conv); /* redraw window */ gtk_widget_queue_draw(pidgin_conv_get_window(gtkconv)->window); }
static void conv_created(PidginConversation *gtkconv, gpointer null) { PidginWindow *win; win = pidgin_conv_get_window(gtkconv); if (!win) return; detach_from_pidgin_window(win, NULL); attach_to_pidgin_window(win, NULL); }
static void new_conversation_cb(PurpleConversation *conv) { PidginWindow *win = pidgin_conv_get_window(PIDGIN_CONVERSATION(conv)); /* If it is the first conversation in the window, * add the sliders, and set transparency */ if (!pidgin_conv_is_hidden(PIDGIN_CONVERSATION(conv)) && pidgin_conv_window_get_gtkconv_count(win) == 1) { GtkWidget *window = win->window; set_conv_window_trans(NULL, win); g_signal_connect(G_OBJECT(window), "focus_in_event", G_CALLBACK(focus_conv_win_cb), window); g_signal_connect(G_OBJECT(window), "focus_out_event", G_CALLBACK(focus_conv_win_cb), window); } }
void remove_pidgin_menuitems (PurpleConversation * conv) { if (PIDGIN_IS_PIDGIN_CONVERSATION (conv)) { PurplePlugin *plugin; GtkWidget *screenshot_insert_menuitem; GtkWidget *screenshot_menuitem, *conversation_menu; GtkWidget *insert_menu; PidginWindow *win; PidginConversation *gtkconv; gtkconv = PIDGIN_CONVERSATION (conv); plugin = purple_plugins_find_with_id (PLUGIN_ID); win = pidgin_conv_get_window (gtkconv); if (win != NULL) { if ((conversation_menu = gtk_item_factory_get_widget (win->menu.item_factory, N_("/Conversation"))) != NULL) { /* remove signal */ gulong handler = g_signal_handler_find (conversation_menu, G_SIGNAL_MATCH_FUNC, 0, 0, NULL, G_CALLBACK (on_conversation_menu_show_cb), NULL); if (handler) g_signal_handler_disconnect (conversation_menu, handler); if ((screenshot_menuitem = g_object_get_data (G_OBJECT (conversation_menu), "screenshot_menuitem")) != NULL) { gtk_widget_destroy (screenshot_menuitem); g_object_steal_data (G_OBJECT (conversation_menu), "screenshot_menuitem"); g_object_steal_data (G_OBJECT (conversation_menu), "img_menuitem"); #ifdef ENABLE_UPLOAD g_object_steal_data (G_OBJECT (conversation_menu), "link_menuitem"); g_object_steal_data (G_OBJECT (conversation_menu), "ftp_link_menuitem"); #endif } } } /* remove signal */ if ((insert_menu = g_object_get_data (G_OBJECT (gtkconv->toolbar), "insert_menu")) != NULL) { gulong handler = g_signal_handler_find (insert_menu, G_SIGNAL_MATCH_FUNC, 0, 0, NULL, G_CALLBACK (on_insert_menu_show_cb), NULL); if (handler) g_signal_handler_disconnect (insert_menu, handler); } screenshot_insert_menuitem = g_object_get_data (G_OBJECT (gtkconv->toolbar), "screenshot_insert_menuitem"); if (screenshot_insert_menuitem != NULL) { gtk_widget_destroy (screenshot_insert_menuitem); g_object_steal_data (G_OBJECT (gtkconv->toolbar), "screenshot_insert_menuitem"); } } }
void create_plugin_menuitems (PurpleConversation * conv) { if (PIDGIN_IS_PIDGIN_CONVERSATION (conv)) { PidginConversation *gtkconv; PurplePlugin *plugin; PidginWindow *win; GtkWidget *conversation_menu, *screenshot_menuitem; GtkWidget *screenshot_insert_menuitem; gtkconv = PIDGIN_CONVERSATION (conv); plugin = purple_plugins_find_with_id (PLUGIN_ID); win = pidgin_conv_get_window (gtkconv); conversation_menu = gtk_item_factory_get_widget (win->menu.item_factory, N_("/Conversation")); screenshot_insert_menuitem = g_object_get_data (G_OBJECT (gtkconv->toolbar), "screenshot_insert_menuitem"); screenshot_menuitem = g_object_get_data (G_OBJECT (conversation_menu), "screenshot_menuitem"); /* Intercept hotkeys defined in pref window */ g_signal_connect_swapped (G_OBJECT (pidgin_conv_get_window (gtkconv)->window), "key_release_event", G_CALLBACK (catch_hotkeys_cb), win); /* Add us to the conv "Insert" menu */ if (screenshot_insert_menuitem == NULL) { GtkWidget *insert_menu;//, *submenu; if ((insert_menu = g_object_get_data (G_OBJECT (gtkconv->toolbar), "insert_menu")) != NULL) { /* add us to the "insert" list */ screenshot_insert_menuitem = gtk_menu_item_new_with_mnemonic (SCREENSHOT_INSERT_MENUITEM_LABEL); //submenu = create_plugin_submenu (gtkconv, FALSE); g_signal_connect_swapped (G_OBJECT (insert_menu), "show", G_CALLBACK (on_insert_menu_show_cb), screenshot_insert_menuitem); g_signal_connect (G_OBJECT (screenshot_insert_menuitem), "activate", G_CALLBACK (on_screenshot_insert_menuitem_activate_cb), gtkconv); /* gtk_menu_item_set_submenu (GTK_MENU_ITEM (screenshot_insert_menuitem), submenu); */ gtk_menu_shell_insert (GTK_MENU_SHELL (insert_menu), screenshot_insert_menuitem, 1); /* 0 = Image */ /* register new widget */ g_object_set_data (G_OBJECT (gtkconv->toolbar), "screenshot_insert_menuitem", screenshot_insert_menuitem); } } /* Add us to the conv "Conversation" menu. */ if (screenshot_menuitem == NULL) { GList *children = NULL, *head_chld = NULL; /* don't g_list_free() it */ guint i = 0; //GtkWidget *submenu = create_plugin_submenu (gtkconv, TRUE); screenshot_menuitem = gtk_menu_item_new_with_mnemonic (SCREENSHOT_MENUITEM_LABEL); /*gtk_menu_item_set_submenu (GTK_MENU_ITEM (screenshot_menuitem), submenu); */ /*gtk_widget_show_all (submenu);*/ children = gtk_container_get_children (GTK_CONTAINER (conversation_menu)); head_chld = children; /* keep first element addr */ /* pack our menuitem at correct place */ while (children != NULL && children->data != (gpointer) win->menu.insert_image) { children = g_list_next (children); i++; } g_list_free (head_chld); gtk_menu_shell_insert (GTK_MENU_SHELL (conversation_menu), screenshot_menuitem, i + 1); gtk_widget_show (screenshot_menuitem); g_object_set_data (G_OBJECT (conversation_menu), "screenshot_menuitem", screenshot_menuitem); } } }