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

📄 gtkeditable.c

📁 gtk是linux一款强大的夸平台的图形化开发工具
💻 C
📖 第 1 页 / 共 2 页
字号:
gtk_editable_get_public_chars (GtkEditable      *editable,			       gint              start,			       gint              end){  if (editable->visible)    return gtk_editable_get_chars (editable, start, end);  else    {      gint i;      gint nchars = end - start;      gchar *str;             if (nchars < 0)	nchars = -nchars;      str = g_new (gchar, nchars + 1);      for (i = 0; i<nchars; i++)	str[i] = '*';      str[i] = '\0';      return str;    }}static voidgtk_editable_set_selection (GtkEditable *editable,			    gint      start_pos,			    gint      end_pos){  GtkEditableClass *klass;  g_return_if_fail (editable != NULL);  g_return_if_fail (GTK_IS_EDITABLE (editable));  klass = GTK_EDITABLE_CLASS (GTK_OBJECT (editable)->klass);  klass->set_selection (editable, start_pos, end_pos);}voidgtk_editable_set_position (GtkEditable      *editable,			   gint              position){  GtkEditableClass *klass;  g_return_if_fail (editable != NULL);  g_return_if_fail (GTK_IS_EDITABLE (editable));  klass = GTK_EDITABLE_CLASS (GTK_OBJECT (editable)->klass);  klass->set_position (editable, position);}gintgtk_editable_get_position (GtkEditable      *editable){  g_return_val_if_fail (editable != NULL, -1);  g_return_val_if_fail (GTK_IS_EDITABLE (editable), -1);  return editable->current_pos;}static gintgtk_editable_selection_clear (GtkWidget         *widget,			      GdkEventSelection *event){  GtkEditable *editable;    g_return_val_if_fail (widget != NULL, FALSE);  g_return_val_if_fail (GTK_IS_EDITABLE (widget), FALSE);  g_return_val_if_fail (event != NULL, FALSE);    /* Let the selection handling code know that the selection   * has been changed, since we've overriden the default handler */  if (!gtk_selection_clear (widget, event))    return FALSE;    editable = GTK_EDITABLE (widget);    if (event->selection == GDK_SELECTION_PRIMARY)    {      if (editable->has_selection)	{	  editable->has_selection = FALSE;	  gtk_editable_update_text (editable, editable->selection_start_pos,				    editable->selection_end_pos);	}    }  else if (event->selection == clipboard_atom)    {      g_free (editable->clipboard_text);      editable->clipboard_text = NULL;    }    return TRUE;}static voidgtk_editable_selection_get (GtkWidget        *widget,			    GtkSelectionData *selection_data,			    guint             info,			    guint             time){  GtkEditable *editable;  gint selection_start_pos;  gint selection_end_pos;  gchar *str;  gint length;  g_return_if_fail (widget != NULL);  g_return_if_fail (GTK_IS_EDITABLE (widget));  editable = GTK_EDITABLE (widget);  if (selection_data->selection == GDK_SELECTION_PRIMARY)    {      selection_start_pos = MIN (editable->selection_start_pos, editable->selection_end_pos);      selection_end_pos = MAX (editable->selection_start_pos, editable->selection_end_pos);      str = gtk_editable_get_public_chars(editable, 					  selection_start_pos, 					  selection_end_pos);      if (!str)	 return;		/* Refuse */      length = strlen (str);    }  else				/* CLIPBOARD */    {      if (!editable->clipboard_text)	return;			/* Refuse */      str = editable->clipboard_text;      length = strlen (editable->clipboard_text);    }    if (info == TARGET_STRING)    {      gtk_selection_data_set (selection_data,                              GDK_SELECTION_TYPE_STRING,                              8*sizeof(gchar), (guchar *)str, length);    }  else if ((info == TARGET_TEXT) || (info == TARGET_COMPOUND_TEXT))    {      guchar *text;      gchar c;      GdkAtom encoding;      gint format;      gint new_length;      c = str[length];      str[length] = '\0';      gdk_string_to_compound_text (str, &encoding, &format, &text, &new_length);      gtk_selection_data_set (selection_data, encoding, format, text, new_length);      gdk_free_compound_text (text);      str[length] = c;    }  if (str != editable->clipboard_text)    g_free (str);}static voidgtk_editable_selection_received  (GtkWidget         *widget,				  GtkSelectionData  *selection_data,				  guint              time){  GtkEditable *editable;  gint reselect;  gint old_pos;  gint tmp_pos;  enum {INVALID, STRING, CTEXT} type;  g_return_if_fail (widget != NULL);  g_return_if_fail (GTK_IS_EDITABLE (widget));  editable = GTK_EDITABLE (widget);  if (selection_data->type == GDK_TARGET_STRING)    type = STRING;  else if ((selection_data->type == gdk_atom_intern ("COMPOUND_TEXT", FALSE)) ||	   (selection_data->type == gdk_atom_intern ("TEXT", FALSE)))    type = CTEXT;  else    type = INVALID;  if (type == INVALID || selection_data->length < 0)    {    /* avoid infinite loop */    if (selection_data->target != GDK_TARGET_STRING)      gtk_selection_convert (widget, selection_data->selection,			     GDK_TARGET_STRING, time);    return;  }  reselect = FALSE;  if ((editable->selection_start_pos != editable->selection_end_pos) &&       (!editable->has_selection ||        (selection_data->selection == clipboard_atom)))    {      reselect = TRUE;      /* Don't want to call gtk_editable_delete_selection here if we are going       * to reclaim the selection to avoid extra server traffic */      if (editable->has_selection)	{	  gtk_editable_delete_text (editable,				 MIN (editable->selection_start_pos, editable->selection_end_pos),				 MAX (editable->selection_start_pos, editable->selection_end_pos));	}      else	gtk_editable_delete_selection (editable);    }  tmp_pos = old_pos = editable->current_pos;  switch (type)    {    case STRING:      selection_data->data[selection_data->length] = 0;      gtk_editable_insert_text (editable, (gchar *)selection_data->data,				strlen ((gchar *)selection_data->data), 				&tmp_pos);      editable->current_pos = tmp_pos;      break;    case CTEXT:      {	gchar **list;	gint count;	gint i;	count = gdk_text_property_to_text_list (selection_data->type,						selection_data->format, 	      					selection_data->data,						selection_data->length,						&list);	for (i=0; i<count; i++) 	  {	    gtk_editable_insert_text (editable, list[i], strlen (list[i]), &tmp_pos);	    editable->current_pos = tmp_pos;	  }	if (count > 0)	  gdk_free_text_list (list);      }      break;    case INVALID:		/* quiet compiler */      break;    }  if (reselect)    gtk_editable_set_selection (editable, old_pos, editable->current_pos);}voidgtk_editable_delete_selection (GtkEditable *editable){  guint start;  guint end;  g_return_if_fail (editable != NULL);  g_return_if_fail (GTK_IS_EDITABLE (editable));  if (!editable->editable)    return;  start = editable->selection_start_pos;  end = editable->selection_end_pos;  editable->selection_start_pos = 0;  editable->selection_end_pos = 0;  if (start != end)    gtk_editable_delete_text (editable, MIN (start, end), MAX (start,end));  if (editable->has_selection)    {      editable->has_selection = FALSE;      if (gdk_selection_owner_get (GDK_SELECTION_PRIMARY) == GTK_WIDGET (editable)->window)	gtk_selection_owner_set (NULL, GDK_SELECTION_PRIMARY, GDK_CURRENT_TIME);    }}voidgtk_editable_claim_selection (GtkEditable *editable, 			      gboolean  claim, 			      guint32   time){  g_return_if_fail (editable != NULL);  g_return_if_fail (GTK_IS_EDITABLE (editable));  g_return_if_fail (GTK_WIDGET_REALIZED (editable));  editable->has_selection = FALSE;    if (claim)    {      if (gtk_selection_owner_set (GTK_WIDGET(editable), GDK_SELECTION_PRIMARY, time))	editable->has_selection = TRUE;    }  else    {      if (gdk_selection_owner_get (GDK_SELECTION_PRIMARY) == 	  GTK_WIDGET(editable)->window)	gtk_selection_owner_set (NULL, GDK_SELECTION_PRIMARY, time);    }}voidgtk_editable_select_region (GtkEditable *editable,			    gint         start,			    gint         end){  g_return_if_fail (editable != NULL);  g_return_if_fail (GTK_IS_EDITABLE (editable));    if (GTK_WIDGET_REALIZED (editable))    gtk_editable_claim_selection (editable, start != end, GDK_CURRENT_TIME);    gtk_editable_set_selection (editable, start, end);}/* Get the timestamp of the current event. Actually, the only thing * we really care about below is the key event */static guint32gtk_editable_get_event_time (GtkEditable *editable){  GdkEvent *event;  guint32 tm = GDK_CURRENT_TIME;    event = gtk_get_current_event();    if (event)    switch (event->type)      {      case GDK_MOTION_NOTIFY:	tm = event->motion.time; break;      case GDK_BUTTON_PRESS:      case GDK_2BUTTON_PRESS:      case GDK_3BUTTON_PRESS:      case GDK_BUTTON_RELEASE:	tm = event->button.time; break;      case GDK_KEY_PRESS:      case GDK_KEY_RELEASE:	tm = event->key.time; break;      case GDK_ENTER_NOTIFY:      case GDK_LEAVE_NOTIFY:	tm = event->crossing.time; break;      case GDK_PROPERTY_NOTIFY:	tm = event->property.time; break;      case GDK_SELECTION_CLEAR:      case GDK_SELECTION_REQUEST:      case GDK_SELECTION_NOTIFY:	tm = event->selection.time; break;      case GDK_PROXIMITY_IN:      case GDK_PROXIMITY_OUT:	tm = event->proximity.time; break;      default:			/* use current time */	break;      }  gdk_event_free(event);    return tm;}voidgtk_editable_cut_clipboard (GtkEditable *editable){  g_return_if_fail (editable != NULL);  g_return_if_fail (GTK_IS_EDITABLE (editable));    gtk_signal_emit (GTK_OBJECT (editable), editable_signals[CUT_CLIPBOARD]);}voidgtk_editable_copy_clipboard (GtkEditable *editable){  g_return_if_fail (editable != NULL);  g_return_if_fail (GTK_IS_EDITABLE (editable));    gtk_signal_emit (GTK_OBJECT (editable), editable_signals[COPY_CLIPBOARD]);}voidgtk_editable_paste_clipboard (GtkEditable *editable){  g_return_if_fail (editable != NULL);  g_return_if_fail (GTK_IS_EDITABLE (editable));    gtk_signal_emit (GTK_OBJECT (editable), editable_signals[PASTE_CLIPBOARD]);}voidgtk_editable_set_editable (GtkEditable    *editable,			   gboolean        is_editable){  g_return_if_fail (editable != NULL);  g_return_if_fail (GTK_IS_EDITABLE (editable));    gtk_signal_emit (GTK_OBJECT (editable), editable_signals[SET_EDITABLE], is_editable != FALSE);}static voidgtk_editable_real_set_editable (GtkEditable    *editable,				gboolean        is_editable){  g_return_if_fail (editable != NULL);  g_return_if_fail (GTK_IS_EDITABLE (editable));  editable->editable = is_editable != FALSE;  gtk_widget_queue_draw (GTK_WIDGET (editable));}static voidgtk_editable_real_cut_clipboard (GtkEditable *editable){  g_return_if_fail (editable != NULL);  g_return_if_fail (GTK_IS_EDITABLE (editable));    gtk_editable_real_copy_clipboard (editable);  gtk_editable_delete_selection (editable);}static voidgtk_editable_real_copy_clipboard (GtkEditable *editable){  guint32 time;  gint selection_start_pos;   gint selection_end_pos;  g_return_if_fail (editable != NULL);  g_return_if_fail (GTK_IS_EDITABLE (editable));    time = gtk_editable_get_event_time (editable);  selection_start_pos = MIN (editable->selection_start_pos, editable->selection_end_pos);  selection_end_pos = MAX (editable->selection_start_pos, editable->selection_end_pos);   if (selection_start_pos != selection_end_pos)    {      if (gtk_selection_owner_set (GTK_WIDGET (editable),				   clipboard_atom,				   time))	editable->clipboard_text = gtk_editable_get_public_chars (editable,								  selection_start_pos,								  selection_end_pos);    }}static voidgtk_editable_real_paste_clipboard (GtkEditable *editable){  guint32 time;  g_return_if_fail (editable != NULL);  g_return_if_fail (GTK_IS_EDITABLE (editable));    time = gtk_editable_get_event_time (editable);  if (editable->editable)    gtk_selection_convert (GTK_WIDGET(editable), 			   clipboard_atom, 			   gdk_atom_intern ("COMPOUND_TEXT", FALSE), time);}voidgtk_editable_changed (GtkEditable *editable){  g_return_if_fail (editable != NULL);  g_return_if_fail (GTK_IS_EDITABLE (editable));    gtk_signal_emit (GTK_OBJECT (editable), editable_signals[CHANGED]);}#if 0static voidgtk_editable_parent_set (GtkWidget *widget, 			 GtkWidget *old_parent, 			 GtkWidget *editable){  GtkWidget *parent;  parent = old_parent;  while (parent)    {      gtk_signal_disconnect_by_func (GTK_OBJECT (parent),				     GTK_SIGNAL_FUNC (gtk_editable_parent_set),				     editable);      parent = parent->parent;    }  parent = widget->parent;  while (parent)    {      gtk_signal_connect (GTK_OBJECT (parent), "parent_set",			  GTK_SIGNAL_FUNC (gtk_editable_parent_set), 			  editable);            parent = parent->parent;    }}#endif

⌨️ 快捷键说明

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