gee
oldstatus
2005-09-19, Nathan Walp
* @file gtknotify.c GTK+ Notification API * Gaim is the legal property of its developers, whose names are too numerous * to list here. Please refer to the COPYRIGHT file distributed with this * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA #include <gdk/gdkkeysyms.h> static void *gaim_gtk_notify_emails(size_t count, gboolean detailed, const char **froms, const char **tos, const char **urls, GCallback cb, message_response_cb(GtkDialog *dialog, gint id, GtkWidget *widget) gaim_notify_close(GAIM_NOTIFY_MESSAGE, widget); email_response_cb(GtkDialog *dialog, gint id, GaimNotifyMailData *data) gaim_notify_uri(NULL, data->url); gaim_notify_close(GAIM_NOTIFY_EMAILS, data); formatted_close_cb(GtkWidget *win, GdkEvent *event, void *user_data) gaim_notify_close(GAIM_NOTIFY_FORMATTED, win); gaim_gtk_notify_message(GaimNotifyMsgType type, const char *title, const char *primary, const char *secondary, GCallback cb, void *user_data) const char *icon_name = NULL; case GAIM_NOTIFY_MSG_ERROR: icon_name = GAIM_STOCK_DIALOG_ERROR; case GAIM_NOTIFY_MSG_WARNING: icon_name = GAIM_STOCK_DIALOG_WARNING; case GAIM_NOTIFY_MSG_INFO: icon_name = GAIM_STOCK_DIALOG_INFO; img = gtk_image_new_from_stock(icon_name, GTK_ICON_SIZE_DIALOG); gtk_misc_set_alignment(GTK_MISC(img), 0, 0); dialog = gtk_dialog_new_with_buttons(title ? title : GAIM_ALERT_TITLE, NULL, 0, GTK_STOCK_CLOSE, GTK_RESPONSE_ACCEPT, NULL); gtk_window_set_role(GTK_WINDOW(dialog), "notify_dialog"); g_signal_connect(G_OBJECT(dialog), "response", G_CALLBACK(message_response_cb), dialog); gtk_container_set_border_width(GTK_CONTAINER(dialog), 6); gtk_window_set_resizable(GTK_WINDOW(dialog), FALSE); gtk_dialog_set_has_separator(GTK_DIALOG(dialog), FALSE); gtk_box_set_spacing(GTK_BOX(GTK_DIALOG(dialog)->vbox), 12); gtk_container_set_border_width(GTK_CONTAINER(GTK_DIALOG(dialog)->vbox), 6); hbox = gtk_hbox_new(FALSE, 12); gtk_container_add(GTK_CONTAINER(GTK_DIALOG(dialog)->vbox), hbox); gtk_box_pack_start(GTK_BOX(hbox), img, FALSE, FALSE, 0); g_snprintf(label_text, sizeof(label_text), "<span weight=\"bold\" size=\"larger\">%s</span>\n\n%s", primary, (secondary ? secondary : "")); label = gtk_label_new(NULL); gtk_label_set_markup(GTK_LABEL(label), label_text); gtk_label_set_line_wrap(GTK_LABEL(label), TRUE); gtk_misc_set_alignment(GTK_MISC(label), 0, 0); gtk_box_pack_start(GTK_BOX(hbox), label, FALSE, FALSE, 0); gtk_widget_show_all(dialog); gaim_gtk_notify_email(const char *subject, const char *from, const char *to, const char *url, GCallback cb, void *user_data) return gaim_gtk_notify_emails(1, TRUE, (subject == NULL ? NULL : &subject), (from == NULL ? NULL : &from), (to == NULL ? NULL : &to), (url == NULL ? NULL : &url), gaim_gtk_notify_emails(size_t count, gboolean detailed, const char **subjects, const char **froms, const char **tos, const char **urls, GCallback cb, void *user_data) GaimNotifyMailData *data; data = g_new0(GaimNotifyMailData, 1); data->url = g_strdup(urls[0]); data->dialog = dialog = gtk_dialog_new(); gtk_dialog_add_button(GTK_DIALOG(dialog), GTK_STOCK_CLOSE, 1); gtk_dialog_add_button(GTK_DIALOG(dialog), GAIM_STOCK_OPEN_MAIL, 0); g_signal_connect(G_OBJECT(dialog), "response", G_CALLBACK(email_response_cb), data); gtk_container_set_border_width(GTK_CONTAINER(dialog), 6); gtk_container_set_border_width(GTK_CONTAINER(GTK_DIALOG(dialog)->vbox), 6); gtk_window_set_resizable(GTK_WINDOW(dialog), FALSE); gtk_dialog_set_has_separator(GTK_DIALOG(dialog), FALSE); gtk_box_set_spacing(GTK_BOX(GTK_DIALOG(dialog)->vbox), 12); /* Setup the main horizontal box */ hbox = gtk_hbox_new(FALSE, 12); gtk_container_add(GTK_CONTAINER(GTK_DIALOG(dialog)->vbox), hbox); img = gtk_image_new_from_stock(GAIM_STOCK_DIALOG_INFO, gtk_misc_set_alignment(GTK_MISC(img), 0, 0); gtk_box_pack_start(GTK_BOX(hbox), img, FALSE, FALSE, 0); vbox = gtk_vbox_new(FALSE, 12); gtk_box_pack_start(GTK_BOX(hbox), vbox, FALSE, FALSE, 0); detail_text = g_strdup_printf(ngettext("%s has %d new message.", "%s has %d new messages.", char *from_text = NULL, *subject_text = NULL; from_enc = g_markup_escape_text(*froms, -1); from_text = g_strdup_printf( _("<span weight=\"bold\">From:</span> %s\n"), from_enc); subject_enc = g_markup_escape_text(*subjects, -1); subject_text = g_strdup_printf( _("<span weight=\"bold\">Subject:</span> %s\n"), subject_enc); label_text = g_strdup_printf( _("<span weight=\"bold\" size=\"larger\">You have mail!</span>" (from_text == NULL && subject_text == NULL ? "" : "\n\n"), (from_text == NULL ? "" : from_text), (subject_text == NULL ? "" : subject_text)); if (subject_text != NULL) label_text = g_strdup_printf( _("<span weight=\"bold\" size=\"larger\">You have mail!</span>" label = gtk_label_new(NULL); gtk_label_set_markup(GTK_LABEL(label), label_text); gtk_label_set_line_wrap(GTK_LABEL(label), TRUE); gtk_misc_set_alignment(GTK_MISC(label), 0, 0); gtk_box_pack_start(GTK_BOX(vbox), label, TRUE, TRUE, 0); gtk_widget_show_all(dialog); formatted_input_cb(GtkWidget *win, GdkEventKey *event, gpointer data) if (event->keyval == GDK_Escape) gaim_notify_close(GAIM_NOTIFY_FORMATTED, win); gaim_gtk_notify_formatted(const char *title, const char *primary, const char *secondary, const char *text, GCallback cb, void *user_data) window = gtk_window_new(GTK_WINDOW_TOPLEVEL); gtk_window_set_title(GTK_WINDOW(window), title); gtk_window_set_type_hint(GTK_WINDOW(window), GDK_WINDOW_TYPE_HINT_DIALOG); gtk_container_set_border_width(GTK_CONTAINER(window), 12); g_signal_connect(G_OBJECT(window), "delete_event", G_CALLBACK(formatted_close_cb), NULL); /* Setup the main vbox */ vbox = gtk_vbox_new(FALSE, 12); gtk_container_add(GTK_CONTAINER(window), vbox); /* Setup the descriptive label */ g_snprintf(label_text, sizeof(label_text), "<span weight=\"bold\" size=\"larger\">%s</span>%s%s", (secondary ? secondary : "")); label = gtk_label_new(NULL); gtk_label_set_markup(GTK_LABEL(label), label_text); gtk_label_set_line_wrap(GTK_LABEL(label), TRUE); gtk_misc_set_alignment(GTK_MISC(label), 0, 0); gtk_box_pack_start(GTK_BOX(vbox), label, FALSE, FALSE, 0); /* Setup the scrolled window that we're putting the gtkimhtml in. */ sw = gtk_scrolled_window_new(NULL, NULL); gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(sw), gtk_scrolled_window_set_shadow_type(GTK_SCROLLED_WINDOW(sw), gtk_widget_set_size_request(sw, 300, 250); gtk_box_pack_start(GTK_BOX(vbox), sw, TRUE, TRUE, 0); /* Now build that gtkimhtml */ imhtml = gtk_imhtml_new(NULL, NULL); gtk_widget_set_name(imhtml, "gaim_gtknotify_imhtml"); gtk_container_add(GTK_CONTAINER(sw), imhtml); gaim_setup_imhtml(imhtml); /* Add the Close button. */ button = gtk_button_new_from_stock(GTK_STOCK_CLOSE); gtk_box_pack_start(GTK_BOX(vbox), button, FALSE, FALSE, 0); g_signal_connect_swapped(G_OBJECT(button), "clicked", G_CALLBACK(formatted_close_cb), window); g_signal_connect(G_OBJECT(window), "key_press_event", G_CALLBACK(formatted_input_cb), NULL); /* Add the text to the gtkimhtml */ if (gaim_prefs_get_bool("/gaim/gtk/conversations/ignore_colors")) options ^= GTK_IMHTML_NO_COLOURS; if (gaim_prefs_get_bool("/gaim/gtk/conversations/ignore_fonts")) options ^= GTK_IMHTML_NO_FONTS; if (gaim_prefs_get_bool("/gaim/gtk/conversations/ignore_font_sizes")) options ^= GTK_IMHTML_NO_SIZES; options ^= GTK_IMHTML_NO_COMMENTS; options ^= GTK_IMHTML_NO_TITLE; options ^= GTK_IMHTML_NO_NEWLINE; options ^= GTK_IMHTML_NO_SCROLL; /* Make sure URLs are clickable */ linked_text = gaim_markup_linkify(text); gtk_imhtml_append_text(GTK_IMHTML(imhtml), linked_text, gaim_gtk_notify_userinfo(GaimConnection *gc, const char *who, const char *title, const char *primary, const char *secondary, const char *text, GCallback cb, void *user_data) return gaim_gtk_notify_formatted(title, primary, secondary, gaim_gtk_close_notify(GaimNotifyType type, void *ui_handle) if (type == GAIM_NOTIFY_EMAIL || type == GAIM_NOTIFY_EMAILS) GaimNotifyMailData *data = (GaimNotifyMailData *)ui_handle; gtk_widget_destroy(data->dialog); else if (ui_handle != NULL) gtk_widget_destroy(GTK_WIDGET(ui_handle)); uri_command(const char *command, gboolean sync) escaped = gaim_escape_html(command); gaim_debug_misc("gtknotify", "Executing %s\n", escaped); if (!gaim_program_is_valid(command)) tmp = g_strdup_printf(_("The browser command <b>%s</b> is invalid."), escaped ? escaped : "(none)"); gaim_notify_error(NULL, NULL, _("Unable to open URL"), tmp); if (!g_spawn_command_line_sync(command, NULL, NULL, &status, &error)) tmp = g_strdup_printf(_("Error launching <b>%s</b>: %s"), escaped, error->message); gaim_notify_error(NULL, NULL, _("Unable to open URL"), tmp); if (!g_spawn_command_line_async(command, &error)) tmp = g_strdup_printf(_("Error launching <b>%s</b>: %s"), escaped, error->message); gaim_notify_error(NULL, NULL, _("Unable to open URL"), tmp); gaim_gtk_notify_uri(const char *uri) char *remote_command = NULL; web_browser = gaim_prefs_get_string("/gaim/gtk/browsers/browser"); place = gaim_prefs_get_int("/gaim/gtk/browsers/place"); /* if they are running gnome, use the gnome web browser */ if (gaim_running_gnome() == TRUE) command = g_strdup_printf("gnome-open \"%s\"", uri); else if (!strcmp(web_browser, "epiphany") || !strcmp(web_browser, "galeon")) if (place == GAIM_BROWSER_NEW_WINDOW) command = g_strdup_printf("%s -w \"%s\"", web_browser, uri); else if (place == GAIM_BROWSER_NEW_TAB) command = g_strdup_printf("%s -n \"%s\"", web_browser, uri); command = g_strdup_printf("%s \"%s\"", web_browser, uri); else if (!strcmp(web_browser, "gnome-open")) command = g_strdup_printf("gnome-open \"%s\"", uri); else if (!strcmp(web_browser, "kfmclient")) command = g_strdup_printf("kfmclient openURL \"%s\"", uri); * Does Konqueror have options to open in new tab else if (!strcmp(web_browser, "mozilla") || !strcmp(web_browser, "mozilla-firebird") || !strcmp(web_browser, "firefox")) command = g_strdup_printf("%s \"%s\"", web_browser, uri); * Firefox 0.9 and higher require a "-a firefox" option when * using -remote commands. This breaks older versions of * mozilla. So we include this other handly little string * when calling firefox. If the API for remote calls changes * any more in firefox then firefox should probably be split * apart from mozilla-firebird and mozilla... but this is good if (!strcmp(web_browser, "firefox")) if (place == GAIM_BROWSER_NEW_WINDOW) remote_command = g_strdup_printf("%s %s -remote " "\"openURL(%s,new-window)\"", else if (place == GAIM_BROWSER_NEW_TAB) remote_command = g_strdup_printf("%s %s -remote " "\"openURL(%s,new-tab)\"", else if (place == GAIM_BROWSER_CURRENT) remote_command = g_strdup_printf("%s %s -remote " else if (!strcmp(web_browser, "netscape")) command = g_strdup_printf("netscape \"%s\"", uri); if (place == GAIM_BROWSER_NEW_WINDOW) remote_command = g_strdup_printf("netscape -remote " "\"openURL(%s,new-window)\"", else if (place == GAIM_BROWSER_CURRENT) remote_command = g_strdup_printf("netscape -remote " else if (!strcmp(web_browser, "opera")) if (place == GAIM_BROWSER_NEW_WINDOW) command = g_strdup_printf("opera -newwindow \"%s\"", uri); else if (place == GAIM_BROWSER_NEW_TAB) command = g_strdup_printf("opera -newpage \"%s\"", uri); else if (place == GAIM_BROWSER_CURRENT) remote_command = g_strdup_printf("opera -remote " command = g_strdup_printf("opera \"%s\"", uri); command = g_strdup_printf("opera \"%s\"", uri); else if (!strcmp(web_browser, "custom")) web_command = gaim_prefs_get_string("/gaim/gtk/browsers/command"); if (web_command == NULL || *web_command == '\0') gaim_notify_error(NULL, NULL, _("Unable to open URL"), _("The 'Manual' browser command has been " "chosen, but no command has been set.")); if (strstr(web_command, "%s")) command = gaim_strreplace(web_command, "%s", uri); * There is no "%s" in the browser command. Assume the user * wanted the URL tacked on to the end of the command. command = g_strdup_printf("%s %s", web_command, uri); if (remote_command != NULL) /* try the remote command first */ if (uri_command(remote_command, TRUE) != 0) uri_command(command, FALSE); uri_command(command, FALSE); static GaimNotifyUiOps ops = gaim_gtk_notify_formatted, gaim_gtk_notify_userinfo, gaim_gtk_notify_get_ui_ops(void)