/* $Id$
 *
 * Copyright (c) 2005 Jasper Huijsmans <jasper@xfce.org>
 *
 * This program is free software; you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published
 * by the Free Software Foundation; either version 2 of the License, or
 * (at your option) any later version.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU Library General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with this program; if not, write to the Free Software
 * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
 */

#ifdef HAVE_CONFIG_H
#include <config.h>
#endif

#ifdef HAVE_STRING_H
#include <string.h>
#endif

#include <X11/Xlib.h>
#include <gtk/gtk.h>
#include <libxfce4util/libxfce4util.h>

#include "panel-app.h"
#include "panel-app-messages.h"

#ifndef _
#define _(x) x
#endif

#define PANEL_APP_ATOM "XFCE4_PANEL_APP"

/* client messages */

static gboolean
client_event_received (GtkWidget      *win,
                       GdkEventClient *ev)
{
    GdkAtom atom = gdk_atom_intern (PANEL_APP_ATOM, FALSE);

    if (ev->message_type == atom)
    {
        switch (ev->data.s[0])
        {
            case PANEL_APP_CUSTOMIZE:
                panel_app_customize ();
                break;
            case PANEL_APP_SAVE:
                panel_app_save ();
                break;
            case PANEL_APP_RESTART:
                panel_app_restart ();
                break;
            case PANEL_APP_QUIT:
                panel_app_quit ();
                break;
            case PANEL_APP_EXIT:
                panel_app_quit_noconfirm ();
                break;
            case PANEL_APP_ADD:
                panel_app_customize_items (NULL);
                break;
            default:
                return FALSE;
        }

        return TRUE;
    }

    return FALSE;
}

/* public API */

/**
 * panel_app_send
 * @message: %PanelAppMesssage
 *
 * Send a message to a running instance of xfce4-panel.
 *
 * Return value: %FALSE if no panel instance is running, or %TRUE otherwise.
 **/
gboolean
panel_app_send (PanelAppMessage message)
{
    Window win;
    GdkEventClient gev;
    GtkWidget *invisible;

    if (panel_app_init () != 1)
    {
        g_warning ("xfce4-panel is not running");
        return FALSE;
    }

    win = panel_app_get_ipc_window ();

    if (win)
    {
        invisible = gtk_invisible_new ();
        gtk_widget_realize (invisible);

        gev.type         = GDK_CLIENT_EVENT;
        gev.window       = invisible->window;
        gev.send_event   = TRUE;
        gev.message_type = gdk_atom_intern (PANEL_APP_ATOM, FALSE);
        gev.data_format  = 16;
        gev.data.s[0]    = message;
        gev.data.s[1]    = 0;

        gdk_event_send_client_message ((GdkEvent *) & gev,
                                       (GdkNativeWindow) win);
        gdk_flush ();

        gtk_widget_destroy (invisible);
    }
    return TRUE;
}

/**
 * panel_app_listen
 * @ipc_window: #GtkWidget that will receive messages.
 *
 * Set up listeners for messages to @ipc_window.
 **/
void
panel_app_listen (GtkWidget *ipc_window)
{
    g_signal_connect (G_OBJECT (ipc_window), "client-event",
                      G_CALLBACK (client_event_received), NULL);
}