Всем привет! Пытаюсь подогнать под свои задачи dwm, цель-запускалка трёх приложений, ничего более. Всего 3 кнопки, допустим, F1, F2, F3 по нажатии должны запускать каждая своё приложение, а если оно уже запущено-переходить к нему. У каждого приложения свой отдельный тайтл и они всё время должны быть развёрнуты максимально. Насколько я понял, патч runorraise делает именно то, что мне нужно, но у меня не получается его установить. Делаю всё по инструкции, но:patch -p1 < ../dwm-6.1-runorraise.diff --dry-run
can't find file to patch at input line 3
Perhaps you used the wrong -p or --strip option?
The text leading up to this was:
--------------------------
|--- dwm.c.orig 2013-11-29 13:58:49.673588564 +0100
|+++ dwm.c 2013-11-23 22:56:49.725007370 +0100
--------------------------
File to patch: dwm.c
checking file dwm.c
Hunk #1 FAILED at 193.
patch: **** malformed patch at line 41: }Пытаюсь вручную вкорячить строки куда надо, но програмист на си из меня не очень, хотя патч там не большой:
-- dwm.c.orig 2013-11-29 13:58:49.673588564 +0100
+++ dwm.c 2013-11-23 22:56:49.725007370 +0100
@@ -193,6 +193,7 @@
static void resizemouse(const Arg *arg);
static void restack(Monitor *m);
static void run(void);
+static void runorraise(const Arg *arg);
static void scan(void);
static Bool sendevent(Client *c, Atom proto);
static void sendmon(Client *c, Monitor *m);
@@ -1349,6 +1350,30 @@
}void
+runorraise(const Arg *arg) {
+ char *app = ((char **)arg->v)[4];
+ Arg a = { .ui = ~0 };
+ Monitor *mon;
+ Client *c;
+ XClassHint hint = { NULL, NULL };
+ /* Tries to find the client */
+ for (mon = mons; mon; mon = mon->next) {
+ for (c = mon->clients; c; c = c->next) {
+ XGetClassHint(dpy, c->win, &hint);
+ if (hint.res_class && strcmp(app, hint.res_class) == 0) {
+ a.ui = c->tags;
+ view(&a);
+ focus(c);
+ XRaiseWindow(dpy, c->win);
+ return;
+ }
+ }
+ }
+ /* Client not found: spawn it */
+ spawn(arg);
+}
+
+void
scan(void) {
unsigned int i, num;
}После вкорячивания пытаюсь перекомпилировать, но:
make clean install
cleaning
dwm build options:
CFLAGS = -std=c99 -pedantic -Wall -Os -I. -I/usr/include -I/usr/X11R6/include -DVERSION="6.0" -DXINERAMA
LDFLAGS = -s -L/usr/lib -lc -L/usr/X11R6/lib -lX11 -L/usr/X11R6/lib -lXinerama
CC = cc
CC dwm.c
dwm.c: In function ‘keypress’:
dwm.c:1088:2: warning: ‘XKeycodeToKeysym’ is deprecated (declared at /usr/include/X11/Xlib.h:1695) [-Wdeprecated-declarations]
dwm.c: At top level:
dwm.c:1450:1: warning: ‘runorraise’ defined but not used [-Wunused-function]Компилится нормально, но ничего нового в поведении dwm не замечаю, функция очевидно не используется и как это поправить я не представляю.
Подскажите пожалуйста, куда копать? Патч взят с офф сайта, других я не нашёл. Если есть возможность провернуть вышеописанное без патчей, буду благодарен любой подсказке.
https://github.com/kmikolaj/dwm/blob/master/24-dwm-6.1-runor... пробовали?
> Подскажите пожалуйста, куда копать?
> dwm.c:1450:1: warning: ‘runorraise’ defined but not used [-Wunused-function]ваша функция определена, но не используется. по идее нужно куда нибудь вкорячить в код вызов runorraise(arg).
Решил вопрос при помощи термоядерного костыля, каждое приложение запускает bash-файл вида:
#!/bin/bashif [ -z `pgrep $appname` ]
then $appname
fiСпасибо всем попытавшимся.