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

📄 tcal.c

📁 一个功能全面的电子邮件客户端
💻 C
📖 第 1 页 / 共 2 页
字号:
	day_width =width / 7;		month->window=new_window (widget, x, y, width, height, 	                          GDK_EXPOSURE_MASK       |				                    GDK_BUTTON_PRESS_MASK   |													  GDK_BUTTON_RELEASE_MASK |													  GDK_LEAVE_NOTIFY_MASK   |													  GDK_ENTER_NOTIFY_MASK, GTK_STATE_NORMAL);	if (mon != -1)		month->name=months[mon];	month->month=mon;	memset (&tm_s, 0, sizeof (struct tm));	tm_s.tm_mon=mon;	tm_s.tm_year=year-1900;	tm_s.tm_isdst=-1;	time=mktime (&tm_s);	tm_s=*(localtime (&time));	for (cy=0;cy<6;cy++) {		for (cx=0;cx<7;cx++) {			GtkTCalDay *day=(GtkTCalDay *)calloc (1, sizeof (GtkTCalDay));			day->window=new_window (widget, cx * day_width, (cy * day_height) + 20, 			                        day_width, day_height, 	                          GDK_EXPOSURE_MASK       |				                    GDK_BUTTON_PRESS_MASK   |													  GDK_BUTTON_RELEASE_MASK |													  GDK_LEAVE_NOTIFY_MASK   |													  GDK_ENTER_NOTIFY_MASK, GTK_STATE_PRELIGHT);			day->width=day_width;			day->height=day_height;			day->x=cx;			day->y=cy;			if (count > tm_s.tm_wday) {				day->date=date;				date++;			} else {				day->date=-1;			}			day->month=mon;			if (year % 4 == 0) {				if (day->date > leap[mon])					day->date=-1;			} else {				if (day->date > non_leap[mon])					day->date=-1;			}			count++;			month->days=g_list_append (month->days, day);		}	}	return month;}static void gtk_tcal_realize (GtkWidget *widget) {	GdkWindowAttr attributes;	GtkTCalMonth *month;	GtkTCal *tcal=GTK_TCAL (widget);	gint attr_mask;	int cx, cy, w, h;	g_return_if_fail (widget != NULL);	g_return_if_fail (GTK_TCAL_IS_TCAL (widget));		GTK_WIDGET_SET_FLAGS (widget, GTK_REALIZED);	attributes.window_type=GDK_WINDOW_CHILD;	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.visual = gtk_widget_get_visual (widget);	attributes.colormap = gtk_widget_get_colormap (widget);	attributes.event_mask = (GDK_EXPOSURE_MASK				                   | GDK_BUTTON_PRESS_MASK													 | GDK_BUTTON_RELEASE_MASK |													  GDK_LEAVE_NOTIFY_MASK   |													  GDK_ENTER_NOTIFY_MASK);													 	attr_mask = GDK_WA_X | GDK_WA_Y | GDK_WA_VISUAL | GDK_WA_COLORMAP;	widget->window = gdk_window_new (gtk_widget_get_parent_window (widget), &attributes, attr_mask);	gdk_window_set_user_data (widget->window, widget);	widget->style = gtk_style_attach (widget->style, widget->window);	gdk_window_set_background (widget->window, &widget->style->bg[GTK_STATE_PRELIGHT]);	switch (tcal->type) {		case GTK_TCAL_MONTH:			month=gtk_tcal_create_month (widget, 0, 0, 			     tcal->width, tcal->height, tcal->year, tcal->month);			tcal->months=g_list_append (tcal->months, month);			break;		case GTK_TCAL_YEAR:			w=tcal->width  / 3;			h=tcal->height / 4;			for (cy=0;cy<4;cy++) {				for (cx=0;cx<3;cx++) {					month=gtk_tcal_create_month (widget, cx * w, cy * h, w, h, 					                                  tcal->year, cy * 3 + cx);					month->rx=cx;					month->ry=cy;					tcal->months=g_list_append (tcal->months, month);							}			}			break;	}	GTK_WIDGET_SET_FLAGS (widget, GTK_REALIZED);}static void gtk_tcal_unrealize (GtkWidget *widget) {	g_return_if_fail (widget != NULL);	g_return_if_fail (GTK_TCAL_IS_TCAL (widget));	if (GTK_WIDGET_CLASS (parent_class)->unrealize)		(*GTK_WIDGET_CLASS (parent_class)->unrealize) (widget);}static void gtk_tcal_size_request (GtkWidget *widget, GtkRequisition *requisition) {	GtkAllocation alloc;	if (GTK_TCAL (widget)->type==GTK_TCAL_YEAR) {		GTK_TCAL (widget)->width    =			requisition->width        = 500;		GTK_TCAL (widget)->height   =			requisition->height       = 600;	} else {		GTK_TCAL (widget)->width    =			requisition->width        = 			alloc.width               = 			widget->parent->allocation.width-4;		GTK_TCAL (widget)->height   =			requisition->height       = 			alloc.height              = 			widget->parent->allocation.height-4;	}	alloc.x=0;	alloc.y=0;}static void gtk_tcal_size_allocate (GtkWidget *widget, GtkAllocation *allocation) {	g_return_if_fail (widget != NULL);	g_return_if_fail (GTK_TCAL_IS_TCAL (widget));	g_return_if_fail (allocation != NULL);		GTK_TCAL (widget)->width=allocation->width;		GTK_TCAL (widget)->height=allocation->height;		if (GTK_WIDGET_REALIZED (widget)) {			if (widget->window)				gdk_window_move_resize (widget->window, allocation->x, allocation->y,				                        allocation->width, allocation->height);			gtk_tcal_resize_children (GTK_TCAL (widget));		}}static char *days[]={"Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"};void gtk_tcal_paint_month (GtkWidget *widget, GtkTCalMonth *month) {	g_return_if_fail (widget != NULL);	g_return_if_fail (widget->style != NULL);	{		int width;		int i;		GdkGC	*black=widget->style->black_gc,		      *light_grey=widget->style->bg_gc[GTK_STATE_NORMAL];		gdk_draw_rectangle (month->window, light_grey, TRUE, 0, 0,		                    month->width, month->height);				gtk_draw_shadow (widget->style, month->window, GTK_STATE_NORMAL, 		                 GTK_SHADOW_IN, 0, 0, month->width, month->height);			width=month->width / 7;		for (i=0;i<7;i++) {			if (black)				gdk_draw_string (month->window, GTK_TCAL (widget)->small->font, black, 				                 i * width + 2, 27, days[i]);		}		if (month->name) {			width=gdk_string_width (GTK_TCAL (widget)->bold->font, month->name);			gdk_draw_string (month->window, GTK_TCAL (widget)->bold->font, black, 				               (month->width / 2 ) - (width / 2), 15, month->name);		}	}}void gtk_tcal_paint_day (GtkWidget *widget, GtkTCalDay *day) {	g_return_if_fail (widget != NULL);	g_return_if_fail (widget->style != NULL);	{		GdkGC *black=widget->style->black_gc,		      *dark_grey=widget->style->bg_gc[GTK_STATE_NORMAL],					*light_grey=widget->style->bg_gc[GTK_STATE_PRELIGHT];		if (day->x == 0 || day->x == 6) {			gdk_draw_rectangle (day->window, dark_grey, TRUE, 0, 0,			                    day->width, day->height);		} else {			gdk_draw_rectangle (day->window, light_grey, TRUE, 0, 0,			                    day->width, day->height);		}		gtk_draw_shadow (widget->style, day->window, GTK_STATE_NORMAL, 		                 GTK_SHADOW_OUT, 0, 0, day->width, day->height);		if (day->date!=-1) {			char *tmp=(char *)calloc (25, sizeof (char));			int width;			snprintf (tmp, 24, "%d", day->date);			if (day->evnt==GTK_TCAL_DONT_KNOW) {				GList *list;				if ((list=find_events (GTK_TCAL (widget), GTK_TCAL (widget)->year, day->month, day->date))) {					day->evnt=GTK_TCAL_HAS_EVENTS;					g_list_free (list);				} else {					day->evnt=GTK_TCAL_HAS_NOT_EVENTS;				}			}			if (day->evnt==GTK_TCAL_HAS_EVENTS) {				width=gdk_string_width (GTK_TCAL (widget)->bold->font, tmp);				gdk_draw_string (day->window, GTK_TCAL (widget)->bold->font, black, 				                 (day->width / 2) - (width / 2), 13, tmp);			} else {				width=gdk_string_width (widget->style->font, tmp);				gtk_draw_string (widget->style, day->window, GTK_STATE_NORMAL,				                 (day->width / 2) - (width / 2), 13, tmp);			}			free (tmp);		}	}}void gtk_tcal_paint_day_focus (GtkWidget *widget, GtkTCalDay *day) {	g_return_if_fail (widget != NULL);	g_return_if_fail (widget->style != NULL);	{		GdkGC *black=widget->style->black_gc,		      *dark_grey=widget->style->bg_gc[GTK_STATE_NORMAL],					*light_grey=widget->style->bg_gc[GTK_STATE_PRELIGHT];		if (day->x == 0 || day->x == 6) {			gdk_draw_rectangle (day->window, dark_grey, TRUE, 0, 0,			                    day->width, day->height);		} else {			gdk_draw_rectangle (day->window, light_grey, TRUE, 0, 0,			                    day->width, day->height);		}		gtk_draw_shadow (widget->style, day->window, GTK_STATE_NORMAL, 		                 GTK_SHADOW_ETCHED_IN, 0, 0, day->width, day->height);		if (day->date!=-1) {			char *tmp=(char *)calloc (25, sizeof (char));			int width;			snprintf (tmp, 24, "%d", day->date);			if (day->evnt==GTK_TCAL_DONT_KNOW) {				GList *list;				if ((list=find_events (GTK_TCAL (widget), GTK_TCAL (widget)->year, day->month, day->date))) {					g_list_free (list);					day->evnt=GTK_TCAL_HAS_EVENTS;				} else {					day->evnt=GTK_TCAL_HAS_NOT_EVENTS;				}			}			if (day->evnt==GTK_TCAL_HAS_EVENTS) {				width=gdk_string_width (GTK_TCAL (widget)->bold->font, tmp);				gdk_draw_string (day->window, GTK_TCAL (widget)->bold->font, black, 				                 (day->width / 2) - (width / 2), 13, tmp);			} else {				width=gdk_string_width (widget->style->font, tmp);				gtk_draw_string (widget->style, day->window, GTK_STATE_NORMAL,				                 (day->width / 2) - (width / 2), 13, tmp);			}					free (tmp);		}	}}void gtk_tcal_paint_day_pressed (GtkWidget *widget, GtkTCalDay *day) {	g_return_if_fail (widget != NULL);	g_return_if_fail (widget->style != NULL);	{		GdkGC *black=widget->style->black_gc,		      *dark_grey=widget->style->bg_gc[GTK_STATE_SELECTED],					*light_grey=widget->style->bg_gc[GTK_STATE_SELECTED];		if (day->x == 0 || day->x == 6) {			gdk_draw_rectangle (day->window, dark_grey, TRUE, 0, 0,			                    day->width, day->height);		} else {			gdk_draw_rectangle (day->window, light_grey, TRUE, 0, 0,			                    day->width, day->height);		}		gtk_draw_shadow (widget->style, day->window, GTK_STATE_NORMAL, 		                 GTK_SHADOW_IN, 0, 0, day->width, day->height);		if (day->date!=-1) {			char *tmp=(char *)calloc (25, sizeof (char));			int width;			snprintf (tmp, 24, "%d", day->date);			if (day->evnt==GTK_TCAL_DONT_KNOW) {				GList *list;				if ((list=find_events (GTK_TCAL (widget), GTK_TCAL (widget)->year, day->month, day->date))) {					day->evnt=GTK_TCAL_HAS_EVENTS;					g_list_free (list);				} else {					day->evnt=GTK_TCAL_HAS_NOT_EVENTS;				}			}			if (day->evnt==GTK_TCAL_HAS_EVENTS) {				width=gdk_string_width (GTK_TCAL (widget)->bold->font, tmp);				gdk_draw_string (day->window, GTK_TCAL (widget)->bold->font, black, 				                 (day->width / 2) - (width / 2), 13, tmp);			} else {				width=gdk_string_width (widget->style->font, tmp);				gtk_draw_string (widget->style, day->window, GTK_STATE_NORMAL,				                 (day->width / 2) - (width / 2), 13, tmp);			}			free (tmp);		}	}}static gint gtk_tcal_button_press_event (GtkWidget *widget, GdkEventButton *event) {	if (event->window != widget->window) {		GtkTCalDay *day=find_day (GTK_TCAL (widget), event->window);		if (day) {			if (day->date != -1) {				GList *events=find_events (GTK_TCAL (widget), GTK_TCAL (widget)->year,				                           day->month, day->date);				if (GTK_IS_WIDGET (GTK_TCAL (widget)->popup)) {					gtk_widget_destroy (GTK_TCAL (widget)->popup);				}				gtk_tcal_create_popup (GTK_TCAL (widget), events);				g_list_free (events);				gtk_tcal_paint_day_pressed (widget, day);				if (event->button == 1) 					gtk_menu_popup (GTK_MENU (GTK_TCAL (widget)->popup), NULL, NULL, NULL, NULL, 1, 0);			}		}	}	return TRUE;}static gint gtk_tcal_button_release_event (GtkWidget *widget, GdkEventButton *event) {	if (event->window != widget->window) {		GtkTCalDay *day=find_day (GTK_TCAL (widget), event->window);		if (day) {			if (day->date != -1) 				gtk_tcal_paint_day_focus (widget, day);		}	}	return TRUE;}void gtk_tcal_paint (GtkWidget *widget, GdkRectangle *area) {	GtkTCal *tcal;	GList *seek;	g_return_if_fail (widget != NULL);	g_return_if_fail (GTK_TCAL_IS_TCAL (widget));	tcal=GTK_TCAL (widget);	for (seek=tcal->months;seek;seek=seek->next) {		GList *dseek;		GtkTCalMonth *month=seek->data;		gtk_tcal_paint_month (widget, month);		for (dseek=month->days;dseek;dseek=dseek->next) {			GtkTCalDay *day=dseek->data;			gtk_tcal_paint_day (widget, day);		}	}	gtk_draw_shadow (widget->style, widget->window, GTK_STATE_NORMAL, GTK_SHADOW_OUT, 	                 0, 0, GTK_TCAL (widget)->width, GTK_TCAL (widget)->height);}static gint gtk_tcal_expose_event (GtkWidget *widget, GdkEventExpose *event) {	GtkTCalMonth *month;	GtkTCalDay *day;	g_return_val_if_fail (GTK_TCAL_IS_TCAL (widget), FALSE);	if (event->window != widget->window) {		month=find_month (GTK_TCAL (widget), event->window);		if (!month) {			day=find_day (GTK_TCAL (widget), event->window);			gtk_tcal_paint_day (widget, day);		} else {			gtk_tcal_paint_month (widget, month);		}	}	return TRUE;}static gint gtk_tcal_leave_notify (GtkWidget *widget, GdkEventCrossing *event) {	GtkTCal *tcal=GTK_TCAL (widget);	if (event->window != widget->window) {		GtkTCalDay *day=find_day (tcal, event->window);		if (day) {			if (day->date != -1) 				gtk_tcal_paint_day (widget, day);		}	}		return TRUE;}static gint gtk_tcal_enter_notify (GtkWidget *widget, GdkEventCrossing *event) {	GtkTCal *tcal=GTK_TCAL (widget);	if (event->window != widget->window) {		GtkTCalDay *day=find_day (tcal, event->window);		if (day) {			if (day->date != -1) 				gtk_tcal_paint_day_focus (widget, day);		}	}		return TRUE;}static void event_selected (GtkTCal *tcal, gpointer data) {}void gtk_tcal_event_store_updated (GtkTCal *tcal) {	GList *seek;	g_return_if_fail (tcal != NULL);	for (seek=g_list_first (tcal->months);seek;seek=seek->next) {		GtkTCalMonth *month=seek->data;		GList *dseek;		for (dseek=month->days;dseek;dseek=dseek->next) {			GtkTCalDay *day=dseek->data;			day->evnt=GTK_TCAL_DONT_KNOW;		}	}}static void gtk_tcal_draw (GtkWidget *widget, GdkRectangle *rect) {	g_return_if_fail (widget != NULL);	g_return_if_fail (GTK_TCAL_IS_TCAL(widget));	gtk_tcal_paint (widget, rect);}

⌨️ 快捷键说明

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