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

📄 gtkdial.c

📁 linux下电话本所依赖的一些图形库
💻 C
📖 第 1 页 / 共 2 页
字号:
                widget->style->bg_gc[GTK_STATE_NORMAL];  blankstyle->black_gc =                widget->style->bg_gc[GTK_STATE_NORMAL];  gtk_paint_polygon (blankstyle,                    widget->window,                    GTK_STATE_NORMAL,                    GTK_SHADOW_OUT,	            NULL,                    widget,                    NULL,                    points, 5,                    FALSE);  g_object_unref (blankstyle);  /* Draw ticks */  if ((upper - lower) == 0)    return FALSE;  increment = (100*M_PI) / (dial->radius*dial->radius);  inc = (upper - lower);  while (inc < 100) inc *= 10;  while (inc >= 1000) inc /= 10;  last = -1;  for (i = 0; i <= inc; i++)    {      theta = ((gfloat)i*M_PI / (18*inc/24.) - M_PI/6.);      if ((theta - last) < (increment))	continue;           last = theta;      s = sin (theta);      c = cos (theta);      tick_length = (i%(inc/10) == 0) ? dial->pointer_width : dial->pointer_width / 2;      gdk_draw_line (widget->window,                     widget->style->fg_gc[widget->state],                     xc + c*(dial->radius - tick_length),                     yc - s*(dial->radius - tick_length),                     xc + c*dial->radius,                     yc - s*dial->radius);    }  /* Draw pointer */  s = sin (dial->angle);  c = cos (dial->angle);  dial->last_angle = dial->angle;  points[0].x = xc + s*dial->pointer_width/2;  points[0].y = yc + c*dial->pointer_width/2;  points[1].x = xc + c*dial->radius;  points[1].y = yc - s*dial->radius;  points[2].x = xc - s*dial->pointer_width/2;  points[2].y = yc - c*dial->pointer_width/2;  points[3].x = xc - c*dial->radius/10;  points[3].y = yc + s*dial->radius/10;  points[4].x = points[0].x;  points[4].y = points[0].y;  gtk_paint_polygon (widget->style,		    widget->window,		    GTK_STATE_NORMAL,		    GTK_SHADOW_OUT,	            NULL,                    widget,                    NULL,		    points, 5,		    TRUE);  return FALSE;}static gbooleangtk_dial_button_press( GtkWidget      *widget,		       GdkEventButton *event ){  GtkDial *dial;  gint dx, dy;  double s, c;  double d_parallel;  double d_perpendicular;  g_return_val_if_fail (widget != NULL, FALSE);  g_return_val_if_fail (GTK_IS_DIAL (widget), FALSE);  g_return_val_if_fail (event != NULL, FALSE);  dial = GTK_DIAL (widget);  /* Determine if button press was within pointer region - we      do this by computing the parallel and perpendicular distance of     the point where the mouse was pressed from the line passing through     the pointer */    dx = event->x - widget->allocation.width / 2;  dy = widget->allocation.height / 2 - event->y;    s = sin (dial->angle);  c = cos (dial->angle);    d_parallel = s*dy + c*dx;  d_perpendicular = fabs (s*dx - c*dy);    if (!dial->button &&      (d_perpendicular < dial->pointer_width/2) &&      (d_parallel > - dial->pointer_width))    {      gtk_grab_add (widget);      dial->button = event->button;      gtk_dial_update_mouse (dial, event->x, event->y);    }  return FALSE;}static gbooleangtk_dial_button_release( GtkWidget      *widget,                         GdkEventButton *event ){  GtkDial *dial;  g_return_val_if_fail (widget != NULL, FALSE);  g_return_val_if_fail (GTK_IS_DIAL (widget), FALSE);  g_return_val_if_fail (event != NULL, FALSE);  dial = GTK_DIAL (widget);  if (dial->button == event->button)    {      gtk_grab_remove (widget);      dial->button = 0;      if (dial->policy == GTK_UPDATE_DELAYED)	g_source_remove (dial->timer);            if ((dial->policy != GTK_UPDATE_CONTINUOUS) &&	  (dial->old_value != dial->adjustment->value))	g_signal_emit_by_name (GTK_OBJECT (dial->adjustment), "value_changed");    }  return FALSE;}static gbooleangtk_dial_motion_notify( GtkWidget      *widget,                        GdkEventMotion *event ){  GtkDial *dial;  GdkModifierType mods;  gint x, y, mask;  g_return_val_if_fail (widget != NULL, FALSE);  g_return_val_if_fail (GTK_IS_DIAL (widget), FALSE);  g_return_val_if_fail (event != NULL, FALSE);  dial = GTK_DIAL (widget);  if (dial->button != 0)    {      x = event->x;      y = event->y;      if (event->is_hint || (event->window != widget->window))	gdk_window_get_pointer (widget->window, &x, &y, &mods);      switch (dial->button)	{	case 1:	  mask = GDK_BUTTON1_MASK;	  break;	case 2:	  mask = GDK_BUTTON2_MASK;	  break;	case 3:	  mask = GDK_BUTTON3_MASK;	  break;	default:	  mask = 0;	  break;	}      if (mods & mask)	gtk_dial_update_mouse (dial, x,y);    }  return FALSE;}static gbooleangtk_dial_timer( GtkDial *dial ){  g_return_val_if_fail (dial != NULL, FALSE);  g_return_val_if_fail (GTK_IS_DIAL (dial), FALSE);  if (dial->policy == GTK_UPDATE_DELAYED)    g_signal_emit_by_name (GTK_OBJECT (dial->adjustment), "value_changed");  return FALSE;}static voidgtk_dial_update_mouse( GtkDial *dial, gint x, gint y ){  gint xc, yc;  gfloat old_value;  g_return_if_fail (dial != NULL);  g_return_if_fail (GTK_IS_DIAL (dial));  xc = GTK_WIDGET(dial)->allocation.width / 2;  yc = GTK_WIDGET(dial)->allocation.height / 2;  old_value = dial->adjustment->value;  dial->angle = atan2(yc-y, x-xc);  if (dial->angle < -M_PI/2.)    dial->angle += 2*M_PI;  if (dial->angle < -M_PI/6)    dial->angle = -M_PI/6;  if (dial->angle > 7.*M_PI/6.)    dial->angle = 7.*M_PI/6.;  dial->adjustment->value = dial->adjustment->lower + (7.*M_PI/6 - dial->angle) *    (dial->adjustment->upper - dial->adjustment->lower) / (4.*M_PI/3.);  if (dial->adjustment->value != old_value)    {      if (dial->policy == GTK_UPDATE_CONTINUOUS)	{	  g_signal_emit_by_name (GTK_OBJECT (dial->adjustment), "value_changed");	}      else	{	  gtk_widget_queue_draw (GTK_WIDGET (dial));	  if (dial->policy == GTK_UPDATE_DELAYED)	    {	      if (dial->timer)		g_source_remove (dial->timer);	      dial->timer = g_timeout_add (SCROLL_DELAY_LENGTH,					   (GtkFunction) gtk_dial_timer,					   (gpointer) dial);	    }	}    }}static voidgtk_dial_update (GtkDial *dial){  gfloat new_value;    g_return_if_fail (dial != NULL);  g_return_if_fail (GTK_IS_DIAL (dial));  new_value = dial->adjustment->value;    if (new_value < dial->adjustment->lower)    new_value = dial->adjustment->lower;  if (new_value > dial->adjustment->upper)    new_value = dial->adjustment->upper;  if (new_value != dial->adjustment->value)    {      dial->adjustment->value = new_value;      g_signal_emit_by_name (GTK_OBJECT (dial->adjustment), "value_changed");    }  dial->angle = 7.*M_PI/6. - (new_value - dial->adjustment->lower) * 4.*M_PI/3. /    (dial->adjustment->upper - dial->adjustment->lower);  gtk_widget_queue_draw (GTK_WIDGET (dial));}static voidgtk_dial_adjustment_changed (GtkAdjustment *adjustment,			      gpointer       data){  GtkDial *dial;  g_return_if_fail (adjustment != NULL);  g_return_if_fail (data != NULL);  dial = GTK_DIAL (data);  if ((dial->old_value != adjustment->value) ||      (dial->old_lower != adjustment->lower) ||      (dial->old_upper != adjustment->upper))    {      gtk_dial_update (dial);      dial->old_value = adjustment->value;      dial->old_lower = adjustment->lower;      dial->old_upper = adjustment->upper;    }}static voidgtk_dial_adjustment_value_changed (GtkAdjustment *adjustment,				    gpointer       data){  GtkDial *dial;  g_return_if_fail (adjustment != NULL);  g_return_if_fail (data != NULL);  dial = GTK_DIAL (data);  if (dial->old_value != adjustment->value)    {      gtk_dial_update (dial);      dial->old_value = adjustment->value;    }}

⌨️ 快捷键说明

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