Da sollte dann doch wmctrl dein Freund sein. Per wmctrl die Fenstergrößen und Positionen ermitteln und dann ein kleines Startscript so in etwa:
Code: Alles auswählen
#!/bin/bash
# starten der Programme
/usr/bin/quackctl & das &, damit die in den Hintergrund wandern
/usr/bin/irgendwas &
sleep 5 <<< hier testen, wie lange die normalerweise zum Start brauchen und anpassen.
# Fenster anpassen und plazieren
wmctrl hier deine Fenster-Parameter und gut ist. " Syntax habe ich jetzt nicht auswendig im Kopf - aber da hat mir die manpage geholfen
.so oft wiederholen, wie du Programme hast und entsprechend Parameter anpassen.
Hier noch das kleine C-Programm - da müsstest du allerdings die Funktionen wie readhigh usw ersetzen, da habe ich ne eigene Lib dafür
readhigh eventuell per fgets und Konsorten und nonewline() entsorgt Zeilenumbrüche.
Hinweis an die professionellen C-Programmierer. Ich habe das Programmieren noch auf ner S/370 148 in Asssembler und PL/1 und Cobol gelernt und mir C selber beigebracht. Das ist vermutlich nicht wirklich guter C-Stil - aber, das zählt für mich - es funktioniert.
// REPORT :WMMAN
// VERSION :1.0
// ********************************************************************************
// AUFTRAGSNR:Ticket: INTERN
// ********************************************************************************
// KURZBESCHR:Steuerprogramm fuer den Windowmanager
// ********************************************************************************
// ANLAGE/AENDERUNG:20150423
// PROGRAMMBESCHREIBUNG:
// Das Programm dient zur Steuerung des Windowmanagers.
// Es koennen Fenster und ihre Position gesichert werden und
// auch wieder in diese Positionen gebracht werden.
// ********************************************************************************
#include <stdio.h>
#include <errno.h>
#include <unistd.h>
#include <stdlib.h>
#include <string.h>
#include <libpferd.h> die hast du nicht - entsprechend Lesefunktionen anpassen
#include <tzn.h>
int rc = 0;
char action[10];
char datei[256];
char befehl[80];
char esatz[1024];
char homedir[80];
int g; // grav
int x; // x-pos of Window
int y; // y-pos of window;
int w; // width
int h; // hight
char wname[512];
char dummy[512];
/* Dateien (Pipe und Config */
FILE *pfeiffe = NULL;
FILE *config = NULL;
/* Interne Funktionen */
void sichern(void);
void laden(void);
int main(int argc, char *argv[]) {
printf("wmman Version 1.0\n");
#include <tzp.h>
/* pruefen der Parameter */
if (argc < 3) {
printf("2 Parameter notwendig\n");
printf("1. Parameter - funktion l oder s\n");
printf(" l=load s=save\n");
printf("2. Parameter Datei\n");
exit(1);
}
/* Verzeichnis ist fest verdrahtet - /home/wm/ */
strncpy(action,argv[1],1);
strcpy(datei,getenv("HOME"));
strcat(datei,"/wm/");
strncat(datei,argv[2],255);
printf("%s%s%s\n",action," - ",datei);
/* schaun mer mal, was zu tun ist */
if (action[0] == 's') {
sichern();
}
else {
laden();
}
return rc;
}
void sichern() {
int bytes;
int rc;
strcpy(befehl,"wmctrl -lG");
pfeiffe = popen(befehl,"r");
if (pfeiffe == NULL) {
perror("Fehler open pfeiffe");
exit(1);
}
config = fopen(datei,"w");
if (config == NULL) {
perror ("Fehler open config-Datei(output)");
exit(1);
}
lesen:
bytes = readhigh(1023, pfeiffe, esatz);
if (bytes < 1) goto endlesen;
sscanf(esatz,"%s%i%i%i%i%i%s%s",dummy,&g,&x,&y,&w,&h,dummy,wname);
if (y <= 17) y = 0;
printf("%-20s%c%i%c%i%c%i%c%i%c%i\n",wname,' ',g,' ',x,' ',
y,' ',w,' ',h);
fprintf(config,"%-20s%c%i%c%i%c%i%c%i%c%i\n",wname,' ',g,' ',x,' ',
y,' ',w,' ',h);
goto lesen;
endlesen:
rc = pclose(pfeiffe);
if (rc != 0) {
perror("Fehler Close pfeiffe");
exit(1);
}
rc = fclose(config);
if (rc != 0) {
perror("Fehler Close config");
exit(1);
}
return;
}
void laden() {
int bytes;
int rc;
char wname[512];
char g[6]; // Bedeutung, wie im globalen Teil
char x[6]; // 6 bytes - max 4 fuer zahl, 1 fuer vorzeichen 1 fuer \0
char y[6];
char w[6];
char h[6];
char above[512];
config = fopen(datei,"r");
if (config == NULL) {
perror ("Fehler open config-Datei(input)");
exit(1);
}
lesen:
bytes = readhigh(1023,config,esatz);
if (bytes < 1) goto endlesen;
nonewline(esatz);
sscanf(esatz,"%s%s%s%s%s%s%s",wname,g,x,y,w,h,above);
// printf("%-10s%-10s%-10s%-10s%-10s%-10s%-10s\n",
// wname,g,x,y,w,h,above);
/* Befehl zusammenbauen */
strcpy(befehl,"wmctrl -r ");
strcat(befehl,wname);
strcat(befehl," -e ");
strcat(befehl,g);
strcat(befehl,",");
strcat(befehl,x);
strcat(befehl,",");
strcat(befehl,y);
strcat(befehl,",");
strcat(befehl,w);
strcat(befehl,",");
strcat(befehl,h);
rc = system(befehl);
if (rc != 0) {
printf("Fehler bei:\n");
printf("%s\n",befehl);
}
/* Pruefen, ob Fenster in Vordergrund soll */
bytes = strlen(above);
if (bytes < 2) goto lesen;
strcpy(befehl,"wmctrl -r ");
strcat(befehl,wname);
strcat(befehl," -b add,above");
rc = system(befehl);
if (rc != 0) {
printf("Fehler bei:\n");
printf("%s\n",befehl);
}
strcpy(above,"");
goto lesen;
endlesen:
rc = fclose(config);
if (rc != 0) {
perror("Fehler Close config");
exit(1);
}
return;
}
Das Programm kann auch die Positionen ermitteln und entsprechend wegschreiben. Allerdings sind dann in der Datei je nach
dem - zumindest bei mir - ein paar Zahlenwerte manuell anzupassen - aber die Richtung stimmt. Musst du halt probieren.