| 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, |