/************************************************************************************************** Load plugin **************************************************************************************************/ static gboolean plugin_load(PurplePlugin *plugin) { PidginBuddyList *gtkblist = pidgin_blist_get_default_gtk_blist(); GList *convs = purple_get_conversations(); if (purple_prefs_get_bool("/plugins/core/hidemenu/default_state")) { hmb_is_menu_visible = FALSE; } else { hmb_is_menu_visible = TRUE; } // set callback for 'blist created' signal purple_signal_connect(pidgin_blist_get_handle(), "gtkblist-created", plugin, PURPLE_CALLBACK(hmb_blist_created_cb), NULL); // set callback for 'conversation displayed' signal purple_signal_connect(pidgin_conversations_get_handle(), "conversation-displayed", plugin, PURPLE_CALLBACK(hmb_conversation_displayed_cb), NULL); // hide blist menubar hmb_toggle_menubar(gtkblist, NULL); // hide conversations menubar while (convs) { PurpleConversation *conv = (PurpleConversation *)convs->data; if (PIDGIN_IS_PIDGIN_CONVERSATION(conv)) { hmb_toggle_menubar(NULL, PIDGIN_CONVERSATION(conv)); } convs = convs->next; } return TRUE; }
/* check if default gtk blist is created */ gboolean is_gtk_blist_created(void) { const PidginBuddyList *blist = pidgin_blist_get_default_gtk_blist(); if(!blist || !blist->vbox || !gtk_widget_get_visible(blist->vbox)) return FALSE; return TRUE; }
static void pidgin_connection_connect_progress(PurpleConnection *gc, const char *text, size_t step, size_t step_count) { PidginBuddyList *gtkblist = pidgin_blist_get_default_gtk_blist(); if (!gtkblist) return; pidgin_status_box_set_connecting(PIDGIN_STATUS_BOX(gtkblist->statusbox), (purple_connections_get_connecting() != NULL)); pidgin_status_box_pulse_connecting(PIDGIN_STATUS_BOX(gtkblist->statusbox)); }
/** * A preference callback to reconstruct the layout panes when settings change * * @param[in] name Unused * @param[in] type Unused * @param[in] pvalue Pointer to the value of the preference * @param[in] data Unused **/ static void pref_convs_side_cb(U const char *name, U PurplePrefType type, gconstpointer pvalue, U gpointer data) { PidginBuddyList *gtkblist; /*< The Buddy List being restructured */ /* XXX: There should be an interface to list available Buddy List * windows. */ gtkblist = pidgin_blist_get_default_gtk_blist(); pwm_create_paned_layout(gtkblist, pvalue); }
/** * The plugin's unload function * * @param[in] plugin Unused * @return Whether to continue unloading **/ static gboolean plugin_unload(U PurplePlugin *plugin) { /* Remove the conversation placement option. */ pidgin_conv_placement_remove_fnc(PLUGIN_TOKEN); purple_prefs_trigger_callback(PIDGIN_PREFS_ROOT "/conversations/placement"); /* XXX: There should be an interface to list available Buddy List * windows. */ pwm_split_conversation(pidgin_blist_get_default_gtk_blist()); return TRUE; }
static void pidgin_connection_disconnected(PurpleConnection *gc) { PidginBuddyList *gtkblist = pidgin_blist_get_default_gtk_blist(); if (!gtkblist) return; pidgin_status_box_set_connecting(PIDGIN_STATUS_BOX(gtkblist->statusbox), (purple_connections_get_connecting() != NULL)); if (purple_connections_get_all() != NULL) return; pidgin_dialogs_destroy_all(); }
static void pidgin_connection_connected(PurpleConnection *gc) { PurpleAccount *account; PidginBuddyList *gtkblist; account = purple_connection_get_account(gc); gtkblist = pidgin_blist_get_default_gtk_blist(); if (gtkblist != NULL) pidgin_status_box_set_connecting(PIDGIN_STATUS_BOX(gtkblist->statusbox), (purple_connections_get_connecting() != NULL)); g_hash_table_remove(auto_reconns, account); }
/************************************************************************************************** Conversation was displayed **************************************************************************************************/ static void hmb_conversation_displayed_cb(PidginConversation *gtkconv) { PidginBuddyList *gtkblist = pidgin_blist_get_default_gtk_blist(); GdkWindow *root = gtk_widget_get_toplevel(GTK_WIDGET(gtkconv->win->window))->window; // set keygrabber if needed if (g_object_get_data((GObject *) root, "filter_set") == NULL) { gdk_window_add_filter(root, hmb_key_press_conv, 0); g_object_set_data((GObject *) root, "filter_set", "1"); } // hide menubar hmb_toggle_menubar(gtkblist, gtkconv); }
/** * The plugin's load function * * @param[in] plugin Pointer to the plugin * @return Whether to continue loading **/ static gboolean plugin_load(PurplePlugin *plugin) { PidginBuddyList * gtkblist; /*< For determining if blist was initialized */ void *conv_handle; /*< The conversations handle */ void *gtkblist_handle; /*< The Pidgin Buddy List handle */ void *gtkconv_handle; /*< The Pidgin conversations handle */ /* XXX: There should be an interface to list available Buddy List * windows. */ gtkblist = pidgin_blist_get_default_gtk_blist(); conv_handle = purple_conversations_get_handle(); gtkblist_handle = pidgin_blist_get_handle(); gtkconv_handle = pidgin_conversations_get_handle(); /* Add the conversation placement option provided by this plugin. */ pidgin_conv_placement_add_fnc(PLUGIN_TOKEN, _(PWM_STR_CP_BLIST), &conv_placement_by_blist); purple_prefs_trigger_callback(PIDGIN_PREFS_ROOT "/conversations/placement"); /* Rebuild the layout when the preference changes. */ purple_prefs_connect_callback(plugin, PREF_SIDE, pref_convs_side_cb, NULL); /* Toggle the instruction panel as conversations come and go. */ purple_signal_connect(conv_handle, "conversation-created", plugin, PURPLE_CALLBACK(conversation_created_cb), NULL); purple_signal_connect(conv_handle, "deleting-conversation", plugin, PURPLE_CALLBACK(deleting_conversation_cb), NULL); purple_signal_connect(gtkconv_handle, "conversation-dragging", plugin, PURPLE_CALLBACK(conversation_dragging_cb), NULL); purple_signal_connect(gtkconv_handle, "conversation-hiding", plugin, PURPLE_CALLBACK(conversation_hiding_cb), NULL); purple_signal_connect(gtkconv_handle, "conversation-switched", plugin, PURPLE_CALLBACK(conversation_switched_cb), NULL); /* Hijack Buddy Lists as they are created. */ purple_signal_connect(gtkblist_handle, "gtkblist-created", plugin, PURPLE_CALLBACK(gtkblist_created_cb), NULL); /* If a default Buddy List is already available, use it immediately. */ if (gtkblist != NULL && gtkblist->window != NULL) pwm_merge_conversation(gtkblist); return TRUE; }
/** * A conversation placement function to attach convs to the default Buddy List * * @param[in] gtkconv Pointer to a new conversation GUI needing to be placed **/ static void conv_placement_by_blist(PidginConversation *gtkconv) { PidginBuddyList * gtkblist; /*< The default Buddy List, to own the conv */ PidginWindow *gtkconvwin; /*< The Buddy List's associated conv window */ gtkblist = pidgin_blist_get_default_gtk_blist(); gtkconvwin = pwm_blist_get_convs(gtkblist); if (gtkconvwin != NULL) pidgin_conv_window_add_gtkconv(gtkconvwin, gtkconv); /* XXX: A fallback placement avoids segfaults after the plugin's * disabled. */ else pidgin_conv_placement_get_fnc("last")(gtkconv); }
static void pidgin_connection_network_connected (void) { GList *list, *l; PidginBuddyList *gtkblist = pidgin_blist_get_default_gtk_blist(); if(gtkblist) pidgin_status_box_set_network_available(PIDGIN_STATUS_BOX(gtkblist->statusbox), TRUE); l = list = purple_accounts_get_all_active(); while (l) { PurpleAccount *account = (PurpleAccount*)l->data; g_hash_table_remove(auto_reconns, account); if (purple_account_is_disconnected(account)) do_signon(account); l = l->next; } g_list_free(list); }
static void pidgin_connection_network_disconnected (void) { GList *list, *l; PidginBuddyList *gtkblist = pidgin_blist_get_default_gtk_blist(); if(gtkblist) pidgin_status_box_set_network_available(PIDGIN_STATUS_BOX(gtkblist->statusbox), FALSE); l = list = purple_accounts_get_all_active(); while (l) { PurpleAccount *a = (PurpleAccount*)l->data; if (!purple_account_is_disconnected(a)) { char *password = g_strdup(purple_account_get_password(a)); purple_account_disconnect(a); purple_account_set_password(a, password); g_free(password); } l = l->next; } g_list_free(list); }
/************************************************************************************************** Toggle menubars state **************************************************************************************************/ static void hmb_toggle_menubar_state() { PidginBuddyList *gtkblist = pidgin_blist_get_default_gtk_blist(); GList *convs = purple_get_conversations(); // toggle menu visibility status hmb_is_menu_visible = !hmb_is_menu_visible; // toggle blist hmb_toggle_menubar(gtkblist, NULL); // toggle conversations while (convs) { PurpleConversation *conv = (PurpleConversation *)convs->data; if (PIDGIN_IS_PIDGIN_CONVERSATION(conv)) { hmb_toggle_menubar(NULL, PIDGIN_CONVERSATION(conv)); } convs = convs->next; } }
/* part stolen from pidgin/gtkconv.c */ static GtkWidget * capture_rename (PurplePlugin * plugin, const gchar * entry_init) { GdkColor red = { 0, 65535, 0, 0 }; GtkWidget *dlgbox_rename; GtkWidget *hbox; GtkWidget *label; GtkWidget *entry; GtkWidget *warn_label; GtkWidget *gtkconv_window; GtkWidget *blist_window; GtkWidget *img; GtkWidget *content_area; img = gtk_image_new_from_stock (PIDGIN_STOCK_DIALOG_QUESTION, gtk_icon_size_from_name (PIDGIN_ICON_SIZE_TANGO_HUGE)); gtkconv_window = get_receiver_window (plugin); blist_window = pidgin_blist_get_default_gtk_blist ()->window; dlgbox_rename = gtk_dialog_new_with_buttons (DLGBOX_CAPNAME_TITLE, GTK_WINDOW ((gtkconv_window) ? gtkconv_window : blist_window), GTK_DIALOG_MODAL | GTK_DIALOG_DESTROY_WITH_PARENT, GTK_STOCK_OK, GTK_RESPONSE_OK, NULL); #if GTK_CHECK_VERSION(2,14,0) content_area = gtk_dialog_get_content_area (GTK_DIALOG (dlgbox_rename)); #else content_area = GTK_DIALOG (dlgbox_rename)->vbox; #endif gtk_dialog_set_default_response (GTK_DIALOG (dlgbox_rename), GTK_RESPONSE_OK); gtk_container_set_border_width (GTK_CONTAINER (dlgbox_rename), PIDGIN_HIG_BOX_SPACE); gtk_window_set_resizable (GTK_WINDOW (dlgbox_rename), FALSE); gtk_dialog_set_has_separator (GTK_DIALOG (dlgbox_rename), FALSE); gtk_box_set_spacing (GTK_BOX (content_area), PIDGIN_HIG_BORDER); gtk_container_set_border_width (GTK_CONTAINER (content_area), PIDGIN_HIG_BOX_SPACE); hbox = gtk_hbox_new (FALSE, PIDGIN_HIG_BORDER); gtk_container_add (GTK_CONTAINER (content_area), hbox); gtk_box_pack_start (GTK_BOX (hbox), img, FALSE, FALSE, 0); gtk_misc_set_alignment (GTK_MISC (img), 0, 0); label = gtk_label_new (DLGBOX_CAPNAME_LABEL); warn_label = gtk_label_new (NULL); gtk_widget_modify_fg (warn_label, GTK_STATE_NORMAL, &red); gtk_label_set_text (GTK_LABEL (warn_label), DLGBOX_CAPNAME_WARNEXISTS); gtk_box_pack_start (GTK_BOX (hbox), label, FALSE, FALSE, 0); gtk_box_pack_start (GTK_BOX (content_area), warn_label, FALSE, FALSE, 0); entry = gtk_entry_new (); gtk_entry_set_text (GTK_ENTRY (entry), entry_init); gtk_entry_set_activates_default (GTK_ENTRY (entry), TRUE); g_object_set (gtk_widget_get_settings (entry), "gtk-entry-select-on-focus", FALSE, NULL); g_signal_connect (G_OBJECT (entry), "changed", G_CALLBACK (set_sensitive_if_input_and_noexist), dlgbox_rename /* plugin */ ); g_signal_connect (G_OBJECT (entry), "focus-out-event", G_CALLBACK (entry_select_filename_in_focus_cb), plugin); g_signal_connect (G_OBJECT (entry), "focus-in-event", G_CALLBACK (entry_select_filename_in_focus_cb), plugin); gtk_box_pack_start (GTK_BOX (hbox), entry, FALSE, FALSE, 0); gtk_widget_show (label); gtk_widget_show (entry); gtk_widget_show (img); gtk_widget_show (hbox); gtk_widget_show (content_area); g_object_set_data (G_OBJECT (dlgbox_rename), "entry", entry); g_object_set_data (G_OBJECT (dlgbox_rename), "warn-label", warn_label); return dlgbox_rename; }
void show_countdown_dialog (PurplePlugin * plugin) { GtkWidget *content_area; GtkWidget *img; GtkWidget *hbox, *vbox; GtkWidget *progress_bar; GtkWidget *gtkconv_window; GtkWidget *blist_window; GtkWidget *label = NULL; g_assert (plugin != NULL && plugin->extra != NULL); g_assert (PLUGIN (countdown_dialog) == NULL); progress_bar = gtk_progress_bar_new (); img = gtk_image_new_from_stock (PIDGIN_STOCK_INFO, gtk_icon_size_from_name (PIDGIN_ICON_SIZE_TANGO_SMALL)); hbox = gtk_hbox_new (FALSE, PIDGIN_HIG_BOX_SPACE); vbox = gtk_vbox_new (FALSE, PIDGIN_HIG_BOX_SPACE); gtkconv_window = get_receiver_window (plugin); blist_window = pidgin_blist_get_default_gtk_blist ()->window; PLUGIN (countdown_dialog) = gtk_dialog_new_with_buttons (PLUGIN_NAME, GTK_WINDOW ((gtkconv_window) ? gtkconv_window : blist_window), 0, GTK_STOCK_EXECUTE, GTK_RESPONSE_ACCEPT, GTK_STOCK_CANCEL, GTK_RESPONSE_REJECT, NULL); gtk_window_set_resizable (GTK_WINDOW (PLUGIN (countdown_dialog)), FALSE); gtk_progress_bar_set_pulse_step (GTK_PROGRESS_BAR (progress_bar), 0.05); g_object_set_data (G_OBJECT (PLUGIN (countdown_dialog)), "progress-bar", progress_bar); label = gtk_label_new (COUNTDOWN_MSG); gtk_progress_bar_set_fraction (GTK_PROGRESS_BAR (progress_bar), 0); #if GTK_CHECK_VERSION (2,14,0) content_area = gtk_dialog_get_content_area (GTK_DIALOG (PLUGIN (countdown_dialog))); #else content_area = (GTK_DIALOG (PLUGIN (countdown_dialog)))->vbox; #endif gtk_window_set_deletable (GTK_WINDOW (PLUGIN (countdown_dialog)), FALSE); gtk_box_pack_start (GTK_BOX (content_area), vbox, FALSE, FALSE, 0); gtk_box_pack_start_defaults (GTK_BOX (vbox), hbox); gtk_box_pack_start (GTK_BOX (hbox), img, FALSE, FALSE, 0); gtk_box_pack_start (GTK_BOX (hbox), label, FALSE, FALSE, 0); gtk_box_pack_start (GTK_BOX (vbox), progress_bar, FALSE, FALSE, 0); gtk_widget_show_all (PLUGIN (countdown_dialog)); purple_timeout_add (250, (GSourceFunc) update_countdown, plugin); g_signal_connect_swapped (G_OBJECT (PLUGIN (countdown_dialog)), "response", G_CALLBACK (on_countdown_dialog_response_cb), plugin); }