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

📄 gtkspinbutton.c

📁 gtk是linux一款强大的夸平台的图形化开发工具
💻 C
📖 第 1 页 / 共 3 页
字号:
  g_return_if_fail (GTK_IS_SPIN_BUTTON (widget));  g_return_if_fail (area != NULL);  if (GTK_WIDGET_DRAWABLE (widget))    gtk_spin_button_paint (widget, area);}static gintgtk_spin_button_expose (GtkWidget      *widget,			GdkEventExpose *event){  g_return_val_if_fail (widget != NULL, FALSE);  g_return_val_if_fail (GTK_IS_SPIN_BUTTON (widget), FALSE);  g_return_val_if_fail (event != NULL, FALSE);  if (GTK_WIDGET_DRAWABLE (widget))    gtk_spin_button_paint (widget, &event->area);  return FALSE;}static voidgtk_spin_button_draw_arrow (GtkSpinButton *spin_button, 			    guint          arrow){  GtkStateType state_type;  GtkShadowType shadow_type;  GtkWidget *widget;  gint x;  gint y;  g_return_if_fail (spin_button != NULL);  g_return_if_fail (GTK_IS_SPIN_BUTTON (spin_button));    widget = GTK_WIDGET (spin_button);  if (GTK_WIDGET_DRAWABLE (spin_button))    {      if (!spin_button->wrap &&	  (((arrow == GTK_ARROW_UP &&	  (spin_button->adjustment->upper - spin_button->adjustment->value	   <= EPSILON))) ||	  ((arrow == GTK_ARROW_DOWN &&	  (spin_button->adjustment->value - spin_button->adjustment->lower	   <= EPSILON)))))	{	  shadow_type = GTK_SHADOW_ETCHED_IN;	  state_type = GTK_STATE_NORMAL;	}      else	{	  if (spin_button->in_child == arrow)	    {	      if (spin_button->click_child == arrow)		state_type = GTK_STATE_ACTIVE;	      else		state_type = GTK_STATE_PRELIGHT;	    }	  else	    state_type = GTK_STATE_NORMAL;	  	  if (spin_button->click_child == arrow)	    shadow_type = GTK_SHADOW_IN;	  else	    shadow_type = GTK_SHADOW_OUT;	}      if (arrow == GTK_ARROW_UP)	{	  if (spin_button->shadow_type != GTK_SHADOW_NONE)	    {	      x = widget->style->klass->xthickness;	      y = widget->style->klass->ythickness;	    }	  else	    {	      x = widget->style->klass->xthickness - 1;	      y = widget->style->klass->ythickness - 1;	    }	  gtk_paint_arrow (widget->style, spin_button->panel,			   state_type, shadow_type, 			   NULL, widget, "spinbutton",			   arrow, TRUE, 			   x, y, ARROW_SIZE, widget->requisition.height / 2 			   - widget->style->klass->ythickness);	}      else	{	  if (spin_button->shadow_type != GTK_SHADOW_NONE)	    {	      x = widget->style->klass->xthickness;	      y = widget->requisition.height / 2;	    }	  else	    {	      x = widget->style->klass->xthickness - 1;	      y = widget->requisition.height / 2 + 1;	    }	  gtk_paint_arrow (widget->style, spin_button->panel,			   state_type, shadow_type, 			   NULL, widget, "spinbutton",			   arrow, TRUE, 			   x, y, ARROW_SIZE, widget->requisition.height / 2 			   - widget->style->klass->ythickness);	}    }}static gintgtk_spin_button_enter_notify (GtkWidget        *widget,			      GdkEventCrossing *event){  GtkSpinButton *spin;  g_return_val_if_fail (widget != NULL, FALSE);  g_return_val_if_fail (GTK_IS_SPIN_BUTTON (widget), FALSE);  g_return_val_if_fail (event != NULL, FALSE);  spin = GTK_SPIN_BUTTON (widget);  if (event->window == spin->panel)    {      gint x;      gint y;      gdk_window_get_pointer (spin->panel, &x, &y, NULL);      if (y <= widget->requisition.height / 2)	{	  spin->in_child = GTK_ARROW_UP;	  if (spin->click_child == 2) 	    gtk_spin_button_draw_arrow (spin, GTK_ARROW_UP);	}      else	{	  spin->in_child = GTK_ARROW_DOWN;	  if (spin->click_child == 2) 	    gtk_spin_button_draw_arrow (spin, GTK_ARROW_DOWN);	}    }  return FALSE;}static gintgtk_spin_button_leave_notify (GtkWidget        *widget,			      GdkEventCrossing *event){  GtkSpinButton *spin;  g_return_val_if_fail (widget != NULL, FALSE);  g_return_val_if_fail (GTK_IS_SPIN_BUTTON (widget), FALSE);  g_return_val_if_fail (event != NULL, FALSE);  spin = GTK_SPIN_BUTTON (widget);  if (event->window == spin->panel && spin->click_child == 2)    {      if (spin->in_child == GTK_ARROW_UP) 	{	  spin->in_child = 2;	  gtk_spin_button_draw_arrow (spin, GTK_ARROW_UP);	}      else	{	  spin->in_child = 2;	  gtk_spin_button_draw_arrow (spin, GTK_ARROW_DOWN);	}    }  return FALSE;}static gintgtk_spin_button_focus_out (GtkWidget     *widget,			   GdkEventFocus *event){  g_return_val_if_fail (widget != NULL, FALSE);  g_return_val_if_fail (GTK_IS_SPIN_BUTTON (widget), FALSE);  g_return_val_if_fail (event != NULL, FALSE);  if (GTK_EDITABLE (widget)->editable)    gtk_spin_button_update (GTK_SPIN_BUTTON (widget));  return GTK_WIDGET_CLASS (parent_class)->focus_out_event (widget, event);}static gintgtk_spin_button_button_press (GtkWidget      *widget,			      GdkEventButton *event){  GtkSpinButton *spin;  g_return_val_if_fail (widget != NULL, FALSE);  g_return_val_if_fail (GTK_IS_SPIN_BUTTON (widget), FALSE);  g_return_val_if_fail (event != NULL, FALSE);  spin = GTK_SPIN_BUTTON (widget);  if (!spin->button)    {      if (event->window == spin->panel)	{	  if (!GTK_WIDGET_HAS_FOCUS (widget))	    gtk_widget_grab_focus (widget);	  gtk_grab_add (widget);	  spin->button = event->button;	  	  if (GTK_EDITABLE (widget)->editable)	    gtk_spin_button_update (spin);	  	  if (event->y <= widget->requisition.height / 2)	    {	      spin->click_child = GTK_ARROW_UP;	      if (event->button == 1)		{		 gtk_spin_button_real_spin (spin, 					    spin->adjustment->step_increment);		  if (!spin->timer)		    {		      spin->timer_step = spin->adjustment->step_increment;		      spin->need_timer = TRUE;		      spin->timer = gtk_timeout_add 			(SPIN_BUTTON_INITIAL_TIMER_DELAY, 			 (GtkFunction) gtk_spin_button_timer, (gpointer) spin);		    }		}	      else if (event->button == 2)		{		 gtk_spin_button_real_spin (spin, 					    spin->adjustment->page_increment);		  if (!spin->timer) 		    {		      spin->timer_step = spin->adjustment->page_increment;		      spin->need_timer = TRUE;		      spin->timer = gtk_timeout_add 			(SPIN_BUTTON_INITIAL_TIMER_DELAY, 			 (GtkFunction) gtk_spin_button_timer, (gpointer) spin);		    }		}	      gtk_spin_button_draw_arrow (spin, GTK_ARROW_UP);	    }	  else 	    {	      spin->click_child = GTK_ARROW_DOWN;	      if (event->button == 1)		{		  gtk_spin_button_real_spin (spin,					     -spin->adjustment->step_increment);		  if (!spin->timer)		    {		      spin->timer_step = spin->adjustment->step_increment;		      spin->need_timer = TRUE;		      spin->timer = gtk_timeout_add 			(SPIN_BUTTON_INITIAL_TIMER_DELAY, 			 (GtkFunction) gtk_spin_button_timer, (gpointer) spin);		    }		}      	      else if (event->button == 2)		{		  gtk_spin_button_real_spin (spin,					     -spin->adjustment->page_increment);		  if (!spin->timer) 		    {		      spin->timer_step = spin->adjustment->page_increment;		      spin->need_timer = TRUE;		      spin->timer = gtk_timeout_add 			(SPIN_BUTTON_INITIAL_TIMER_DELAY, 			 (GtkFunction) gtk_spin_button_timer, (gpointer) spin);		    }		}	      gtk_spin_button_draw_arrow (spin, GTK_ARROW_DOWN);	    }	}      else	GTK_WIDGET_CLASS (parent_class)->button_press_event (widget, event);    }  return FALSE;}static gintgtk_spin_button_button_release (GtkWidget      *widget,				GdkEventButton *event){  GtkSpinButton *spin;  g_return_val_if_fail (widget != NULL, FALSE);  g_return_val_if_fail (GTK_IS_SPIN_BUTTON (widget), FALSE);  g_return_val_if_fail (event != NULL, FALSE);  spin = GTK_SPIN_BUTTON (widget);  if (event->button == spin->button)    {      guint click_child;      if (spin->timer)	{	  gtk_timeout_remove (spin->timer);	  spin->timer = 0;	  spin->timer_calls = 0;	  spin->need_timer = FALSE;	}      if (event->button == 3)	{	  if (event->y >= 0 && event->x >= 0 && 	      event->y <= widget->requisition.height &&	      event->x <= ARROW_SIZE + 2 * widget->style->klass->xthickness)	    {	      if (spin->click_child == GTK_ARROW_UP &&		  event->y <= widget->requisition.height / 2)		{		  gfloat diff;		  diff = spin->adjustment->upper - spin->adjustment->value;		  if (diff > EPSILON)		    gtk_spin_button_real_spin (spin, diff);		}	      else if (spin->click_child == GTK_ARROW_DOWN &&		       event->y > widget->requisition.height / 2)		{		  gfloat diff;		  diff = spin->adjustment->value - spin->adjustment->lower;		  if (diff > EPSILON)		    gtk_spin_button_real_spin (spin, -diff);		}	    }	}		        gtk_grab_remove (widget);      click_child = spin->click_child;      spin->click_child = 2;      spin->button = 0;      gtk_spin_button_draw_arrow (spin, click_child);    }  else    GTK_WIDGET_CLASS (parent_class)->button_release_event (widget, event);  return FALSE;}static gintgtk_spin_button_motion_notify (GtkWidget      *widget,			       GdkEventMotion *event){  GtkSpinButton *spin;  g_return_val_if_fail (widget != NULL, FALSE);  g_return_val_if_fail (GTK_IS_SPIN_BUTTON (widget), FALSE);  g_return_val_if_fail (event != NULL, FALSE);  spin = GTK_SPIN_BUTTON (widget);    if (spin->button)    return FALSE;  if (event->window == spin->panel)    {      gint y;      y = event->y;      if (event->is_hint)	gdk_window_get_pointer (spin->panel, NULL, &y, NULL);      if (y <= widget->requisition.height / 2 && 	  spin->in_child == GTK_ARROW_DOWN)	{	  spin->in_child = GTK_ARROW_UP;	  gtk_spin_button_draw_arrow (spin, GTK_ARROW_UP);	  gtk_spin_button_draw_arrow (spin, GTK_ARROW_DOWN);	}      else if (y > widget->requisition.height / 2 && 	  spin->in_child == GTK_ARROW_UP)	{	  spin->in_child = GTK_ARROW_DOWN;	  gtk_spin_button_draw_arrow (spin, GTK_ARROW_UP);	  gtk_spin_button_draw_arrow (spin, GTK_ARROW_DOWN);	}      return FALSE;    }	    return GTK_WIDGET_CLASS (parent_class)->motion_notify_event (widget, event);}static gintgtk_spin_button_timer (GtkSpinButton *spin_button){  gboolean retval = FALSE;    GDK_THREADS_ENTER ();  if (spin_button->timer)    {      if (spin_button->click_child == GTK_ARROW_UP)	gtk_spin_button_real_spin (spin_button,	spin_button->timer_step);      else	gtk_spin_button_real_spin (spin_button,	-spin_button->timer_step);      if (spin_button->need_timer)	{	  spin_button->need_timer = FALSE;	  spin_button->timer = gtk_timeout_add 	    (SPIN_BUTTON_TIMER_DELAY, (GtkFunction) gtk_spin_button_timer, 	     (gpointer) spin_button);	}      else 	{	  if (spin_button->climb_rate > 0.0 && spin_button->timer_step 	      < spin_button->adjustment->page_increment)	    {	      if (spin_button->timer_calls < MAX_TIMER_CALLS)		spin_button->timer_calls++;	      else 		{		  spin_button->timer_calls = 0;		  spin_button->timer_step += spin_button->climb_rate;		}	    }	  retval = TRUE;	}    }  GDK_THREADS_LEAVE ();  return retval;}static voidgtk_spin_button_value_changed (GtkAdjustment *adjustment,			       GtkSpinButton *spin_button){  char buf[MAX_TEXT_LENGTH];  g_return_if_fail (adjustment != NULL);  g_return_if_fail (GTK_IS_ADJUSTMENT (adjustment));  sprintf (buf, "%0.*f", spin_button->digits, adjustment->value);  gtk_entry_set_text (GTK_ENTRY (spin_button), buf);}static gintgtk_spin_button_key_press (GtkWidget     *widget,			   GdkEventKey   *event){  GtkSpinButton *spin;  gint key;  gboolean key_repeat = FALSE;  g_return_val_if_fail (widget != NULL, FALSE);  g_return_val_if_fail (GTK_IS_SPIN_BUTTON (widget), FALSE);  g_return_val_if_fail (event != NULL, FALSE);    spin = GTK_SPIN_BUTTON (widget);  key = event->keyval;  key_repeat = (event->time == spin->ev_time);  if (GTK_EDITABLE (widget)->editable &&      (key == GDK_Up || key == GDK_Down ||        key == GDK_Page_Up || key == GDK_Page_Down))    gtk_spin_button_update (spin);  switch (key)    {    case GDK_Up:      if (GTK_WIDGET_HAS_FOCUS (widget))	{	  gtk_signal_emit_stop_by_name (GTK_OBJECT (widget), 					"key_press_event");	  if (!key_repeat)	    spin->timer_step = spin->adjustment->step_increment;	 gtk_spin_button_real_spin (spin, spin->timer_step);	  if (key_repeat)	    {	      if (spin->climb_rate > 0.0 && spin->timer_step		  < spin->adjustment->page_increment)		{		  if (spin->timer_calls < MAX_TIMER_CALLS)		    spin->timer_calls++;		  else 		    {		      spin->timer_calls = 0;		      spin->timer_step += spin->climb_rate;		    }		}	    }	  return TRUE;	}      return FALSE;    case GDK_Down:      if (GTK_WIDGET_HAS_FOCUS (widget))	{	  gtk_signal_emit_stop_by_name (GTK_OBJECT (widget), 					"key_press_event");	  if (!key_repeat)	    spin->timer_step = spin->adjustment->step_increment;	 gtk_spin_button_real_spin (spin, -spin->timer_step);	  if (key_repeat)	    {	      if (spin->climb_rate > 0.0 && spin->timer_step		  < spin->adjustment->page_increment)		{		  if (spin->timer_calls < MAX_TIMER_CALLS)		    spin->timer_calls++;		  else 		    {		      spin->timer_calls = 0;		      spin->timer_step += spin->climb_rate;		    }		}	    }	  return TRUE;	}      return FALSE;    case GDK_Page_Up:      if (event->state & GDK_CONTROL_MASK)	{	  gfloat diff = spin->adjustment->upper - spin->adjustment->value;	  if (diff > EPSILON)	    gtk_spin_button_real_spin (spin, diff);	}      else	gtk_spin_button_real_spin (spin, spin->adjustment->page_increment);

⌨️ 快捷键说明

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