aboutsummaryrefslogtreecommitdiffstats
path: root/calendar/gui/e-day-view.c
diff options
context:
space:
mode:
Diffstat (limited to 'calendar/gui/e-day-view.c')
-rw-r--r--calendar/gui/e-day-view.c264
1 files changed, 178 insertions, 86 deletions
diff --git a/calendar/gui/e-day-view.c b/calendar/gui/e-day-view.c
index 59d558078d..5c3b4f2202 100644
--- a/calendar/gui/e-day-view.c
+++ b/calendar/gui/e-day-view.c
@@ -175,20 +175,20 @@ static void e_day_view_on_canvas_realized (GtkWidget *widget,
EDayView *day_view);
static gboolean e_day_view_on_top_canvas_button_press (GtkWidget *widget,
- GdkEventButton *event,
+ GdkEvent *button_event,
EDayView *day_view);
static gboolean e_day_view_on_top_canvas_button_release (GtkWidget *widget,
- GdkEventButton *event,
+ GdkEvent *button_event,
EDayView *day_view);
static gboolean e_day_view_on_top_canvas_motion (GtkWidget *widget,
GdkEventMotion *event,
EDayView *day_view);
static gboolean e_day_view_on_main_canvas_button_press (GtkWidget *widget,
- GdkEventButton *event,
+ GdkEvent *button_event,
EDayView *day_view);
static gboolean e_day_view_on_main_canvas_button_release (GtkWidget *widget,
- GdkEventButton *event,
+ GdkEvent *button_event,
EDayView *day_view);
static gboolean e_day_view_on_top_canvas_scroll (GtkWidget *widget,
@@ -219,27 +219,27 @@ static void e_day_view_abort_resize (EDayView *day_view);
static gboolean e_day_view_on_long_event_button_press (EDayView *day_view,
gint event_num,
- GdkEventButton *event,
+ GdkEvent *button_event,
ECalendarViewPosition pos,
gint event_x,
gint event_y);
static gboolean e_day_view_on_event_button_press (EDayView *day_view,
gint day,
gint event_num,
- GdkEventButton *event,
+ GdkEvent *button_event,
ECalendarViewPosition pos,
gint event_x,
gint event_y);
static void e_day_view_on_long_event_click (EDayView *day_view,
gint event_num,
- GdkEventButton *bevent,
+ GdkEvent *button_event,
ECalendarViewPosition pos,
gint event_x,
gint event_y);
static void e_day_view_on_event_click (EDayView *day_view,
gint day,
gint event_num,
- GdkEventButton *event,
+ GdkEvent *button_event,
ECalendarViewPosition pos,
gint event_x,
gint event_y);
@@ -247,11 +247,11 @@ static void e_day_view_on_event_double_click (EDayView *day_view,
gint day,
gint event_num);
static void e_day_view_on_event_right_click (EDayView *day_view,
- GdkEventButton *bevent,
+ GdkEvent *button_event,
gint day,
gint event_num);
static void e_day_view_show_popup_menu (EDayView *day_view,
- GdkEventButton *event,
+ GdkEvent *button_event,
gint day,
gint event_num);
@@ -3098,17 +3098,24 @@ e_day_view_convert_time_to_position (EDayView *day_view,
static gboolean
e_day_view_on_top_canvas_button_press (GtkWidget *widget,
- GdkEventButton *event,
+ GdkEvent *button_event,
EDayView *day_view)
{
gint event_x, event_y, day, event_num;
ECalendarViewPosition pos;
GtkLayout *layout;
GdkWindow *window;
+ GdkDevice *event_device;
+ guint event_button = 0;
+ guint32 event_time;
layout = GTK_LAYOUT (widget);
window = gtk_layout_get_bin_window (layout);
+ gdk_event_get_button (button_event, &event_button);
+ event_device = gdk_event_get_device (button_event);
+ event_time = gdk_event_get_time (button_event);
+
if (day_view->resize_event_num != -1)
day_view->resize_event_num = -1;
@@ -3118,7 +3125,7 @@ e_day_view_on_top_canvas_button_press (GtkWidget *widget,
/* Convert the coords to the main canvas window, or return if the
* window is not found. */
if (!e_day_view_convert_event_coords (
- day_view, (GdkEvent *) event, window, &event_x, &event_y))
+ day_view, button_event, window, &event_x, &event_y))
return FALSE;
pos = e_day_view_convert_position_in_top_canvas (
@@ -3133,14 +3140,17 @@ e_day_view_on_top_canvas_button_press (GtkWidget *widget,
return e_day_view_on_long_event_button_press (
day_view,
event_num,
- event, pos,
+ button_event,
+ pos,
event_x,
event_y);
e_day_view_stop_editing_event (day_view);
- if (event->button == 1) {
- if (event->type == GDK_2BUTTON_PRESS) {
+ if (event_button == 1) {
+ GdkGrabStatus grab_status;
+
+ if (button_event->type == GDK_2BUTTON_PRESS) {
time_t dtstart, dtend;
e_day_view_get_selected_time_range ((ECalendarView *) day_view, &dtstart, &dtend);
@@ -3150,25 +3160,36 @@ e_day_view_on_top_canvas_button_press (GtkWidget *widget,
e_day_view_set_selected_time_range ((ECalendarView *) day_view, dtstart, dtend);
}
- e_calendar_view_new_appointment_for (E_CALENDAR_VIEW (day_view),
- dtstart, dtend,
- TRUE, calendar_config_get_prefer_meeting ());
+ e_calendar_view_new_appointment_for (
+ E_CALENDAR_VIEW (day_view),
+ dtstart, dtend, TRUE,
+ calendar_config_get_prefer_meeting ());
return TRUE;
}
if (!gtk_widget_has_focus (GTK_WIDGET (day_view)))
gtk_widget_grab_focus (GTK_WIDGET (day_view));
- if (gdk_pointer_grab (window, FALSE,
- GDK_POINTER_MOTION_MASK
- | GDK_BUTTON_RELEASE_MASK,
- NULL, NULL, event->time) == 0) {
- if (event->time - day_view->bc_event_time > 250)
- e_day_view_get_selected_time_range ((ECalendarView *) day_view, &day_view->before_click_dtstart, &day_view->before_click_dtend);
- day_view->bc_event_time = event->time;
+ grab_status = gdk_device_grab (
+ event_device,
+ window,
+ GDK_OWNERSHIP_NONE,
+ FALSE,
+ GDK_POINTER_MOTION_MASK |
+ GDK_BUTTON_RELEASE_MASK,
+ NULL,
+ event_time);
+
+ if (grab_status == GDK_GRAB_SUCCESS) {
+ if (event_time - day_view->bc_event_time > 250)
+ e_day_view_get_selected_time_range (
+ E_CALENDAR_VIEW (day_view),
+ &day_view->before_click_dtstart,
+ &day_view->before_click_dtend);
+ day_view->bc_event_time = event_time;
e_day_view_start_selection (day_view, day, -1);
}
- } else if (event->button == 3) {
+ } else if (event_button == 3) {
if (!gtk_widget_has_focus (GTK_WIDGET (day_view)))
gtk_widget_grab_focus (GTK_WIDGET (day_view));
@@ -3177,7 +3198,7 @@ e_day_view_on_top_canvas_button_press (GtkWidget *widget,
e_day_view_finish_selection (day_view);
}
- e_day_view_on_event_right_click (day_view, event, -1, -1);
+ e_day_view_on_event_right_click (day_view, button_event, -1, -1);
}
return TRUE;
@@ -3235,17 +3256,24 @@ e_day_view_convert_event_coords (EDayView *day_view,
static gboolean
e_day_view_on_main_canvas_button_press (GtkWidget *widget,
- GdkEventButton *event,
+ GdkEvent *button_event,
EDayView *day_view)
{
gint event_x, event_y, row, day, event_num;
ECalendarViewPosition pos;
GtkLayout *layout;
GdkWindow *window;
+ GdkDevice *event_device;
+ guint event_button = 0;
+ guint32 event_time;
layout = GTK_LAYOUT (widget);
window = gtk_layout_get_bin_window (layout);
+ gdk_event_get_button (button_event, &event_button);
+ event_device = gdk_event_get_device (button_event);
+ event_time = gdk_event_get_time (button_event);
+
if (day_view->resize_event_num != -1)
day_view->resize_event_num = -1;
@@ -3255,7 +3283,7 @@ e_day_view_on_main_canvas_button_press (GtkWidget *widget,
/* Convert the coords to the main canvas window, or return if the
* window is not found. */
if (!e_day_view_convert_event_coords (
- day_view, (GdkEvent *) event, window, &event_x, &event_y))
+ day_view, button_event, window, &event_x, &event_y))
return FALSE;
/* Find out where the mouse is. */
@@ -3270,15 +3298,21 @@ e_day_view_on_main_canvas_button_press (GtkWidget *widget,
if (pos != E_CALENDAR_VIEW_POS_NONE)
return e_day_view_on_event_button_press (
- day_view, day,
- event_num, event, pos,
- event_x, event_y);
+ day_view,
+ day,
+ event_num,
+ button_event,
+ pos,
+ event_x,
+ event_y);
e_day_view_stop_editing_event (day_view);
/* Start the selection drag. */
- if (event->button == 1) {
- if (event->type == GDK_2BUTTON_PRESS) {
+ if (event_button == 1) {
+ GdkGrabStatus grab_status;
+
+ if (button_event->type == GDK_2BUTTON_PRESS) {
time_t dtstart, dtend;
e_day_view_get_selected_time_range ((ECalendarView *) day_view, &dtstart, &dtend);
@@ -3287,26 +3321,37 @@ e_day_view_on_main_canvas_button_press (GtkWidget *widget,
dtend = day_view->before_click_dtend;
e_day_view_set_selected_time_range ((ECalendarView *) day_view, dtstart, dtend);
}
- e_calendar_view_new_appointment_for (E_CALENDAR_VIEW (day_view),
- dtstart, dtend,
- FALSE, calendar_config_get_prefer_meeting ());
+ e_calendar_view_new_appointment_for (
+ E_CALENDAR_VIEW (day_view),
+ dtstart, dtend, FALSE,
+ calendar_config_get_prefer_meeting ());
return TRUE;
}
if (!gtk_widget_has_focus (GTK_WIDGET (day_view)) && !gtk_widget_has_focus (GTK_WIDGET (day_view->main_canvas)))
gtk_widget_grab_focus (GTK_WIDGET (day_view));
- if (gdk_pointer_grab (window, FALSE,
- GDK_POINTER_MOTION_MASK
- | GDK_BUTTON_RELEASE_MASK,
- NULL, NULL, event->time) == 0) {
- if (event->time - day_view->bc_event_time > 250)
- e_day_view_get_selected_time_range ((ECalendarView *) day_view, &day_view->before_click_dtstart, &day_view->before_click_dtend);
- day_view->bc_event_time = event->time;
+ grab_status = gdk_device_grab (
+ event_device,
+ window,
+ GDK_OWNERSHIP_NONE,
+ FALSE,
+ GDK_POINTER_MOTION_MASK |
+ GDK_BUTTON_RELEASE_MASK,
+ NULL,
+ event_time);
+
+ if (grab_status == GDK_GRAB_SUCCESS) {
+ if (event_time - day_view->bc_event_time > 250)
+ e_day_view_get_selected_time_range (
+ E_CALENDAR_VIEW (day_view),
+ &day_view->before_click_dtstart,
+ &day_view->before_click_dtend);
+ day_view->bc_event_time = event_time;
e_day_view_start_selection (day_view, day, row);
g_signal_emit_by_name (day_view, "selected_time_changed");
}
- } else if (event->button == 3) {
+ } else if (event_button == 3) {
if (!gtk_widget_has_focus (GTK_WIDGET (day_view)))
gtk_widget_grab_focus (GTK_WIDGET (day_view));
@@ -3317,7 +3362,7 @@ e_day_view_on_main_canvas_button_press (GtkWidget *widget,
e_day_view_finish_selection (day_view);
}
- e_day_view_on_event_right_click (day_view, event, -1, -1);
+ e_day_view_on_event_right_click (day_view, button_event, -1, -1);
}
return TRUE;
@@ -3414,26 +3459,30 @@ e_day_view_on_time_canvas_scroll (GtkWidget *widget,
static gboolean
e_day_view_on_long_event_button_press (EDayView *day_view,
gint event_num,
- GdkEventButton *event,
+ GdkEvent *button_event,
ECalendarViewPosition pos,
gint event_x,
gint event_y)
{
- if (event->button == 1) {
- if (event->type == GDK_BUTTON_PRESS) {
+ guint event_button = 0;
+
+ gdk_event_get_button (button_event, &event_button);
+
+ if (event_button == 1) {
+ if (button_event->type == GDK_BUTTON_PRESS) {
e_day_view_on_long_event_click (
day_view, event_num,
- event, pos,
+ button_event, pos,
event_x, event_y);
return TRUE;
- } else if (event->type == GDK_2BUTTON_PRESS) {
+ } else if (button_event->type == GDK_2BUTTON_PRESS) {
e_day_view_on_event_double_click (
day_view, -1,
event_num);
g_signal_stop_emission_by_name (day_view->top_canvas, "button_press_event");
return TRUE;
}
- } else if (event->button == 3) {
+ } else if (event_button == 3) {
EDayViewEvent *e;
if (!is_array_index_in_bounds (day_view->long_events, event_num))
@@ -3444,7 +3493,7 @@ e_day_view_on_long_event_button_press (EDayView *day_view,
e_day_view_set_selected_time_range_in_top_visible (day_view, e->start, e->end);
e_day_view_on_event_right_click (
- day_view, event,
+ day_view, button_event,
E_DAY_VIEW_LONG_EVENT,
event_num);
@@ -3457,19 +3506,23 @@ static gboolean
e_day_view_on_event_button_press (EDayView *day_view,
gint day,
gint event_num,
- GdkEventButton *event,
+ GdkEvent *button_event,
ECalendarViewPosition pos,
gint event_x,
gint event_y)
{
- if (event->button == 1) {
- if (event->type == GDK_BUTTON_PRESS) {
+ guint event_button = 0;
+
+ gdk_event_get_button (button_event, &event_button);
+
+ if (event_button == 1) {
+ if (button_event->type == GDK_BUTTON_PRESS) {
e_day_view_on_event_click (
day_view, day, event_num,
- event, pos,
+ button_event, pos,
event_x, event_y);
return TRUE;
- } else if (event->type == GDK_2BUTTON_PRESS) {
+ } else if (button_event->type == GDK_2BUTTON_PRESS) {
e_day_view_on_event_double_click (
day_view, day,
event_num);
@@ -3477,7 +3530,7 @@ e_day_view_on_event_button_press (EDayView *day_view,
g_signal_stop_emission_by_name (day_view->main_canvas, "button_press_event");
return TRUE;
}
- } else if (event->button == 3) {
+ } else if (event_button == 3) {
EDayViewEvent *e;
if (!is_array_index_in_bounds (day_view->events[day], event_num))
@@ -3488,8 +3541,7 @@ e_day_view_on_event_button_press (EDayView *day_view,
e_day_view_set_selected_time_range_visible (day_view, e->start, e->end);
e_day_view_on_event_right_click (
- day_view, event,
- day, event_num);
+ day_view, button_event, day, event_num);
return TRUE;
}
@@ -3499,7 +3551,7 @@ e_day_view_on_event_button_press (EDayView *day_view,
static void
e_day_view_on_long_event_click (EDayView *day_view,
gint event_num,
- GdkEventButton *bevent,
+ GdkEvent *button_event,
ECalendarViewPosition pos,
gint event_x,
gint event_y)
@@ -3522,7 +3574,8 @@ e_day_view_on_long_event_click (EDayView *day_view,
/* Ignore clicks on the EText while editing. */
if (pos == E_CALENDAR_VIEW_POS_EVENT
&& E_TEXT (event->canvas_item)->editing) {
- GNOME_CANVAS_ITEM_GET_CLASS (event->canvas_item)->event (event->canvas_item, (GdkEvent *) bevent);
+ GNOME_CANVAS_ITEM_GET_CLASS (event->canvas_item)->event (
+ event->canvas_item, button_event);
return;
}
@@ -3530,6 +3583,10 @@ e_day_view_on_long_event_click (EDayView *day_view,
!e_cal_util_component_has_recurrences (event->comp_data->icalcomp))
&& (pos == E_CALENDAR_VIEW_POS_LEFT_EDGE
|| pos == E_CALENDAR_VIEW_POS_RIGHT_EDGE)) {
+ GdkGrabStatus grab_status;
+ GdkDevice *event_device;
+ guint32 event_time;
+
if (!e_day_view_find_long_event_days (event,
day_view->days_shown,
day_view->day_starts,
@@ -3544,11 +3601,20 @@ e_day_view_on_long_event_click (EDayView *day_view,
layout = GTK_LAYOUT (day_view->top_canvas);
window = gtk_layout_get_bin_window (layout);
- if (gdk_pointer_grab (window, FALSE,
- GDK_POINTER_MOTION_MASK
- | GDK_BUTTON_RELEASE_MASK,
- NULL, NULL, bevent->time) == 0) {
+ event_device = gdk_event_get_device (button_event);
+ event_time = gdk_event_get_time (button_event);
+
+ grab_status = gdk_device_grab (
+ event_device,
+ window,
+ GDK_OWNERSHIP_NONE,
+ FALSE,
+ GDK_POINTER_MOTION_MASK |
+ GDK_BUTTON_RELEASE_MASK,
+ NULL,
+ event_time);
+ if (grab_status == GDK_GRAB_SUCCESS) {
day_view->resize_event_day = E_DAY_VIEW_LONG_EVENT;
day_view->resize_event_num = event_num;
day_view->resize_drag_pos = pos;
@@ -3582,7 +3648,7 @@ static void
e_day_view_on_event_click (EDayView *day_view,
gint day,
gint event_num,
- GdkEventButton *bevent,
+ GdkEvent *button_event,
ECalendarViewPosition pos,
gint event_x,
gint event_y)
@@ -3609,7 +3675,8 @@ e_day_view_on_event_click (EDayView *day_view,
/* Ignore clicks on the EText while editing. */
if (pos == E_CALENDAR_VIEW_POS_EVENT
&& E_TEXT (event->canvas_item)->editing) {
- GNOME_CANVAS_ITEM_GET_CLASS (event->canvas_item)->event (event->canvas_item, (GdkEvent *) bevent);
+ GNOME_CANVAS_ITEM_GET_CLASS (event->canvas_item)->event (
+ event->canvas_item, button_event);
return;
}
@@ -3617,6 +3684,10 @@ e_day_view_on_event_click (EDayView *day_view,
!e_cal_util_component_has_recurrences (event->comp_data->icalcomp))
&& (pos == E_CALENDAR_VIEW_POS_TOP_EDGE
|| pos == E_CALENDAR_VIEW_POS_BOTTOM_EDGE)) {
+ GdkGrabStatus grab_status;
+ GdkDevice *event_device;
+ guint32 event_time;
+
if (event && (!event->is_editable || e_client_is_readonly (E_CLIENT (event->comp_data->client)))) {
return;
}
@@ -3629,11 +3700,20 @@ e_day_view_on_event_click (EDayView *day_view,
layout = GTK_LAYOUT (day_view->main_canvas);
window = gtk_layout_get_bin_window (layout);
- if (gdk_pointer_grab (window, FALSE,
- GDK_POINTER_MOTION_MASK
- | GDK_BUTTON_RELEASE_MASK,
- NULL, NULL, bevent->time) == 0) {
+ event_device = gdk_event_get_device (button_event);
+ event_time = gdk_event_get_time (button_event);
+
+ grab_status = gdk_device_grab (
+ event_device,
+ window,
+ GDK_OWNERSHIP_NONE,
+ FALSE,
+ GDK_POINTER_MOTION_MASK |
+ GDK_BUTTON_RELEASE_MASK,
+ NULL,
+ event_time);
+ if (grab_status != GDK_GRAB_SUCCESS) {
day_view->resize_event_day = day;
day_view->resize_event_num = event_num;
day_view->resize_drag_pos = pos;
@@ -3699,7 +3779,7 @@ e_day_view_on_event_double_click (EDayView *day_view,
static void
e_day_view_show_popup_menu (EDayView *day_view,
- GdkEventButton *event,
+ GdkEvent *button_event,
gint day,
gint event_num)
{
@@ -3708,7 +3788,7 @@ e_day_view_show_popup_menu (EDayView *day_view,
day_view->popup_event_day = day;
day_view->popup_event_num = event_num;
- e_calendar_view_popup_event (E_CALENDAR_VIEW (day_view), event);
+ e_calendar_view_popup_event (E_CALENDAR_VIEW (day_view), button_event);
}
static gboolean
@@ -3806,23 +3886,29 @@ e_day_view_update_query (EDayView *day_view)
static void
e_day_view_on_event_right_click (EDayView *day_view,
- GdkEventButton *bevent,
+ GdkEvent *button_event,
gint day,
gint event_num)
{
- e_day_view_show_popup_menu (day_view, bevent, day, event_num);
+ e_day_view_show_popup_menu (day_view, button_event, day, event_num);
}
static gboolean
e_day_view_on_top_canvas_button_release (GtkWidget *widget,
- GdkEventButton *event,
+ GdkEvent *button_event,
EDayView *day_view)
{
+ GdkDevice *event_device;
+ guint32 event_time;
+
+ event_device = gdk_event_get_device (button_event);
+ event_time = gdk_event_get_time (button_event);
+
if (day_view->selection_is_being_dragged) {
- gdk_pointer_ungrab (event->time);
+ gdk_device_ungrab (event_device, event_time);
e_day_view_finish_selection (day_view);
} else if (day_view->resize_drag_pos != E_CALENDAR_VIEW_POS_NONE) {
- gdk_pointer_ungrab (event->time);
+ gdk_device_ungrab (event_device, event_time);
e_day_view_finish_long_event_resize (day_view);
} else if (day_view->pressed_event_day != -1) {
e_day_view_start_editing_event (
@@ -3839,23 +3925,29 @@ e_day_view_on_top_canvas_button_release (GtkWidget *widget,
static gboolean
e_day_view_on_main_canvas_button_release (GtkWidget *widget,
- GdkEventButton *event,
+ GdkEvent *button_event,
EDayView *day_view)
{
+ GdkDevice *event_device;
+ guint32 event_time;
+
+ event_device = gdk_event_get_device (button_event);
+ event_time = gdk_event_get_time (button_event);
+
if (day_view->selection_is_being_dragged) {
- gdk_pointer_ungrab (event->time);
+ gdk_device_ungrab (event_device, event_time);
e_day_view_finish_selection (day_view);
e_day_view_stop_auto_scroll (day_view);
} else if (day_view->resize_drag_pos != E_CALENDAR_VIEW_POS_NONE) {
- gdk_pointer_ungrab (event->time);
+ gdk_device_ungrab (event_device, event_time);
e_day_view_finish_resize (day_view);
e_day_view_stop_auto_scroll (day_view);
} else if (day_view->pressed_event_day != -1) {
e_day_view_start_editing_event (
day_view,
- day_view->pressed_event_day,
- day_view->pressed_event_num,
- NULL);
+ day_view->pressed_event_day,
+ day_view->pressed_event_num,
+ NULL);
}
day_view->pressed_event_day = -1;