pidgin/plugins/timestamp_format.c

changeset 30000
a6ceec33f2c1
parent 20288
5ca925a094e2
child 30010
2b3e5bbd0492
equal deleted inserted replaced
29998:fcacdafd0f2d 30000:a6ceec33f2c1
6 #include "util.h" 6 #include "util.h"
7 #include "version.h" 7 #include "version.h"
8 8
9 #include "gtkconv.h" 9 #include "gtkconv.h"
10 #include "gtkplugin.h" 10 #include "gtkplugin.h"
11 #include "gtkimhtml.h"
11 12
12 #include <time.h> 13 #include <time.h>
13 14
14 static PurplePluginPrefFrame * 15 static PurplePluginPrefFrame *
15 get_plugin_pref_frame(PurplePlugin *plugin) 16 get_plugin_pref_frame(PurplePlugin *plugin)
106 g_return_val_if_fail(log != NULL, NULL); 107 g_return_val_if_fail(log != NULL, NULL);
107 108
108 return timestamp_cb_common(log->conv, t, show_date, force, dates, FALSE); 109 return timestamp_cb_common(log->conv, t, show_date, force, dates, FALSE);
109 } 110 }
110 111
112 static void
113 menu_cb(GtkWidget *item, gpointer data)
114 {
115 PurplePlugin *plugin = data;
116 GtkWidget *frame = pidgin_plugin_get_config_frame(plugin), *dialog;
117 if (!frame)
118 return;
119
120 dialog = gtk_dialog_new_with_buttons(PIDGIN_ALERT_TITLE, NULL,
121 GTK_DIALOG_NO_SEPARATOR | GTK_DIALOG_DESTROY_WITH_PARENT,
122 GTK_STOCK_CLOSE, GTK_RESPONSE_CLOSE,
123 NULL);
124 g_signal_connect_after(G_OBJECT(dialog), "response", G_CALLBACK(gtk_widget_destroy), dialog);
125 gtk_container_add(GTK_CONTAINER(GTK_DIALOG(dialog)->vbox), frame);
126 gtk_window_set_role(GTK_WINDOW(dialog), "plugin_config");
127 gtk_window_set_title(GTK_WINDOW(dialog), _(purple_plugin_get_name(plugin)));
128 gtk_widget_show_all(dialog);
129 }
130
131 static gboolean
132 textview_emission_hook(GSignalInvocationHint *hint, guint n_params,
133 const GValue *pvalues, gpointer data)
134 {
135 GtkTextView *view = GTK_TEXT_VIEW(g_value_get_object(pvalues));
136 GtkWidget *menu, *item;
137 GtkTextBuffer *buffer;
138 GtkTextIter cursor;
139 int cx, cy, bx, by;
140
141 if (!GTK_IS_IMHTML(view))
142 return TRUE;
143
144 if (!gdk_window_get_pointer(GTK_WIDGET(view)->window, &cx, &cy, NULL))
145 return TRUE;
146
147 buffer = gtk_text_view_get_buffer(view);
148
149 gtk_text_view_window_to_buffer_coords(view, GTK_TEXT_WINDOW_TEXT, cx, cy, &bx, &by);
150 gtk_text_view_get_iter_at_location(view, &cursor, bx, by);
151 if (!gtk_text_iter_has_tag(&cursor,
152 gtk_text_tag_table_lookup(gtk_text_buffer_get_tag_table(buffer), "comment")))
153 return TRUE;
154
155 menu = g_value_get_object(&pvalues[1]);
156
157 item = gtk_menu_item_new_with_label(_("Timestamp Format Options"));
158 gtk_widget_show_all(item);
159 g_signal_connect(G_OBJECT(item), "activate", G_CALLBACK(menu_cb), data);
160 gtk_menu_shell_insert(GTK_MENU_SHELL(menu), item, 0);
161
162 item = gtk_separator_menu_item_new();
163 gtk_widget_show(item);
164 gtk_menu_shell_insert(GTK_MENU_SHELL(menu), item, 1);
165
166 return TRUE;
167 }
168
169 static guint signal_id;
170 static gulong hook_id;
171
111 static gboolean 172 static gboolean
112 plugin_load(PurplePlugin *plugin) 173 plugin_load(PurplePlugin *plugin)
113 { 174 {
175 gpointer klass = NULL;
176
114 purple_signal_connect(pidgin_conversations_get_handle(), "conversation-timestamp", 177 purple_signal_connect(pidgin_conversations_get_handle(), "conversation-timestamp",
115 plugin, PURPLE_CALLBACK(conversation_timestamp_cb), NULL); 178 plugin, PURPLE_CALLBACK(conversation_timestamp_cb), NULL);
116 purple_signal_connect(purple_log_get_handle(), "log-timestamp", 179 purple_signal_connect(purple_log_get_handle(), "log-timestamp",
117 plugin, PURPLE_CALLBACK(log_timestamp_cb), NULL); 180 plugin, PURPLE_CALLBACK(log_timestamp_cb), NULL);
181
182 klass = g_type_class_ref(GTK_TYPE_TEXT_VIEW);
183
184 /* In 3.0.0, use purple_g_signal_connect_flags */
185 g_signal_parse_name("populate_popup", GTK_TYPE_TEXT_VIEW, &signal_id, NULL, FALSE);
186 hook_id = g_signal_add_emission_hook(signal_id, 0, textview_emission_hook,
187 plugin, NULL);
188
189 g_type_class_unref(klass);
190
118 return TRUE; 191 return TRUE;
119 } 192 }
120 193
121 static gboolean 194 static gboolean
122 plugin_unload(PurplePlugin *plugin) 195 plugin_unload(PurplePlugin *plugin)
123 { 196 {
197 g_signal_remove_emission_hook(signal_id, hook_id);
124 return TRUE; 198 return TRUE;
125 } 199 }
126 200
127 static PurplePluginUiInfo prefs_info = { 201 static PurplePluginUiInfo prefs_info = {
128 get_plugin_pref_frame, 202 get_plugin_pref_frame,

mercurial