IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

GTK+ Discussion :

Fenêtre d'une application tierce au 1er plan


Sujet :

GTK+

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre du Club
    Inscrit en
    Avril 2008
    Messages
    8
    Détails du profil
    Informations personnelles :
    Âge : 41

    Informations forums :
    Inscription : Avril 2008
    Messages : 8
    Par défaut [Résolu] Fenêtre d'une application tierce au 1er plan
    Bonjour à tous,

    Je suis en train d'écrire un lanceur d'applications qui ne doit pas lancer une nouvelle instance d'un programme lorsqu'il y en a déjà une en cours d'exécution. Ce que je voudrais faire dans mon programme, c'est mettre au premier plan la fenêtre de l'application tierce pour indiquer à l'utilisateur que celle-ci est déjà lancée.
    Exemple concret : L'utilisateur demande au lanceur d'ouvrir Firefox, celui-ci a déjà été ouvert auparavant, le lanceur ramène au premier plan l'instance existante.

    Malheureusement, je ne parviens pas à trouver "les fonctions qui vont bien" pour faire cela. L'un d'entre vous aurait-il déjà travaillé sur le sujet ?

    Merci pour votre aide,

    Guillaume.

  2. #2
    Membre Expert
    Homme Profil pro
    Inscrit en
    Janvier 2005
    Messages
    1 259
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 1 259
    Par défaut
    Pour ramener au premier plan, ça doit être gtk_window_present. Pour la gestion d'instances multiples, la libunique doit faire ça http://live.gnome.org/LibUnique

  3. #3
    Membre du Club
    Inscrit en
    Avril 2008
    Messages
    8
    Détails du profil
    Informations personnelles :
    Âge : 41

    Informations forums :
    Inscription : Avril 2008
    Messages : 8
    Par défaut
    Merci ! Je vais regarder si je peux utiliser cette librairie pour envoyer un message à une autre application...

  4. #4
    Membre Expert
    Homme Profil pro
    Inscrit en
    Janvier 2005
    Messages
    1 259
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 1 259
    Par défaut
    Ah, j'avais mal lu je crois, je pensais que tu parlais d'une seule et même appli sur laquelle tu as le contrôle. devil's pie http://burtonini.com/blog/computers/devilspie fait peut être ce que tu veux.

  5. #5
    Membre du Club
    Inscrit en
    Avril 2008
    Messages
    8
    Détails du profil
    Informations personnelles :
    Âge : 41

    Informations forums :
    Inscription : Avril 2008
    Messages : 8
    Par défaut
    Merci pour le lien... D'après la doc, ce soft devrait faire ce dont j'ai besoin. Je viens de télécharger les sources pour voir comment les messages sont envoyés !
    Mes recherches me font penser que devilspie utilise DBus... Les sources confirmeront...

    Encore merci pour ton aide.

  6. #6
    Membre du Club
    Inscrit en
    Avril 2008
    Messages
    8
    Détails du profil
    Informations personnelles :
    Âge : 41

    Informations forums :
    Inscription : Avril 2008
    Messages : 8
    Par défaut
    Bonsoir à tous,

    Mes recherches et votre aide m'ont permis de trouver une solution à mon problème. Ci-dessous, un petit programme commenté illustrant une solution utilisant libwnck, une librairie faisant partie du projet Gnome.

    Encore merci à tous,

    Guillaume.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
     
    #include<stdio.h>
    #include <glib.h>
    #include <gdk/gdk.h>
     
    /* Sans ce "define", impossible de compiler le programme !
     * L'API de cette librairie n'est pour le moment pas public, les développeurs 
     * se réservent donc le droit de modifier/supprimer le comportement d'une ou 
     * plusieurs fonctions sans préavis
     */
    #define WNCK_I_KNOW_THIS_IS_UNSTABLE
     
    #include <libwnck/libwnck.h>
     
     
    int main(int argc, char *argv[])
    {
        /* Pour test, nom de la fenêtre recherchée : un gnome-terminal */
        char *win_name = "guillaume@gmlinux: ~";
     
        int i;
        int n = 0;
        int nscreens;
        int found = 0;
        WnckScreen *screen = NULL;
        WnckWindow *window = NULL;
        GList *windowList = NULL;
        GList *w = NULL;
        const char *window_name = NULL;
     
        /* Initialisation de l'environnement GTK */
        gtk_init(&argc, &argv);
     
        /* Parcours de la liste des ecrans */
        nscreens = gdk_display_get_n_screens(gdk_display_get_default());
        for(i = 0; i < nscreens; i++)
        {
            /* Ecran n°i */
            screen = wnck_screen_get(i);
     
            /* L'appel a wnck_screen_force_update() est obligatoire.
             * En effet, la librairie libwnck étant asynchrone par nature, 
             * la liste des fenêtres manipulées par l'objet "screen" que 
             * nous venons de créer est vide pour le moment. Il faut 
             * attendre quelques tours de la boucle principale 
             * ("g_main_loop") pour que la liste soit mise à jour.
             * L'appel ci-dessous permet de demander explicitement la mise 
             * à jour de l'objet "screen" sans attendre une mise à jour par 
             * la boucle principale.
             */
            wnck_screen_force_update(screen);
     
            /* Récupération de la liste des fenêtres dessinées sur cet 
             * écran
             */
            windowList = wnck_screen_get_windows(screen);
     
            w = windowList;
            found = 0;
            while(w != NULL && !found)
            {
                window = WNCK_WINDOW(w->data);
     
                /* Récupération du nom de la fenêtre */
                window_name = wnck_window_get_name(window);
     
                /* S'il s'agit de la fenêtre recherchée, on sort de la 
                 * boucle
                 */
                if(strcmp(win_name, window_name) == 0)
                {
                    found = 1;
                }
     
                /* Fenêtre suivante */
                w = w->next;
            }
     
            /* Fenêtre trouvée, on demande sa mise au premier plan */
            if(found == 1)
            {
                wnck_window_activate(window, 5);
            }
        }
        return 0;
    }
    Le programme se compile via la commande :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    gcc test.c `pkg-config --cflags --libs libgnome-2.0 libpanelapplet-2.0 libwnck-1.0`

Discussions similaires

  1. [Débutant] Comment faire passer une fenêtre d'application active au 1er plan
    Par guillaume.niel dans le forum VB.NET
    Réponses: 4
    Dernier message: 08/12/2012, 23h28
  2. Remettre une application externe au 1er plan
    Par sql_ignorant dans le forum Langage
    Réponses: 4
    Dernier message: 22/08/2009, 09h54
  3. [VB6]Accéder à une fenêtre dans une application VB
    Par issaines dans le forum VB 6 et antérieur
    Réponses: 8
    Dernier message: 05/04/2006, 14h58
  4. Réponses: 2
    Dernier message: 11/02/2006, 12h56

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo