LINUX.ORG.RU

hotkeys в XFCE


0

0

там есть настройка горячих клавишь. она даже работает.

только не понятно как определить НАПИСАНИЕ комманд при добавлении клавиши. Например я бы хотел на одну из "лишних" кнопок мыши повесить меню с программами, то, которое по правой на столе вылезает. или список открытых окон. где взять название?

anonymous

>где взять название?

Непонятно - название чего ?
правая кнопка мыши->settings->keyboard->shortcats
там вначале:
add->новая тема - если там кроме default ничего нет
потом уже в этой теме:
add (которая правее :) ->появляется диалог command (справа есть кнопка выбора команды из броузера по фс)выбираешь команду ОК-> после этого xfce ожидает нажатие какойнибуть кнопки - тут и жмешь ее :)

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

это все понятно. как прицепить кнопу на приложение ясно. я имею в виду комманды xfce. например вызов меню программ. Или списка запущенных приложений... на самом деле интересуют именно эти две вещи.

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

>я имею в виду комманды xfce. например вызов меню программ.

Если это команда - то увидишь ее после запуска в ps. В xfce очень многое сделано через плагины поэтому напрямую с командной строки их вызвать не получится. Несколькими постами раньше я приводил пример как можно сделать вызов плагина панели xfce - xfce4-screenshooter.

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

спасибо. попробую впитать инфо по плагинам и понять как оно вызывается. но что то мне мнится что это не внешний плагин.... Скорее всего такие вещи как меню и список программ несколько отличаются по реализации от плагина скриншота.

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

>Например я бы хотел на одну из "лишних" кнопок мыши повесить меню с программами, то, которое по правой на столе вылезает. или список открытых окон. где взять название?

>Скорее всего такие вещи как меню и список программ несколько отличаются по реализации от плагина скриншота.

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

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

посмотрел пример при плагин. если честно в силу своих знаний понял далеко не все. точнее почти ничего. я не силен в С. совсем.

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

>посмотрел пример при плагин. если честно в силу своих знаний понял далеко не все. 
точнее почти ничего. я не силен в С. совсем.

Знания - это приходящее - главное не лениться их получать. Ничего сложного там нет.
Для начала делаем патч :) чтобы было ясно чего мы там наменяли
 (xfce4-screenshooter-plugin-1.0.0_ - это наша версия плагина): 

bash-3.2$ diff -u -r xfce4-screenshooter-plugin-1.0.0 xfce4-screenshooter-plugin-1.0.0_ >> 1.patch

Содержимое патча привожу не полностью - заострю внимание на основных моментах:

     gtk_container_add (GTK_CONTAINER (plugin), sd->button);
     xfce_panel_plugin_add_action_widget (plugin, sd->button);
+
// вызывам свою ф-ию при запуске плагина
+	screenshot_set_selection(sd); 


// это наша ф-ция вызываемая при запуске плагина
// тут в начале всякие вызовы необходимые для гтк - я сам не особо 
// вникал - все оставил как было в плагине к xfce4-dict-plugin :) 
// немного изменил под наши реалии

+static gboolean screenshot_set_selection(ScreenshotData *sd)
+{
+    GdkScreen *gscreen;
+    gchar      selection_name[32];
+    Atom       selection_atom;
+    GtkWidget *win;
+    Window     xwin;
+
+    win = gtk_invisible_new();
+    gtk_widget_realize(win);
+    xwin = GDK_WINDOW_XID(GTK_WIDGET(win)->window);
+
+    gscreen = gtk_widget_get_screen(win);
+    g_snprintf(selection_name, sizeof (selection_name),
+            XFCE_SCREENSHOT_SELECT"%d", gdk_screen_get_number(gscreen));

// ищем атом по имени - так как его еще нет то фактически создаем его
// и присваем себе это для того чтобы потом можно было найти это  
// приложение по имени атома и послать ему сообщение
+    selection_atom = XInternAtom(GDK_DISPLAY(), selection_name, False); +
+    if (XGetSelectionOwner(GDK_DISPLAY(), selection_atom))
+    {
+            gtk_widget_destroy(win);
+            return FALSE;
+    }
+
+    XSelectInput(GDK_DISPLAY(), xwin, PropertyChangeMask);
+    XSetSelectionOwner(GDK_DISPLAY(), selection_atom, xwin, GDK_CURRENT_TIME);
+
// тут регистрируем обработчик для пользовательских сообщений - каллбэк ф-ия 
(она будет вызвана при какомто события - в данном случае "client-event" - событие клиента)
+    g_signal_connect(G_OBJECT(win), "client-event", G_CALLBACK(screenshot_message_received), sd);
+
+    return TRUE;
+}

// получено событие от клиента - обрабатываем его
+static gboolean screenshot_message_received(GtkWidget *w, GdkEventClient *ev, gpointer user_data)
+{
+	ScreenshotData *sd = user_data;
+
+	if (ev->data_format == 8 && *(ev->data.b) != '\0')
+	{

// проверяем - чего там хочет клиент - в данном примере только одна 
// хотелка - сделать скриншот - но тем не менее проверяем - она ли это
+		if (strcmp(XFCE_SCREENSHOT_WINDOW_MESSAGE, ev->data.b) == 0)
+		{	/* take screenshot */
// ага - клиенту нужен скриншот - вызываем обработчик который уже есть
// как будто была нажата иконка на панели
+			button_clicked(NULL, sd);
+			return TRUE;
+		}
+
+	}
+
+	return FALSE;
+}

Далее про посылалку сообщений :) (xfce4-take-screenshot.c)

int main(int argc, char *argv[])
// тут вначале всякая фигня с nls, инициазация gtk, формирование события
// для нас главное тут - это наше сообщение
	strcpy(gev.data.b, XFCE_SCREENSHOT_WINDOW_MESSAGE);
// вызываем ф-цию которая попытается найти наш плагин по имени атома
// (помнишь - мы его в начале при запуске регистрировали :) - главное
// получить от нее id. Тут есть небольшие грабли - сообщение не более
// 20 символов - я на них в начале наступил - потом укоротил его :)
	if (xfce4_check_is_running(win, &id))
// ага - нашли наш плагин, знаем его id - посылаем ему событие с нашим 
// сообщением
		gdk_event_send_client_message((GdkEvent*) &gev, (GdkNativeWindow) id);
	else
		g_warning("Can't find the xfce4-screenshooter-plugin to take screenshot.\n");

	gdk_flush();
	gtk_widget_destroy(win);

	return 0;
}

Вот и все :)

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