📄 gtkcalendar.c
字号:
calendar = GTK_CALENDAR (widget); private_data = GTK_CALENDAR_PRIVATE_DATA (widget); /* Header window ------------------------------------- */ if (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; 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); } else { private_data->header_win = NULL; } gtk_calendar_realize_arrows (widget);}static voidgtk_calendar_realize_day_names (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)); calendar = GTK_CALENDAR (widget); private_data = GTK_CALENDAR_PRIVATE_DATA (widget); /* Day names window --------------------------------- */ if ( calendar->display_flags & GTK_CALENDAR_SHOW_DAY_NAMES) { 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 = (widget->style->klass->xthickness + INNER_BORDER); attributes.y = private_data->header_h + (widget->style->klass->ythickness + INNER_BORDER); attributes.width = (widget->allocation.width - (widget->style->klass->xthickness + INNER_BORDER) * 2); attributes.height = private_data->day_name_h; private_data->day_name_win = gdk_window_new (widget->window, &attributes, attributes_mask); gdk_window_set_background (private_data->day_name_win, BACKGROUND_COLOR ( GTK_WIDGET ( calendar))); gdk_window_show (private_data->day_name_win); gdk_window_set_user_data (private_data->day_name_win, widget); } else { private_data->day_name_win = NULL; }}static voidgtk_calendar_realize_week_numbers (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)); calendar = GTK_CALENDAR (widget); private_data = GTK_CALENDAR_PRIVATE_DATA (widget); /* Week number window -------------------------------- */ if (calendar->display_flags & GTK_CALENDAR_SHOW_WEEK_NUMBERS) { 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 = + (widget->style->klass->xthickness + INNER_BORDER); attributes.y = (private_data->header_h + private_data->day_name_h + (widget->style->klass->ythickness + INNER_BORDER)); attributes.width = private_data->week_width; attributes.height = private_data->main_h; private_data->week_win = gdk_window_new (widget->window, &attributes, attributes_mask); gdk_window_set_background (private_data->week_win, BACKGROUND_COLOR (GTK_WIDGET (calendar))); gdk_window_show (private_data->week_win); gdk_window_set_user_data (private_data->week_win, widget); } else { private_data->week_win = NULL; }}static voidgtk_calendar_realize (GtkWidget *widget){ GtkCalendar *calendar; GtkCalendarPrivateData *private_data; GdkWindowAttr attributes; gint attributes_mask; GdkGCValues values; 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); GTK_WIDGET_SET_FLAGS (widget, GTK_REALIZED); gtk_calendar_compute_days (calendar); attributes.x = widget->allocation.x; attributes.y = widget->allocation.y; attributes.width = widget->allocation.width; attributes.height = widget->allocation.height; attributes.wclass = GDK_INPUT_OUTPUT; attributes.window_type = GDK_WINDOW_CHILD; attributes.event_mask = (gtk_widget_get_events (widget) | GDK_EXPOSURE_MASK |GDK_KEY_PRESS_MASK); attributes.visual = gtk_widget_get_visual (widget); attributes.colormap = gtk_widget_get_colormap (widget); attributes_mask = GDK_WA_X | GDK_WA_Y | GDK_WA_VISUAL | GDK_WA_COLORMAP; widget->window = gdk_window_new (widget->parent->window, &attributes, attributes_mask); widget->style = gtk_style_attach (widget->style, widget->window); /* Header window ------------------------------------- */ gtk_calendar_realize_header (widget); /* Day names window --------------------------------- */ gtk_calendar_realize_day_names (widget); /* Week number window -------------------------------- */ gtk_calendar_realize_week_numbers (widget); /* Main Window -------------------------------------- */ attributes.event_mask = (gtk_widget_get_events (widget) | GDK_EXPOSURE_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK | GDK_POINTER_MOTION_MASK | GDK_LEAVE_NOTIFY_MASK); if (calendar->display_flags & GTK_CALENDAR_SHOW_WEEK_NUMBERS) attributes.x = private_data->week_width; else attributes.x = 0; attributes.x += (widget->style->klass->xthickness + INNER_BORDER); attributes.y = (private_data->header_h + private_data->day_name_h + (widget->style->klass->ythickness + INNER_BORDER)); attributes.width = (widget->allocation.width - attributes.x - (widget->style->klass->xthickness + INNER_BORDER)); attributes.height = private_data->main_h; private_data->main_win = gdk_window_new (widget->window, &attributes, attributes_mask); gdk_window_set_background (private_data->main_win, BACKGROUND_COLOR ( GTK_WIDGET ( calendar))); gdk_window_show (private_data->main_win); gdk_window_set_user_data (private_data->main_win, widget); gdk_window_set_background (widget->window, BACKGROUND_COLOR (widget)); gdk_window_show (widget->window); gdk_window_set_user_data (widget->window, widget); /* Set widgets gc */ calendar->gc = gdk_gc_new (widget->window); values.foreground = widget->style->white; values.function = GDK_XOR; calendar->xor_gc = gdk_gc_new_with_values (widget->window, &values, GDK_GC_FOREGROUND | GDK_GC_FUNCTION);}static voidgtk_calendar_unrealize (GtkWidget *widget){ GtkCalendar *calendar; GtkCalendarPrivateData *private_data; 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); if (private_data->header_win) { for (i = 0; i < 4; i++) { if (private_data->arrow_win[i]) { gdk_window_set_user_data (private_data->arrow_win[i], NULL); gdk_window_destroy (private_data->arrow_win[i]); private_data->arrow_win[i] = NULL; } } gdk_window_set_user_data (private_data->header_win, NULL); gdk_window_destroy (private_data->header_win); private_data->header_win = NULL; } if (private_data->week_win) { gdk_window_set_user_data (private_data->week_win, NULL); gdk_window_destroy (private_data->week_win); private_data->week_win = NULL; } if (private_data->main_win) { gdk_window_set_user_data (private_data->main_win, NULL); gdk_window_destroy (private_data->main_win); private_data->main_win = NULL; } if (GTK_WIDGET_CLASS (parent_class)->unrealize) (* GTK_WIDGET_CLASS (parent_class)->unrealize) (widget);}static voidgtk_calendar_size_request (GtkWidget *widget, GtkRequisition *requisition){ GtkCalendar *calendar; GtkCalendarPrivateData *private_data; gint height; gint i; gchar buffer[255]; gint calendar_margin = CALENDAR_MARGIN; gint header_width, main_width; gint lbearing; gint rbearing; gint ascent; gint descent; gint width; calendar = GTK_CALENDAR (widget); private_data = GTK_CALENDAR_PRIVATE_DATA (widget); /* * Calculate the requisition width for the widget. */ /* Header width */ if (calendar->display_flags & GTK_CALENDAR_SHOW_HEADING) { private_data->max_month_width = 0; for (i = 0; i < 12; i++) { private_data->max_month_width = MAX (private_data->max_month_width, gdk_string_measure (HEADER_FONT (widget), default_monthname[i]) + 8); } private_data->max_year_width = 0; for (i=0; i<10; i++) { sprintf (buffer, "%d%d%d%d", i,i,i,i); private_data->max_year_width = MAX (private_data->max_year_width, gdk_string_measure (HEADER_FONT (widget), buffer) + 8); } } else { private_data->max_month_width = 0; private_data->max_year_width = 0; } if (calendar->display_flags & GTK_CALENDAR_NO_MONTH_CHANGE) header_width = (private_data->max_month_width + private_data->max_year_width + 3 * 3); else header_width = (private_data->max_month_width + private_data->max_year_width + 4 * private_data->arrow_width + 3 * 3); /* Mainwindow labels width */ private_data->max_day_char_width = 0; for (i = 0; i < 9; i++) { sprintf (buffer, "%d%d", i, i); private_data->min_day_width = MAX (private_data->max_day_char_width, gdk_string_measure (DAY_FONT (widget), buffer)); } /* We add one to max_day_char_width to be able to make the marked day "bold" */ private_data->max_day_char_width = private_data->min_day_width / 2 +1; if (calendar->display_flags & GTK_CALENDAR_SHOW_DAY_NAMES) for (i = 0; i < 7; i++) { gdk_text_extents (LABEL_FONT (widget), default_abbreviated_dayname[i], strlen(default_abbreviated_dayname[i]), &lbearing, &rbearing, &width, &ascent, &descent); private_data->min_day_width = MAX (private_data->min_day_width, width); private_data->max_label_char_ascent = MAX (private_data->max_label_char_ascent, ascent); private_data->max_label_char_descent = MAX (private_data->max_label_char_descent, descent); } private_data->max_week_char_width = 0; if (calendar->display_flags & GTK_CALENDAR_SHOW_WEEK_NUMBERS) for (i = 0; i < 9; i++) { sprintf (buffer, "%d%d", i, i); private_data->max_week_char_width = MAX (private_data->max_week_char_width, gdk_string_measure (LABEL_FONT (widget), buffer) / 2); } main_width = (7 * (private_data->min_day_width + DAY_XPAD * 2) + (DAY_XSEP * 6) + CALENDAR_MARGIN * 2 + (private_data->max_week_char_width ? private_data->max_week_char_width * 2 + DAY_XPAD * 2 + CALENDAR_XSEP * 2 : 0)); requisition->width = MAX (header_width+4, main_width + (widget->style->klass->xthickness + INNER_BORDER) *2); /* * Calculate the requisition height for the widget. */ if (calendar->display_flags & GTK_CALENDAR_SHOW_HEADING) { private_data->header_h = (HEADER_FONT (widget)->ascent + HEADER_FONT (widget)->descent + CALENDAR_YSEP * 2); } else { private_data->header_h = 0; } if (calendar->display_flags & GTK_CALENDAR_SHOW_DAY_NAMES) { private_data->day_name_h = (private_data->max_label_char_ascent + private_data->max_label_char_descent + 2 * DAY_YPAD + calendar_margin); calendar_margin = CALENDAR_YSEP; } else { private_data->day_name_h = 0; } gdk_text_extents (DAY_FONT (widget), "0123456789", 10, &lbearing, &rbearing, &width, &private_data->max_day_char_ascent, &private_data->max_day_char_descent); private_data->main_h = (CALENDAR_MARGIN + calendar_margin + 6 * (private_data->max_day_char_ascent + private_data->max_day_char_descent + DAY_YPAD * 2) + DAY_YSEP * 5); /* * If we display weeknumbers we need some extra space */ if (calendar->display_flags & GTK_CALENDAR_SHOW_WEEK_NUMBERS) { private_data->main_h = MAX (private_data->main_h, (CALENDAR_MARGIN + calendar_margin + 6 * (private_data->max_day_char_ascent + private_data->max_day_char_descent + DAY_YPAD * 2) + DAY_YSEP * 5)); } height = (private_data->header_h + private_data->day_name_h + private_data->main_h); requisition->height = height + (widget->style->klass->ythickness + INNER_BORDER) * 2;}static voidgtk_calendar_size_allocate (GtkWidget *widget, GtkAllocation *allocation){ GtkCalendar *calendar; GtkCalendarPrivateData *private_data; g_return_if_fail (widget != NULL); g_return_if_fail (GTK_IS_CALENDAR (widget)); g_return_if_fail (allocation != NULL); widget->allocation = *allocation; calendar = GTK_CALENDAR (widget); private_data = GTK_CALENDAR_PRIVATE_DATA (widget); if (calendar->display_flags & GTK_CALENDAR_SHOW_WEEK_NUMBERS) { private_data->day_width = (private_data->min_day_width * ((allocation->width - (widget->style->klass->xthickness + INNER_BORDER) * 2 - (CALENDAR_MARGIN * 2) - (DAY_XSEP * 7) - CALENDAR_XSEP * 2)) / (7 * private_data->min_day_width + private_data->max_week_char_width * 2)); private_data->week_width = ((allocation->width - (widget->style->klass->xthickness + INNER_BORDER) * 2 - (CALENDAR_MARGIN * 2) - (DAY_XSEP * 7) - CALENDAR_XSEP * 2 ) - private_data->day_width * 7 + CALENDAR_MARGIN + CALENDAR_XSEP); } else { private_data->day_width = (allocation->width - (widget->style->klass->xthickness + INNER_BORDER) * 2 - (CALENDAR_MARGIN * 2) - (DAY_XSEP * 7))/7; private_data->week_width = 0; } if (GTK_WIDGET_REALIZED (widget)) { gdk_window_move_resize (widget->window,
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -