Mercurial > pidgin
annotate plugins/contact_priority.c @ 12468:6faefbebcd24
[gaim-migrate @ 14778]
SF Patch #1372898 from charkins
"This patch updates the unseen conversation api in
gtkconv to ensure consistancy and avoid code
duplication. The ...first_unseen() function is renamed
and expanded to return a list of conversations that
match the specified criteria. A max_count parameter is
used to allow this to short circuit early (using 1
gives old behavior). An additional flag was added to
allow this function to only consider hidden
conversations (used by the buddy list). The blist is
currently inconsistant in which conversations it loops
over for showing the menu tray icon, creating the
tooltip and the unseen menu. This patch fixes that.
The ...find_unseen_list() now handles contact-aware
conversations correctly as well (based on sadrul's
patches in #1362579 which are obsoleted by this patch).
I also included the fix from #1362579 which increments
unseen_count only when state>=UNSEEN_TEXT."
committer: Tailor Script <tailor@pidgin.im>
| author | Richard Laager <rlaager@wiktel.com> |
|---|---|
| date | Mon, 12 Dec 2005 18:59:29 +0000 |
| parents | 281ab2ecc08c |
| children | 3169cd6727ad |
| rev | line source |
|---|---|
| 7421 | 1 /* |
| 2 * Contact priority settings plugin. | |
| 3 * | |
| 4 * Copyright (C) 2003 Etan Reisner, <deryni9@users.sourceforge.net>. | |
| 5 * | |
| 6 * This program is free software; you can redistribute it and/or | |
| 7 * modify it under the terms of the GNU General Public License as | |
| 8 * published by the Free Software Foundation; either version 2 of the | |
| 9 * License, or (at your option) any later version. | |
| 10 * | |
| 11 * This program is distributed in the hope that it will be useful, | |
| 12 * but WITHOUT ANY WARRANTY; without even the implied warranty of | |
| 13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |
| 14 * GNU General Public License for more details. | |
| 15 * | |
| 16 * You should have received a copy of the GNU General Public License | |
| 17 * along with this program; if not, write to the Free Software | |
| 18 * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. | |
| 19 */ | |
| 20 | |
| 9821 | 21 #include "internal.h" |
| 22 #include "gtkgaim.h" | |
| 7421 | 23 #include "gtkplugin.h" |
| 24 #include "gtkutils.h" | |
| 25 #include "prefs.h" | |
| 9954 | 26 #include "version.h" |
| 7421 | 27 |
| 28 #define CONTACT_PRIORITY_PLUGIN_ID "gtk-contact-priority" | |
| 29 | |
| 30 static void | |
| 31 select_account(GtkWidget *widget, GaimAccount *account, gpointer data) | |
| 32 { | |
| 33 gtk_spin_button_set_value(GTK_SPIN_BUTTON(data), | |
| 34 (gdouble)gaim_account_get_int(account, "score", 0)); | |
| 35 } | |
| 36 | |
| 37 static void | |
| 38 account_update(GtkWidget *widget, GtkOptionMenu *optmenu) | |
| 39 { | |
| 40 GaimAccount *account = NULL; | |
| 41 | |
| 42 account = g_object_get_data(G_OBJECT(gtk_menu_get_active(GTK_MENU(gtk_option_menu_get_menu(optmenu)))), "account"); | |
| 43 gaim_account_set_int(account, "score", gtk_spin_button_get_value_as_int(GTK_SPIN_BUTTON(widget))); | |
| 44 } | |
| 45 | |
| 46 static void | |
|
12164
281ab2ecc08c
[gaim-migrate @ 14465]
Richard Laager <rlaager@wiktel.com>
parents:
10729
diff
changeset
|
47 pref_update(GtkWidget *widget, char *pref) |
| 7421 | 48 { |
| 49 if (gaim_prefs_get_type(pref) == GAIM_PREF_INT) | |
| 50 gaim_prefs_set_int(pref, gtk_spin_button_get_value_as_int(GTK_SPIN_BUTTON(widget))); | |
| 51 if (gaim_prefs_get_type(pref) == GAIM_PREF_BOOLEAN) | |
| 52 gaim_prefs_set_bool(pref, gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(widget))); | |
| 53 } | |
| 54 | |
|
12164
281ab2ecc08c
[gaim-migrate @ 14465]
Richard Laager <rlaager@wiktel.com>
parents:
10729
diff
changeset
|
55 static struct GaimContactPriorityStatuses |
|
281ab2ecc08c
[gaim-migrate @ 14465]
Richard Laager <rlaager@wiktel.com>
parents:
10729
diff
changeset
|
56 { |
|
281ab2ecc08c
[gaim-migrate @ 14465]
Richard Laager <rlaager@wiktel.com>
parents:
10729
diff
changeset
|
57 const char *id; |
|
281ab2ecc08c
[gaim-migrate @ 14465]
Richard Laager <rlaager@wiktel.com>
parents:
10729
diff
changeset
|
58 const char *description; |
|
281ab2ecc08c
[gaim-migrate @ 14465]
Richard Laager <rlaager@wiktel.com>
parents:
10729
diff
changeset
|
59 } const statuses[] = |
|
281ab2ecc08c
[gaim-migrate @ 14465]
Richard Laager <rlaager@wiktel.com>
parents:
10729
diff
changeset
|
60 { |
|
281ab2ecc08c
[gaim-migrate @ 14465]
Richard Laager <rlaager@wiktel.com>
parents:
10729
diff
changeset
|
61 { "idle", N_("Buddy is idle") }, |
|
281ab2ecc08c
[gaim-migrate @ 14465]
Richard Laager <rlaager@wiktel.com>
parents:
10729
diff
changeset
|
62 { "away", N_("Buddy is away") }, |
|
281ab2ecc08c
[gaim-migrate @ 14465]
Richard Laager <rlaager@wiktel.com>
parents:
10729
diff
changeset
|
63 { "extended_away", N_("Buddy is \"extended\" away") }, |
|
281ab2ecc08c
[gaim-migrate @ 14465]
Richard Laager <rlaager@wiktel.com>
parents:
10729
diff
changeset
|
64 { "offline", N_("Buddy is offline") }, |
|
281ab2ecc08c
[gaim-migrate @ 14465]
Richard Laager <rlaager@wiktel.com>
parents:
10729
diff
changeset
|
65 { NULL, NULL } |
|
281ab2ecc08c
[gaim-migrate @ 14465]
Richard Laager <rlaager@wiktel.com>
parents:
10729
diff
changeset
|
66 }; |
|
281ab2ecc08c
[gaim-migrate @ 14465]
Richard Laager <rlaager@wiktel.com>
parents:
10729
diff
changeset
|
67 |
| 7421 | 68 static GtkWidget * |
| 69 get_config_frame(GaimPlugin *plugin) | |
| 70 { | |
| 71 GtkWidget *ret = NULL, *hbox = NULL, *frame = NULL, *vbox = NULL; | |
| 72 GtkWidget *label = NULL, *spin = NULL, *check = NULL; | |
| 73 GtkWidget *optmenu = NULL; | |
| 74 GtkObject *adj = NULL; | |
| 75 GtkSizeGroup *sg = NULL; | |
| 76 GaimAccount *account = NULL; | |
|
12164
281ab2ecc08c
[gaim-migrate @ 14465]
Richard Laager <rlaager@wiktel.com>
parents:
10729
diff
changeset
|
77 int i; |
|
281ab2ecc08c
[gaim-migrate @ 14465]
Richard Laager <rlaager@wiktel.com>
parents:
10729
diff
changeset
|
78 |
| 7421 | 79 gboolean last_match = gaim_prefs_get_bool("/core/contact/last_match"); |
| 80 | |
| 81 sg = gtk_size_group_new(GTK_SIZE_GROUP_HORIZONTAL); | |
| 82 | |
| 83 ret = gtk_vbox_new(FALSE, 18); | |
| 84 gtk_container_set_border_width(GTK_CONTAINER(ret), 12); | |
| 85 | |
| 86 frame = gaim_gtk_make_frame(ret, _("Point values to use when...")); | |
| 87 | |
| 88 vbox = gtk_vbox_new(FALSE, 5); | |
| 89 gtk_container_add(GTK_CONTAINER(frame), vbox); | |
| 90 | |
|
12164
281ab2ecc08c
[gaim-migrate @ 14465]
Richard Laager <rlaager@wiktel.com>
parents:
10729
diff
changeset
|
91 /* Status Spinboxes */ |
|
281ab2ecc08c
[gaim-migrate @ 14465]
Richard Laager <rlaager@wiktel.com>
parents:
10729
diff
changeset
|
92 for (i = 0 ; statuses[i].id != NULL && statuses[i].description != NULL ; i++) |
|
281ab2ecc08c
[gaim-migrate @ 14465]
Richard Laager <rlaager@wiktel.com>
parents:
10729
diff
changeset
|
93 { |
|
281ab2ecc08c
[gaim-migrate @ 14465]
Richard Laager <rlaager@wiktel.com>
parents:
10729
diff
changeset
|
94 char *pref = g_strconcat("/core/status/scores/", statuses[i].id, NULL); |
| 7421 | 95 |
|
12164
281ab2ecc08c
[gaim-migrate @ 14465]
Richard Laager <rlaager@wiktel.com>
parents:
10729
diff
changeset
|
96 hbox = gtk_hbox_new(FALSE, 5); |
|
281ab2ecc08c
[gaim-migrate @ 14465]
Richard Laager <rlaager@wiktel.com>
parents:
10729
diff
changeset
|
97 gtk_box_pack_start(GTK_BOX(vbox), hbox, FALSE, FALSE, 0); |
|
281ab2ecc08c
[gaim-migrate @ 14465]
Richard Laager <rlaager@wiktel.com>
parents:
10729
diff
changeset
|
98 |
|
281ab2ecc08c
[gaim-migrate @ 14465]
Richard Laager <rlaager@wiktel.com>
parents:
10729
diff
changeset
|
99 label = gtk_label_new_with_mnemonic(_(statuses[i].description)); |
|
281ab2ecc08c
[gaim-migrate @ 14465]
Richard Laager <rlaager@wiktel.com>
parents:
10729
diff
changeset
|
100 gtk_box_pack_start(GTK_BOX(hbox), label, FALSE, FALSE, 0); |
|
281ab2ecc08c
[gaim-migrate @ 14465]
Richard Laager <rlaager@wiktel.com>
parents:
10729
diff
changeset
|
101 gtk_size_group_add_widget(sg, label); |
|
281ab2ecc08c
[gaim-migrate @ 14465]
Richard Laager <rlaager@wiktel.com>
parents:
10729
diff
changeset
|
102 gtk_misc_set_alignment(GTK_MISC(label), 0, 0); |
|
281ab2ecc08c
[gaim-migrate @ 14465]
Richard Laager <rlaager@wiktel.com>
parents:
10729
diff
changeset
|
103 |
|
281ab2ecc08c
[gaim-migrate @ 14465]
Richard Laager <rlaager@wiktel.com>
parents:
10729
diff
changeset
|
104 adj = gtk_adjustment_new(gaim_prefs_get_int(pref), -500, 500, 1, 1, 1); |
|
281ab2ecc08c
[gaim-migrate @ 14465]
Richard Laager <rlaager@wiktel.com>
parents:
10729
diff
changeset
|
105 spin = gtk_spin_button_new((GtkAdjustment *)adj, 1, 0); |
|
281ab2ecc08c
[gaim-migrate @ 14465]
Richard Laager <rlaager@wiktel.com>
parents:
10729
diff
changeset
|
106 g_signal_connect(G_OBJECT(spin), "value-changed", G_CALLBACK(pref_update), pref); |
|
281ab2ecc08c
[gaim-migrate @ 14465]
Richard Laager <rlaager@wiktel.com>
parents:
10729
diff
changeset
|
107 gtk_box_pack_start(GTK_BOX(hbox), spin, FALSE, FALSE, 0); |
| 7421 | 108 |
|
12164
281ab2ecc08c
[gaim-migrate @ 14465]
Richard Laager <rlaager@wiktel.com>
parents:
10729
diff
changeset
|
109 g_free(pref); |
|
281ab2ecc08c
[gaim-migrate @ 14465]
Richard Laager <rlaager@wiktel.com>
parents:
10729
diff
changeset
|
110 } |
| 7421 | 111 |
|
12164
281ab2ecc08c
[gaim-migrate @ 14465]
Richard Laager <rlaager@wiktel.com>
parents:
10729
diff
changeset
|
112 /* Explanation */ |
|
281ab2ecc08c
[gaim-migrate @ 14465]
Richard Laager <rlaager@wiktel.com>
parents:
10729
diff
changeset
|
113 label = gtk_label_new(NULL); |
|
281ab2ecc08c
[gaim-migrate @ 14465]
Richard Laager <rlaager@wiktel.com>
parents:
10729
diff
changeset
|
114 gtk_label_set_markup(GTK_LABEL(label), _("The buddy with the <i>largest score</i> is the buddy who will have priority in the contact.\n")); |
|
281ab2ecc08c
[gaim-migrate @ 14465]
Richard Laager <rlaager@wiktel.com>
parents:
10729
diff
changeset
|
115 gtk_box_pack_start(GTK_BOX(vbox), label, FALSE, FALSE, 0); |
| 7421 | 116 |
| 117 /* Last match */ | |
| 118 hbox = gtk_hbox_new(FALSE, 5); | |
| 119 gtk_box_pack_start(GTK_BOX(vbox), hbox, FALSE, FALSE, 0); | |
| 120 | |
|
12164
281ab2ecc08c
[gaim-migrate @ 14465]
Richard Laager <rlaager@wiktel.com>
parents:
10729
diff
changeset
|
121 check = gtk_check_button_new_with_label(_("Use last buddy when scores are equal")); |
| 7421 | 122 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(check), last_match); |
|
12164
281ab2ecc08c
[gaim-migrate @ 14465]
Richard Laager <rlaager@wiktel.com>
parents:
10729
diff
changeset
|
123 g_signal_connect(G_OBJECT(check), "toggled", G_CALLBACK(pref_update), "/core/contact/last_match"); |
| 7421 | 124 gtk_box_pack_start(GTK_BOX(hbox), check, FALSE, FALSE, 0); |
| 125 | |
| 10729 | 126 frame = gaim_gtk_make_frame(ret, _("Point values to use for account...")); |
| 7421 | 127 |
| 128 vbox = gtk_vbox_new(FALSE, 5); | |
| 129 gtk_container_add(GTK_CONTAINER(frame), vbox); | |
| 130 | |
| 131 /* Account */ | |
| 132 hbox = gtk_hbox_new(FALSE, 5); | |
| 133 gtk_box_pack_start(GTK_BOX(vbox), hbox, FALSE, FALSE, 0); | |
| 134 | |
| 135 /* make this here so I can use it in the option menu callback, we'll | |
| 136 * actually set it up later */ | |
|
12164
281ab2ecc08c
[gaim-migrate @ 14465]
Richard Laager <rlaager@wiktel.com>
parents:
10729
diff
changeset
|
137 adj = gtk_adjustment_new(0, -500, 500, 1, 1, 1); |
| 7421 | 138 spin = gtk_spin_button_new((GtkAdjustment *)adj, 1, 0); |
| 139 | |
| 140 optmenu = gaim_gtk_account_option_menu_new(NULL, TRUE, | |
| 141 G_CALLBACK(select_account), | |
| 142 NULL, spin); | |
| 143 gtk_box_pack_start(GTK_BOX(hbox), optmenu, FALSE, FALSE, 0); | |
| 144 | |
| 145 /* this is where we set up the spin button we made above */ | |
| 146 account = g_object_get_data(G_OBJECT(gtk_menu_get_active(GTK_MENU(gtk_option_menu_get_menu(GTK_OPTION_MENU(optmenu))))), | |
| 147 "account"); | |
| 148 gtk_spin_button_set_value(GTK_SPIN_BUTTON(spin), | |
| 149 (gdouble)gaim_account_get_int(account, "score", 0)); | |
| 150 gtk_spin_button_set_adjustment(GTK_SPIN_BUTTON(spin), GTK_ADJUSTMENT(adj)); | |
| 151 g_signal_connect(G_OBJECT(spin), "value-changed", | |
| 152 G_CALLBACK(account_update), optmenu); | |
| 153 gtk_box_pack_start(GTK_BOX(hbox), spin, FALSE, FALSE, 0); | |
| 154 | |
| 155 gtk_widget_show_all(ret); | |
| 156 | |
| 157 return ret; | |
| 158 } | |
| 159 | |
| 160 static GaimGtkPluginUiInfo ui_info = | |
| 161 { | |
| 162 get_config_frame | |
| 163 }; | |
| 164 | |
| 165 static GaimPluginInfo info = | |
| 166 { | |
| 9954 | 167 GAIM_PLUGIN_MAGIC, |
| 168 GAIM_MAJOR_VERSION, | |
| 169 GAIM_MINOR_VERSION, | |
| 7421 | 170 GAIM_PLUGIN_STANDARD, /**< type */ |
| 171 GAIM_GTK_PLUGIN_TYPE, /**< ui_requirement */ | |
| 172 0, /**< flags */ | |
| 173 NULL, /**< dependencies */ | |
| 174 GAIM_PRIORITY_DEFAULT, /**< priority */ | |
| 175 | |
| 176 CONTACT_PRIORITY_PLUGIN_ID, /**< id */ | |
| 177 N_("Contact Priority"), /**< name */ | |
| 178 VERSION, /**< version */ | |
| 179 /**< summary */ | |
| 180 N_("Allows for controlling the values associated with different buddy states."), | |
| 181 /**< description */ | |
| 182 N_("Allows for changing the point values of idle/away/offline states for buddies in contact priority computations."), | |
| 183 "Etan Reisner <deryni@eden.rutgers.edu>", /**< author */ | |
| 184 GAIM_WEBSITE, /**< homepage */ | |
| 185 | |
| 186 NULL, /**< load */ | |
| 187 NULL, /**< unload */ | |
| 188 NULL, /**< destroy */ | |
| 189 &ui_info, /**< ui_info */ | |
| 190 NULL /**< extra_info */ | |
| 191 }; | |
| 192 | |
| 193 static void | |
| 194 init_plugin(GaimPlugin *plugin) | |
| 195 { | |
| 196 } | |
| 197 | |
| 198 GAIM_INIT_PLUGIN(contactpriority, init_plugin, info) |
