LINUX.ORG.RU

Как сделать, чтобы при попадании фокуса на GtkEntry, в нём выделялся весь текст?

 , ,


0

1

С трудом родил такой вариант:

void grab_focus(GtkWidget *w){
       gtk_editable_select_region(GTK_EDITABLE(w), 0, -1);
}

/* ... */

g_signal_connect(G_OBJECT(w),"grab-focus",(GCallback)grab_focus,NULL);
Но он работает, только если переходить в поле ввода tab'ом. Если щелчком мыши - текст выделяется на мгновение, а потом курсор устанавливается в место щелчка и выделение пропадает. Видимо проблема в том, что сигнал «grab-focus» отправляется до сигнала о щелчке кнопкой мыши. Вопрос: как это победить?

P.S. Исходник не мой, GTK+ вижу второй раз в жизни.

Deleted

Последнее исправление: cetjs2 (всего исправлений: 2)

В grab-focus установить в true логическую переменную, повесить второй обработчик - на щелчок мышью и если переменная true, то выделить текст (то есть первый клик по полю ввода всегда будет выделять весь текст, в конце обработчика переменная обнуляется, чтобы в следующий раз клики ушли дефолтному).

KivApple ★★★★★
()
Ответ на: комментарий от KivApple

А менее костыльного решения нет?

Deleted
()

как-то так

#include <gtk/gtk.h>

gboolean on_focus (GtkWidget *w, GdkEventButton *ev, gpointer d)
{
  if (ev->button == 1)
    {
      gtk_widget_grab_focus (w);
      gtk_editable_select_region (GTK_EDITABLE (w), 0, -1);
      return TRUE;
    }
}

int main (int argc, char *argv[])
{
  GtkWidget *w, *b, *e;
  
  gtk_init (&argc, &argv);
  
  w = gtk_window_new (GTK_WINDOW_TOPLEVEL);
  g_signal_connect (w, "delete-event", G_CALLBACK (gtk_main_quit), NULL);
  
  b = gtk_vbox_new (TRUE, 2);
  gtk_container_add (GTK_CONTAINER (w), b);
  
  e = gtk_entry_new (); 
  gtk_entry_set_text (GTK_ENTRY (e), "this is the text 1");
  gtk_box_pack_start (GTK_BOX (b), e, TRUE, TRUE, 2); 
  g_signal_connect (e, "button-press-event", G_CALLBACK (on_focus), NULL);

  e = gtk_entry_new (); 
  gtk_entry_set_text (GTK_ENTRY (e), "this is the text 2");
  gtk_box_pack_start (GTK_BOX (b), e, TRUE, TRUE, 2); 

  gtk_widget_show_all (w);
  gtk_main ();
  
  return 0;
}

правда, последующее позиционирование курсора мышью в первом entry уже будет невозможно. если это необходимо - обработчик должен быть сложнее, и учитывать кто, когда и сколько клацнул

ananas ★★★★★
()
Ответ на: комментарий от ananas

Спасибо! У меня получился вот такой обработчик:

gboolean button_press_event(GtkWidget *w, GdkEvent event, gpointer data){
       (void)event;
       (void)data;
       if (!gtk_widget_has_focus(w)){
               gtk_widget_grab_focus(w);
               gtk_editable_select_region(GTK_EDITABLE(w), 0, -1);
               return TRUE;
       }
       return FALSE;
}
Вроде работает как надо.

Deleted
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.