Exemplo n.º 1
0
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);
}
Exemplo n.º 2
0
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);
		}
	}
}
Exemplo n.º 3
0
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);
}
Exemplo n.º 4
0
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);
        }
    }
}
Exemplo n.º 5
0
/**
 * 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);
	}
}
Exemplo n.º 6
0
/**
 * 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);
	}
}
Exemplo n.º 7
0
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);
	}
}
Exemplo n.º 8
0
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);
}
Exemplo n.º 9
0
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);
}
Exemplo n.º 10
0
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);
	}
}
Exemplo n.º 11
0
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");
        }
    }
}
Exemplo n.º 12
0
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);
        }
    }
}