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

📄 gtkcalendar.c

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