⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 gtkcalendar.c

📁 gtk是linux一款强大的夸平台的图形化开发工具
💻 C
📖 第 1 页 / 共 5 页
字号:
  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 + -