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

📄 calendar.c

📁 一个linux下的时钟软件
💻 C
📖 第 1 页 / 共 5 页
字号:
  }  else      private_data->header_win = NULL;  calendar_realize_arrows (widget);}static voidcalendar_realize_day_names (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);  /* Day names	window --------------------------------- */  if ( calendar->display_flags & 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 voidcalendar_realize_week_numbers (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);  /* Week number window -------------------------------- */  if (calendar->display_flags & 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 voidcalendar_realize (GtkWidget *widget){  Calendar *calendar;  CalendarPrivateData *private_data;  GdkWindowAttr attributes;  gint attributes_mask;  GdkGCValues values;  g_return_if_fail (widget != NULL);  g_return_if_fail (IS_CALENDAR (widget));    calendar = CALENDAR (widget);  private_data = CALENDAR_PRIVATE_DATA (widget);    GTK_WIDGET_SET_FLAGS (widget, GTK_REALIZED);  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 ------------------------------------- */  calendar_realize_header (widget);  /* Day names	window --------------------------------- */  calendar_realize_day_names (widget);  /* Week number window -------------------------------- */  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 & 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 voidcalendar_unrealize (GtkWidget *widget){  Calendar *calendar;  CalendarPrivateData *private_data;  gint i;    g_return_if_fail (widget != NULL);  g_return_if_fail (IS_CALENDAR (widget));    calendar = CALENDAR (widget);  private_data = 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 (private_data->day_name_win)    {      gdk_window_set_user_data (private_data->day_name_win, NULL);      gdk_window_destroy (private_data->day_name_win);      private_data->day_name_win = NULL;          }  if (calendar->xor_gc)    gdk_gc_unref (calendar->xor_gc);  if (calendar->gc)    gdk_gc_unref (calendar->gc);    if (GTK_WIDGET_CLASS (parent_class)->unrealize)    (* GTK_WIDGET_CLASS (parent_class)->unrealize) (widget);}static voidcalendar_size_request (GtkWidget	  *widget,			   GtkRequisition *requisition){  Calendar *calendar;  CalendarPrivateData *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 = CALENDAR (widget);  private_data = CALENDAR_PRIVATE_DATA (widget);    /*   * Calculate the requisition	width for the widget.   */  /* Header width */  if (calendar->display_flags & 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])) + 4);//+4 is lishiyan modified of 2003/11/20原来为+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 & 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 & 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 & 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 & CALENDAR_SHOW_HEADING)      private_data->header_h = (HEADER_FONT (widget)->ascent 				+ HEADER_FONT (widget)->descent				+ CALENDAR_YSEP * 2 - 3);//-3 is lishiyan modified of 2003/11/20原来没有-3  else      private_data->header_h = 0;    if (calendar->display_flags & 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 & 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 voidcalendar_size_allocate (GtkWidget	  *widget,			    GtkAllocation *allocation){  Calendar *calendar;  CalendarPrivateData *private_data;    g_return_if_fail (widget != NULL);  g_return_if_fail (IS_CALENDAR (widget));  g_return_if_fail (allocation != NULL);    widget->allocation = *allocation;    calendar = CALENDAR (widget);  private_data = CALENDAR_PRIVATE_DATA (widget);    if (calendar->display_flags & 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,			      allocation->x, allocation->y,			      allocation->width, allocation->height);      if (private_data->header_win)		gdk_window_move_resize (private_data->header_win,				2, 2,				allocation->width-4, private_data->header_h);      if (private_data->arrow_win[ARROW_MONTH_LEFT])		gdk_window_move_resize (private_data->arrow_win[ARROW_MONTH_LEFT],				3, 3,				private_data->arrow_width,				private_data->header_h - 7);      if (private_data->arrow_win[ARROW_MONTH_RIGHT])		gdk_window_move_resize (private_data->arrow_win[ARROW_MONTH_RIGHT],				(private_data->arrow_width 				 + private_data->max_month_width), 				3,				private_data->arrow_width,				private_data->header_h - 7);      if (private_data->arrow_win[ARROW_YEAR_LEFT])		gdk_window_move_resize (private_data->arrow_win[ARROW_YEAR_LEFT],				(allocation->width - 4				 - (3 + 2*private_data->arrow_width 			    + private_data->max_year_width)),				3,				private_data->arrow_width,				private_data->header_h - 7);      if (private_data->arrow_win[ARROW_YEAR_RIGHT])		gdk_window_move_resize (private_data->arrow_win[ARROW_YEAR_RIGHT],				(allocation->width - 4 				 - 3 - private_data->arrow_width), 				3,				private_data->arrow_width,				private_data->header_h - 7);      if (private_data->day_name_win)		gdk_window_move_resize (private_data->day_name_win,				widget->style->klass->xthickness + INNER_BORDER,				private_data->header_h + (widget->style->klass->ythickness + INNER_BORDER),				allocation->width - (widget->style->klass->xthickness + INNER_BORDER) * 2,

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -