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

📄 gtktooltips.c

📁 gtk是linux一款强大的夸平台的图形化开发工具
💻 C
📖 第 1 页 / 共 2 页
字号:
  tooltips->enabled = FALSE;}voidgtk_tooltips_set_delay (GtkTooltips *tooltips,                        guint         delay){  g_return_if_fail (tooltips != NULL);  tooltips->delay = delay;}GtkTooltipsData*gtk_tooltips_data_get (GtkWidget       *widget){  g_return_val_if_fail (widget != NULL, NULL);  return gtk_object_get_data ((GtkObject*) widget, tooltips_data_key);}voidgtk_tooltips_set_tip (GtkTooltips *tooltips,		      GtkWidget   *widget,		      const gchar *tip_text,		      const gchar *tip_private){  GtkTooltipsData *tooltipsdata;  g_return_if_fail (tooltips != NULL);  g_return_if_fail (GTK_IS_TOOLTIPS (tooltips));  g_return_if_fail (widget != NULL);  tooltipsdata = gtk_tooltips_data_get (widget);  if (tooltipsdata)    gtk_tooltips_widget_remove (tooltipsdata->widget, tooltipsdata);  if (!tip_text)    return;  tooltipsdata = g_new0 (GtkTooltipsData, 1);  if (tooltipsdata != NULL)    {      tooltipsdata->tooltips = tooltips;      tooltipsdata->widget = widget;      gtk_widget_ref (widget);      tooltipsdata->tip_text = g_strdup (tip_text);      tooltipsdata->tip_private = g_strdup (tip_private);      /* Flag data as unitialized */      tooltipsdata->font = NULL;      tooltips->tips_data_list = g_list_append (tooltips->tips_data_list,                                             tooltipsdata);      gtk_signal_connect_after(GTK_OBJECT (widget), "event",                               (GtkSignalFunc) gtk_tooltips_event_handler, 	                       (gpointer) tooltipsdata);      gtk_object_set_data (GTK_OBJECT (widget), tooltips_data_key,                           (gpointer) tooltipsdata);      gtk_signal_connect (GTK_OBJECT (widget), "unmap",                          (GtkSignalFunc) gtk_tooltips_widget_unmap,                          (gpointer) tooltipsdata);      gtk_signal_connect (GTK_OBJECT (widget), "unrealize",                          (GtkSignalFunc) gtk_tooltips_widget_unmap,                          (gpointer) tooltipsdata);      gtk_signal_connect (GTK_OBJECT (widget), "destroy",			  (GtkSignalFunc) gtk_tooltips_widget_remove,			  (gpointer) tooltipsdata);    }}voidgtk_tooltips_set_colors (GtkTooltips *tooltips,			 GdkColor    *background,			 GdkColor    *foreground){  g_return_if_fail (tooltips != NULL);  if (background != NULL)    tooltips->foreground = foreground;  if (foreground != NULL)    tooltips->background = background;}static gintgtk_tooltips_paint_window (GtkTooltips *tooltips){  GtkStyle *style;  gint y, baseline_skip, gap;  GtkTooltipsData *data;  GList *el;  style = tooltips->tip_window->style;  gap = (style->font->ascent + style->font->descent) / 4;  if (gap < 2)    gap = 2;  baseline_skip = style->font->ascent + style->font->descent + gap;  data = tooltips->active_tips_data;  if (!data)    return FALSE;  gtk_paint_flat_box(style, tooltips->tip_window->window,		     GTK_STATE_NORMAL, GTK_SHADOW_OUT, 		     NULL, GTK_WIDGET(tooltips->tip_window), "tooltip",		     0, 0, -1, -1);  y = style->font->ascent + 4;    for (el = data->row; el; el = el->next)    {      if (el->data)	{	  gtk_paint_string (style, tooltips->tip_window->window, 			    GTK_STATE_NORMAL, 			    NULL, GTK_WIDGET(tooltips->tip_window), "tooltip",			    4, y, el->data);	  y += baseline_skip;	}      else	y += baseline_skip / 2;    }  return FALSE;}static voidgtk_tooltips_draw_tips (GtkTooltips * tooltips){  GtkWidget *widget;  GtkStyle *style;  gint gap, x, y, w, h, scr_w, scr_h, baseline_skip;  GtkTooltipsData *data;  GList *el;  if (!tooltips->tip_window)    gtk_tooltips_force_window (tooltips);  else if (GTK_WIDGET_VISIBLE (tooltips->tip_window))    gtk_widget_hide (tooltips->tip_window);  gtk_widget_ensure_style (tooltips->tip_window);  style = tooltips->tip_window->style;    widget = tooltips->active_tips_data->widget;  scr_w = gdk_screen_width ();  scr_h = gdk_screen_height ();  data = tooltips->active_tips_data;  if (data->font != style->font)    gtk_tooltips_layout_text (tooltips, data);  gap = (style->font->ascent + style->font->descent) / 4;  if (gap < 2)    gap = 2;  baseline_skip = style->font->ascent + style->font->descent + gap;  w = data->width;  h = 8 - gap;  for (el = data->row; el; el = el->next)    if (el->data)      h += baseline_skip;    else      h += baseline_skip / 2;  if (h < 8)    h = 8;  gdk_window_get_pointer (NULL, &x, NULL, NULL);  gdk_window_get_origin (widget->window, NULL, &y);  if (GTK_WIDGET_NO_WINDOW (widget))    y += widget->allocation.y;  x -= ((w >> 1) + 4);  if ((x + w) > scr_w)    x -= (x + w) - scr_w;  else if (x < 0)    x = 0;  if ((y + h + widget->allocation.height + 4) > scr_h)    y = y - h - 4;  else    y = y + widget->allocation.height + 4;  gtk_widget_set_usize (tooltips->tip_window, w, h);  gtk_widget_popup (tooltips->tip_window, x, y);}static gintgtk_tooltips_timeout (gpointer data){  GtkTooltips *tooltips = (GtkTooltips *) data;  GDK_THREADS_ENTER ();    if (tooltips->active_tips_data != NULL &&      GTK_WIDGET_DRAWABLE (tooltips->active_tips_data->widget))    gtk_tooltips_draw_tips (tooltips);  GDK_THREADS_LEAVE ();  return FALSE;}static voidgtk_tooltips_set_active_widget (GtkTooltips *tooltips,                                GtkWidget   *widget){  if (tooltips->tip_window)    gtk_widget_hide (tooltips->tip_window);  if (tooltips->timer_tag)    {      gtk_timeout_remove (tooltips->timer_tag);      tooltips->timer_tag = 0;    }    tooltips->active_tips_data = NULL;    if (widget)    {      GList *list;            for (list = tooltips->tips_data_list; list; list = list->next)	{	  GtkTooltipsData *tooltipsdata;	  	  tooltipsdata = list->data;	  	  if (tooltipsdata->widget == widget &&	      GTK_WIDGET_DRAWABLE (widget))	    {	      tooltips->active_tips_data = tooltipsdata;	      break;	    }	}    }}static gintgtk_tooltips_event_handler (GtkWidget *widget,                            GdkEvent  *event){  GtkTooltips *tooltips;  GtkTooltipsData *old_tips_data;  GtkWidget *event_widget;  if ((event->type == GDK_LEAVE_NOTIFY || event->type == GDK_ENTER_NOTIFY) &&      event->crossing.detail == GDK_NOTIFY_INFERIOR)    return FALSE;  event_widget = gtk_get_event_widget (event);  if (event_widget != widget)    return FALSE;    old_tips_data = gtk_tooltips_data_get (widget);  tooltips = old_tips_data->tooltips;  switch (event->type)    {    case GDK_MOTION_NOTIFY:    case GDK_EXPOSE:      /* do nothing */      break;          case GDK_ENTER_NOTIFY:      old_tips_data = tooltips->active_tips_data;      if (tooltips->enabled &&	  (!old_tips_data || old_tips_data->widget != widget))	{	  gtk_tooltips_set_active_widget (tooltips, widget);	  	  tooltips->timer_tag = gtk_timeout_add (tooltips->delay,						 gtk_tooltips_timeout,						 (gpointer) tooltips);	}      break;    default:      gtk_tooltips_set_active_widget (tooltips, NULL);      break;    }  return FALSE;}static voidgtk_tooltips_widget_unmap (GtkWidget *widget,			   gpointer   data){  GtkTooltipsData *tooltipsdata = (GtkTooltipsData *)data;  GtkTooltips *tooltips = tooltipsdata->tooltips;    if (tooltips->active_tips_data &&      (tooltips->active_tips_data->widget == widget))    gtk_tooltips_set_active_widget (tooltips, NULL);}static voidgtk_tooltips_widget_remove (GtkWidget *widget,			    gpointer   data){  GtkTooltipsData *tooltipsdata = (GtkTooltipsData*) data;  GtkTooltips *tooltips = tooltipsdata->tooltips;  gtk_tooltips_widget_unmap (widget, data);  tooltips->tips_data_list = g_list_remove (tooltips->tips_data_list,					    tooltipsdata);  gtk_tooltips_destroy_data (tooltipsdata);}

⌨️ 快捷键说明

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