diff options
-rw-r--r-- | calendar/ChangeLog | 17 | ||||
-rw-r--r-- | calendar/gui/e-cal-view.c | 13 | ||||
-rw-r--r-- | calendar/gui/e-calendar-table.c | 245 | ||||
-rw-r--r-- | calendar/gui/e-calendar-table.h | 4 | ||||
-rw-r--r-- | calendar/gui/e-calendar-view.c | 13 |
5 files changed, 101 insertions, 191 deletions
diff --git a/calendar/ChangeLog b/calendar/ChangeLog index e5c330a325..6c6a63d9bc 100644 --- a/calendar/ChangeLog +++ b/calendar/ChangeLog @@ -1,5 +1,22 @@ 2003-12-16 Rodrigo Moya <rodrigo@ximian.com> + Fixes part of #41237 + + * gui/e-calendar-table.c: use GtkClipboard instead of GtkInvisible + for cut/copy/paste. + (selection_clear_event, selection_received, selection_get): removed + unneeded functions. + (e_calendar_table_init): don't create the invisible widget. + (e_calendar_table_copy_clipboard): use gtk_clipboard_set_text(). + (e_calendar_table_paste_clipboard): use gtk_clipboard_request_text(). + (clipboard_get_text_cb): callback for gtk_clipboard_request_text(). + + * gui/e-cal-view.c (e_calendar_view_init, e_calendar_view_destroy, + e_calendar_view_copy_clipboard): no need anymore to keep the last + clipboard selection, GtkClipboard does it for us. + +2003-12-16 Rodrigo Moya <rodrigo@ximian.com> + * gui/alarm-notify/notify-main.c (alarm_notify_factory_fn): return a reference to the alarm_notify_service, not NULL and ref the object before returning it. diff --git a/calendar/gui/e-cal-view.c b/calendar/gui/e-cal-view.c index f93cee6c10..ffaca9bedb 100644 --- a/calendar/gui/e-cal-view.c +++ b/calendar/gui/e-cal-view.c @@ -63,9 +63,6 @@ struct _ECalendarViewPrivate { /* Current activity (for the EActivityHandler, i.e. the status bar). */ guint activity_id; - /* clipboard selections */ - gchar *clipboard_selection; - /* The popup menu */ EPopupMenu *view_menu; @@ -341,8 +338,6 @@ e_calendar_view_init (ECalendarView *cal_view, ECalendarViewClass *klass) G_CALLBACK (model_rows_changed_cb), cal_view); g_signal_connect (G_OBJECT (cal_view->priv->model), "model_rows_deleted", G_CALLBACK (model_rows_changed_cb), cal_view); - - cal_view->priv->clipboard_selection = NULL; } static void @@ -361,11 +356,6 @@ e_calendar_view_destroy (GtkObject *object) cal_view->priv->model = NULL; } - if (cal_view->priv->clipboard_selection) { - g_free (cal_view->priv->clipboard_selection); - cal_view->priv->clipboard_selection = NULL; - } - if (cal_view->priv->default_category) { g_free (cal_view->priv->default_category); cal_view->priv->default_category = NULL; @@ -674,9 +664,6 @@ e_calendar_view_copy_clipboard (ECalendarView *cal_view) /* copy the VCALENDAR to the clipboard */ comp_str = icalcomponent_as_ical_string (vcal_comp); - if (cal_view->priv->clipboard_selection != NULL) - g_free (cal_view->priv->clipboard_selection); - cal_view->priv->clipboard_selection = g_strdup (comp_str); gtk_clipboard_set_text (gtk_widget_get_clipboard (GTK_WIDGET (cal_view), clipboard_atom), (const gchar *) comp_str, g_utf8_strlen (comp_str, -1)); diff --git a/calendar/gui/e-calendar-table.c b/calendar/gui/e-calendar-table.c index d9ea59905b..d04315799d 100644 --- a/calendar/gui/e-calendar-table.c +++ b/calendar/gui/e-calendar-table.c @@ -31,7 +31,6 @@ #include <sys/stat.h> #include <unistd.h> #include <gnome.h> -#include <gtk/gtkinvisible.h> #include <gal/widgets/e-gui-utils.h> #include <gal/e-table/e-cell-checkbox.h> #include <gal/e-table/e-cell-toggle.h> @@ -106,18 +105,6 @@ static gint e_calendar_table_on_key_press (ETable *table, GdkEventKey *event, ECalendarTable *cal_table); -static void selection_clear_event (GtkWidget *invisible, - GdkEventSelection *event, - ECalendarTable *cal_table); -static void selection_received (GtkWidget *invisible, - GtkSelectionData *selection_data, - guint time, - ECalendarTable *cal_table); -static void selection_get (GtkWidget *invisible, - GtkSelectionData *selection_data, - guint info, - guint time_stamp, - ECalendarTable *cal_table); static struct tm e_calendar_table_get_current_time (ECellDateEdit *ecde, gpointer data); static void mark_row_complete_cb (int model_row, gpointer data); @@ -531,21 +518,6 @@ e_calendar_table_init (ECalendarTable *cal_table) g_signal_connect (e_table, "right_click", G_CALLBACK (e_calendar_table_on_right_click), cal_table); g_signal_connect (e_table, "key_press", G_CALLBACK (e_calendar_table_on_key_press), cal_table); g_signal_connect (e_table, "popup_menu", G_CALLBACK (e_calendar_table_on_popup_menu), cal_table); - - /* Set up the invisible widget for the clipboard selections */ - cal_table->invisible = gtk_invisible_new (); - gtk_selection_add_target (cal_table->invisible, - clipboard_atom, - GDK_SELECTION_TYPE_STRING, - 0); - g_signal_connect (cal_table->invisible, "selection_get", - G_CALLBACK (selection_get), cal_table); - g_signal_connect (cal_table->invisible, "selection_clear_event", - G_CALLBACK (selection_clear_event), cal_table); - g_signal_connect (cal_table->invisible, "selection_received", - G_CALLBACK (selection_received), cal_table); - - cal_table->clipboard_selection = NULL; } @@ -595,15 +567,6 @@ e_calendar_table_destroy (GtkObject *object) g_object_unref (cal_table->model); cal_table->model = NULL; } - - if (cal_table->invisible) { - gtk_widget_destroy (cal_table->invisible); - cal_table->invisible = NULL; - } - if (cal_table->clipboard_selection) { - g_free (cal_table->clipboard_selection); - cal_table->clipboard_selection = NULL; - } GTK_OBJECT_CLASS (parent_class)->destroy (object); } @@ -838,23 +801,96 @@ e_calendar_table_copy_clipboard (ECalendarTable *cal_table) g_return_if_fail (E_IS_CALENDAR_TABLE (cal_table)); - if (cal_table->clipboard_selection) { - g_free (cal_table->clipboard_selection); - cal_table->clipboard_selection = NULL; - } - /* create temporary VCALENDAR object */ cal_table->tmp_vcal = e_cal_util_new_top_level (); etable = e_table_scrolled_get_table (E_TABLE_SCROLLED (cal_table->etable)); e_table_selected_row_foreach (etable, copy_row_cb, cal_table); - comp_str = icalcomponent_as_ical_string (cal_table->tmp_vcal); - cal_table->clipboard_selection = g_strdup (comp_str); + gtk_clipboard_set_text (gtk_widget_get_clipboard (GTK_WIDGET (cal_table), clipboard_atom), + (const char *) comp_str, + g_utf8_strlen (comp_str, -1)); + + /* free memory */ icalcomponent_free (cal_table->tmp_vcal); cal_table->tmp_vcal = NULL; +} + +static void +clipboard_get_text_cb (GtkClipboard *clipboard, const gchar *text, ECalendarTable *cal_table) +{ + char *comp_str; + icalcomponent *icalcomp; + char *uid; + ECalComponent *comp; + ECal *client; + icalcomponent_kind kind; + + g_return_if_fail (E_IS_CALENDAR_TABLE (cal_table)); + + comp_str = (char *) text; + icalcomp = icalparser_parse_string ((const char *) comp_str); + if (!icalcomp) + return; + + /* check the type of the component */ + kind = icalcomponent_isa (icalcomp); + if (kind != ICAL_VCALENDAR_COMPONENT && + kind != ICAL_VEVENT_COMPONENT && + kind != ICAL_VTODO_COMPONENT && + kind != ICAL_VJOURNAL_COMPONENT) { + return; + } + + client = e_cal_model_get_default_client (cal_table->model); + + e_calendar_table_set_status_message (cal_table, _("Updating objects")); + + if (kind == ICAL_VCALENDAR_COMPONENT) { + icalcomponent_kind child_kind; + icalcomponent *subcomp; + icalcomponent *vcal_comp; + + vcal_comp = icalcomp; + subcomp = icalcomponent_get_first_component ( + vcal_comp, ICAL_ANY_COMPONENT); + while (subcomp) { + child_kind = icalcomponent_isa (subcomp); + if (child_kind == ICAL_VEVENT_COMPONENT || + child_kind == ICAL_VTODO_COMPONENT || + child_kind == ICAL_VJOURNAL_COMPONENT) { + ECalComponent *tmp_comp; + + uid = e_cal_component_gen_uid (); + tmp_comp = e_cal_component_new (); + e_cal_component_set_icalcomponent ( + tmp_comp, icalcomponent_new_clone (subcomp)); + e_cal_component_set_uid (tmp_comp, uid); + free (uid); + + /* FIXME should we convert start/due/complete times? */ + /* FIXME Error handling */ + e_cal_create_object (client, e_cal_component_get_icalcomponent (tmp_comp), NULL, NULL); + + g_object_unref (tmp_comp); + } + subcomp = icalcomponent_get_next_component ( + vcal_comp, ICAL_ANY_COMPONENT); + } + } + else { + comp = e_cal_component_new (); + e_cal_component_set_icalcomponent (comp, icalcomp); + uid = e_cal_component_gen_uid (); + e_cal_component_set_uid (comp, (const char *) uid); + free (uid); - gtk_selection_owner_set (cal_table->invisible, clipboard_atom, GDK_CURRENT_TIME); + e_cal_create_object (client, e_cal_component_get_icalcomponent (comp), NULL, NULL); + + g_object_unref (comp); + } + + e_calendar_table_set_status_message (cal_table, NULL); } /** @@ -868,10 +904,8 @@ e_calendar_table_paste_clipboard (ECalendarTable *cal_table) { g_return_if_fail (E_IS_CALENDAR_TABLE (cal_table)); - gtk_selection_convert (cal_table->invisible, - clipboard_atom, - GDK_SELECTION_TYPE_STRING, - GDK_CURRENT_TIME); + gtk_clipboard_request_text (gtk_widget_get_clipboard (GTK_WIDGET (cal_table), clipboard_atom), + (GtkClipboardTextReceivedFunc) clipboard_get_text_cb, cal_table); } /* Opens a task in the task editor */ @@ -1281,119 +1315,6 @@ e_calendar_table_save_state (ECalendarTable *cal_table, filename); } -static void -selection_get (GtkWidget *invisible, - GtkSelectionData *selection_data, - guint info, - guint time_stamp, - ECalendarTable *cal_table) -{ - if (cal_table->clipboard_selection != NULL) { - gtk_selection_data_set (selection_data, - GDK_SELECTION_TYPE_STRING, - 8, - cal_table->clipboard_selection, - strlen (cal_table->clipboard_selection)); - } -} - -static void -selection_clear_event (GtkWidget *invisible, - GdkEventSelection *event, - ECalendarTable *cal_table) -{ - if (cal_table->clipboard_selection != NULL) { - g_free (cal_table->clipboard_selection); - cal_table->clipboard_selection = NULL; - } -} - -static void -selection_received (GtkWidget *invisible, - GtkSelectionData *selection_data, - guint time, - ECalendarTable *cal_table) -{ - char *comp_str; - icalcomponent *icalcomp; - char *uid; - ECalComponent *comp; - ECal *client; - icalcomponent_kind kind; - - g_return_if_fail (E_IS_CALENDAR_TABLE (cal_table)); - - if (selection_data->length < 0 || - selection_data->type != GDK_SELECTION_TYPE_STRING) { - return; - } - - comp_str = (char *) selection_data->data; - icalcomp = icalparser_parse_string ((const char *) comp_str); - if (!icalcomp) - return; - - /* check the type of the component */ - kind = icalcomponent_isa (icalcomp); - if (kind != ICAL_VCALENDAR_COMPONENT && - kind != ICAL_VEVENT_COMPONENT && - kind != ICAL_VTODO_COMPONENT && - kind != ICAL_VJOURNAL_COMPONENT) { - return; - } - - client = e_cal_model_get_default_client (cal_table->model); - - e_calendar_table_set_status_message (cal_table, _("Updating objects")); - - if (kind == ICAL_VCALENDAR_COMPONENT) { - icalcomponent_kind child_kind; - icalcomponent *subcomp; - icalcomponent *vcal_comp; - - vcal_comp = icalcomp; - subcomp = icalcomponent_get_first_component ( - vcal_comp, ICAL_ANY_COMPONENT); - while (subcomp) { - child_kind = icalcomponent_isa (subcomp); - if (child_kind == ICAL_VEVENT_COMPONENT || - child_kind == ICAL_VTODO_COMPONENT || - child_kind == ICAL_VJOURNAL_COMPONENT) { - ECalComponent *tmp_comp; - - uid = e_cal_component_gen_uid (); - tmp_comp = e_cal_component_new (); - e_cal_component_set_icalcomponent ( - tmp_comp, icalcomponent_new_clone (subcomp)); - e_cal_component_set_uid (tmp_comp, uid); - free (uid); - - /* FIXME should we convert start/due/complete times? */ - /* FIXME Error handling */ - e_cal_create_object (client, e_cal_component_get_icalcomponent (tmp_comp), NULL, NULL); - - g_object_unref (tmp_comp); - } - subcomp = icalcomponent_get_next_component ( - vcal_comp, ICAL_ANY_COMPONENT); - } - } - else { - comp = e_cal_component_new (); - e_cal_component_set_icalcomponent (comp, icalcomp); - uid = e_cal_component_gen_uid (); - e_cal_component_set_uid (comp, (const char *) uid); - free (uid); - - e_cal_create_object (client, e_cal_component_get_icalcomponent (comp), NULL, NULL); - - g_object_unref (comp); - } - - e_calendar_table_set_status_message (cal_table, NULL); -} - - /* Returns the current time, for the ECellDateEdit items. FIXME: Should probably use the timezone of the item rather than the current timezone, though that may be difficult to get from here. */ diff --git a/calendar/gui/e-calendar-table.h b/calendar/gui/e-calendar-table.h index 810c78254b..2cff1bead3 100644 --- a/calendar/gui/e-calendar-table.h +++ b/calendar/gui/e-calendar-table.h @@ -57,9 +57,7 @@ struct _ECalendarTable { /* The ECell used to view & edit dates. */ ECellDateEdit *dates_cell; - /* The invisible widget used for cut/copy/paste */ - GtkWidget *invisible; - gchar *clipboard_selection; + /* Fields used for cut/copy/paste */ icalcomponent *tmp_vcal; /* Activity ID for the EActivityHandler (i.e. the status bar). */ diff --git a/calendar/gui/e-calendar-view.c b/calendar/gui/e-calendar-view.c index f93cee6c10..ffaca9bedb 100644 --- a/calendar/gui/e-calendar-view.c +++ b/calendar/gui/e-calendar-view.c @@ -63,9 +63,6 @@ struct _ECalendarViewPrivate { /* Current activity (for the EActivityHandler, i.e. the status bar). */ guint activity_id; - /* clipboard selections */ - gchar *clipboard_selection; - /* The popup menu */ EPopupMenu *view_menu; @@ -341,8 +338,6 @@ e_calendar_view_init (ECalendarView *cal_view, ECalendarViewClass *klass) G_CALLBACK (model_rows_changed_cb), cal_view); g_signal_connect (G_OBJECT (cal_view->priv->model), "model_rows_deleted", G_CALLBACK (model_rows_changed_cb), cal_view); - - cal_view->priv->clipboard_selection = NULL; } static void @@ -361,11 +356,6 @@ e_calendar_view_destroy (GtkObject *object) cal_view->priv->model = NULL; } - if (cal_view->priv->clipboard_selection) { - g_free (cal_view->priv->clipboard_selection); - cal_view->priv->clipboard_selection = NULL; - } - if (cal_view->priv->default_category) { g_free (cal_view->priv->default_category); cal_view->priv->default_category = NULL; @@ -674,9 +664,6 @@ e_calendar_view_copy_clipboard (ECalendarView *cal_view) /* copy the VCALENDAR to the clipboard */ comp_str = icalcomponent_as_ical_string (vcal_comp); - if (cal_view->priv->clipboard_selection != NULL) - g_free (cal_view->priv->clipboard_selection); - cal_view->priv->clipboard_selection = g_strdup (comp_str); gtk_clipboard_set_text (gtk_widget_get_clipboard (GTK_WIDGET (cal_view), clipboard_atom), (const gchar *) comp_str, g_utf8_strlen (comp_str, -1)); |