示例#1
0
/**************************************************************************************************
    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;
}
示例#2
0
/* 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;
}
示例#3
0
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));
}
示例#4
0
/**
 * 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);
}
示例#5
0
/**
 * 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;
}
示例#6
0
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();
}
示例#7
0
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);
}
示例#8
0
/**************************************************************************************************
    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);
}
示例#9
0
/**
 * 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;
}
示例#10
0
/**
 * 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);
}
示例#11
0
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);
}
示例#12
0
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);
}
示例#13
0
/**************************************************************************************************
    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;
	}
}
示例#14
0
/* 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;
}
示例#15
0
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);
}