📄 calendar.c
字号:
calendar->highlight_row = -1; calendar->highlight_col = -1; calendar->focus_row = -1; calendar->focus_col = -1; calendar->xor_gc = NULL; calendar->setting = 0; private_data->max_year_width = 0; private_data->max_month_width = 0; private_data->max_day_char_width = 0; private_data->max_week_char_width = 0; private_data->max_day_char_ascent = 0; private_data->max_day_char_descent = 0; private_data->max_label_char_ascent = 0; private_data->max_label_char_descent = 0; private_data->arrow_width = 10; private_data->freeze_count = 0; private_data->dirty_header = 0; private_data->dirty_day_names = 0; private_data->dirty_week = 0; private_data->dirty_main = 0;}GtkWidget*calendar_new (void){ return GTK_WIDGET (gtk_type_new (calendar_get_type()));}/* column_from_x: returns the column 0-6 that the * x pixel of the xwindow is in */static gintcolumn_from_x (Calendar *calendar, gint event_x){ gint c, column; gint x_left, x_right; column = -1; for (c = 0; c < 7; c++) { x_left = left_x_for_column (calendar, c); x_right = x_left + CALENDAR_PRIVATE_DATA (calendar)->day_width; if (event_x >= x_left && event_x < x_right) { column = c; break; } } return column;}static gintrow_height (Calendar *calendar){ return (CALENDAR_PRIVATE_DATA (calendar)->main_h - CALENDAR_MARGIN - ((calendar->display_flags & CALENDAR_SHOW_DAY_NAMES) ? CALENDAR_YSEP : CALENDAR_MARGIN)) / 6;}
/* row_from_y: returns the row 0-5 that the * y pixel of the xwindow is in */static gintrow_from_y (Calendar *calendar, gint event_y){ gint r, row; gint height; gint y_top, y_bottom; height = row_height (calendar); row = -1; for (r = 0; r < 6; r++) { y_top = top_y_for_row (calendar, r); y_bottom = y_top + height; if (event_y >= y_top && event_y < y_bottom) { row = r; break; } } return row;}/* left_x_for_column: returns the x coordinate * for the left of the column */static gintleft_x_for_column (Calendar *calendar, gint column){ gint width; gint x_left; width = CALENDAR_PRIVATE_DATA (calendar)->day_width; if (calendar->display_flags & CALENDAR_SHOW_WEEK_NUMBERS) x_left = DAY_XSEP + (width + DAY_XSEP) * column; else x_left = CALENDAR_MARGIN + (width + DAY_XSEP) * column; return x_left;}/* top_y_for_row: returns the y coordinate * for the top of the row */static ginttop_y_for_row (Calendar *calendar, gint row){ return (CALENDAR_PRIVATE_DATA (calendar)->main_h - (CALENDAR_MARGIN + (6 - row) * row_height (calendar)));}/* This function should be done by the toolkit, but we don't like the * GTK arrows because they don't look good on this widget */static voiddraw_arrow_right (GdkWindow *window, GdkGC *gc, gint x, gint y, gint size){ gint i; for (i = 0; i <= size / 2; i++) gdk_draw_line (window, gc, x + i, y + i, x + i, y + size - i);}/* This function should be done by the toolkit, but we don't like the * GTK arrows because they don't look good on this widget */static voiddraw_arrow_left (GdkWindow *window, GdkGC *gc, gint x, gint y, gint size){ gint i; for (i = 0; i <= size / 2; i++) gdk_draw_line (window, gc, x + size/2 - i, y + i, x + size/2 - i, y + size - i);}static voidcalendar_set_month_prev (Calendar *calendar){ gint month_len; if (calendar->display_flags & CALENDAR_NO_MONTH_CHANGE) return; if (calendar->month == 0) { if(calendar->year == 1901)
return;
calendar->month = 11; calendar->year--; } else calendar->month--;
month_len = month_length[leap (calendar->year)][calendar->month + 1]; calendar_freeze (calendar); calendar_compute_days (calendar); gtk_signal_emit (GTK_OBJECT (calendar), calendar_signals[PREV_MONTH_SIGNAL]); gtk_signal_emit (GTK_OBJECT (calendar), calendar_signals[MONTH_CHANGED_SIGNAL]); if (month_len < calendar->selected_day) { calendar->selected_day = 0; calendar_select_day (calendar, month_len); } else { if (calendar->selected_day < 0) calendar->selected_day = calendar->selected_day + 1 +
month_length[leap (calendar->year)][calendar->month + 1]; calendar_select_day (calendar, calendar->selected_day); } calendar_paint (GTK_WIDGET (calendar), NULL); calendar_thaw (calendar);}static voidcalendar_set_month_next (Calendar *calendar){ gint month_len; g_return_if_fail (calendar != NULL); g_return_if_fail (GTK_IS_WIDGET (calendar)); if (calendar->display_flags & CALENDAR_NO_MONTH_CHANGE) return; if (calendar->month == 11) { calendar->month = 0; calendar->year++; } else calendar->month++; calendar_freeze (calendar); calendar_compute_days (calendar); gtk_signal_emit (GTK_OBJECT (calendar), calendar_signals[NEXT_MONTH_SIGNAL]); gtk_signal_emit (GTK_OBJECT (calendar), calendar_signals[MONTH_CHANGED_SIGNAL]); month_len = month_length[leap (calendar->year)][calendar->month + 1]; if (month_len < calendar->selected_day) { calendar->selected_day = 0; calendar_select_day (calendar, month_len); } else calendar_select_day (calendar, calendar->selected_day); calendar_paint (GTK_WIDGET(calendar), NULL); calendar_thaw (calendar);}static voidcalendar_set_year_prev (Calendar *calendar){ gint month_len; g_return_if_fail (calendar != NULL); g_return_if_fail (GTK_IS_WIDGET (calendar));
if(calendar->year == 1901)
return;
calendar->year--; calendar_freeze (calendar); calendar_compute_days (calendar); gtk_signal_emit (GTK_OBJECT (calendar), calendar_signals[PREV_YEAR_SIGNAL]); gtk_signal_emit (GTK_OBJECT (calendar), calendar_signals[MONTH_CHANGED_SIGNAL]); month_len = month_length[leap (calendar->year)][calendar->month + 1]; if (month_len < calendar->selected_day) { calendar->selected_day = 0; calendar_select_day (calendar, month_len); } else calendar_select_day (calendar, calendar->selected_day); calendar_paint (GTK_WIDGET (calendar), NULL); calendar_thaw (calendar);}static voidcalendar_set_year_next (Calendar *calendar){ gint month_len; GtkWidget *widget; g_return_if_fail (calendar != NULL); g_return_if_fail (GTK_IS_WIDGET (calendar)); widget = GTK_WIDGET (calendar);
calendar_freeze (calendar); calendar->year++; calendar_compute_days (calendar); gtk_signal_emit (GTK_OBJECT (calendar), calendar_signals[NEXT_YEAR_SIGNAL]); gtk_signal_emit (GTK_OBJECT (calendar), calendar_signals[MONTH_CHANGED_SIGNAL]); month_len = month_length[leap (calendar->year)][calendar->month + 1]; if (month_len < calendar->selected_day) { calendar->selected_day = 0; calendar_select_day (calendar, month_len); } else calendar_select_day (calendar, calendar->selected_day); calendar_paint (GTK_WIDGET (calendar), NULL); calendar_thaw (calendar);}static voidcalendar_main_button (GtkWidget *widget, GdkEventButton *event){ Calendar *calendar; gint x, y; gint row, col; gint day_month; gint old_focus_row, old_focus_col; calendar = CALENDAR (widget); x = (gint) (event->x); y = (gint) (event->y); row = row_from_y (calendar, y); col = column_from_x (calendar, x); /* If row or column isn't found, just return. */ if (row == -1 || col == -1) return; day_month = calendar->day_month[row][col]; if (day_month == MONTH_CURRENT) { if (event->type == GDK_2BUTTON_PRESS) gtk_signal_emit (GTK_OBJECT (calendar), 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; calendar_paint_day (widget, old_focus_row, old_focus_col); calendar_select_day (calendar, calendar->day[row][col]); } } else if (day_month == MONTH_PREV) calendar_set_month_prev (calendar); else if (day_month == MONTH_NEXT) calendar_set_month_next (calendar);}static voidcalendar_realize_arrows (GtkWidget *widget){ Calendar *calendar; CalendarPrivateData *private_data; GdkWindowAttr attributes; gint attributes_mask; gint i; g_return_if_fail (widget != NULL); g_return_if_fail (IS_CALENDAR (widget)); calendar = CALENDAR (widget); private_data = CALENDAR_PRIVATE_DATA (widget); /* Arrow windows ------------------------------------- */ if (! (calendar->display_flags & CALENDAR_NO_MONTH_CHANGE) && (calendar->display_flags & CALENDAR_SHOW_HEADING)) { attributes.wclass = GDK_INPUT_OUTPUT; attributes.window_type = GDK_WINDOW_CHILD; attributes.visual = gtk_widget_get_visual (widget); attributes.colormap = gtk_widget_get_colormap (widget); attributes.event_mask = (gtk_widget_get_events (widget) | GDK_EXPOSURE_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK | GDK_ENTER_NOTIFY_MASK | GDK_LEAVE_NOTIFY_MASK); attributes_mask = GDK_WA_X | GDK_WA_Y | GDK_WA_VISUAL | GDK_WA_COLORMAP; attributes.y = 3; attributes.width = private_data->arrow_width; attributes.height = private_data->header_h - 7; for (i = 0; i < 4; i++) { switch (i) { case ARROW_MONTH_LEFT: attributes.x = 3; break; case ARROW_MONTH_RIGHT: attributes.x = (private_data->arrow_width + private_data->max_month_width); break; case ARROW_YEAR_LEFT: attributes.x = (widget->allocation.width - 4 - (3 + 2*private_data->arrow_width + private_data->max_year_width)); break; case ARROW_YEAR_RIGHT: attributes.x = (widget->allocation.width - 4 - 3 - private_data->arrow_width); break; } private_data->arrow_win[i] = gdk_window_new (private_data->header_win, &attributes, attributes_mask); private_data->arrow_state[i] = GTK_STATE_NORMAL; gdk_window_set_background (private_data->arrow_win[i], HEADER_BG_COLOR (GTK_WIDGET (calendar))); gdk_window_show (private_data->arrow_win[i]); gdk_window_set_user_data (private_data->arrow_win[i], widget); } } else for (i = 0; i < 4; i++) private_data->arrow_win[i] = NULL;}static voidcalendar_realize_header (GtkWidget *widget){ Calendar *calendar; CalendarPrivateData *private_data; GdkWindowAttr attributes; gint attributes_mask; g_return_if_fail (widget != NULL); g_return_if_fail (IS_CALENDAR (widget)); calendar = CALENDAR (widget); private_data = CALENDAR_PRIVATE_DATA (widget); /* Header window ------------------------------------- */ if (calendar->display_flags & CALENDAR_SHOW_HEADING) { attributes.wclass = GDK_INPUT_OUTPUT; attributes.window_type = GDK_WINDOW_CHILD; attributes.visual = gtk_widget_get_visual (widget); attributes.colormap = gtk_widget_get_colormap (widget); attributes.event_mask = gtk_widget_get_events (widget) | GDK_EXPOSURE_MASK; attributes_mask = GDK_WA_X | GDK_WA_Y | GDK_WA_VISUAL | GDK_WA_COLORMAP; attributes.x = 2; attributes.y = 2; attributes.width = widget->allocation.width - 4; attributes.height = private_data->header_h; private_data->header_win = gdk_window_new (widget->window, &attributes, attributes_mask); gdk_window_set_background (private_data->header_win, HEADER_BG_COLOR (GTK_WIDGET (calendar))); gdk_window_show (private_data->header_win); gdk_window_set_user_data (private_data->header_win, widget);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -