[Fwd: [evolution-patches] A patch for calendar based on trunk]



Hi, Rodrigo

Would you please spend some time to have a look at this patch? Thanks.

Regards
--- Begin Message --- Hi,

We have found some keyboard navigation problem with the calendar. Before #45776
was fixed, Alt + Left Arrow / Right Arrow move the focus to the same day
in the previous/next week. But now it doesn't work even when no event is
selected. That's because *ALL* Alt + Arrow signals are intercepted by the
code to move a selected event around the way we fixed #45776.

Enclosed is a patch to avoid the conflicting accessibility key problem. When
no event is selected, the Alt + Left/Right signals just get to the proper handler.
Would you like to spend a little time to review it?
Index: calendar/ChangeLog
===================================================================
RCS file: /cvs/gnome/evolution/calendar/ChangeLog,v
retrieving revision 1.2202
diff -u -r1.2202 ChangeLog
--- calendar/ChangeLog	22 Mar 2004 13:27:52 -0000	1.2202
+++ calendar/ChangeLog	23 Mar 2004 08:47:00 -0000
@@ -1,3 +1,18 @@
+2004-03-23  Kidd Wang  <kidd wang sun com>
+
+	* gui/e-calendar-view.c: (e_calendar_view_class_init): remove the
+	EVENT_MOVE signal which was binded to Alt + Arrows.
+	* gui/e-calendar-view.h: ditto.
+	* gui/e-day-view.c: (e_day_view_class_init),
+	(e_day_view_do_key_press), (e_day_view_event_move): handle Alt + Arrows
+	in the more general place e_day_view_do_key_press so that we can avoid
+	the conflicting accessible key. When an appointment is selected,
+	pressing Alt + Arrows causes it to be moved around. Otherwise, pressing
+	Alt + LEFT/RIGHT will move the focus to the same day in the
+	previous/next week.
+	* gui/e-week-view.c: (e_week_view_class_init),
+	(e_week_view_event_move), (e_week_view_do_key_press): ditto.
+
 2004-03-22  Rodrigo Moya <rodrigo ximian com>
 
 	* gui/e-calendar-view.c (e_calendar_view_add_event): get the UID
Index: calendar/gui/e-calendar-view.c
===================================================================
RCS file: /cvs/gnome/evolution/calendar/gui/e-calendar-view.c,v
retrieving revision 1.39
diff -u -r1.39 e-calendar-view.c
--- calendar/gui/e-calendar-view.c	22 Mar 2004 13:27:57 -0000	1.39
+++ calendar/gui/e-calendar-view.c	23 Mar 2004 08:47:00 -0000
@@ -100,7 +100,6 @@
 	EVENT_CHANGED,
 	EVENT_ADDED,
 	OPEN_EVENT,
-	EVENT_MOVE,
 	LAST_SIGNAL
 };
 
@@ -170,7 +169,6 @@
 	klass->get_visible_time_range = NULL;
 	klass->update_query = NULL;
 	klass->open_event = e_calendar_view_open_event;
-	klass->event_move = NULL;
 
 	g_object_class_install_property (gobject_class, PROP_MODEL, 
 					 g_param_spec_object ("model", NULL, NULL, E_TYPE_CAL_MODEL,
@@ -231,16 +229,6 @@
 			      G_TYPE_NONE, 1,
 			      G_TYPE_POINTER);
 
-	e_calendar_view_signals [EVENT_MOVE] =
-		g_signal_new ("event_move",
-			      G_TYPE_FROM_CLASS (klass),
-			      G_SIGNAL_RUN_FIRST | G_SIGNAL_ACTION,
-			      G_STRUCT_OFFSET (ECalendarViewClass, event_move),
-			      NULL, NULL,
-			      g_cclosure_marshal_VOID__INT,
-			      G_TYPE_NONE, 1,
-			      G_TYPE_INT);
-
 	/* clipboard atom */
 	if (!clipboard_atom)
 		clipboard_atom = gdk_atom_intern ("CLIPBOARD", FALSE);
@@ -255,49 +243,7 @@
 	gtk_binding_entry_add_signal (binding_set, GDK_o,
                                       GDK_CONTROL_MASK,
                                       "open_event", 0);
-
-        /* Alt+Arrow, move the editing event*/
-        gtk_binding_entry_add_signal (binding_set, GDK_Up,
-                        GDK_MOD1_MASK,
-                        "event_move", 1,
-                        G_TYPE_ENUM,
-                        E_CAL_VIEW_MOVE_UP);
-        gtk_binding_entry_add_signal (binding_set, GDK_KP_Up,
-                        GDK_MOD1_MASK,
-                        "event_move", 1,
-                        G_TYPE_ENUM,
-                        E_CAL_VIEW_MOVE_UP);
-        gtk_binding_entry_add_signal (binding_set, GDK_Down,
-                        GDK_MOD1_MASK,
-                        "event_move", 1,
-                        G_TYPE_ENUM,
-                        E_CAL_VIEW_MOVE_DOWN);
-        gtk_binding_entry_add_signal (binding_set, GDK_KP_Down,
-                        GDK_MOD1_MASK,
-                        "event_move", 1,
-                        G_TYPE_ENUM,
-                        E_CAL_VIEW_MOVE_DOWN);
-	gtk_binding_entry_add_signal (binding_set, GDK_Left,
-                        GDK_MOD1_MASK,
-                        "event_move", 1,
-                        G_TYPE_ENUM,
-                        E_CAL_VIEW_MOVE_LEFT);
-        gtk_binding_entry_add_signal (binding_set, GDK_KP_Left,
-                        GDK_MOD1_MASK,
-                        "event_move", 1,
-                        G_TYPE_ENUM,
-                        E_CAL_VIEW_MOVE_LEFT);
-        gtk_binding_entry_add_signal (binding_set, GDK_Right,
-                        GDK_MOD1_MASK,
-                        "event_move", 1,
-                        G_TYPE_ENUM,
-                        E_CAL_VIEW_MOVE_RIGHT);
-        gtk_binding_entry_add_signal (binding_set, GDK_KP_Right,
-                        GDK_MOD1_MASK,
-                        "event_move", 1,
-                        G_TYPE_ENUM,
-                        E_CAL_VIEW_MOVE_RIGHT);
-
+       
 	/* init the accessibility support for e_day_view */
  	e_cal_view_a11y_init ();
 }
Index: calendar/gui/e-calendar-view.h
===================================================================
RCS file: /cvs/gnome/evolution/calendar/gui/e-calendar-view.h,v
retrieving revision 1.23
diff -u -r1.23 e-calendar-view.h
--- calendar/gui/e-calendar-view.h	15 Mar 2004 16:29:50 -0000	1.23
+++ calendar/gui/e-calendar-view.h	23 Mar 2004 08:47:00 -0000
@@ -95,7 +95,6 @@
 	gboolean (* get_visible_time_range) (ECalendarView *cal_view, time_t *start_time, time_t *end_time);
 	void (* update_query) (ECalendarView *cal_view);
 	void (* open_event) (ECalendarView *cal_view);
-	void (* event_move) (ECalendarView *cal_view, ECalViewMoveDirection direction);
 };
 
 GType          e_calendar_view_get_type (void);
Index: calendar/gui/e-day-view.c
===================================================================
RCS file: /cvs/gnome/evolution/calendar/gui/e-day-view.c,v
retrieving revision 1.239
diff -u -r1.239 e-day-view.c
--- calendar/gui/e-day-view.c	19 Mar 2004 15:05:07 -0000	1.239
+++ calendar/gui/e-day-view.c	23 Mar 2004 08:47:03 -0000
@@ -344,7 +344,7 @@
 static gboolean e_day_view_on_text_item_event (GnomeCanvasItem *item,
 					       GdkEvent *event,
 					       EDayView *day_view);
-static void e_day_view_event_move (ECalendarView *cal_view, ECalViewMoveDirection direction);
+static gboolean e_day_view_event_move (ECalendarView *cal_view, ECalViewMoveDirection direction);
 static void e_day_view_change_event_time (EDayView *day_view, time_t start_dt,
 time_t end_dt);
 static void e_day_view_change_event_end_time_up (EDayView *day_view);
@@ -480,7 +480,6 @@
 	view_class->get_selected_time_range = e_day_view_get_selected_time_range;
 	view_class->set_selected_time_range = e_day_view_set_selected_time_range;
 	view_class->get_visible_time_range = e_day_view_get_visible_time_range;
-	view_class->event_move		= e_day_view_event_move;
 
 	/* init the accessibility support for e_day_view */
  	e_day_view_a11y_init ();
@@ -4682,12 +4681,41 @@
 		}
 		return FALSE;
 	}
-
+	
+	/* Alt + Arrow Keys to move a selected event through time lines */
+	if ((keyval == GDK_Up || keyval == GDK_KP_Up)
+			&&((event->state & GDK_SHIFT_MASK) != GDK_SHIFT_MASK)
+			&&((event->state & GDK_CONTROL_MASK) != GDK_CONTROL_MASK)
+			&&((event->state & GDK_MOD1_MASK) == GDK_MOD1_MASK)) {
+		return e_day_view_event_move ((ECalendarView *) day_view, E_CAL_VIEW_MOVE_UP);
+	}
+	
+	if ((keyval == GDK_Down || keyval == GDK_KP_Down)
+			&&((event->state & GDK_SHIFT_MASK) != GDK_SHIFT_MASK)
+			&&((event->state & GDK_CONTROL_MASK) != GDK_CONTROL_MASK)
+			&&((event->state & GDK_MOD1_MASK) == GDK_MOD1_MASK)) {
+		return e_day_view_event_move ((ECalendarView *) day_view, E_CAL_VIEW_MOVE_DOWN);
+	}
+	
+	if ((keyval == GDK_Left || keyval == GDK_KP_Left)
+			&&((event->state & GDK_SHIFT_MASK) != GDK_SHIFT_MASK)
+			&&((event->state & GDK_CONTROL_MASK) != GDK_CONTROL_MASK)
+			&&((event->state & GDK_MOD1_MASK) == GDK_MOD1_MASK)) {
+		return e_day_view_event_move ((ECalendarView *) day_view, E_CAL_VIEW_MOVE_LEFT);
+	}
+	
+	if ((keyval == GDK_Right || keyval == GDK_KP_Right)
+			&&((event->state & GDK_SHIFT_MASK) != GDK_SHIFT_MASK)
+			&&((event->state & GDK_CONTROL_MASK) != GDK_CONTROL_MASK)
+			&&((event->state & GDK_MOD1_MASK) == GDK_MOD1_MASK)) {
+		return e_day_view_event_move ((ECalendarView *) day_view, E_CAL_VIEW_MOVE_RIGHT);
+	}
+	
 	/*Go to the start/end of a work day*/	
 	if ((keyval == GDK_Home)
-	    &&((event->state & GDK_SHIFT_MASK) != GDK_SHIFT_MASK)
-	    &&((event->state & GDK_CONTROL_MASK) != GDK_CONTROL_MASK)
-	    &&((event->state & GDK_MOD1_MASK) != GDK_MOD1_MASK)) {
+	    		&&((event->state & GDK_SHIFT_MASK) != GDK_SHIFT_MASK)
+	    		&&((event->state & GDK_CONTROL_MASK) != GDK_CONTROL_MASK)
+	    		&&((event->state & GDK_MOD1_MASK) != GDK_MOD1_MASK)) {
 		e_day_view_goto_start_of_work_day (day_view);
 		return TRUE;
 	}
@@ -5689,7 +5717,7 @@
 	return FALSE;
 }
 
-static void 
+static gboolean 
 e_day_view_event_move (ECalendarView *cal_view, ECalViewMoveDirection direction)
 {
 	EDayViewEvent *event;
@@ -5703,7 +5731,7 @@
 	event_num = day_view->editing_event_num;
 
 	if ((day == -1) || (day == E_DAY_VIEW_LONG_EVENT))
-		return;
+		return FALSE;
 
 	event = &g_array_index (day_view->events[day], EDayViewEvent,
 				event_num);
@@ -5719,7 +5747,7 @@
 	switch (direction) {
 	case E_CAL_VIEW_MOVE_UP:
 		if (resize_start_row <= 0)
-			return;
+			return FALSE;
 		resize_start_row--;
 		resize_end_row--;
 		start_dt = e_day_view_convert_grid_position_to_time (day_view, day, resize_start_row);
@@ -5727,7 +5755,7 @@
 		break;
 	case E_CAL_VIEW_MOVE_DOWN:
 		if (resize_end_row >= day_view->rows - 1)
-			return;
+			return FALSE;
 		resize_start_row++;
 		resize_end_row++;
 		start_dt = e_day_view_convert_grid_position_to_time (day_view, day, resize_start_row);
@@ -5735,7 +5763,7 @@
 		break;
 	case E_CAL_VIEW_MOVE_LEFT:
 		if (day <= 0) 
-			return;
+			return TRUE;
 		start_dt = e_day_view_convert_grid_position_to_time (day_view, day, resize_start_row);
 		end_dt = e_day_view_convert_grid_position_to_time (day_view, day, resize_end_row + 1);
 		start_time = icaltime_from_timet (start_dt, 0);
@@ -5747,7 +5775,7 @@
 		break;
 	case E_CAL_VIEW_MOVE_RIGHT:
 		if (day + 1 >= day_view->days_shown)
-			return;
+			return TRUE;
 		start_dt = e_day_view_convert_grid_position_to_time (day_view, day, resize_start_row);
 		end_dt = e_day_view_convert_grid_position_to_time (day_view, day, resize_end_row + 1);
 		start_time = icaltime_from_timet (start_dt, 0);
@@ -5758,11 +5786,13 @@
 		end_dt = icaltime_as_timet (end_time);
 		break;	
 	default:
-		return;
+		return FALSE;
 	}
 	
 	e_day_view_change_event_time (day_view, start_dt, end_dt);
 	e_day_view_ensure_rows_visible (day_view, resize_start_row, resize_end_row);
+
+	return TRUE;
 }
 
 static void
Index: calendar/gui/e-week-view.c
===================================================================
RCS file: /cvs/gnome/evolution/calendar/gui/e-week-view.c,v
retrieving revision 1.200
diff -u -r1.200 e-week-view.c
--- calendar/gui/e-week-view.c	19 Mar 2004 15:05:08 -0000	1.200
+++ calendar/gui/e-week-view.c	23 Mar 2004 08:47:04 -0000
@@ -179,7 +179,7 @@
 static gboolean e_week_view_on_text_item_event (GnomeCanvasItem *item,
 						GdkEvent *event,
 						EWeekView *week_view);
-static void e_week_view_event_move (ECalendarView *cal_view, ECalViewMoveDirection direction);
+static gboolean e_week_view_event_move (ECalendarView *cal_view, ECalViewMoveDirection direction);
 static gint e_week_view_get_day_offset_of_event (EWeekView *week_view, time_t event_time);
 static void e_week_view_scroll_a_step (EWeekView *week_view, ECalViewMoveDirection direction);
 static void e_week_view_change_event_time (EWeekView *week_view, time_t start_dt, time_t end_dt);
@@ -244,7 +244,6 @@
 	view_class->get_selected_time_range = e_week_view_get_selected_time_range;
 	view_class->set_selected_time_range = e_week_view_set_selected_time_range;
 	view_class->get_visible_time_range = e_week_view_get_visible_time_range;
-	view_class->event_move		= e_week_view_event_move;
 
 	/* init the accessibility support for e_week_view */
 	e_week_view_a11y_init ();
@@ -3171,7 +3170,7 @@
 	return FALSE;
 }
 
-static void e_week_view_event_move (ECalendarView *cal_view, ECalViewMoveDirection direction)
+static gboolean e_week_view_event_move (ECalendarView *cal_view, ECalViewMoveDirection direction)
 {
 	EWeekViewEvent *event;
 	gint event_num, span_num, adjust_days, current_start_day, current_end_day;
@@ -3185,7 +3184,7 @@
 
 	/* If no item is being edited, just return. */
 	if (event_num == -1)
-		return;
+		return FALSE;
 
 	event = &g_array_index (week_view->events, EWeekViewEvent, event_num);
 	start_dt = event->start;
@@ -3220,19 +3219,20 @@
 	current_end_day = e_week_view_get_day_offset_of_event (week_view,end_dt);
 
 	if (current_start_day < 0) {
-		return;
+		return TRUE;
 	}
 	if (week_view->multi_week_view) {
 		if (current_end_day > week_view->weeks_shown * 7) {
-			return;
+			return TRUE;
 		}
 	}else {
 		if (current_end_day >= 7) {
-			return;
+			return TRUE;
 		}
 	}
 	
 	e_week_view_change_event_time (week_view, start_dt, end_dt);
+	return TRUE;
 }
 
 static gint
@@ -3559,12 +3559,14 @@
 	time_t dtstart, dtend;
 	const char *uid;
 	AddEventData add_event_data;
+	guint keyval;
 
 	g_return_val_if_fail (widget != NULL, FALSE);
 	g_return_val_if_fail (E_IS_WEEK_VIEW (widget), FALSE);
 	g_return_val_if_fail (event != NULL, FALSE);
 
 	week_view = E_WEEK_VIEW (widget);
+	keyval = event->keyval;
 
 	/* The Escape key aborts a resize operation. */
 #if 0
@@ -3577,27 +3579,34 @@
 #endif
 
 	/*Navigation through days with arrow keys*/
-	if (!((event->state & GDK_SHIFT_MASK)
-		||(event->state & GDK_CONTROL_MASK)
-		||(event->state & GDK_MOD1_MASK))) {
-	switch (event->keyval) {
-	case GDK_Up:
-		e_week_view_move_selection_day (week_view,E_CAL_VIEW_MOVE_UP);
-		return TRUE;
-	case GDK_Down:
-		e_week_view_move_selection_day (week_view,E_CAL_VIEW_MOVE_DOWN);
-		return TRUE;	
-	case GDK_Left:
-		e_week_view_move_selection_day (week_view,E_CAL_VIEW_MOVE_LEFT);
-		return TRUE;
-	case GDK_Right:
-		e_week_view_move_selection_day (week_view,E_CAL_VIEW_MOVE_RIGHT);
-		return TRUE;
-	default:
-		break;
-	}
+	if ((keyval == GDK_Up || keyval == GDK_KP_Up)
+			&&((event->state & GDK_SHIFT_MASK) != GDK_SHIFT_MASK)
+			&&((event->state & GDK_CONTROL_MASK) != GDK_CONTROL_MASK)
+			&&((event->state & GDK_MOD1_MASK) == GDK_MOD1_MASK)) {
+		return e_week_view_event_move ((ECalendarView *) week_view, E_CAL_VIEW_MOVE_UP);
+	}
+	
+	if ((keyval == GDK_Down || keyval == GDK_KP_Down)
+			&&((event->state & GDK_SHIFT_MASK) != GDK_SHIFT_MASK)
+			&&((event->state & GDK_CONTROL_MASK) != GDK_CONTROL_MASK)
+			&&((event->state & GDK_MOD1_MASK) == GDK_MOD1_MASK)) {
+		return e_week_view_event_move ((ECalendarView *) week_view, E_CAL_VIEW_MOVE_DOWN);
+	}
+	
+	if ((keyval == GDK_Left || keyval == GDK_KP_Left)
+			&&((event->state & GDK_SHIFT_MASK) != GDK_SHIFT_MASK)
+			&&((event->state & GDK_CONTROL_MASK) != GDK_CONTROL_MASK)
+			&&((event->state & GDK_MOD1_MASK) == GDK_MOD1_MASK)) {
+		return e_week_view_event_move ((ECalendarView *) week_view, E_CAL_VIEW_MOVE_LEFT);
+	}
+	
+	if ((keyval == GDK_Right || keyval == GDK_KP_Right)
+			&&((event->state & GDK_SHIFT_MASK) != GDK_SHIFT_MASK)
+			&&((event->state & GDK_CONTROL_MASK) != GDK_CONTROL_MASK)
+			&&((event->state & GDK_MOD1_MASK) == GDK_MOD1_MASK)) {
+		return e_week_view_event_move ((ECalendarView *) week_view, E_CAL_VIEW_MOVE_RIGHT);
 	}
-
+	
 	if (week_view->selection_start_day == -1)
 		return FALSE;
 

--- End Message ---


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]