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

📄 gtktext.c

📁 gtk是linux一款强大的夸平台的图形化开发工具
💻 C
📖 第 1 页 / 共 5 页
字号:
  g_return_val_if_fail (GTK_IS_TEXT (widget), FALSE);  g_return_val_if_fail (event != NULL, FALSE);    text = GTK_TEXT (widget);    gtk_grab_remove (widget);    if (text->button != event->button)    return FALSE;    text->button = 0;    if (text->timer)    {      gtk_timeout_remove (text->timer);      text->timer = 0;    }    if (event->button == 1)    {      text = GTK_TEXT (widget);      editable = GTK_EDITABLE (widget);            gtk_grab_remove (widget);            editable->has_selection = FALSE;      if (editable->selection_start_pos != editable->selection_end_pos)	{	  if (gtk_selection_owner_set (widget,				       GDK_SELECTION_PRIMARY,				       event->time))	    editable->has_selection = TRUE;	  else	    gtk_text_update_text (editable, editable->selection_start_pos,				  editable->selection_end_pos);	}      else	{	  if (gdk_selection_owner_get (GDK_SELECTION_PRIMARY) == widget->window)	    gtk_selection_owner_set (NULL, GDK_SELECTION_PRIMARY, event->time);	}    }  else if (event->button == 3)    {      gtk_grab_remove (widget);    }    undraw_cursor (text, FALSE);  find_cursor (text, TRUE);  draw_cursor (text, FALSE);    return FALSE;}static gintgtk_text_motion_notify (GtkWidget      *widget,			GdkEventMotion *event){  GtkText *text;  gint x, y;  gint height;  GdkModifierType mask;    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);    text = GTK_TEXT (widget);    x = event->x;  y = event->y;  mask = event->state;  if (event->is_hint || (text->text_area != event->window))    {      gdk_window_get_pointer (text->text_area, &x, &y, &mask);    }    if ((text->button == 0) ||      !(mask & (GDK_BUTTON1_MASK | GDK_BUTTON3_MASK)))    return FALSE;    gdk_window_get_size (text->text_area, NULL, &height);    if ((y < 0) || (y > height))    {      if (text->timer == 0)	{	  text->timer = gtk_timeout_add (SCROLL_TIME, 					 gtk_text_scroll_timeout,					 text);	  	  if (y < 0)	    scroll_int (text, y/2);	  else	    scroll_int (text, (y - height)/2);	}      else	return FALSE;    }    undraw_cursor (GTK_TEXT (widget), FALSE);  find_mouse_cursor (GTK_TEXT (widget), x, y);  draw_cursor (GTK_TEXT (widget), FALSE);    gtk_text_set_selection (GTK_EDITABLE(text), 			  GTK_EDITABLE(text)->selection_start_pos,			  text->cursor_mark.index);    return FALSE;}static void gtk_text_insert_text    (GtkEditable       *editable,			 const gchar       *new_text,			 gint               new_text_length,			 gint              *position){  GtkText *text = GTK_TEXT (editable);  GdkFont *font;  GdkColor *fore, *back;  TextProperty *property;  gtk_text_set_point (text, *position);  property = MARK_CURRENT_PROPERTY (&text->point);  font = property->flags & PROPERTY_FONT ? property->font->gdk_font : NULL;   fore = property->flags & PROPERTY_FOREGROUND ? &property->fore_color : NULL;   back = property->flags & PROPERTY_BACKGROUND ? &property->back_color : NULL;     gtk_text_insert (text, font, fore, back, new_text, new_text_length);  *position = text->point.index;}static void gtk_text_delete_text    (GtkEditable       *editable,			 gint               start_pos,			 gint               end_pos){  GtkText *text;    g_return_if_fail (start_pos >= 0);    text = GTK_TEXT (editable);    gtk_text_set_point (text, start_pos);  if (end_pos < 0)    end_pos = TEXT_LENGTH (text);    if (end_pos > start_pos)    gtk_text_forward_delete (text, end_pos - start_pos);}static gintgtk_text_key_press (GtkWidget   *widget,		    GdkEventKey *event){  GtkText *text;  GtkEditable *editable;  gchar key;  gint return_val;  gint position;    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);    return_val = FALSE;    text = GTK_TEXT (widget);  editable = GTK_EDITABLE (widget);    key = event->keyval;  return_val = TRUE;    if ((GTK_EDITABLE(text)->editable == FALSE))    {      switch (event->keyval)	{	case GDK_Home:      	  if (event->state & GDK_CONTROL_MASK)	    scroll_int (text, -text->vadj->value);	  else	    return_val = FALSE;	  break;	case GDK_End:	  if (event->state & GDK_CONTROL_MASK)	    scroll_int (text, +text->vadj->upper); 	  else	    return_val = FALSE;	  break;	case GDK_Page_Up:   scroll_int (text, -text->vadj->page_increment); break;	case GDK_Page_Down: scroll_int (text, +text->vadj->page_increment); break;	case GDK_Up:        scroll_int (text, -KEY_SCROLL_PIXELS); break;	case GDK_Down:      scroll_int (text, +KEY_SCROLL_PIXELS); break;	case GDK_Return:	  if (event->state & GDK_CONTROL_MASK)	    gtk_signal_emit_by_name (GTK_OBJECT (text), "activate");	  else	    return_val = FALSE;	  break;	default:	  return_val = FALSE;	  break;	}    }  else    {      gint extend_selection;      gint extend_start;      guint initial_pos = editable->current_pos;            text->point = find_mark (text, text->cursor_mark.index);            extend_selection = event->state & GDK_SHIFT_MASK;      extend_start = FALSE;            if (extend_selection)	{	  editable->has_selection = TRUE;	  	  if (editable->selection_start_pos == editable->selection_end_pos)	    {	      editable->selection_start_pos = text->point.index;	      editable->selection_end_pos = text->point.index;	    }	  	  extend_start = (text->point.index == editable->selection_start_pos);	}            switch (event->keyval)	{	case GDK_Home:	  if (event->state & GDK_CONTROL_MASK)	    move_cursor_buffer_ver (text, -1);	  else	    gtk_text_move_beginning_of_line (text);	  break;	case GDK_End:	  if (event->state & GDK_CONTROL_MASK)	    move_cursor_buffer_ver (text, +1);	  else	    gtk_text_move_end_of_line (text);	  break;	case GDK_Page_Up:   move_cursor_page_ver (text, -1); break;	case GDK_Page_Down: move_cursor_page_ver (text, +1); break;	  /* CUA has Ctrl-Up/Ctrl-Down as paragraph up down */	case GDK_Up:        move_cursor_ver (text, -1); break;	case GDK_Down:      move_cursor_ver (text, +1); break;	case GDK_Left:	  if (event->state & GDK_CONTROL_MASK)	    gtk_text_move_backward_word (text);	  else	    move_cursor_hor (text, -1); 	  break;	case GDK_Right:     	  if (event->state & GDK_CONTROL_MASK)	    gtk_text_move_forward_word (text);	  else	    move_cursor_hor (text, +1); 	  break;	  	case GDK_BackSpace:	  if (event->state & GDK_CONTROL_MASK)	    gtk_text_delete_backward_word (text);	  else	    gtk_text_delete_backward_character (text);	  break;	case GDK_Clear:	  gtk_text_delete_line (text);	  break;	case GDK_Insert:	  if (event->state & GDK_SHIFT_MASK)	    {	      extend_selection = FALSE;	      gtk_editable_paste_clipboard (editable);	    }	  else if (event->state & GDK_CONTROL_MASK)	    {	      gtk_editable_copy_clipboard (editable);	    }	  else	    {	      /* gtk_toggle_insert(text) -- IMPLEMENT */	    }	  break;	case GDK_Delete:	  if (event->state & GDK_CONTROL_MASK)	    gtk_text_delete_forward_word (text);	  else if (event->state & GDK_SHIFT_MASK)	    {	      extend_selection = FALSE;	      gtk_editable_cut_clipboard (editable);	    }	  else	    gtk_text_delete_forward_character (text);	  break;	case GDK_Tab:	  position = text->point.index;	  gtk_editable_insert_text (editable, "\t", 1, &position);	  break;	case GDK_Return:	  if (event->state & GDK_CONTROL_MASK)	    gtk_signal_emit_by_name (GTK_OBJECT (text), "activate");	  else	    {	      position = text->point.index;	      gtk_editable_insert_text (editable, "\n", 1, &position);	    }	  break;	case GDK_Escape:	  /* Don't insert literally */	  return_val = FALSE;	  break;	  	default:	  return_val = FALSE;	  	  if (event->state & GDK_CONTROL_MASK)	    {	      if ((key >= 'A') && (key <= 'Z'))		key -= 'A' - 'a';	      	      if ((key >= 'a') && (key <= 'z') && control_keys[(int) (key - 'a')])		{		  (* control_keys[(int) (key - 'a')]) (editable, event->time);		  return_val = TRUE;		}	      	      break;	    }	  else if (event->state & GDK_MOD1_MASK)	    {	      if ((key >= 'A') && (key <= 'Z'))		key -= 'A' - 'a';	      	      if ((key >= 'a') && (key <= 'z') && alt_keys[(int) (key - 'a')])		{		  (* alt_keys[(int) (key - 'a')]) (editable, event->time);		  return_val = TRUE;		}	      	      break;	    }	  else if (event->length > 0)	    {	      extend_selection = FALSE;	      	      gtk_editable_delete_selection (editable);	      position = text->point.index;	      gtk_editable_insert_text (editable, event->string, event->length, &position);	      	      return_val = TRUE;	    }	  else	    return_val = FALSE;	}            if (return_val && (editable->current_pos != initial_pos))	{	  if (extend_selection)	    {	      if (editable->current_pos < editable->selection_start_pos)		gtk_text_set_selection (editable, editable->current_pos,					editable->selection_end_pos);	      else if (editable->current_pos > editable->selection_end_pos)		gtk_text_set_selection (editable, editable->selection_start_pos,					editable->current_pos);	      else		{		  if (extend_start)		    gtk_text_set_selection (editable, editable->current_pos,					    editable->selection_end_pos);		  else		    gtk_text_set_selection (editable, editable->selection_start_pos,					    editable->current_pos);		}	    }	  else	    gtk_text_set_selection (editable, 0, 0);	  	  gtk_editable_claim_selection (editable,					editable->selection_start_pos != editable->selection_end_pos,					event->time);	}    }    return return_val;}static gintgtk_text_focus_in (GtkWidget     *widget,		   GdkEventFocus *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);    TDEBUG (("in gtk_text_focus_in\n"));    GTK_WIDGET_SET_FLAGS (widget, GTK_HAS_FOCUS);  gtk_widget_draw_focus (widget);  #ifdef USE_XIM  if (GTK_EDITABLE(widget)->ic)    gdk_im_begin (GTK_EDITABLE(widget)->ic, GTK_TEXT(widget)->text_area);#endif    draw_cursor (GTK_TEXT(widget), TRUE);    return FALSE;}static gintgtk_text_focus_out (GtkWidget     *widget,		    GdkEventFocus *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);    TDEBUG (("in gtk_text_focus_out\n"));    GTK_WIDGET_UNSET_FLAGS (widget, GTK_HAS_FOCUS);  gtk_widget_draw_focus (widget);    undraw_cursor (GTK_TEXT(widget), TRUE);  #ifdef USE_XIM  gdk_im_end ();#endif    return FALSE;}static voidgtk_text_adjustment (GtkAdjustment *adjustment,		     GtkText       *text){  gfloat old_val;    g_return_if_fail (adjustment != NULL);  g_return_if_fail (GTK_IS_ADJUSTMENT (adjustment));  g_return_if_fail (text != NULL);  g_return_if_fail (GTK_IS_TEXT (text));  /* Clamp the value here, because we'll get really confused   * if someone tries to move the adjusment outside of the   * allowed bounds   */  old_val = adjustment->value;  adjustment->value = MIN (adjustment->value, adjustment->upper - adjus

⌨️ 快捷键说明

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