summaryrefslogtreecommitdiff
path: root/gtk/gtkcalendar.c
diff options
context:
space:
mode:
Diffstat (limited to 'gtk/gtkcalendar.c')
-rw-r--r--gtk/gtkcalendar.c103
1 files changed, 63 insertions, 40 deletions
diff --git a/gtk/gtkcalendar.c b/gtk/gtkcalendar.c
index d52e44a257..88cb713407 100644
--- a/gtk/gtkcalendar.c
+++ b/gtk/gtkcalendar.c
@@ -177,14 +177,12 @@ dates_difference(N_int year1, N_int mm1, N_int dd1,
/* Color usage */
#define HEADER_FG_COLOR(widget) (& (widget)->style->fg[GTK_WIDGET_STATE (widget)])
#define HEADER_BG_COLOR(widget) (& (widget)->style->bg[GTK_WIDGET_STATE (widget)])
-#define DAY_NAME_COLOR(widget) (& (widget)->style->base[GTK_STATE_SELECTED])
+#define SELECTED_BG_COLOR(widget) (& (widget)->style->base[GTK_WIDGET_HAS_FOCUS (widget) ? GTK_STATE_SELECTED : GTK_STATE_ACTIVE])
+#define SELECTED_FG_COLOR(widget) (& (widget)->style->text[GTK_WIDGET_HAS_FOCUS (widget) ? GTK_STATE_SELECTED : GTK_STATE_ACTIVE])
#define NORMAL_DAY_COLOR(widget) (& (widget)->style->fg[GTK_WIDGET_STATE (widget)])
-#define SELECTION_FOCUS_COLOR(widget) (& (widget)->style->fg[GTK_WIDGET_STATE (widget)])
-#define SELECTION_NO_FOCUS_COLOR(widget) (& (widget)->style->mid[GTK_WIDGET_STATE (widget)])
#define PREV_MONTH_COLOR(widget) (& (widget)->style->mid[GTK_WIDGET_STATE (widget)])
#define NEXT_MONTH_COLOR(widget) (& (widget)->style->mid[GTK_WIDGET_STATE (widget)])
#define MARKED_COLOR(widget) (& (widget)->style->fg[GTK_WIDGET_STATE (widget)])
-#define FOREGROUND_COLOR(widget) (& (widget)->style->fg[GTK_WIDGET_STATE (widget)])
#define BACKGROUND_COLOR(widget) (& (widget)->style->base[GTK_WIDGET_STATE (widget)])
#define HIGHLIGHT_BACK_COLOR(widget) (& (widget)->style->mid[GTK_WIDGET_STATE (widget)])
@@ -290,6 +288,8 @@ static void gtk_calendar_paint_day_names (GtkWidget *widget);
static void gtk_calendar_paint_week_numbers (GtkWidget *widget);
static void gtk_calendar_paint_main (GtkWidget *widget);
+static void gtk_calendar_select_and_focus_day (GtkCalendar *calendar,
+ guint day);
static void gtk_calendar_paint_arrow (GtkWidget *widget,
guint arrow);
@@ -777,7 +777,7 @@ gtk_calendar_main_button (GtkWidget *widget,
gint x, y;
gint row, col;
gint day_month;
- gint old_focus_row, old_focus_col;
+ gint day;
calendar = GTK_CALENDAR (widget);
@@ -792,28 +792,28 @@ gtk_calendar_main_button (GtkWidget *widget,
return;
day_month = calendar->day_month[row][col];
-
- if (day_month == MONTH_CURRENT)
+
+ if (event->type == GDK_BUTTON_PRESS)
{
- if (event->type == GDK_2BUTTON_PRESS)
+ day = calendar->day[row][col];
+
+ if (day_month == MONTH_PREV)
+ gtk_calendar_set_month_prev (calendar);
+ else if (day_month == MONTH_NEXT)
+ gtk_calendar_set_month_next (calendar);
+
+ if (!GTK_WIDGET_HAS_FOCUS (widget))
+ gtk_widget_grab_focus (widget);
+
+ gtk_calendar_select_and_focus_day (calendar, day);
+
+ }
+ else if (event->type == GDK_2BUTTON_PRESS)
+ {
+ if (day_month == MONTH_CURRENT)
gtk_signal_emit (GTK_OBJECT (calendar),
gtk_calendar_signals[DAY_SELECTED_DOUBLE_CLICK_SIGNAL]);
- else
- {
- if (!GTK_WIDGET_HAS_FOCUS (widget))
- gtk_widget_grab_focus (widget);
- old_focus_row = calendar->focus_row;
- old_focus_col = calendar->focus_col;
- calendar->focus_row = row;
- calendar->focus_col = col;
- gtk_calendar_paint_day (widget, old_focus_row, old_focus_col);
- gtk_calendar_select_day (calendar, calendar->day[row][col]);
- }
}
- else if (day_month == MONTH_PREV)
- gtk_calendar_set_month_prev (calendar);
- else if (day_month == MONTH_NEXT)
- gtk_calendar_set_month_next (calendar);
}
static void
@@ -1557,7 +1557,7 @@ gtk_calendar_paint_day_names (GtkWidget *widget)
* Draw rectangles as inverted background for the labels.
*/
- gdk_gc_set_foreground (gc, &widget->style->base[GTK_STATE_SELECTED]);
+ gdk_gc_set_foreground (gc, SELECTED_BG_COLOR (widget));
gdk_draw_rectangle (private_data->day_name_win, gc, TRUE,
CALENDAR_MARGIN, CALENDAR_MARGIN,
cal_width-CALENDAR_MARGIN * 2,
@@ -1576,7 +1576,7 @@ gtk_calendar_paint_day_names (GtkWidget *widget)
layout = gtk_widget_create_pango_layout (widget, NULL);
- gdk_gc_set_foreground (gc, &widget->style->text[GTK_STATE_SELECTED]);
+ gdk_gc_set_foreground (gc, SELECTED_FG_COLOR (widget));
for (i = 0; i < 7; i++)
{
if (gtk_widget_get_direction (GTK_WIDGET (calendar)) == GTK_TEXT_DIR_RTL)
@@ -1650,7 +1650,7 @@ gtk_calendar_paint_week_numbers (GtkWidget *widget)
* Draw a rectangle as inverted background for the labels.
*/
- gdk_gc_set_foreground (gc, &widget->style->base[GTK_STATE_SELECTED]);
+ gdk_gc_set_foreground (gc, SELECTED_BG_COLOR (widget));
if (private_data->day_name_win)
gdk_draw_rectangle (private_data->week_win, gc, TRUE,
CALENDAR_MARGIN,
@@ -1670,7 +1670,7 @@ gtk_calendar_paint_week_numbers (GtkWidget *widget)
layout = gtk_widget_create_pango_layout (widget, NULL);
- gdk_gc_set_foreground (gc, &widget->style->text[GTK_STATE_SELECTED]);
+ gdk_gc_set_foreground (gc, SELECTED_FG_COLOR (widget));
day_height = row_height (calendar);
for (row = 0; row < 6; row++)
{
@@ -1801,7 +1801,7 @@ gtk_calendar_paint_day (GtkWidget *widget,
*/
if (calendar->selected_day == day)
{
- gdk_gc_set_foreground (gc, & (GTK_WIDGET (calendar)->style->base[GTK_STATE_SELECTED]));
+ gdk_gc_set_foreground (gc, SELECTED_BG_COLOR (GTK_WIDGET (calendar)));
gdk_draw_rectangle (private_data->main_win, gc, TRUE, x_left, y_top,
private_data->day_width, day_height);
}
@@ -1812,7 +1812,7 @@ gtk_calendar_paint_day (GtkWidget *widget,
gdk_gc_set_foreground (gc, NORMAL_DAY_COLOR (GTK_WIDGET (calendar)));
if (calendar->selected_day == day)
- gdk_gc_set_foreground (gc, & (GTK_WIDGET (calendar)->style->text[GTK_STATE_SELECTED]));
+ gdk_gc_set_foreground (gc, SELECTED_FG_COLOR (GTK_WIDGET (calendar)));
else
gdk_gc_set_foreground (gc, & (GTK_WIDGET (calendar)->style->fg[GTK_WIDGET_STATE (calendar)]));
}
@@ -1835,6 +1835,13 @@ gtk_calendar_paint_day (GtkWidget *widget,
if (GTK_WIDGET_HAS_FOCUS (calendar)
&& calendar->focus_row == row && calendar->focus_col == col)
{
+ GtkStateType state;
+
+ if (calendar->selected_day == day)
+ state = GTK_WIDGET_HAS_FOCUS (widget) ? GTK_STATE_SELECTED : GTK_STATE_ACTIVE;
+ else
+ state = GTK_STATE_NORMAL;
+
gtk_paint_focus (widget->style,
private_data->main_win,
(calendar->selected_day == day)
@@ -2141,6 +2148,32 @@ gtk_calendar_select_day (GtkCalendar *calendar,
gtk_calendar_signals[DAY_SELECTED_SIGNAL]);
}
+static void
+gtk_calendar_select_and_focus_day (GtkCalendar *calendar,
+ guint day)
+{
+ gint old_focus_row = calendar->focus_row;
+ gint old_focus_col = calendar->focus_col;
+ gint row;
+ gint col;
+
+ for (row = 0; row < 6; row ++)
+ for (col = 0; col < 7; col++)
+ {
+ if (calendar->day_month[row][col] == MONTH_CURRENT
+ && calendar->day[row][col] == day)
+ {
+ calendar->focus_row = row;
+ calendar->focus_col = col;
+ }
+ }
+
+ if (old_focus_row != -1 && old_focus_col != -1)
+ gtk_calendar_paint_day (GTK_WIDGET (calendar), old_focus_row, old_focus_col);
+
+ gtk_calendar_select_day (calendar, day);
+}
+
void
gtk_calendar_clear_marks (GtkCalendar *calendar)
{
@@ -2645,18 +2678,8 @@ gtk_calendar_key_press (GtkWidget *widget,
gtk_calendar_set_month_next (calendar);
}
- gtk_calendar_select_day (calendar, day);
+ gtk_calendar_select_and_focus_day (calendar, day);
- for (row = 0; row < 6; row ++)
- for (col = 0; col < 7; col++)
- {
- if (calendar->day_month[row][col] == MONTH_CURRENT
- && calendar->day[row][col] == day)
- {
- calendar->focus_row = row;
- calendar->focus_col = col;
- }
- }
gtk_calendar_thaw (calendar);
}
}