X-Git-Url: http://git.maemo.org/git/?p=modest;a=blobdiff_plain;f=src%2Fmaemo%2Fmodest-platform.c;h=cf31c38b896554a1a3a70a73d90dc0fc85dd95fe;hp=3cc28de1bbadf51eabac58f6b1570e038668675c;hb=fcbc6a6dfa1a10921d2ca889256a21b192adbe98;hpb=5fe84384c617285abe0e5f2f08e4be08ae4d339b diff --git a/src/maemo/modest-platform.c b/src/maemo/modest-platform.c index 3cc28de..cf31c38 100644 --- a/src/maemo/modest-platform.c +++ b/src/maemo/modest-platform.c @@ -59,11 +59,12 @@ static osso_context_t *osso_context = NULL; -static void folder_name_insensitive_press (GtkWidget *widget, ModestWindow *window); - static void -on_modest_conf_update_interval_changed (ModestConf* self, const gchar *key, - ModestConfEvent event, gpointer user_data) +on_modest_conf_update_interval_changed (ModestConf* self, + const gchar *key, + ModestConfEvent event, + ModestConfNotificationId id, + gpointer user_data) { if (strcmp (key, MODEST_CONF_UPDATE_INTERVAL) == 0) { const guint update_interval_minutes = @@ -142,7 +143,13 @@ modest_platform_init (int argc, char *argv[]) /* Make sure that the update interval is changed whenever its gconf key - * is changed: */ + * is changed */ + /* CAUTION: we're not using here the + modest_conf_listen_to_namespace because we know that there + are other parts of Modest listening for this namespace, so + we'll receive the notifications anyway. We basically do not + use it because there is no easy way to do the + modest_conf_forget_namespace */ ModestConf *conf = modest_runtime_get_conf (); g_signal_connect (G_OBJECT(conf), "key_changed", @@ -151,7 +158,7 @@ modest_platform_init (int argc, char *argv[]) /* Get the initial update interval from gconf: */ on_modest_conf_update_interval_changed(conf, MODEST_CONF_UPDATE_INTERVAL, - MODEST_CONF_EVENT_KEY_CHANGED, NULL); + MODEST_CONF_EVENT_KEY_CHANGED, 0, NULL); /* initialize the addressbook */ if (!osso_abook_init (&argc, &argv, osso_context)) { @@ -203,14 +210,11 @@ guess_mime_type_from_name (const gchar* name) gchar* modest_platform_get_file_icon_name (const gchar* name, const gchar* mime_type, - gchar **effective_mime_type) + gchar **effective_mime_type) { GString *mime_str = NULL; gchar *icon_name = NULL; gchar **icons, **cursor; - - - g_return_val_if_fail (name || mime_type, NULL); if (!mime_type || !g_ascii_strcasecmp (mime_type, "application/octet-stream")) mime_str = g_string_new (guess_mime_type_from_name(name)); @@ -520,7 +524,14 @@ modest_platform_get_icon (const gchar *name) GtkIconTheme *current_theme = NULL; g_return_val_if_fail (name, NULL); + + /* strlen == 0 is not really an error; it just + * means the icon is not available + */ + if (!name || strlen(name) == 0) + return NULL; +#if 0 /* do we still need this? */ if (g_str_has_suffix (name, ".png")) { /*FIXME: hack*/ pixbuf = gdk_pixbuf_new_from_file (name, &err); if (!pixbuf) { @@ -531,7 +542,7 @@ modest_platform_get_icon (const gchar *name) } return pixbuf; } - +#endif /* */ current_theme = gtk_icon_theme_get_default (); pixbuf = gtk_icon_theme_load_icon (current_theme, name, 26, GTK_ICON_LOOKUP_NO_SVG, @@ -568,26 +579,25 @@ entry_insert_text (GtkEditable *editable, hildon_banner_show_information (gtk_widget_get_parent (GTK_WIDGET (data)), NULL, _CS("ckdg_ib_maximum_characters_reached")); } else { - if (chars_length == 0) { - /* A blank space is not valid as first character */ - if (strcmp (text, " ")) { - GtkWidget *ok_button; - GList *buttons; - - /* Show OK button */ - buttons = gtk_container_get_children (GTK_CONTAINER (GTK_DIALOG (data)->action_area)); - ok_button = GTK_WIDGET (buttons->next->data); - gtk_widget_set_sensitive (ok_button, TRUE); - g_list_free (buttons); - } + if (modest_text_utils_is_forbidden_char (*text, FOLDER_NAME_FORBIDDEN_CHARS)) { + /* Show an error */ + gchar *tmp, *msg; + + tmp = g_strndup (folder_name_forbidden_chars, + FOLDER_NAME_FORBIDDEN_CHARS_LENGTH); + msg = g_strdup_printf (_CS("ckdg_ib_illegal_characters_entered"), tmp); + hildon_banner_show_information (gtk_widget_get_parent (GTK_WIDGET (data)), + NULL, msg); + g_free (msg); + g_free (tmp); + } else { + /* Write the text in the entry if it's valid */ + g_signal_handlers_block_by_func (editable, + (gpointer) entry_insert_text, data); + gtk_editable_insert_text (editable, text, length, position); + g_signal_handlers_unblock_by_func (editable, + (gpointer) entry_insert_text, data); } - - /* Write the text in the entry */ - g_signal_handlers_block_by_func (editable, - (gpointer) entry_insert_text, data); - gtk_editable_insert_text (editable, text, length, position); - g_signal_handlers_unblock_by_func (editable, - (gpointer) entry_insert_text, data); } /* Do not allow further processing */ g_signal_stop_emission_by_name (editable, "insert_text"); @@ -598,24 +608,24 @@ entry_changed (GtkEditable *editable, gpointer user_data) { gchar *chars; + GtkWidget *ok_button; + GList *buttons; + buttons = gtk_container_get_children (GTK_CONTAINER (GTK_DIALOG (user_data)->action_area)); + ok_button = GTK_WIDGET (buttons->next->data); + chars = gtk_editable_get_chars (editable, 0, -1); g_return_if_fail (chars != NULL); - /* Dimm OK button. Do not allow also the "/" */ - if (strlen (chars) == 0 || strchr (chars, '/')) { - GtkWidget *ok_button; - GList *buttons; - - buttons = gtk_container_get_children (GTK_CONTAINER (GTK_DIALOG (user_data)->action_area)); - ok_button = GTK_WIDGET (buttons->next->data); - gtk_widget_set_sensitive (ok_button, FALSE); - - g_list_free (buttons); - } else if (g_utf8_strlen (chars,-1) >= 21) + + if (g_utf8_strlen (chars,-1) >= 21) hildon_banner_show_information (gtk_widget_get_parent (GTK_WIDGET (user_data)), NULL, - _CS("ckdg_ib_maximum_characters_reached")); + _CS("ckdg_ib_maximum_characters_reached")); + else + gtk_widget_set_sensitive (ok_button, modest_text_utils_validate_folder_name(chars)); + /* Free */ + g_list_free (buttons); g_free (chars); } @@ -743,8 +753,8 @@ launch_sort_headers_dialog (GtkWindow *parent_window, modest_widget_memory_save (modest_runtime_get_conf (), G_OBJECT (header_view), MODEST_CONF_HEADER_VIEW_KEY); - while (gtk_events_pending ()) - gtk_main_iteration (); +/* while (gtk_events_pending ()) */ +/* gtk_main_iteration (); */ /* free */ g_list_free(cols); @@ -775,8 +785,6 @@ modest_platform_run_folder_name_dialog (GtkWindow *parent_window, /* Add accept button (with unsensitive handler) */ buttons = gtk_container_get_children (GTK_CONTAINER (GTK_DIALOG (dialog)->action_area)); accept_btn = GTK_WIDGET (buttons->next->data); - g_signal_connect (G_OBJECT (accept_btn), "insensitive-press", G_CALLBACK (folder_name_insensitive_press), parent_window); - /* Create label and entry */ label = gtk_label_new (label_text); /* TODO: check that the suggested name does not exist */ @@ -823,12 +831,6 @@ modest_platform_run_folder_name_dialog (GtkWindow *parent_window, return result; } -static void -folder_name_insensitive_press (GtkWidget *widget, ModestWindow *window) -{ - hildon_banner_show_information (NULL, NULL, _("(empty)")); -} - gint modest_platform_run_new_folder_dialog (GtkWindow *parent_window, TnyFolderStore *parent_folder, @@ -978,9 +980,13 @@ on_idle_connect_and_wait(gpointer user_data) printf ("DEBUG: %s:\n", __FUNCTION__); TnyDevice *device = modest_runtime_get_device(); if (!tny_device_is_online (device)) { - gdk_threads_enter(); + + /* This is a GDK lock because we are an idle callback and + * tny_maemo_conic_device_connect can contain Gtk+ code */ + + gdk_threads_enter(); /* CHECKED */ tny_maemo_conic_device_connect (TNY_MAEMO_CONIC_DEVICE (device), NULL); - gdk_threads_leave(); + gdk_threads_leave(); /* CHECKED */ } /* Allow the function that requested this idle callback to continue: */ @@ -1190,32 +1196,29 @@ gboolean modest_platform_set_update_interval (guint minutes) /* Register alarm: */ - /* Get current time: */ - time_t time_now; - time (&time_now); - struct tm *st_time = localtime (&time_now); - - /* Add minutes to tm_min field: */ - st_time->tm_min += minutes; - - /* Set the time in alarm_event_t structure: */ + /* Set the interval in alarm_event_t structure: */ alarm_event_t *event = g_new0(alarm_event_t, 1); - event->alarm_time = mktime (st_time); + event->alarm_time = minutes * 60; /* seconds */ + + /* Set recurrence every few minutes: */ + event->recurrence = minutes; + event->recurrence_count = -1; /* Means infinite */ /* Specify what should happen when the alarm happens: * It should call this D-Bus method: */ - /* Note: I am surpised that alarmd can't just use the modest.service file - * for this. murrayc. */ - event->dbus_path = g_strdup(PREFIX "/bin/modest"); - + event->dbus_path = g_strdup(MODEST_DBUS_OBJECT); event->dbus_interface = g_strdup (MODEST_DBUS_IFACE); event->dbus_service = g_strdup (MODEST_DBUS_SERVICE); event->dbus_name = g_strdup (MODEST_DBUS_METHOD_SEND_RECEIVE); - /* Otherwise, a dialog will be shown if exect_name or dbus_path is NULL, - even though we have specified no dialog text: */ - event->flags = ALARM_EVENT_NO_DIALOG; + /* Use ALARM_EVENT_NO_DIALOG: Otherwise, a dialog will be shown if + * exec_name or dbus_path is NULL, even though we have specified no dialog text. + * Also use ALARM_EVENT_ACTIVATION so that modest is started (without UI) to get emails + * This is why we want to use the Alarm API instead of just g_timeout_add(). + * (The old maemo email-client did this, though it isn't specified in the UI spec.) + */ + event->flags = ALARM_EVENT_NO_DIALOG | ALARM_EVENT_ACTIVATION; alarm_cookie = alarm_event_add (event); @@ -1229,20 +1232,22 @@ gboolean modest_platform_set_update_interval (guint minutes) if (!alarm_cookie) { /* Error */ const alarm_error_t alarm_error = alarmd_get_error (); - printf ("Error setting alarm event. Error code: '%d'\n", alarm_error); + g_debug ("Error setting alarm event. Error code: '%d'\n", alarm_error); /* Give people some clue: */ /* The alarm API should have a function for this: */ if (alarm_error == ALARMD_ERROR_DBUS) { - printf (" ALARMD_ERROR_DBUS: An error with D-Bus occurred, probably coudn't get a D-Bus connection.\n"); + g_debug (" ALARMD_ERROR_DBUS: An error with D-Bus occurred, probably coudn't get a D-Bus connection.\n"); } else if (alarm_error == ALARMD_ERROR_CONNECTION) { - printf (" ALARMD_ERROR_CONNECTION: Could not contact alarmd via D-Bus.\n"); + g_debug (" ALARMD_ERROR_CONNECTION: Could not contact alarmd via D-Bus.\n"); } else if (alarm_error == ALARMD_ERROR_INTERNAL) { - printf (" ALARMD_ERROR_INTERNAL: Some alarmd or libalarm internal error, possibly a version mismatch.\n"); + g_debug (" ALARMD_ERROR_INTERNAL: Some alarmd or libalarm internal error, possibly a version mismatch.\n"); } else if (alarm_error == ALARMD_ERROR_MEMORY) { - printf (" ALARMD_ERROR_MEMORY: A memory allocation failed.\n"); + g_debug (" ALARMD_ERROR_MEMORY: A memory allocation failed.\n"); } else if (alarm_error == ALARMD_ERROR_ARGUMENT) { - printf (" ALARMD_ERROR_ARGUMENT: An argument given by caller was invalid.\n"); + g_debug (" ALARMD_ERROR_ARGUMENT: An argument given by caller was invalid.\n"); + } else if (alarm_error == ALARMD_ERROR_NOT_RUNNING) { + g_debug (" ALARMD_ERROR_NOT_RUNNING: alarmd is not running.\n"); } return FALSE; @@ -1341,10 +1346,11 @@ modest_platform_create_folder_view (TnyFolderStoreQuery *query) { GtkWidget *widget = modest_folder_view_new (query); - /* Show all accounts by default */ + /* Show one account by default */ modest_folder_view_set_style (MODEST_FOLDER_VIEW (widget), MODEST_FOLDER_VIEW_STYLE_SHOW_ONE); + /* Restore settings */ modest_widget_memory_restore (modest_runtime_get_conf(), G_OBJECT (widget),