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

📄 gtktext.c

📁 gtk是linux一款强大的夸平台的图形化开发工具
💻 C
📖 第 1 页 / 共 5 页
字号:
	    }	  attrmask |= GDK_IC_PREEDIT_POSITION_REQ;	  gdk_window_get_size (text->text_area, &width, &height);	  attr->spot_location.x = 0;	  attr->spot_location.y = height;	  attr->preedit_area.x = 0;	  attr->preedit_area.y = 0;	  attr->preedit_area.width = width;	  attr->preedit_area.height = height;	  attr->preedit_fontset = widget->style->font;	  	  break;	}      editable->ic = gdk_ic_new (attr, attrmask);            if (editable->ic == NULL)	g_warning ("Can't create input context.");      else	{	  mask = gdk_window_get_events (text->text_area);	  mask |= gdk_ic_get_events (editable->ic);	  gdk_window_set_events (text->text_area, mask);	  	  if (GTK_WIDGET_HAS_FOCUS (widget))	    gdk_im_begin (editable->ic, text->text_area);	}    }#endif  realize_properties (text);  gdk_window_show (text->text_area);  init_properties (text);  if (editable->selection_start_pos != editable->selection_end_pos)    gtk_editable_claim_selection (editable, TRUE, GDK_CURRENT_TIME);    recompute_geometry (text);}static void gtk_text_style_set	(GtkWidget      *widget,			 GtkStyle       *previous_style){  GtkText *text;    g_return_if_fail (widget != NULL);  g_return_if_fail (GTK_IS_TEXT (widget));    text = GTK_TEXT (widget);  if (GTK_WIDGET_REALIZED (widget))    {      gdk_window_set_background (widget->window, &widget->style->base[GTK_STATE_NORMAL]);      gdk_window_set_background (text->text_area, &widget->style->base[GTK_STATE_NORMAL]);            if (text->bg_gc)	{	  gdk_gc_destroy (text->bg_gc);	  text->bg_gc = NULL;	}      if (widget->style->bg_pixmap[GTK_STATE_NORMAL])	text->bg_gc = create_bg_gc (text);      recompute_geometry (text);    }  if (text->current_font)    text_font_unref (text->current_font);  text->current_font = get_text_font (widget->style->font);}static voidgtk_text_unrealize (GtkWidget *widget){  GtkText *text;    g_return_if_fail (widget != NULL);  g_return_if_fail (GTK_IS_TEXT (widget));    text = GTK_TEXT (widget);#ifdef USE_XIM  if (GTK_EDITABLE (widget)->ic)    {      gdk_ic_destroy (GTK_EDITABLE (widget)->ic);      GTK_EDITABLE (widget)->ic = NULL;    }  if (GTK_EDITABLE (widget)->ic_attr)    {      gdk_ic_attr_destroy (GTK_EDITABLE (widget)->ic_attr);      GTK_EDITABLE (widget)->ic_attr = NULL;    }#endif  gdk_window_set_user_data (text->text_area, NULL);  gdk_window_destroy (text->text_area);  text->text_area = NULL;    gdk_gc_destroy (text->gc);  text->gc = NULL;  if (text->bg_gc)    {      gdk_gc_destroy (text->bg_gc);      text->bg_gc = NULL;    }    gdk_pixmap_unref (text->line_wrap_bitmap);  gdk_pixmap_unref (text->line_arrow_bitmap);  unrealize_properties (text);  free_cache (text);  if (GTK_WIDGET_CLASS (parent_class)->unrealize)    (* GTK_WIDGET_CLASS (parent_class)->unrealize) (widget);}static voidclear_focus_area (GtkText *text, gint area_x, gint area_y, gint area_width, gint area_height){  GtkWidget *widget = GTK_WIDGET (text);    gint ythick = TEXT_BORDER_ROOM + widget->style->klass->ythickness;  gint xthick = TEXT_BORDER_ROOM + widget->style->klass->xthickness;    gint width, height;    gdk_window_get_size (widget->style->bg_pixmap[GTK_STATE_NORMAL], &width, &height);    gdk_gc_set_ts_origin (text->bg_gc,			(- (gint)text->first_onscreen_hor_pixel + xthick) % width,			(- (gint)text->first_onscreen_ver_pixel + ythick) % height);  gdk_draw_rectangle (GTK_WIDGET (text)->window, text->bg_gc, TRUE,		      area_x, area_y, area_width, area_height);}static voidgtk_text_draw_focus (GtkWidget *widget){  GtkText *text;  gint width, height;  gint x, y;    g_return_if_fail (widget != NULL);  g_return_if_fail (GTK_IS_TEXT (widget));    text = GTK_TEXT (widget);    if (GTK_WIDGET_DRAWABLE (widget))    {      gint ythick = widget->style->klass->ythickness;      gint xthick = widget->style->klass->xthickness;      gint xextra = TEXT_BORDER_ROOM;      gint yextra = TEXT_BORDER_ROOM;            TDEBUG (("in gtk_text_draw_focus\n"));            x = 0;      y = 0;      width = widget->allocation.width;      height = widget->allocation.height;            if (GTK_WIDGET_HAS_FOCUS (widget))	{	  x += 1;	  y += 1;	  width -=  2;	  height -= 2;	  xextra -= 1;	  yextra -= 1;	  gtk_paint_focus (widget->style, widget->window,			   NULL, widget, "text",			   0, 0,			   widget->allocation.width - 1,			   widget->allocation.height - 1);	}      gtk_paint_shadow (widget->style, widget->window,			GTK_STATE_NORMAL, GTK_SHADOW_IN,			NULL, widget, "text",			x, y, width, height);      x += xthick;       y += ythick;      width -= 2 * xthick;      height -= 2 * ythick;            if (widget->style->bg_pixmap[GTK_STATE_NORMAL])	{	  /* top rect */	  clear_focus_area (text, x, y, width, yextra);	  /* left rect */	  clear_focus_area (text, x, y + yextra, 			    xextra, y + height - 2 * yextra);	  /* right rect */	  clear_focus_area (text, x + width - xextra, y + yextra, 			    xextra, height - 2 * ythick);	  /* bottom rect */	  clear_focus_area (text, x, x + height - yextra, width, yextra);	}    }  else    {      TDEBUG (("in gtk_text_draw_focus (undrawable !!!)\n"));    }}static voidgtk_text_size_request (GtkWidget      *widget,		       GtkRequisition *requisition){  gint xthickness;  gint ythickness;  gint char_height;  gint char_width;    g_return_if_fail (widget != NULL);  g_return_if_fail (GTK_IS_TEXT (widget));  g_return_if_fail (requisition != NULL);    xthickness = widget->style->klass->xthickness + TEXT_BORDER_ROOM;  ythickness = widget->style->klass->ythickness + TEXT_BORDER_ROOM;    char_height = MIN_TEXT_HEIGHT_LINES * (widget->style->font->ascent +					 widget->style->font->descent);    char_width = MIN_TEXT_WIDTH_LINES * (gdk_text_width (widget->style->font,						       "ABCDEFGHIJKLMNOPQRSTUVWXYZ",						       26)				       / 26);    requisition->width  = char_width  + xthickness * 2;  requisition->height = char_height + ythickness * 2;}static voidgtk_text_size_allocate (GtkWidget     *widget,			GtkAllocation *allocation){  GtkText *text;  GtkEditable *editable;    g_return_if_fail (widget != NULL);  g_return_if_fail (GTK_IS_TEXT (widget));  g_return_if_fail (allocation != NULL);    text = GTK_TEXT (widget);  editable = GTK_EDITABLE (widget);    widget->allocation = *allocation;  if (GTK_WIDGET_REALIZED (widget))    {      gdk_window_move_resize (widget->window,			      allocation->x, allocation->y,			      allocation->width, allocation->height);            gdk_window_move_resize (text->text_area,			      widget->style->klass->xthickness + TEXT_BORDER_ROOM,			      widget->style->klass->ythickness + TEXT_BORDER_ROOM,			      MAX (1, (gint)widget->allocation.width - (gint)(widget->style->klass->xthickness +							  (gint)TEXT_BORDER_ROOM) * 2),			      MAX (1, (gint)widget->allocation.height - (gint)(widget->style->klass->ythickness +							   (gint)TEXT_BORDER_ROOM) * 2));      #ifdef USE_XIM      if (editable->ic && (gdk_ic_get_style (editable->ic) & GDK_IM_PREEDIT_POSITION))	{	  gint width, height;	  	  gdk_window_get_size (text->text_area, &width, &height);	  editable->ic_attr->preedit_area.width = width;	  editable->ic_attr->preedit_area.height = height;	  gdk_ic_set_attr (editable->ic,	      		   editable->ic_attr, GDK_IC_PREEDIT_AREA);	}#endif            recompute_geometry (text);    }}static voidgtk_text_draw (GtkWidget    *widget,	       GdkRectangle *area){  g_return_if_fail (widget != NULL);  g_return_if_fail (GTK_IS_TEXT (widget));  g_return_if_fail (area != NULL);    if (GTK_WIDGET_DRAWABLE (widget))    {      expose_text (GTK_TEXT (widget), area, TRUE);      gtk_widget_draw_focus (widget);    }}static gintgtk_text_expose (GtkWidget      *widget,		 GdkEventExpose *event){  g_return_val_if_fail (widget != NULL, FALSE);  g_return_val_if_fail (GTK_IS_TEXT (widget), FALSE);  g_return_val_if_fail (event != NULL, FALSE);    if (event->window == GTK_TEXT (widget)->text_area)    {      TDEBUG (("in gtk_text_expose (expose)\n"));      expose_text (GTK_TEXT (widget), &event->area, TRUE);    }  else if (event->count == 0)    {      TDEBUG (("in gtk_text_expose (focus)\n"));      gtk_widget_draw_focus (widget);    }    return FALSE;}static gintgtk_text_scroll_timeout (gpointer data){  GtkText *text;  GdkEventMotion event;  gint x, y;  GdkModifierType mask;    GDK_THREADS_ENTER ();  text = GTK_TEXT (data);    text->timer = 0;  gdk_window_get_pointer (text->text_area, &x, &y, &mask);    if (mask & (GDK_BUTTON1_MASK | GDK_BUTTON3_MASK))    {      event.is_hint = 0;      event.x = x;      event.y = y;      event.state = mask;            gtk_text_motion_notify (GTK_WIDGET (text), &event);    }  GDK_THREADS_LEAVE ();    return FALSE;}static gintgtk_text_button_press (GtkWidget      *widget,		       GdkEventButton *event){  GtkText *text;  GtkEditable *editable;  static GdkAtom ctext_atom = GDK_NONE;    g_return_val_if_fail (widget != NULL, FALSE);  g_return_val_if_fail (GTK_IS_TEXT (widget), FALSE);  g_return_val_if_fail (event != NULL, FALSE);    if (ctext_atom == GDK_NONE)    ctext_atom = gdk_atom_intern ("COMPOUND_TEXT", FALSE);    text = GTK_TEXT (widget);  editable = GTK_EDITABLE (widget);    if (text->button && (event->button != text->button))    return FALSE;    text->button = event->button;    if (!GTK_WIDGET_HAS_FOCUS (widget))    gtk_widget_grab_focus (widget);    if (event->button == 1)    {      switch (event->type)	{	case GDK_BUTTON_PRESS:	  gtk_grab_add (widget);	  	  undraw_cursor (text, FALSE);	  find_mouse_cursor (text, (gint)event->x, (gint)event->y);	  draw_cursor (text, FALSE);	  	  /* Set it now, so we display things right. We'll unset it	   * later if things don't work out */	  editable->has_selection = TRUE;	  gtk_text_set_selection (GTK_EDITABLE(text),				  text->cursor_mark.index,				  text->cursor_mark.index);	  	  break;	  	case GDK_2BUTTON_PRESS:	  gtk_text_select_word (text, event->time);	  break;	  	case GDK_3BUTTON_PRESS:	  gtk_text_select_line (text, event->time);	  break;	  	default:	  break;	}    }  else if (event->type == GDK_BUTTON_PRESS)    {      if ((event->button == 2) && editable->editable)	{	  if (editable->selection_start_pos == editable->selection_end_pos ||	      editable->has_selection)	    {	      undraw_cursor (text, FALSE);	      find_mouse_cursor (text, (gint)event->x, (gint)event->y);	      draw_cursor (text, FALSE);	      	    }	  	  gtk_selection_convert (widget, GDK_SELECTION_PRIMARY,				 ctext_atom, event->time);	}      else	{	  gtk_grab_add (widget);	  	  undraw_cursor (text, FALSE);	  find_mouse_cursor (text, event->x, event->y);	  draw_cursor (text, FALSE);	  	  gtk_text_set_selection (GTK_EDITABLE(text),				  text->cursor_mark.index,				  text->cursor_mark.index);	  	  editable->has_selection = FALSE;	  if (gdk_selection_owner_get (GDK_SELECTION_PRIMARY) == widget->window)	    gtk_selection_owner_set (NULL, GDK_SELECTION_PRIMARY, event->time);	}    }    return FALSE;}static gintgtk_text_button_release (GtkWidget      *widget,			 GdkEventButton *event){  GtkText *text;  GtkEditable *editable;  g_return_val_if_fail (widget != NULL, FALSE);

⌨️ 快捷键说明

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