Библиотеки типа GTK, QT не дают возможности работать с чужими окнами (окнами которые не были созданы из процесс в котором к ним идет обращение) Спускаясь на уровень ниже Xlib так же не дает этого сделать. Даже банально изменить заголовок чужого окна нельзя. На сколько я вычитал Xlib это всетаки некая надстройка над самим X11. Работая на уровне API Х11 минуя всякие надстройки будет ли возможность управлять чужими окнами ? Как блеать это вообще сделать ?
если используете UTF 8 int Xutf8TextListToTextProperty(Display *display, char **list, int count, XICCEncodingStyle style, XTextProperty *text_prop_return); если не используете UTF 8 XStringListToTextProperty(char **list, int count, XTextProperty *text_prop_return) ну и ставим заголовок XSetWMName( Display *display, handle окна, XTextProperty *text_prop_return ); ну собственно XTextProperty *text_prop_return - это и есть ваша строка заголовка. ПС могу конечно и как хендел чужого окна получить расписать, но правда я уже устала всю ночь за компом, но если надо могу и расписать. PS: данной функции безразницы кому менять хендел, какой укажите, тому окну и будет менять. _______________________________ перемещение окна XMoveWindow( Display *display, хендл опять таки, икс, угрек ) изменение размеров XResizeWindow( Display *display, хендл опять таки, икс, угрек ) Да собственно все там можно. Стоит только копнуть XLib
на сколько вы в этом уверены ? вы это делали кода нибудь или предполагаете что оно так должно быть ? вот есть код Code: void GetTopWindow1(Display *dpy) { Window winf; int ret; if(dpy == NULL) { cout << "Не удалось соединится с X-Server" << endl; return; } //scrn = DefaultScreen (dpy); XGetInputFocus(dpy, &winf, &ret); printf ("0x%lx\n", winf); XStoreName(dpy, winf, "Fuckkk Fuuucck"); } int main(int argc, char* argv[]) { Display *dpy; dpy = XOpenDisplay (0); Window myWin = XCreateSimpleWindow(dpy, DefaultRootWindow(dpy), 100, 100, 320, 320, 0, BlackPixel(dpy, DefaultScreen(dpy)), WhitePixel(dpy, DefaultScreen(dpy))); XSelectInput (dpy, myWin, KeyPressMask); XMapWindow(dpy, myWin); XFlush(dpy); while(1) { GetTopWindow1(dpy); } XDestroyWindow(dpy, myWin); XCloseDisplay(dpy); return 0; } суть его такова: в бесконечном цыкле отыскивает текущее активное окно (с фокусом ввода) выводих его хендел и меняет енр заголовок. а работает он так: отычкивает текущее активное окно, выводит его хендел, и меняет его заголовок только если это окно было создано мной, если это окно чужой программы ничего он не меняет. И не одна манипуляция (типо подвинуть, изменить размер) с ним не работает. По этому я собсно тему и создал, а не потому что я не знаю какие функции вызвать
на 100% иначе бы не предлагала 2 варианта для Анси и ЮТФ. Работала непосредственно для рендеринга в чужое окно. собственно почему не прокатывает XStoreName не знаю, что поэтому поводу возвращают BadAlloc и BadWindow??? ПС вечером дома буду сама пороюсь по поводу не срабатывания. ППС: проверялось под su ?
Не стал создавать новую тему, т.к. вопрос глупый=) Не давно познакомился с gtk, и вот возникла глупая проблема=) при компиляции не может найти glade/glade.h: Code: ||=== gtk, Debug ===| /home/ххх/gtk/main.c|3|fatal error: glade/glade.h: No such file or directory| ||=== Build finished: 1 errors, 0 warnings ===| В чем проблема? Причем Code: #include <gtk/gtk.h> #include <glib.h> находит без проблем...
если не затруднит попробуйте прям мой код. Под su не пробовал, потому что нужно что бы оно без прав рута работало. PS. от рута тоже не работает Может мне нужно окно чей идентификатор я имею как то приджойнить к своему процессу. Забегая вперед: я еще хочу отлавливать событие KeyPress, но отлов происходит толко для моего окна. И это уже политика безопастности оконного менеджера приходит. Собсно эту проблему тоже как то хочется решить
нуу я имел ввиду кто хорошо шарит в X11, код то целиком выложен. Там тока хедера подключить надо Code: #include <X11/Xlib.h> #include <glib.h> и параметры компиляции указать стандартные для X11 и Gtk. Я симайком собираю, так что какие именно параметры для g++ сказать не могу
немного отступившись от этой темы, возникла новая мысль. "Понять как происходит связь между окном на сервере и процессом на клиенте", далее поперло... почитав, зацепил за сам Протокол Х который формирует пакеты и передает их при возниковении одного из обстоятельств: запрос (от клиента например на создание окна) ответ (от сервера) событие (от сервера клиенту при возникновении например... KeyPress) ошибка. При формировании пакета (например от сервера клиента) сервере определяет кому именно предназначен этот пакет (так например происходит разделение событий KeyPress между теми приложениями на клиенте, с чьим окно было связанно это событие). Так как это пакет и передает он либо по сети (либо через внутрении конал) то его можно снифать, если его можно снифать то можно таким образом из моего приложения цеплять все события keyPress которые уходят от сервера... на и соответсвенно формировать свой пакет для отправки серверу чтобы получить возможность работать с чужими окнами). Вуаля. Дело осталось за малым... понять как это сделать Для начало было бы не плохо найти исходник функции XFlush для Xlib что бы посмотреть как она берет пакеты из буфера, как она их оправляет, и что собстно в этих пакетах есть (что бы найти то заветное значения для связи окна и приложения). Но что то у меня вызвало проблемы вообще найти исходники Xlib некто их не встречал в сети ?)) смотрел на Git там нет репозитария для него, это печально.