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

📄 gtkentry.c

📁 gtk是linux一款强大的夸平台的图形化开发工具
💻 C
📖 第 1 页 / 共 5 页
字号:
	  editable->has_selection = FALSE;	  editable->current_pos = editable->selection_start_pos;	  if (gdk_selection_owner_get (GDK_SELECTION_PRIMARY) == widget->window)	    gtk_selection_owner_set (NULL, GDK_SELECTION_PRIMARY, event->time);	}    }  return FALSE;}static gintgtk_entry_button_release (GtkWidget      *widget,			  GdkEventButton *event){  GtkEntry *entry;  GtkEditable *editable;  g_return_val_if_fail (widget != NULL, FALSE);  g_return_val_if_fail (GTK_IS_ENTRY (widget), FALSE);  g_return_val_if_fail (event != NULL, FALSE);  entry = GTK_ENTRY (widget);  editable = GTK_EDITABLE (widget);  if (entry->button != event->button)    return FALSE;  entry->button = 0;    if (event->button == 1)    {      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_entry_queue_draw (entry);	}      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);    }  return FALSE;}static gintgtk_entry_motion_notify (GtkWidget      *widget,			 GdkEventMotion *event){  GtkEntry *entry;  gint x;  g_return_val_if_fail (widget != NULL, FALSE);  g_return_val_if_fail (GTK_IS_ENTRY (widget), FALSE);  g_return_val_if_fail (event != NULL, FALSE);  entry = GTK_ENTRY (widget);  if (entry->button == 0)    return FALSE;  x = event->x;  if (event->is_hint || (entry->text_area != event->window))    gdk_window_get_pointer (entry->text_area, &x, NULL, NULL);  GTK_EDITABLE(entry)->selection_end_pos = gtk_entry_position (entry, x + entry->scroll_offset);  GTK_EDITABLE(entry)->current_pos = GTK_EDITABLE(entry)->selection_end_pos;  entry_adjust_scroll (entry);  gtk_entry_queue_draw (entry);  return FALSE;}static gintgtk_entry_key_press (GtkWidget   *widget,		     GdkEventKey *event){  GtkEntry *entry;  GtkEditable *editable;  gint return_val;  gint key;  guint initial_pos;  gint extend_selection;  gint extend_start;  g_return_val_if_fail (widget != NULL, FALSE);  g_return_val_if_fail (GTK_IS_ENTRY (widget), FALSE);  g_return_val_if_fail (event != NULL, FALSE);  entry = GTK_ENTRY (widget);  editable = GTK_EDITABLE (widget);  return_val = FALSE;  if(editable->editable == FALSE)    return FALSE;  initial_pos = editable->current_pos;  extend_selection = event->state & GDK_SHIFT_MASK;  extend_start = FALSE;  if (extend_selection)    {      if (editable->selection_start_pos == editable->selection_end_pos)	{	  editable->selection_start_pos = editable->current_pos;	  editable->selection_end_pos = editable->current_pos;	}            extend_start = (editable->current_pos == editable->selection_start_pos);    }  switch (event->keyval)    {    case GDK_BackSpace:      return_val = TRUE;      if (event->state & GDK_CONTROL_MASK)	gtk_delete_backward_word (entry);      else	gtk_delete_backward_character (entry);      break;    case GDK_Clear:      return_val = TRUE;      gtk_delete_line (entry);      break;    case GDK_Insert:      return_val = TRUE;      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(entry) -- IMPLEMENT */	}      break;    case GDK_Delete:      return_val = TRUE;      if (event->state & GDK_CONTROL_MASK)	gtk_delete_forward_word (entry);      else if (event->state & GDK_SHIFT_MASK)	{	  extend_selection = FALSE;	  gtk_editable_cut_clipboard (editable);	}      else	gtk_delete_forward_character (entry);      break;    case GDK_Home:      return_val = TRUE;      gtk_move_beginning_of_line (entry);      break;    case GDK_End:      return_val = TRUE;      gtk_move_end_of_line (entry);      break;    case GDK_Left:      return_val = TRUE;      if (event->state & GDK_CONTROL_MASK)	gtk_move_backward_word (entry);      else	gtk_move_backward_character (entry);      break;    case GDK_Right:      return_val = TRUE;      if (event->state & GDK_CONTROL_MASK)	gtk_move_forward_word (entry);      else	gtk_move_forward_character (entry);      break;    case GDK_Return:      return_val = TRUE;      gtk_widget_activate (widget);      break;    /* The next two keys should not be inserted literally. Any others ??? */    case GDK_Tab:    case GDK_Escape:      break;    default:      if ((event->keyval >= 0x20) && (event->keyval <= 0xFF))	{	  key = event->keyval;	  if (event->state & GDK_CONTROL_MASK)	    {	      if ((key >= 'A') && (key <= 'Z'))		key -= 'A' - 'a';	      if ((key >= 'a') && (key <= 'z') && control_keys[key - 'a'])		{		  (* control_keys[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[key - 'a'])		{		  (* alt_keys[key - 'a']) (editable, event->time);		  return_val = TRUE;		}	      break;	    }	}      if (event->length > 0)	{	  gint tmp_pos;	  extend_selection = FALSE;	  gtk_editable_delete_selection (editable);	  tmp_pos = editable->current_pos;	  gtk_editable_insert_text (editable, event->string, event->length, &tmp_pos);	  editable->current_pos = tmp_pos;	  return_val = TRUE;	}      break;    }  /* since we emit signals from within the above code,   * the widget might already be destroyed or at least   * unrealized.   */  if (GTK_WIDGET_REALIZED (editable) &&      return_val && (editable->current_pos != initial_pos))    {      if (extend_selection)	{	  if (editable->current_pos < editable->selection_start_pos)	    editable->selection_start_pos = editable->current_pos;	  else if (editable->current_pos > editable->selection_end_pos)	    editable->selection_end_pos = editable->current_pos;	  else	    {	      if (extend_start)		editable->selection_start_pos = editable->current_pos;	      else		editable->selection_end_pos = editable->current_pos;	    }	}      else	{	  editable->selection_start_pos = 0;	  editable->selection_end_pos = 0;	}      gtk_editable_claim_selection (editable,				    editable->selection_start_pos != editable->selection_end_pos,				    event->time);            entry_adjust_scroll (entry);      gtk_entry_queue_draw (entry);    }  return return_val;}static gintgtk_entry_focus_in (GtkWidget     *widget,		    GdkEventFocus *event){  g_return_val_if_fail (widget != NULL, FALSE);  g_return_val_if_fail (GTK_IS_ENTRY (widget), FALSE);  g_return_val_if_fail (event != NULL, FALSE);  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_ENTRY(widget)->text_area);#endif  return FALSE;}static gintgtk_entry_focus_out (GtkWidget     *widget,		     GdkEventFocus *event){  g_return_val_if_fail (widget != NULL, FALSE);  g_return_val_if_fail (GTK_IS_ENTRY (widget), FALSE);  g_return_val_if_fail (event != NULL, FALSE);  GTK_WIDGET_UNSET_FLAGS (widget, GTK_HAS_FOCUS);  gtk_widget_draw_focus (widget);#ifdef USE_XIM  gdk_im_end ();#endif  return FALSE;}static voidgtk_entry_make_backing_pixmap (GtkEntry *entry, gint width, gint height){  gint pixmap_width, pixmap_height;  if (!entry->backing_pixmap)    {      /* allocate */      entry->backing_pixmap = gdk_pixmap_new (entry->text_area,					      width, height,					      -1);    }  else    {      /* reallocate if sizes don't match */      gdk_window_get_size (entry->backing_pixmap,			   &pixmap_width, &pixmap_height);      if ((pixmap_width != width) || (pixmap_height != height))	{	  gdk_pixmap_unref (entry->backing_pixmap);	  entry->backing_pixmap = gdk_pixmap_new (entry->text_area,						  width, height,						  -1);	}    }}static voidgtk_entry_draw_text (GtkEntry *entry){  GtkWidget *widget;  GtkEditable *editable;  GtkStateType selected_state;  gint start_pos;  gint end_pos;  gint start_xoffset;  gint selection_start_pos;  gint selection_end_pos;  gint selection_start_xoffset;  gint selection_end_xoffset;  gint width, height;  gint y;  GdkDrawable *drawable;  gint use_backing_pixmap;  GdkWChar *stars;  GdkWChar *toprint;  g_return_if_fail (entry != NULL);  g_return_if_fail (GTK_IS_ENTRY (entry));  if (entry->timer)    {      gtk_timeout_remove (entry->timer);      entry->timer = 0;    }  if (GTK_WIDGET_DRAWABLE (entry))    {      widget = GTK_WIDGET (entry);      editable = GTK_EDITABLE (entry);      if (!entry->text)	{	  	  gtk_paint_flat_box (widget->style, entry->text_area,			      GTK_WIDGET_STATE(widget), GTK_SHADOW_NONE,			      NULL, widget, "entry_bg", 			      0, 0, -1, -1);	  if (editable->editable)	    gtk_entry_draw_cursor (entry);	  return;	}      gdk_window_get_size (entry->text_area, &width, &height);      /*	If the widget has focus, draw on a backing pixmap to avoid flickering	and copy it to the text_area.	Otherwise draw to text_area directly for better speed.      */      use_backing_pixmap = GTK_WIDGET_HAS_FOCUS (widget) && (entry->text != NULL);      if (use_backing_pixmap)	{	   gtk_entry_make_backing_pixmap (entry, width, height);	   drawable = entry->backing_pixmap;	}       else	 {	    drawable = entry->text_area;	 }       gtk_paint_flat_box (widget->style, drawable, 			   GTK_WIDGET_STATE(widget), GTK_SHADOW_NONE,			   NULL, widget, "entry_bg", 			   0, 0, width, height);      y = (height - (widget->style->font->ascent + widget->style->font->descent)) / 2;      y += widget->style->font->ascent;      start_pos = gtk_entry_find_position (entry, entry->scroll_offset);      start_xoffset = entry->char_offset[start_pos] - entry->scroll_offset;      end_pos = gtk_entry_find_position (entry, entry->scroll_offset + width);      if (end_pos < entry->text_length)	end_pos += 1;      selected_state = GTK_STATE_SELECTED;      if (!editable->has_selection)	selected_state = GTK_STATE_ACTIVE;      selection_start_pos = MIN (editable->selection_start_pos, editable->selection_end_pos);      selection_end_pos = MAX (editable->selection_start_pos, editable->selection_end_pos);            selection_start_pos = CLAMP (selection_start_pos, start_pos, end_pos);      selection_end_pos = CLAMP (selection_end_pos, start_pos, end_pos);      selection_start_xoffset = 	entry->char_offset[selection_start_pos] - entry->scroll_offset;      selection_end_xoffset = 	entry->char_offset[selection_end_pos] -entry->scroll_offset;      /* if editable->visible, print a bunch of stars.  If not, print the standard text. */      if (editable->visible)	{	  toprint = entry->text + start_pos;	}      else	{	  gint i;	  	  stars = g_new (GdkWChar, end_pos - start_pos);	  for (i = 0; i < end_pos - start_pos; i++)	    stars[i] = '*';	  toprint = stars;	}            if (selection_start_pos > start_pos)	gdk_draw_text_wc (drawable, widget->style->font,			  widget->style->fg_gc[GTK_WIDGET_STATE (widget)],			  INNER_BORDER + start_xoffset, y,			  toprint,			  selection_start_pos - start_pos);            if ((selection_end_pos >= start_pos) && 	  (selection_start_pos < end_pos) &&	  (selection_start_pos != selection_end_pos))

⌨️ 快捷键说明

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