~attente/gtk/refresh-mir-3

« back to all changes in this revision

Viewing changes to debian/patches/calendar-always-emit-day-selected-once.patch

  • Committer: Lars Uebernickel
  • Date: 2015-10-01 13:53:19 UTC
  • Revision ID: lars.uebernickel@canonical.com-20151001135319-zkv97bfmkeoafahq
Add debian/patches/calendar-always-emit-day-selected-once.patch:
Fixes infintite loop between indicator-datetime and the panel (LP: #1480387)

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
From 01d3ae030937b024bba63445cefd5050be4b2c8e Mon Sep 17 00:00:00 2001
 
2
From: Lars Uebernickel <lars.uebernickel@canonical.com>
 
3
Date: Thu, 1 Oct 2015 15:35:09 +0200
 
4
Subject: [PATCH] calendar: always emit "day-selected" once
 
5
 
 
6
"day-selected" was emitted twice when clicking on a day of the previous
 
7
or next month. This was because calendar_set_month{next,prev}() always
 
8
selected the first (or last) day of the newly focussed month. Callers
 
9
that wanted a different day to be selected had to do so after calling
 
10
one of those functions.
 
11
 
 
12
Fix this by passing the desired day into those functions directly.
 
13
 
 
14
https://bugzilla.gnome.org/show_bug.cgi?id=755941
 
15
---
 
16
 gtk/gtkcalendar.c | 72 +++++++++++++++++++++++++++++++++----------------------
 
17
 1 file changed, 43 insertions(+), 29 deletions(-)
 
18
 
 
19
diff --git a/gtk/gtkcalendar.c b/gtk/gtkcalendar.c
 
20
index b4ef543..2d338ef 100644
 
21
--- a/gtk/gtkcalendar.c
 
22
+++ b/gtk/gtkcalendar.c
 
23
@@ -876,11 +876,15 @@ calendar_queue_refresh (GtkCalendar *calendar)
 
24
 }
 
25
 
 
26
 static void
 
27
-calendar_set_month_next (GtkCalendar *calendar)
 
28
+calendar_set_month_next (GtkCalendar *calendar,
 
29
+                         gint         day)
 
30
 {
 
31
   gint month_len;
 
32
   GtkCalendarPrivate *priv = calendar->priv;
 
33
 
 
34
+  if (day < 0)
 
35
+    day = priv->selected_day;
 
36
+
 
37
   if (priv->display_flags & GTK_CALENDAR_NO_MONTH_CHANGE)
 
38
     return;
 
39
 
 
40
@@ -902,13 +906,13 @@ calendar_set_month_next (GtkCalendar *calendar)
 
41
 
 
42
   month_len = month_length[leap (priv->year)][priv->month + 1];
 
43
 
 
44
-  if (month_len < priv->selected_day)
 
45
+  if (month_len < day)
 
46
     {
 
47
       priv->selected_day = 0;
 
48
       gtk_calendar_select_day (calendar, month_len);
 
49
     }
 
50
   else
 
51
-    gtk_calendar_select_day (calendar, priv->selected_day);
 
52
+    gtk_calendar_select_day (calendar, day);
 
53
 
 
54
   calendar_queue_refresh (calendar);
 
55
 }
 
56
@@ -1298,11 +1302,15 @@ calendar_day_rectangle (GtkCalendar  *calendar,
 
57
 }
 
58
 
 
59
 static void
 
60
-calendar_set_month_prev (GtkCalendar *calendar)
 
61
+calendar_set_month_prev (GtkCalendar *calendar,
 
62
+                         gint         day)
 
63
 {
 
64
   GtkCalendarPrivate *priv = calendar->priv;
 
65
   gint month_len;
 
66
 
 
67
+  if (day < 0)
 
68
+    day = priv->selected_day;
 
69
+
 
70
   if (priv->display_flags & GTK_CALENDAR_NO_MONTH_CHANGE)
 
71
     return;
 
72
 
 
73
@@ -1325,16 +1333,16 @@ calendar_set_month_prev (GtkCalendar *calendar)
 
74
                  gtk_calendar_signals[MONTH_CHANGED_SIGNAL],
 
75
                  0);
 
76
 
 
77
-  if (month_len < priv->selected_day)
 
78
+  if (month_len < day)
 
79
     {
 
80
       priv->selected_day = 0;
 
81
       gtk_calendar_select_day (calendar, month_len);
 
82
     }
 
83
   else
 
84
     {
 
85
-      if (priv->selected_day < 0)
 
86
-        priv->selected_day = priv->selected_day + 1 + month_length[leap (priv->year)][priv->month + 1];
 
87
-      gtk_calendar_select_day (calendar, priv->selected_day);
 
88
+      if (day < 0)
 
89
+        day = day + 1 + month_length[leap (priv->year)][priv->month + 1];
 
90
+      gtk_calendar_select_day (calendar, day);
 
91
     }
 
92
 
 
93
   calendar_queue_refresh (calendar);
 
94
@@ -2811,10 +2819,10 @@ calendar_arrow_action (GtkCalendar *calendar,
 
95
       calendar_set_year_next (calendar);
 
96
       break;
 
97
     case ARROW_MONTH_LEFT:
 
98
-      calendar_set_month_prev (calendar);
 
99
+      calendar_set_month_prev (calendar, -1);
 
100
       break;
 
101
     case ARROW_MONTH_RIGHT:
 
102
-      calendar_set_month_next (calendar);
 
103
+      calendar_set_month_next (calendar, -1);
 
104
       break;
 
105
     default:;
 
106
       /* do nothing */
 
107
@@ -2913,21 +2921,27 @@ calendar_main_button_press (GtkCalendar    *calendar,
 
108
       day = priv->day[row][col];
 
109
 
 
110
       if (day_month == MONTH_PREV)
 
111
-        calendar_set_month_prev (calendar);
 
112
+        {
 
113
+          calendar_set_month_prev (calendar, day);
 
114
+        }
 
115
       else if (day_month == MONTH_NEXT)
 
116
-        calendar_set_month_next (calendar);
 
117
-
 
118
-      if (!gtk_widget_has_focus (widget))
 
119
-        gtk_widget_grab_focus (widget);
 
120
-
 
121
-      if (event->button == GDK_BUTTON_PRIMARY)
 
122
         {
 
123
-          priv->in_drag = 1;
 
124
-          priv->drag_start_x = x;
 
125
-          priv->drag_start_y = y;
 
126
+          calendar_set_month_next (calendar, day);
 
127
         }
 
128
+      else
 
129
+        {
 
130
+          if (!gtk_widget_has_focus (widget))
 
131
+            gtk_widget_grab_focus (widget);
 
132
+
 
133
+          if (event->button == GDK_BUTTON_PRIMARY)
 
134
+            {
 
135
+              priv->in_drag = 1;
 
136
+              priv->drag_start_x = x;
 
137
+              priv->drag_start_y = y;
 
138
+            }
 
139
 
 
140
-      calendar_select_and_focus_day (calendar, day);
 
141
+          calendar_select_and_focus_day (calendar, day);
 
142
+        }
 
143
     }
 
144
   else if (event->type == GDK_2BUTTON_PRESS)
 
145
     {
 
146
@@ -3098,13 +3112,13 @@ gtk_calendar_scroll (GtkWidget      *widget,
 
147
     {
 
148
       if (!gtk_widget_has_focus (widget))
 
149
         gtk_widget_grab_focus (widget);
 
150
-      calendar_set_month_prev (calendar);
 
151
+      calendar_set_month_prev (calendar, -1);
 
152
     }
 
153
   else if (event->direction == GDK_SCROLL_DOWN)
 
154
     {
 
155
       if (!gtk_widget_has_focus (widget))
 
156
         gtk_widget_grab_focus (widget);
 
157
-      calendar_set_month_next (calendar);
 
158
+      calendar_set_month_next (calendar, -1);
 
159
     }
 
160
   else
 
161
     return FALSE;
 
162
@@ -3179,7 +3193,7 @@ gtk_calendar_key_press (GtkWidget   *widget,
 
163
     case GDK_KEY_Left:
 
164
       return_val = TRUE;
 
165
       if (event->state & GDK_CONTROL_MASK)
 
166
-        calendar_set_month_prev (calendar);
 
167
+        calendar_set_month_prev (calendar, -1);
 
168
       else
 
169
         {
 
170
           move_focus (calendar, -1);
 
171
@@ -3192,7 +3206,7 @@ gtk_calendar_key_press (GtkWidget   *widget,
 
172
     case GDK_KEY_Right:
 
173
       return_val = TRUE;
 
174
       if (event->state & GDK_CONTROL_MASK)
 
175
-        calendar_set_month_next (calendar);
 
176
+        calendar_set_month_next (calendar, -1);
 
177
       else
 
178
         {
 
179
           move_focus (calendar, 1);
 
180
@@ -3246,11 +3260,11 @@ gtk_calendar_key_press (GtkWidget   *widget,
 
181
 
 
182
           day = priv->day[row][col];
 
183
           if (priv->day_month[row][col] == MONTH_PREV)
 
184
-            calendar_set_month_prev (calendar);
 
185
+            calendar_set_month_prev (calendar, day);
 
186
           else if (priv->day_month[row][col] == MONTH_NEXT)
 
187
-            calendar_set_month_next (calendar);
 
188
-
 
189
-          calendar_select_and_focus_day (calendar, day);
 
190
+            calendar_set_month_next (calendar, day);
 
191
+          else
 
192
+            calendar_select_and_focus_day (calendar, day);
 
193
         }
 
194
     }
 
195
 
 
196
-- 
 
197
2.5.0
 
198