aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--widgets/misc/ChangeLog20
-rw-r--r--widgets/misc/e-calendar-item.c13
-rw-r--r--widgets/misc/e-calendar.c29
-rw-r--r--widgets/misc/e-dateedit.c3
4 files changed, 52 insertions, 13 deletions
diff --git a/widgets/misc/ChangeLog b/widgets/misc/ChangeLog
index 09dbb12325..e5d357b31e 100644
--- a/widgets/misc/ChangeLog
+++ b/widgets/misc/ChangeLog
@@ -1,3 +1,23 @@
+2003-12-04 Harry Lu <harry.lu@sun.com>
+
+ Fix for bugzilla bug #51624 and #51627.
+
+ * e-calendar-item.c: (e_calendar_item_selection_add_days):
+ set the date to the first day of the month so that user can use
+ keyboard's arrow key to select a date.
+ (e_calendar_item_set_selection_if_emission): only set selection_changed
+ if emission is TRUE.
+ * e-calendar.c: (e_calendar_init): add back the "clicked" handler so
+ that user can use keyboard to click the button.
+ (e_calendar_start_auto_move): no need to move since it is already
+ handled by the clicked handler
+ (e_calendar_on_prev_clicked), (e_calendar_on_next_clicked): move the
+ month here.
+ * e-dateedit.c: (e_date_edit_show_date_popup): use gdk_window_focus
+ instead of gdk_keyboard_grab so that the focus won't lost if user click
+ the button with keyboard.
+ (hide_date_popup): no need to call gdk_keyboard_ungrab.
+
2003-12-02 Ettore Perazzoli <ettore@ximian.com>
* e-source-selector.c (init): Set the mode on the text cell
diff --git a/widgets/misc/e-calendar-item.c b/widgets/misc/e-calendar-item.c
index 83bdbab49e..bde45441f6 100644
--- a/widgets/misc/e-calendar-item.c
+++ b/widgets/misc/e-calendar-item.c
@@ -1624,8 +1624,12 @@ e_calendar_item_selection_add_days (ECalendarItem *calitem, gint n_days,
g_return_if_fail (E_IS_CALENDAR_ITEM (calitem));
- if (!e_calendar_item_get_selection (calitem, &gdate_start, &gdate_end))
- return;
+ if (!e_calendar_item_get_selection (calitem, &gdate_start, &gdate_end)) {
+ /* We set the date to the first day of the month */
+ g_date_set_dmy (&gdate_start, 1, calitem->month + 1, calitem->year);
+ gdate_end = gdate_start;
+ }
+
if (multi_selection && calitem->max_days_selected > 1) {
gint days_between;
@@ -2898,9 +2902,10 @@ e_calendar_item_set_selection_if_emission (ECalendarItem *calitem,
|| calitem->selection_end_month_offset != new_end_month_offset
|| calitem->selection_end_day != new_end_day) {
need_update = TRUE;
- calitem->selection_changed = TRUE;
- if (emission)
+ if (emission) {
+ calitem->selection_changed = TRUE;
e_calendar_item_queue_signal_emission (calitem);
+ }
calitem->selection_set = TRUE;
calitem->selection_start_month_offset = new_start_month_offset;
calitem->selection_start_day = new_start_day;
diff --git a/widgets/misc/e-calendar.c b/widgets/misc/e-calendar.c
index 9a5f75769f..402e390df0 100644
--- a/widgets/misc/e-calendar.c
+++ b/widgets/misc/e-calendar.c
@@ -93,8 +93,10 @@ static gboolean e_calendar_focus (GtkWidget *widget,
static void e_calendar_on_prev_pressed (ECalendar *cal);
static void e_calendar_on_prev_released (ECalendar *cal);
+static void e_calendar_on_prev_clicked (ECalendar *cal);
static void e_calendar_on_next_pressed (ECalendar *cal);
static void e_calendar_on_next_released (ECalendar *cal);
+static void e_calendar_on_next_clicked (ECalendar *cal);
static void e_calendar_start_auto_move (ECalendar *cal,
gboolean moving_forward);
@@ -165,6 +167,9 @@ e_calendar_init (ECalendar *cal)
gtk_signal_connect_object (GTK_OBJECT (button), "released",
G_CALLBACK (e_calendar_on_prev_released),
GTK_OBJECT (cal));
+ gtk_signal_connect_object (GTK_OBJECT (button), "clicked",
+ G_CALLBACK (e_calendar_on_prev_clicked),
+ GTK_OBJECT (cal));
pixmap = gtk_arrow_new (GTK_ARROW_LEFT, GTK_SHADOW_NONE);
gtk_widget_show (pixmap);
@@ -184,6 +189,9 @@ e_calendar_init (ECalendar *cal)
gtk_signal_connect_object (GTK_OBJECT (button), "released",
G_CALLBACK (e_calendar_on_next_released),
GTK_OBJECT (cal));
+ gtk_signal_connect_object (GTK_OBJECT (button), "clicked",
+ G_CALLBACK (e_calendar_on_next_clicked),
+ GTK_OBJECT (cal));
pixmap = gtk_arrow_new (GTK_ARROW_RIGHT, GTK_SHADOW_NONE);
gtk_widget_show (pixmap);
@@ -442,9 +450,6 @@ static void
e_calendar_start_auto_move (ECalendar *cal,
gboolean moving_forward)
{
- ECalendarItem *calitem;
- gint offset;
-
if (cal->timeout_id == 0) {
cal->timeout_id = g_timeout_add (E_CALENDAR_AUTO_MOVE_TIMEOUT,
e_calendar_auto_move_handler,
@@ -453,10 +458,6 @@ e_calendar_start_auto_move (ECalendar *cal,
cal->timeout_delay = E_CALENDAR_AUTO_MOVE_TIMEOUT_DELAY;
cal->moving_forward = moving_forward;
- calitem = cal->calitem;
- offset = cal->moving_forward ? 1 : -1;
- e_calendar_item_set_first_month (calitem, calitem->year,
- calitem->month + offset);
}
@@ -510,6 +511,20 @@ e_calendar_stop_auto_move (ECalendar *cal)
}
}
+static void
+e_calendar_on_prev_clicked (ECalendar *cal)
+{
+ e_calendar_item_set_first_month (cal->calitem, cal->calitem->year,
+ cal->calitem->month - 1);
+}
+
+static void
+e_calendar_on_next_clicked (ECalendar *cal)
+{
+ e_calendar_item_set_first_month (cal->calitem, cal->calitem->year,
+ cal->calitem->month + 1);
+}
+
static gint
e_calendar_drag_motion (GtkWidget *widget,
diff --git a/widgets/misc/e-dateedit.c b/widgets/misc/e-dateedit.c
index c6c2ad9bc7..94cd4a2874 100644
--- a/widgets/misc/e-dateedit.c
+++ b/widgets/misc/e-dateedit.c
@@ -1180,7 +1180,6 @@ e_date_edit_show_date_popup (EDateEdit *dedit)
position_date_popup (dedit);
gtk_widget_show (priv->cal_popup);
- gdk_keyboard_grab (priv->cal_popup->window, TRUE, GDK_CURRENT_TIME);
gtk_widget_grab_focus (priv->cal_popup);
gtk_grab_add (priv->cal_popup);
gdk_pointer_grab (priv->cal_popup->window, TRUE,
@@ -1188,6 +1187,7 @@ e_date_edit_show_date_popup (EDateEdit *dedit)
| GDK_BUTTON_RELEASE_MASK
| GDK_POINTER_MOTION_MASK),
NULL, NULL, GDK_CURRENT_TIME);
+ gdk_window_focus (priv->cal_popup->window, GDK_CURRENT_TIME);
}
@@ -1366,7 +1366,6 @@ hide_date_popup (EDateEdit *dedit)
gtk_widget_hide (dedit->priv->cal_popup);
gtk_grab_remove (dedit->priv->cal_popup);
gdk_pointer_ungrab (GDK_CURRENT_TIME);
- gdk_keyboard_ungrab (GDK_CURRENT_TIME);
}