📄 gtkcalendar.c
字号:
calendar->month = tm->tm_mon; calendar->year = 1900 + tm->tm_year; for (i=0;i<31;i++) calendar->marked_date[i] = FALSE; calendar->selected_day = 1; calendar->display_flags = ( GTK_CALENDAR_SHOW_HEADING | GTK_CALENDAR_SHOW_DAY_NAMES ); calendar->highlight_row = -1; calendar->highlight_col = -1; calendar->focus_row = -1; calendar->focus_col = -1; calendar->xor_gc = NULL; 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*gtk_calendar_new (void){ return GTK_WIDGET (gtk_type_new (GTK_TYPE_CALENDAR));}/* column_from_x: returns the column 0-6 that the * x pixel of the xwindow is in */static gintcolumn_from_x (GtkCalendar *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 + GTK_CALENDAR_PRIVATE_DATA (calendar)->day_width; if (event_x > x_left && event_x < x_right) { column = c; break; } } return column;}static gintrow_height (GtkCalendar *calendar){ return (GTK_CALENDAR_PRIVATE_DATA (calendar)->main_h - CALENDAR_MARGIN - ((calendar->display_flags & GTK_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 (GtkCalendar *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 (GtkCalendar *calendar, gint column){ gint width; gint x_left; width = GTK_CALENDAR_PRIVATE_DATA (calendar)->day_width; if (calendar->display_flags & GTK_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 (GtkCalendar *calendar, gint row){ return (GTK_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 voidgtk_calendar_set_month_prev (GtkCalendar *calendar){ gint month_len; if (calendar->display_flags & GTK_CALENDAR_NO_MONTH_CHANGE) return; if (calendar->month == 0) { calendar->month = 11; calendar->year--; } else calendar->month--; month_len = month_length[leap (calendar->year)][calendar->month + 1]; gtk_calendar_freeze (calendar); gtk_calendar_compute_days (calendar); gtk_signal_emit (GTK_OBJECT (calendar), gtk_calendar_signals[PREV_MONTH_SIGNAL]); gtk_signal_emit (GTK_OBJECT (calendar), gtk_calendar_signals[MONTH_CHANGED_SIGNAL]); if (month_len < calendar->selected_day) { calendar->selected_day = 0; gtk_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]; else gtk_calendar_select_day (calendar, calendar->selected_day); } gtk_calendar_select_day (calendar, calendar->selected_day); gtk_calendar_paint (GTK_WIDGET (calendar), NULL); gtk_calendar_thaw (calendar);}static voidgtk_calendar_set_month_next (GtkCalendar *calendar){ gint month_len; g_return_if_fail (calendar != NULL); g_return_if_fail (GTK_IS_WIDGET (calendar)); if (calendar->display_flags & GTK_CALENDAR_NO_MONTH_CHANGE) return; if (calendar->month == 11) { calendar->month = 0; calendar->year++; } else calendar->month++; gtk_calendar_freeze (calendar); gtk_calendar_compute_days (calendar); gtk_signal_emit (GTK_OBJECT (calendar), gtk_calendar_signals[NEXT_MONTH_SIGNAL]); gtk_signal_emit (GTK_OBJECT (calendar), gtk_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; gtk_calendar_select_day (calendar, month_len); } else gtk_calendar_select_day (calendar, calendar->selected_day); gtk_calendar_paint (GTK_WIDGET(calendar), NULL); gtk_calendar_thaw (calendar);}static voidgtk_calendar_set_year_prev (GtkCalendar *calendar){ gint month_len; g_return_if_fail (calendar != NULL); g_return_if_fail (GTK_IS_WIDGET (calendar)); calendar->year--; gtk_calendar_freeze (calendar); gtk_calendar_compute_days (calendar); gtk_signal_emit (GTK_OBJECT (calendar), gtk_calendar_signals[PREV_YEAR_SIGNAL]); gtk_signal_emit (GTK_OBJECT (calendar), gtk_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; gtk_calendar_select_day (calendar, month_len); } else gtk_calendar_select_day (calendar, calendar->selected_day); gtk_calendar_paint (GTK_WIDGET (calendar), NULL); gtk_calendar_thaw (calendar);}static voidgtk_calendar_set_year_next (GtkCalendar *calendar){ gint month_len; GtkWidget *widget; g_return_if_fail (calendar != NULL); g_return_if_fail (GTK_IS_WIDGET (calendar)); widget = GTK_WIDGET (calendar); gtk_calendar_freeze (calendar); calendar->year++; gtk_calendar_compute_days (calendar); gtk_signal_emit (GTK_OBJECT (calendar), gtk_calendar_signals[NEXT_YEAR_SIGNAL]); gtk_signal_emit (GTK_OBJECT (calendar), gtk_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; gtk_calendar_select_day (calendar, month_len); } else gtk_calendar_select_day (calendar, calendar->selected_day); gtk_calendar_paint (GTK_WIDGET (calendar), NULL); gtk_calendar_thaw (calendar);}static voidgtk_calendar_main_button (GtkWidget *widget, GdkEventButton *event){ GtkCalendar *calendar; gint x, y; gint row, col; gint day_month; gint old_focus_row, old_focus_col; calendar = GTK_CALENDAR (widget); x = (gint) (event->x); y = (gint) (event->y); row = row_from_y (calendar, y); col = column_from_x (calendar, x); day_month = calendar->day_month[row][col]; if (day_month == MONTH_CURRENT) { if (event->type == GDK_2BUTTON_PRESS) 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 voidgtk_calendar_realize_arrows (GtkWidget *widget){ GtkCalendar *calendar; GtkCalendarPrivateData *private_data; GdkWindowAttr attributes; gint attributes_mask; gint i; g_return_if_fail (widget != NULL); g_return_if_fail (GTK_IS_CALENDAR (widget)); calendar = GTK_CALENDAR (widget); private_data = GTK_CALENDAR_PRIVATE_DATA (widget); /* Arrow windows ------------------------------------- */ if (! (calendar->display_flags & GTK_CALENDAR_NO_MONTH_CHANGE) && (calendar->display_flags & GTK_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 voidgtk_calendar_realize_header (GtkWidget *widget){ GtkCalendar *calendar; GtkCalendarPrivateData *private_data; GdkWindowAttr attributes; gint attributes_mask; g_return_if_fail (widget != NULL); g_return_if_fail (GTK_IS_CALENDAR (widget));
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -