pidgin/gtknotify.c

branch
gtk4
changeset 41534
ed3a7cfa0b0c
parent 41526
ad8654c2e758
child 41575
d08b9a655b0e
equal deleted inserted replaced
41533:bca738fd139b 41534:ed3a7cfa0b0c
125 purple_account_get_username(account)); 125 purple_account_get_username(account));
126 126
127 if (GTK_IS_BOX(cont)) { 127 if (GTK_IS_BOX(cont)) {
128 gtk_widget_set_halign(image, GTK_ALIGN_START); 128 gtk_widget_set_halign(image, GTK_ALIGN_START);
129 gtk_widget_set_valign(image, GTK_ALIGN_START); 129 gtk_widget_set_valign(image, GTK_ALIGN_START);
130 gtk_box_pack_end(GTK_BOX(cont), image, FALSE, TRUE, 0); 130 gtk_widget_set_hexpand(image, TRUE);
131 } 131 gtk_box_append(GTK_BOX(cont), image);
132 gtk_widget_show(image); 132 }
133 } 133 }
134 134
135 static void * 135 static void *
136 pidgin_notify_message(PurpleNotifyMessageType type, const char *title, 136 pidgin_notify_message(PurpleNotifyMessageType type, const char *title,
137 const char *primary, const char *secondary, 137 const char *primary, const char *secondary,
164 break; 164 break;
165 } 165 }
166 166
167 if (icon_name != NULL) 167 if (icon_name != NULL)
168 { 168 {
169 img = gtk_image_new_from_icon_name(icon_name, 169 img = gtk_image_new_from_icon_name(icon_name);
170 GTK_ICON_SIZE_DIALOG); 170 gtk_image_set_pixel_size(GTK_IMAGE(img), 48);
171 gtk_widget_set_halign(img, GTK_ALIGN_START); 171 gtk_widget_set_halign(img, GTK_ALIGN_START);
172 gtk_widget_set_valign(img, GTK_ALIGN_START); 172 gtk_widget_set_valign(img, GTK_ALIGN_START);
173 } 173 }
174 174
175 dialog = gtk_dialog_new_with_buttons(title ? title : PIDGIN_ALERT_TITLE, 175 dialog = gtk_dialog_new_with_buttons(title ? title : PIDGIN_ALERT_TITLE,
176 NULL, 0, _("Close"), 176 NULL, 0, _("Close"),
177 GTK_RESPONSE_CLOSE, NULL); 177 GTK_RESPONSE_CLOSE, NULL);
178 178
179 gtk_window_set_role(GTK_WINDOW(dialog), "notify_dialog");
180
181 g_signal_connect(G_OBJECT(dialog), "response", 179 g_signal_connect(G_OBJECT(dialog), "response",
182 G_CALLBACK(message_response_cb), dialog); 180 G_CALLBACK(message_response_cb), dialog);
183 181
184 gtk_container_set_border_width(GTK_CONTAINER(dialog), 12);
185 gtk_window_set_resizable(GTK_WINDOW(dialog), FALSE); 182 gtk_window_set_resizable(GTK_WINDOW(dialog), FALSE);
186 gtk_box_set_spacing(GTK_BOX(gtk_dialog_get_content_area(GTK_DIALOG(dialog))), 183 gtk_box_set_spacing(GTK_BOX(gtk_dialog_get_content_area(GTK_DIALOG(dialog))),
187 12); 184 12);
188 gtk_container_set_border_width(GTK_CONTAINER(gtk_dialog_get_content_area(GTK_DIALOG(dialog))),
189 6);
190 185
191 hbox = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 12); 186 hbox = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 12);
192 gtk_container_add(GTK_CONTAINER(gtk_dialog_get_content_area(GTK_DIALOG(dialog))), 187 gtk_box_append(GTK_BOX(gtk_dialog_get_content_area(GTK_DIALOG(dialog))),
193 hbox); 188 hbox);
194 189
195 if (img != NULL) 190 if (img != NULL) {
196 gtk_box_pack_start(GTK_BOX(hbox), img, FALSE, FALSE, 0); 191 gtk_box_append(GTK_BOX(hbox), img);
197 192 }
198 pidgin_widget_decorate_account(hbox,
199 purple_request_cpar_get_account(cpar));
200 193
201 primary_esc = g_markup_escape_text(primary, -1); 194 primary_esc = g_markup_escape_text(primary, -1);
202 secondary_esc = (secondary != NULL) ? g_markup_escape_text(secondary, -1) : NULL; 195 secondary_esc = (secondary != NULL) ? g_markup_escape_text(secondary, -1) : NULL;
203 g_snprintf(label_text, sizeof(label_text), 196 g_snprintf(label_text, sizeof(label_text),
204 "<span weight=\"bold\" size=\"larger\">%s</span>%s%s", 197 "<span weight=\"bold\" size=\"larger\">%s</span>%s%s",
208 g_free(secondary_esc); 201 g_free(secondary_esc);
209 202
210 label = gtk_label_new(NULL); 203 label = gtk_label_new(NULL);
211 204
212 gtk_label_set_markup(GTK_LABEL(label), label_text); 205 gtk_label_set_markup(GTK_LABEL(label), label_text);
213 gtk_label_set_line_wrap(GTK_LABEL(label), TRUE); 206 gtk_label_set_wrap(GTK_LABEL(label), TRUE);
214 gtk_label_set_selectable(GTK_LABEL(label), TRUE); 207 gtk_label_set_selectable(GTK_LABEL(label), TRUE);
215 gtk_label_set_xalign(GTK_LABEL(label), 0); 208 gtk_label_set_xalign(GTK_LABEL(label), 0);
216 gtk_label_set_yalign(GTK_LABEL(label), 0); 209 gtk_label_set_yalign(GTK_LABEL(label), 0);
217 gtk_box_pack_start(GTK_BOX(hbox), label, FALSE, FALSE, 0); 210 gtk_box_append(GTK_BOX(hbox), label);
211
212 pidgin_widget_decorate_account(hbox,
213 purple_request_cpar_get_account(cpar));
218 214
219 g_object_set_data(G_OBJECT(dialog), "pidgin-parent-from", 215 g_object_set_data(G_OBJECT(dialog), "pidgin-parent-from",
220 purple_request_cpar_get_parent_from(cpar)); 216 purple_request_cpar_get_parent_from(cpar));
221 pidgin_auto_parent_window(dialog); 217 pidgin_auto_parent_window(dialog);
222 218
223 gtk_widget_show_all(dialog); 219 gtk_widget_show(dialog);
224 220
225 return dialog; 221 return dialog;
226 } 222 }
227 223
228 static gboolean 224 static gboolean
229 formatted_input_cb(GtkWidget *win, GdkEventKey *event, gpointer data) 225 formatted_input_cb(GtkWidget *win, guint keyval, G_GNUC_UNUSED guint keycode,
230 { 226 G_GNUC_UNUSED GdkModifierType state, gpointer data)
231 if (event->keyval == GDK_KEY_Escape) 227 {
232 { 228 if (keyval == GDK_KEY_Escape) {
233 purple_notify_close(PURPLE_NOTIFY_FORMATTED, win); 229 purple_notify_close(PURPLE_NOTIFY_FORMATTED, win);
234 230
235 return TRUE; 231 return TRUE;
236 } 232 }
237 233
244 { 240 {
245 GtkWidget *window; 241 GtkWidget *window;
246 GtkWidget *vbox; 242 GtkWidget *vbox;
247 GtkWidget *label; 243 GtkWidget *label;
248 GtkWidget *button; 244 GtkWidget *button;
245 GtkEventController *event = NULL;
249 GtkWidget *sw; 246 GtkWidget *sw;
250 GtkWidget *view; 247 GtkWidget *view;
251 GtkTextBuffer *buffer; 248 GtkTextBuffer *buffer;
252 char label_text[2048]; 249 char label_text[2048];
253 char *linked_text, *primary_esc, *secondary_esc; 250 char *linked_text, *primary_esc, *secondary_esc;
274 g_free(secondary_esc); 271 g_free(secondary_esc);
275 272
276 label = gtk_label_new(NULL); 273 label = gtk_label_new(NULL);
277 274
278 gtk_label_set_markup(GTK_LABEL(label), label_text); 275 gtk_label_set_markup(GTK_LABEL(label), label_text);
279 gtk_label_set_line_wrap(GTK_LABEL(label), TRUE); 276 gtk_label_set_wrap(GTK_LABEL(label), TRUE);
280 gtk_label_set_selectable(GTK_LABEL(label), TRUE); 277 gtk_label_set_selectable(GTK_LABEL(label), TRUE);
281 gtk_label_set_xalign(GTK_LABEL(label), 0); 278 gtk_label_set_xalign(GTK_LABEL(label), 0);
282 gtk_label_set_yalign(GTK_LABEL(label), 0); 279 gtk_label_set_yalign(GTK_LABEL(label), 0);
283 gtk_box_pack_start(GTK_BOX(vbox), label, FALSE, FALSE, 0); 280 gtk_box_append(GTK_BOX(vbox), label);
284 gtk_widget_show(label);
285 281
286 /* Add the view */ 282 /* Add the view */
287 sw = gtk_scrolled_window_new(NULL, NULL); 283 sw = gtk_scrolled_window_new();
288 gtk_box_pack_start(GTK_BOX(vbox), sw, TRUE, TRUE, 0); 284 gtk_box_append(GTK_BOX(vbox), sw);
285 gtk_widget_set_valign(sw, GTK_ALIGN_FILL);
286 gtk_widget_set_vexpand(sw, TRUE);
289 287
290 buffer = talkatu_html_buffer_new(); 288 buffer = talkatu_html_buffer_new();
291 view = talkatu_view_new_with_buffer(buffer); 289 view = talkatu_view_new_with_buffer(buffer);
292 gtk_container_add(GTK_CONTAINER(sw), view); 290 gtk_scrolled_window_set_child(GTK_SCROLLED_WINDOW(sw), view);
293 gtk_widget_set_name(view, "pidgin_notify_view"); 291 gtk_widget_set_name(view, "pidgin_notify_view");
294 gtk_widget_set_size_request(view, 300, 250); 292 gtk_widget_set_size_request(view, 300, 250);
295 gtk_widget_show_all(sw);
296 293
297 /* Add the Close button. */ 294 /* Add the Close button. */
298 button = gtk_dialog_add_button(GTK_DIALOG(window), _("Close"), GTK_RESPONSE_CLOSE); 295 button = gtk_dialog_add_button(GTK_DIALOG(window), _("Close"), GTK_RESPONSE_CLOSE);
299 gtk_widget_grab_focus(button); 296 gtk_widget_grab_focus(button);
300 297
301 g_signal_connect_swapped(G_OBJECT(button), "clicked", 298 g_signal_connect_swapped(G_OBJECT(button), "clicked",
302 G_CALLBACK(formatted_close_cb), window); 299 G_CALLBACK(formatted_close_cb), window);
303 g_signal_connect(G_OBJECT(window), "key_press_event", 300 event = gtk_event_controller_key_new();
304 G_CALLBACK(formatted_input_cb), NULL); 301 gtk_widget_add_controller(window, event);
302 g_signal_connect(G_OBJECT(event), "key-pressed",
303 G_CALLBACK(formatted_input_cb), NULL);
305 304
306 /* Make sure URLs are clickable */ 305 /* Make sure URLs are clickable */
307 linked_text = purple_markup_linkify(text); 306 linked_text = purple_markup_linkify(text);
308 talkatu_markup_set_html(TALKATU_BUFFER(buffer), linked_text, -1); 307 talkatu_markup_set_html(TALKATU_BUFFER(buffer), linked_text, -1);
309 g_free(linked_text); 308 g_free(linked_text);
369 GList *columniter; 368 GList *columniter;
370 guint i; 369 guint i;
371 GList *l; 370 GList *l;
372 371
373 GtkWidget *vbox; 372 GtkWidget *vbox;
373 GtkWidget *sw;
374 GtkWidget *label; 374 GtkWidget *label;
375 PidginNotifySearchResultsData *data; 375 PidginNotifySearchResultsData *data;
376 char *label_text; 376 char *label_text;
377 char *primary_esc, *secondary_esc; 377 char *primary_esc, *secondary_esc;
378 378
384 data->results = results; 384 data->results = results;
385 385
386 /* Create the window */ 386 /* Create the window */
387 window = gtk_dialog_new(); 387 window = gtk_dialog_new();
388 gtk_window_set_title(GTK_WINDOW(window), title ? title :_("Search Results")); 388 gtk_window_set_title(GTK_WINDOW(window), title ? title :_("Search Results"));
389 gtk_container_set_border_width(GTK_CONTAINER(window), 12);
390 gtk_window_set_resizable(GTK_WINDOW(window), TRUE); 389 gtk_window_set_resizable(GTK_WINDOW(window), TRUE);
391 390
392 g_signal_connect_swapped(G_OBJECT(window), "delete_event", 391 g_signal_connect_swapped(G_OBJECT(window), "delete_event",
393 G_CALLBACK(searchresults_close_cb), data); 392 G_CALLBACK(searchresults_close_cb), data);
394 393
405 (secondary ? secondary_esc : "")); 404 (secondary ? secondary_esc : ""));
406 g_free(primary_esc); 405 g_free(primary_esc);
407 g_free(secondary_esc); 406 g_free(secondary_esc);
408 label = gtk_label_new(NULL); 407 label = gtk_label_new(NULL);
409 gtk_label_set_markup(GTK_LABEL(label), label_text); 408 gtk_label_set_markup(GTK_LABEL(label), label_text);
410 gtk_label_set_line_wrap(GTK_LABEL(label), TRUE); 409 gtk_label_set_wrap(GTK_LABEL(label), TRUE);
411 gtk_label_set_xalign(GTK_LABEL(label), 0); 410 gtk_label_set_xalign(GTK_LABEL(label), 0);
412 gtk_label_set_yalign(GTK_LABEL(label), 0); 411 gtk_label_set_yalign(GTK_LABEL(label), 0);
413 gtk_box_pack_start(GTK_BOX(vbox), label, FALSE, FALSE, 0); 412 gtk_box_append(GTK_BOX(vbox), label);
414 gtk_widget_show(label);
415 g_free(label_text); 413 g_free(label_text);
416 414
417 /* +1 is for the automagically created Status column. */ 415 /* +1 is for the automagically created Status column. */
418 col_num = g_list_length(results->columns) + 1; 416 col_num = g_list_length(results->columns) + 1;
419 417
433 g_object_unref(G_OBJECT(model)); 431 g_object_unref(G_OBJECT(model));
434 gtk_widget_set_size_request(treeview, 500, 400); 432 gtk_widget_set_size_request(treeview, 500, 400);
435 gtk_tree_selection_set_mode(gtk_tree_view_get_selection(GTK_TREE_VIEW(treeview)), 433 gtk_tree_selection_set_mode(gtk_tree_view_get_selection(GTK_TREE_VIEW(treeview)),
436 GTK_SELECTION_SINGLE); 434 GTK_SELECTION_SINGLE);
437 gtk_tree_view_set_headers_visible(GTK_TREE_VIEW(treeview), TRUE); 435 gtk_tree_view_set_headers_visible(GTK_TREE_VIEW(treeview), TRUE);
438 gtk_box_pack_start(GTK_BOX(vbox), 436 sw = gtk_scrolled_window_new();
439 pidgin_make_scrollable(treeview, GTK_POLICY_AUTOMATIC, GTK_POLICY_ALWAYS, -1, -1), 437 gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(sw),
440 TRUE, TRUE, 0); 438 GTK_POLICY_AUTOMATIC, GTK_POLICY_ALWAYS);
441 gtk_widget_show(treeview); 439 gtk_scrolled_window_set_child(GTK_SCROLLED_WINDOW(sw), treeview);
440 gtk_widget_set_valign(sw, GTK_ALIGN_FILL);
441 gtk_widget_set_vexpand(sw, TRUE);
442 gtk_box_append(GTK_BOX(vbox), sw);
442 443
443 renderer = gtk_cell_renderer_pixbuf_new(); 444 renderer = gtk_cell_renderer_pixbuf_new();
444 gtk_tree_view_insert_column_with_attributes(GTK_TREE_VIEW(treeview), 445 gtk_tree_view_insert_column_with_attributes(GTK_TREE_VIEW(treeview),
445 -1, "", renderer, "pixbuf", 0, NULL); 446 -1, "", renderer, "pixbuf", 0, NULL);
446 447
589 } 590 }
590 591
591 static void 592 static void
592 pidgin_close_notify(PurpleNotifyType type, void *ui_handle) 593 pidgin_close_notify(PurpleNotifyType type, void *ui_handle)
593 { 594 {
594 if (type == PURPLE_NOTIFY_SEARCHRESULTS) 595 if (type == PURPLE_NOTIFY_SEARCHRESULTS) {
595 {
596 PidginNotifySearchResultsData *data = (PidginNotifySearchResultsData *)ui_handle; 596 PidginNotifySearchResultsData *data = (PidginNotifySearchResultsData *)ui_handle;
597 597
598 gtk_widget_destroy(data->window); 598 gtk_window_destroy(GTK_WINDOW(data->window));
599 purple_notify_searchresults_free(data->results); 599 purple_notify_searchresults_free(data->results);
600 600
601 g_free(data); 601 g_free(data);
602 } 602
603 else if (ui_handle != NULL) 603 } else if (ui_handle != NULL) {
604 gtk_widget_destroy(GTK_WIDGET(ui_handle)); 604 gtk_window_destroy(GTK_WINDOW(ui_handle));
605 }
605 } 606 }
606 607
607 static void * 608 static void *
608 pidgin_notify_uri(const char *uri) { 609 pidgin_notify_uri(const char *uri) {
609 gtk_show_uri_on_window(NULL, uri, GDK_CURRENT_TIME, NULL); 610 gtk_show_uri(NULL, uri, GDK_CURRENT_TIME);
610 611
611 return NULL; 612 return NULL;
612 } 613 }
613 614
614 static void* 615 static void*

mercurial