Pagina 1 di 1
[RISOLTO][BASH-C] Eseguire applicativo su specifica area di lavoro
Inviato: giovedì 18 settembre 2008, 17:53
da IacopoDeeNosee
è possibile lanciare da terminale un applicativo specificando l'area di lavoro in cui l'eseguibile apparirà?chiarisco che uso compiz con 4 aree di lavoro attive,il classico cubo per capirsi.
BYE ???
Re: [BASH] Eseguire applicativo su specifica area di lavoro
Inviato: giovedì 18 settembre 2008, 18:04
da m4ssimo
Non so se si possa fare in bash so che però alcuni programmi (non ricordo esempi

) hanno opzioni che permettono di farlo..è una cosa legata al singolo programma però e non un opzione "generale"!
Spero qualcun altro possa darti maggior informazioni
Re: [BASH] Eseguire applicativo su specifica area di lavoro
Inviato: giovedì 18 settembre 2008, 18:52
da Volans
Molti programmi grafici includono le opzioni per il server X tra cui:
--display=DISPLAY
controlla se il tuo ce l'ha

Re: [BASH] Eseguire applicativo su specifica area di lavoro
Inviato: giovedì 18 settembre 2008, 19:17
da IacopoDeeNosee
ho fatto una prova con gedit,che ha questa possibilità fra le opzioni,ma credo di sbagliare la sintassi...
Codice: Seleziona tutto
iacopodeenosee@ubuntu:~$ gedit --help
Uso:
gedit [OPZIONE...] [FILE...] - Modifica file di testo
Opzioni dell'applicazione:
--encoding=CODIFICA Imposta la codifica dei caratteri da usare per aprire i file elencati nella riga di comando
--new-window Crea una nuova finestra toplevel in un'istanza esistente di gedit
--new-document Crea un nuovo documento in un'istanza esistente di gedit
--display=DISPLAY Display X da usare
iacopodeenosee@ubuntu:~$ gedit --display=:0.0
iacopodeenosee@ubuntu:~$ gedit --display=:0.1
cannot open display: :0.1
Eseguire "gedit --help" per vedere un elenco completo delle opzioni a riga di comando.
iacopodeenosee@ubuntu:~$ gedit --display=:0.2
cannot open display: :0.2
Eseguire "gedit --help" per vedere un elenco completo delle opzioni a riga di comando.
in compiz ho settato a 4 i desktop virtuali in orizzontale,a 1 quelli virtuali in verticale,se lancio gedit indicandogli il display 0.0 mii lancia l'applicativo nel desktop attivo,mentre se indico un'altro desktop mi da errore:
cannot open display: :0.1
dove sbaglio?
Re: [BASH] Eseguire applicativo su specifica area di lavoro
Inviato: giovedì 18 settembre 2008, 19:33
da tomm
non so esattamente a cosa si riferisce --display=DISPLAY ma sicuramente non alle aree di lavoro
Credo che si riferisca all' x server. Di default all'avvio viene avviato un x server, ma se ne possono avviare anche altri e farci partire le applicazioni (correggetemi se sbaglio)
A IacopoDeeNosee:
non so se si può fare quello che dici tu, ma con devilspie (nei repository -
tutorial) puoi impostare su quale area di lavoro si deve aprire un'applicazione e molto altro (grandezza finestra, in basso, in alto, a lato ecc...).
Re: [BASH] Eseguire applicativo su specifica area di lavoro
Inviato: giovedì 18 settembre 2008, 19:37
da Volans
@tomm:
mi sa che hai ragione, mi stavo confondendo... è che con --screen lo apri su un altro schermo se hai più schermi configurati, con --display per esclusione avevo pensato alle aree di lavoro ma è possibile che si riferisca ad altri display X avviabili che poi trovi in ctrl+alt+F8 e successivi...
Re: [BASH] Eseguire applicativo su specifica area di lavoro
Inviato: domenica 21 settembre 2008, 19:02
da IacopoDeeNosee
ho dato un occhio ai sorgenti di
devilspie ed ho notato che per cambiare area di lavoro usa la libreria
Libwnck,ora ho provato a realizzare un piccolo applicativo in C,usando la stessa libreria,per cambiare l'area di lavoro attiva.Questo è il codice:
Codice: Seleziona tutto
//-----------------------------------//
//--------Include libraries----------//
//-----------------------------------//
#include <stdio.h>
#include <stdlib.h>
#include <glib.h>
#include <gdk/gdk.h>
#include <libwnck/application.h>
#include <libwnck/class-group.h>
#include <libwnck/workspace.h>
//to compile use this command:
// gcc -Wall ChangeDesktop.c -o ChangeDesktop `pkg-config --cflags --libs glib-2.0 libwnck-1.0 gdk`
//-----------------------------------//
//------------Main function----------//
//-----------------------------------//
int main(int argc, char *argv[], char *envp[])
{
int i, j;
WnckScreen *screen;
WnckWorkspace *workspace;
int num;
GTimeVal timestamp;
//example of use : $ ChangeDesktop 1 gedit | ChangeDesktop <number of workspace to active> <command to execute into the workspace indicated>
g_print("- NUMERO DI ARGOMENTI PASSATI %d -\n",argc);
g_print("- ARGOMENTI PASSATI -\n\n");
for (i = 0; i < argc; i++)
g_print("%s\\n", argv[i]);
g_print("\n\n- VARIABILI DI AMBIENTE -\n\n");
for (j = 0; envp[j] !='\0'; j++) {
g_print("%s\n", envp[j]);
}
/* Initialise GDK */
gdk_init(&argc, &argv);
num = 0;
screen = wnck_screen_get_default();
int Num_Screens = gdk_display_get_n_screens (gdk_display_get_default());
g_print("numero di screens : %d \n",Num_Screens);
int Num_Workspace = wnck_screen_get_workspace_count(screen);
g_print("numero di workspace : %d \n",Num_Workspace);
workspace = wnck_screen_get_workspace(screen, num);
if (!workspace)
{
g_print("Workspace number %d does not exist\n", num);
return 1;
}
g_get_current_time(×tamp);
wnck_workspace_activate(workspace, timestamp.tv_sec);
system("gedit");
return 0;
}
il programma pare funzionare bene solo che non trova le 4 aree di lavoro e di conseguenza non posso attivarne una, ho guardato anche nelle variabili d'ambiente passate all'eseguibile ma non ho trovato niente di utile ???
vorrei sapere in cosa sbaglio? ma sopratutto dove posso reperire della documentazione riguardo alla libreria Libwnck... >:(
Re: [BASH] Eseguire applicativo su specifica area di lavoro
Inviato: lunedì 22 settembre 2008, 7:28
da paper0k
Re: [BASH] Eseguire applicativo su specifica area di lavoro
Inviato: lunedì 22 settembre 2008, 11:34
da IacopoDeeNosee
grazie del suggerimento,ho provato wmctrl e funziona se uso metacity come VM mentre se uso compiz non riconosce le aree di lavoro,qui sotto riporto il risultato del comando -l usando come VM compiz e tutte le finestre compaiono sotto un unica area di lavoro anche se in realtà sono disposte su 4 aree ???
Codice: Seleziona tutto
iacopodeenosee@ubuntu:~$ wmctrl -l
0x04600024 0 ubuntu Liferea
0x01000003 0 ubuntu Pannello di bordo espanso superiore
0x01200022 0 ubuntu Scrivania
0x01e00060 0 ubuntu Elenco conoscenti
0x03a00001 0 ubuntu iacopodeenosee - Skype™
0x03600033 0 ubuntu gdesklets-daemon
0x0360009d 0 ubuntu gdesklets-daemon
0x036000e6 0 ubuntu gdesklets-daemon
0x036001c8 0 ubuntu gdesklets-daemon
0x0360025c 0 ubuntu gdesklets-daemon
0x036002ec 0 ubuntu gdesklets-daemon
0x0360037c 0 ubuntu gdesklets-daemon
0x03e00024 0 ubuntu Firestarter ubuntu
0x04000020 0 ubuntu iacopodeenosee@ubuntu: ~
0x030004d5 0 ubuntu aMule 2.2.1
0x012000e4 0 ubuntu Condivisioni Windows su 192.168.1.150 - Esplorazione file
0x0120029d 0 ubuntu Incoming - Esplorazione file
0x04200183 0 ubuntu [BASH] Eseguire applicativo su specifica area di lavoro - Mozilla Firefox
0x044000ca 0 ubuntu Posta in arrivo - Mozilla Thunderbird
0x04800006 0 ubuntu Main.c - /home/iacopodeenosee/Progetti_Building/VisualHunter/src - [visualhunter] - Geany
0x04a00003 0 ubuntu Libwnck Reference Manual : WnckWorkspace
0x0120066c 0 ubuntu VisualHunter - Esplorazione file
perciò presumo che il problema sia compiz e non il mio programmino in c.Può essere un bug di compiz?o è un problema relativo alle mie impostazioni?a voi funziona?
Re: [BASH] Eseguire applicativo su specifica area di lavoro
Inviato: venerdì 26 settembre 2008, 11:41
da IacopoDeeNosee
indagando è rislutato che compiz non usa i
workspace ma i
viewport per i vari desktop ed al momento la libreria Libwnck li gestisce separatamente,ora ho coretto il codice è funziona anche con compiz.
Codice: Seleziona tutto
//-----------------------------------//
//--------Include libraries----------//
//-----------------------------------//
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <glib.h>
#include <gdk/gdk.h>
#include <libwnck/application.h>
#include <libwnck/class-group.h>
#include <libwnck/workspace.h>
//to compile use this command:
// gcc -Wall ChangeDesktop.c -o ChangeDesktop `pkg-config --cflags --libs glib-2.0 libwnck-1.0 gdk`
//-----------------------------------//
//------------Main function----------//
//-----------------------------------//
int main(int argc, char *argv[], char *envp[])
{
gint i, j;
gint SelectWorkspace=0;
WnckScreen *Screen;
WnckWorkspace *Workspace;
GTimeVal timestamp;
gchar StrCommand[1000]="";
g_print("- NUMBER OF ARGUMENTS %d -\n\n",argc);
g_print("- ARGUMENTS -\n\n");
for (i = 0; i < argc; i++)
g_print("%s\n", argv[i]);
g_print("\n\n- VARIABLES OF ENVIRONMENT -\n\n");
for (j = 0; envp[j] !='\0'; j++)
g_print("%s\n", envp[j]);
//check the number of arguments
if(argc!=3)
{
g_print("\n>> ERROR too many/few arguments!!! <<\n ChangeDesktop <num of desktop> <command to execute> \n num desktop starting from 1 to n \n");
return 1;
}
//copy the arguments of number of desktop to active
SelectWorkspace = atoi(argv[1]);
//copy the arguments of command to the string
strcpy(StrCommand,argv[2]);
g_print("launch application > %s < into the desktop > %d < \n",StrCommand,SelectWorkspace);
/* Initialise GDK */
gdk_init(&argc, &argv);
Screen = wnck_screen_get_default();
gint Num_Screens = gdk_display_get_n_screens (gdk_display_get_default());
g_print("Number of screens : %d \n",Num_Screens);
gint Num_Workspace = wnck_screen_get_workspace_count(Screen);
g_print("Number of workspaces : %d \n",Num_Workspace);
gint ScreenWidth = wnck_screen_get_width(Screen);
g_print("Width of screen : %d \n",ScreenWidth);
gint ScreenHeight = wnck_screen_get_height(Screen);
g_print("Height of screen : %d \n",ScreenHeight);
Workspace = wnck_screen_get_workspace(Screen,SelectWorkspace-1);
if (!Workspace)
{
g_print("Workspace number %d does not exist!!!\njust change the viewport instead\n", SelectWorkspace);
//change the desktop
wnck_screen_move_viewport(Screen,ScreenWidth*(SelectWorkspace-1),0);
}
else
{
g_get_current_time(×tamp);
//change the desktop
wnck_workspace_activate(Workspace, timestamp.tv_sec);
}
//wait for change the desktop
sleep(1);
//launch the program
system(StrCommand);
return 0;
}
BYE
