LINUX.ORG.RU

[gtk] accelerator, динамическое изменение

 


0

0

Пытаюсь динамически изменить сочетание клавиш для активации действия, связанного с пунктом меню, создаваемым из glade'овского UI:

	if(winId == MAIN_WINDOW || winId == OPENGL_WINDOW){
		nBlocks = 4; prefix = "main"; handlers = mainSigHandler;
		GtkAction *quit = GTK_ACTION(gtk_builder_get_object(builder, "mainQuitMenuItem"));
		GtkAccelGroup *accelgroup = gtk_accel_group_new();
		//~ GtkActionGroup *actiongroup = gtk_action_group_new("<main>/file/");
		gtk_window_add_accel_group(GTK_WINDOW(window->window), accelgroup);
		gtk_accel_map_add_entry("<Actions>/actiongroup3/mainCloseMenuItem", GDK_w, GDK_CONTROL_MASK);
		gtk_accel_map_add_entry("<Actions>/actiongroup3/mainQuitMenuItem", GDK_q, GDK_CONTROL_MASK);
		if(winId == OPENGL_WINDOW){
			gtk_action_set_label(quit, _("Close"));
			g_signal_connect_swapped(quit, "activate",
				G_CALLBACK(destroy_window), window);
			gtk_action_set_icon_name (quit, "window-close");
			gtk_action_set_accel_path(quit, "<Actions>/actiongroup3/mainQuitMenuItem");
			//~ gtk_action_group_add_action_with_accel(actiongroup, quit, "<Control>q");
		}else{
			g_signal_connect(quit, "activate", chk_quit, NULL);
			gtk_action_set_icon_name(quit, "application-exit");
			gtk_action_set_accel_path(quit, "<Actions>/actiongroup3/mainCloseMenuItem");
			//~ gtk_action_group_add_action_with_accel(actiongroup, quit, "<Control>w");
		}
		gtk_accel_map_save("accel");
		gtk_action_set_accel_group(quit, accelgroup);
		gtk_action_connect_accelerator(quit);
	}
Надпись меняется, картинка на кнопке меняется, действие меняется, а вот сочетания клавиш не появляются. Сам пункт меню вот такой:
          <object class="GtkAction" id="mainQuitMenuItem">
            <property name="name">mainQuitMenuItem</property>
            <property name="label">_Quit</property>
          </object>
Подскажите, пожалуйста, как по-человечески «ускоритель» сделать?

☆☆☆☆☆

Что ж мне этот пунктик меню вручную создавать? Дык, сигналы ко всем пунктам меню я уже вручную выставляю, зачем мне тогда вообще этот glade, если и окна/менюшки вручную рисовать надо будет?

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

Попробую вечером, но какие-то проблемы у меня с форматом gtkbuilder'а изначально были, из-за чего я сохранял файл в формате glade и конвертировал его потом в builder'овский...

Eddy_Em ☆☆☆☆☆
() автор топика

Ни черта не получается. Как в glade создавать отдельный «ускоритель», я так и не нашел. Создание ускорителя при помощи gtk_accel_map_add_entry, подключение его посредством gtk_action_set_accel_path и активация gtk_action_connect_accelerator ничего не дают :(

Eddy_Em ☆☆☆☆☆
() автор топика

УРА!

Неисповедимы пути glade :)

Воткнул gtk_action_disconnect_accelerator до подключения нового «ускорителя», и все заработало:

		GtkAction *quit = GTK_ACTION(gtk_builder_get_object(builder, "mainQuitMenuItem"));
		gtk_action_disconnect_accelerator(quit);
		if(winId == MAIN_WINDOW){
			g_signal_connect(quit, "activate", chk_quit, NULL);
			gtk_action_set_icon_name(quit, "application-exit");
			gtk_action_set_accel_path(quit, "<Main>/quit");
		}else{
			gtk_action_set_accel_path(quit, "<Main>/close");
			gtk_action_set_label(quit, _("Close"));
			g_signal_connect_swapped(quit, "activate",
				G_CALLBACK(destroy_window), window);
			gtk_action_set_icon_name (quit, "window-close");
		}
		gtk_action_connect_accelerator(quit);

Eddy_Em ☆☆☆☆☆
() автор топика
Ответ на: комментарий от Eddy_Em

> Как в glade создавать отдельный «ускоритель», я так и не нашел

создаешь action_group, edit на нее, чтобы насоздавать нужных экшнов с нужными ускорителями и прочей лабудой. а для кнопок, тулбаров, менюх и прочего выбираешь «использовать действие» вместо «готовая кнопка» или простого задания текста картинки и прочего

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

выбираешь «использовать действие»

это действие потом как-то надо будет менять. gtk_action_set_accel_path - самый простой способ.

Eddy_Em ☆☆☆☆☆
() автор топика
Ответ на: комментарий от Eddy_Em

> это действие потом как-то надо будет менять. gtk_action_set_accel_path - самый простой способ.

gtk-can-change-accel = 1 в gtkrc плюс gtk_accel_map_save()/gtk_accel_map_load() и меняй себе, сколько влезет.

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

Дык, менять все равно придется тем же самым gtk_action_set_accel_path. Других-то способов сменить для gtkAction ускоритель нет.

Eddy_Em ☆☆☆☆☆
() автор топика
Ответ на: комментарий от Eddy_Em

gtk_accel_map_save()/gtk_accel_map_load() позволяют сдампить/загрузить акселераторы в файл. а там - vim/emacs в зубы и вперед на танки, сиречь на удобные клавиатурные шорткаты

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

Вы, похоже, не поняли. Зачем мне это делать? В моей программке одно и то же glade'овское окно используется как шаблон и родительского, и дочерних окон. Соответственно, кнопочке «выход» в родительском окне надо назначить сочетание ctrl+q и сигнал quit, а в дочерних - сочетание ctrl+w и сигнал close (ну и переименовать пункт соответствующим образом).

И как мне в этом поможет gtk_accel_map_save()/gtk_accel_map_load() ???

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