LINUX.ORG.RU

gtk2-2.4.0/как сделать тулбар нефокусируемым?


0

0

Точнее не сам тулбар, а его кнопки. Тулбар - Action-based или gtk_toolbar_new/gtk_toolbar_insert_item.

Это не прошло: g_object_set(G_OBJECT(toolbar), "can-focus", FALSE, NULL); g_object_set(G_OBJECT(toolbar), "has-focus", FALSE, NULL);

Сфокусироваться на другие с помощью gtk_widget_grab_focus не получится - т.к. больше нет фокусируемых виджетов.

anonymous
Ответ на: комментарий от anonymous

#include <gtk/gtk.h>


void set_no_focus (GtkWidget *widget, gpointer data) {
  

  if (GTK_IS_CONTAINER(widget)) {
     gtk_container_foreach (GTK_CONTAINER(widget), (GtkCallback)set_no_focus, NULL);
  }
  
  g_object_set(G_OBJECT(widget), "can-focus", FALSE, NULL);

}

gint
main (gint argc, gchar **argv)
{
  GtkToolItem *item;
  GtkWidget *toolbar;
  GtkWidget *window;
  
  gtk_init (&argc, &argv);

  window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
  gtk_window_set_default_size (GTK_WINDOW(window), 100, 20);

  g_signal_connect (window, "destroy", G_CALLBACK(gtk_main_quit), NULL);

  toolbar = gtk_toolbar_new ();

  item = gtk_tool_button_new_from_stock (GTK_STOCK_OPEN);
  gtk_toolbar_insert (GTK_TOOLBAR (toolbar), item, -1);

  item = gtk_tool_button_new_from_stock (GTK_STOCK_SAVE);
  gtk_toolbar_insert (GTK_TOOLBAR (toolbar), item, -1);

  gtk_container_add (GTK_CONTAINER(window), toolbar);
  
  gtk_container_foreach (GTK_CONTAINER(toolbar), (GtkCallback)set_no_focus, NULL);
  
  gtk_widget_show_all (window);
  
  gtk_main ();
  
  return 0;
}

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

Спасибо, то что надо.

Можно еще пару вопросов?

Есть диалог типа такого:
GtkWidget *dialog = gtk_dialog_new_with_buttons ("hi!",	GTK_WINDOW (my_window),	GTK_DIALOG_MODAL, GTK_STOCK_OK,	GTK_RESPONSE_ACCEPT, NULL);

1. Как заставить его закрываться по нажатию кнопки ESC?
Пытался написать что-то вроде этого, но работает как-то странно:
g_signal_connect(G_OBJECT(dialog), "key_press_event", G_CALLBACK(ds), NULL);

static gint ds(GtkWidget *window, GdkEventKey *event){
	if(event->keyval==GDK_Escape){
		gtk_widget_destroy(window);
		return TRUE;
	}
	return TRUE;
}

2. Как заставить диалог при запуске фокусироваться на кнопку OK (я в него добавил пару виджетов и фокусируются они)?

 

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

Проще всего добавить кнопку "отменить", тогда и диалог будет закрываться по Esc. Мне кажется, это самое естественное решение.
#include <gtk/gtk.h>


void
run_dialog (GtkWidget* widget, gpointer data)
{
  GtkWidget *dialog;
  GtkWidget *entry;
  GtkWidget *button;
  
  
  dialog = gtk_dialog_new_with_buttons ("hi!",GTK_WINDOW (data),GTK_DIALOG_MODAL, NULL);

  button = gtk_button_new_from_stock (GTK_STOCK_CANCEL);
  gtk_dialog_add_action_widget (GTK_DIALOG(dialog), button, GTK_RESPONSE_CANCEL);

  button = gtk_button_new_from_stock (GTK_STOCK_OK);
  gtk_dialog_add_action_widget (GTK_DIALOG(dialog), button, GTK_RESPONSE_OK);
  					
  entry = gtk_entry_new ();
  gtk_box_pack_start_defaults (GTK_BOX(GTK_DIALOG(dialog)->vbox), entry);  
  gtk_widget_show_all (dialog);
  
  gtk_widget_grab_focus (button);
  					
  gtk_dialog_run (GTK_DIALOG(dialog));					
  gtk_widget_hide (dialog);
  gtk_widget_destroy (dialog);
}

int main( int   argc,
          char *argv[] )
{
    GtkWidget *window;
    GtkWidget *button;
    
    gtk_init (&argc, &argv);
    
    window = gtk_window_new (GTK_WINDOW_TOPLEVEL);

    button = gtk_button_new_with_label ("Press me");
    
    g_signal_connect (G_OBJECT (button), "clicked",
		      G_CALLBACK (run_dialog), window);
    
    gtk_container_add (GTK_CONTAINER(window), button);
    gtk_widget_show_all (window);
    
    gtk_main ();
    
    return 0;
}


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

Если уж очень хочется без кнопки Cancel можно сделать так - дело в том, что по Esc вырабатывается сигнал close, а вот закрывается диалог только в том случае, если Cancel есть. Можно перехватывать сигнал самому и закрывать диалог.

#include <gtk/gtk.h>

void close_dialog (GtkDialog *dialog, gpointer data) {

    gtk_dialog_response (dialog, GTK_RESPONSE_NONE);
    
}

void
run_dialog (GtkWidget* widget, gpointer data)
{
  GtkWidget *dialog;
  GtkWidget *entry;
  GtkWidget *button;
  
  
  dialog = gtk_dialog_new_with_buttons ("hi!",GTK_WINDOW (data),GTK_DIALOG_MODAL, NULL);

  g_signal_connect (G_OBJECT(dialog), "close", G_CALLBACK(close_dialog), NULL);

  button = gtk_button_new_from_stock (GTK_STOCK_OK);
  gtk_dialog_add_action_widget (GTK_DIALOG(dialog), button, GTK_RESPONSE_OK);
  					
  entry = gtk_entry_new ();
  gtk_box_pack_start_defaults (GTK_BOX(GTK_DIALOG(dialog)->vbox), entry);  
  gtk_widget_show_all (dialog);
  
  gtk_widget_grab_focus (button);
  					
  gtk_dialog_run (GTK_DIALOG(dialog));					
  gtk_widget_hide (dialog);
  gtk_widget_destroy (dialog);
}

int main( int   argc,
          char *argv[] )
{
    GtkWidget *window;
    GtkWidget *button;
    
    gtk_init (&argc, &argv);
    
    window = gtk_window_new (GTK_WINDOW_TOPLEVEL);

    button = gtk_button_new_with_label ("Press me");
    
    g_signal_connect (G_OBJECT (button), "clicked",
		      G_CALLBACK (run_dialog), window);
    
    gtk_container_add (GTK_CONTAINER(window), button);
    gtk_widget_show_all (window);
    
    gtk_main ();
    
    return 0;
}

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