/*
 * mate-panel-applet.h: panel applet writing API.
 *
 * Copyright (C) 2001 Sun Microsystems, Inc.
 * Copyright (C) 2012-2021 MATE Developers
 *
 * This library is free software; you can redistribute it and/or
 * modify it under the terms of the GNU Library General Public
 * License as published by the Free Software Foundation; either
 * version 2 of the License, or (at your option) any later version.
 *
 * This library 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 Library General Public
 * License along with this library; if not, write to the
 * Free Software Foundation, Inc., 51 Franklin St, Fifth Floor,
 * Boston, MA 02110-1301, USA.
 *
 * Authors:
 *     Mark McLoughlin <mark@skynet.ie>
 */

#ifndef __MATE_PANEL_APPLET_H__
#define __MATE_PANEL_APPLET_H__

#include <glib.h>
#include <gtk/gtk.h>
#include <gdk/gdk.h>
#include <cairo.h>
#include <cairo-gobject.h>

G_BEGIN_DECLS

#define PANEL_TYPE_APPLET mate_panel_applet_get_type ()
G_DECLARE_DERIVABLE_TYPE (MatePanelApplet, mate_panel_applet, MATE_PANEL, APPLET, GtkEventBox)

typedef enum {
    MATE_PANEL_APPLET_ORIENT_UP,
    MATE_PANEL_APPLET_ORIENT_DOWN,
    MATE_PANEL_APPLET_ORIENT_LEFT,
    MATE_PANEL_APPLET_ORIENT_RIGHT
#define MATE_PANEL_APPLET_ORIENT_FIRST MATE_PANEL_APPLET_ORIENT_UP
#define MATE_PANEL_APPLET_ORIENT_LAST  MATE_PANEL_APPLET_ORIENT_RIGHT
} MatePanelAppletOrient;

typedef enum {
    PANEL_NO_BACKGROUND,
    PANEL_COLOR_BACKGROUND,
    PANEL_PIXMAP_BACKGROUND
} MatePanelAppletBackgroundType;

typedef enum {
    MATE_PANEL_APPLET_FLAGS_NONE   = 0,
    MATE_PANEL_APPLET_EXPAND_MAJOR = 1 << 0,
    MATE_PANEL_APPLET_EXPAND_MINOR = 1 << 1,
    MATE_PANEL_APPLET_HAS_HANDLE   = 1 << 2
#define MATE_PANEL_APPLET_FLAGS_ALL (MATE_PANEL_APPLET_EXPAND_MAJOR|MATE_PANEL_APPLET_EXPAND_MINOR|MATE_PANEL_APPLET_HAS_HANDLE)
} MatePanelAppletFlags;

typedef gboolean (*MatePanelAppletFactoryCallback) (MatePanelApplet *applet, const gchar *iid, gpointer user_data);

struct _MatePanelAppletClass {
    GtkEventBoxClass event_box_class;

    void    (*change_orient)            (MatePanelApplet         *applet,
                                         MatePanelAppletOrient    orient);

    void    (*change_size)              (MatePanelApplet   *applet,
                                         guint              size);

    void    (*change_background)        (MatePanelApplet               *applet,
                                         MatePanelAppletBackgroundType  type,
                                         GdkRGBA                       *color,
                                         cairo_pattern_t               *pattern);

    void    (*move_focus_out_of_applet) (MatePanelApplet    *frame,
                                         GtkDirectionType    direction);
};

GtkWidget*              mate_panel_applet_new                       (void);

MatePanelAppletOrient   mate_panel_applet_get_orient                (MatePanelApplet   *applet);

guint                   mate_panel_applet_get_size                  (MatePanelApplet   *applet);

MatePanelAppletBackgroundType   mate_panel_applet_get_background    (MatePanelApplet   *applet,
                                                 /* return values */ GdkRGBA           *color,
                                                                     cairo_pattern_t  **pattern);

void                    mate_panel_applet_set_background_widget     (MatePanelApplet   *applet,
                                                                     GtkWidget         *widget);

gchar*                  mate_panel_applet_get_preferences_path      (MatePanelApplet   *applet);

MatePanelAppletFlags    mate_panel_applet_get_flags                 (MatePanelApplet   *applet);

void                    mate_panel_applet_set_flags                 (MatePanelApplet       *applet,
                                                                     MatePanelAppletFlags   flags);

void                    mate_panel_applet_set_size_hints            (MatePanelApplet    *applet,
                                                                     const int          *size_hints,
                                                                     int                 n_elements,
                                                                     int                 base_size);

gboolean                mate_panel_applet_get_locked_down           (MatePanelApplet    *applet);

/* Does nothing when not on X11 */
void                    mate_panel_applet_request_focus             (MatePanelApplet    *applet,
                                                                     guint32             timestamp);

void                    mate_panel_applet_setup_menu                (MatePanelApplet    *applet,
                                                                     const gchar        *xml,
                                                                     GtkActionGroup     *action_group);

void                    mate_panel_applet_setup_menu_from_file      (MatePanelApplet    *applet,
                                                                     const gchar        *filename,
                                                                     GtkActionGroup     *action_group);

void                    mate_panel_applet_setup_menu_from_resource  (MatePanelApplet    *applet,
                                                                     const gchar        *resource_path,
                                                                     GtkActionGroup     *action_group);

int                     mate_panel_applet_factory_main              (const gchar   *factory_id,
                                                                     gboolean       out_process,
                                                                     GType          applet_type,
                                                                     MatePanelAppletFactoryCallback callback,
                                                                     gpointer       data);

int                     mate_panel_applet_factory_setup_in_process  (const gchar    *factory_id,
                                                                     GType           applet_type,
                                                                     MatePanelAppletFactoryCallback callback,
                                                                     gpointer        data);

/*
 * These macros are getting a bit unwieldy.
 *
 * Things to define for these:
 *     + required if Native Language Support is enabled (ENABLE_NLS):
 *                   GETTEXT_PACKAGE and MATELOCALEDIR
 */

#if !defined(ENABLE_NLS)
    #define _MATE_PANEL_APPLET_SETUP_GETTEXT(call_textdomain) \
        do { } while (0)
#else /* defined(ENABLE_NLS) */
    #include <libintl.h>
    #define _MATE_PANEL_APPLET_SETUP_GETTEXT(call_textdomain) \
    do { \
        bindtextdomain (GETTEXT_PACKAGE, MATELOCALEDIR); \
        bind_textdomain_codeset (GETTEXT_PACKAGE, "UTF-8"); \
        if (call_textdomain) \
            textdomain (GETTEXT_PACKAGE); \
    } while (0)
#endif /* !defined(ENABLE_NLS) */

#define MATE_PANEL_APPLET_OUT_PROCESS_FACTORY(factory_id, type, name, callback, data) \
int main(int argc, char *argv[]) \
{ \
    GOptionContext *context; \
    GError *error; \
    int retval; \
     \
    _MATE_PANEL_APPLET_SETUP_GETTEXT (TRUE); \
     \
    context = g_option_context_new(""); \
    g_option_context_add_group (context, gtk_get_option_group(TRUE)); \
     \
    error = NULL; \
    if (!g_option_context_parse (context, &argc, &argv, &error)) \
    { \
        if (error) \
        { \
            g_printerr ("Cannot parse arguments: %s.\n", error->message); \
            g_error_free (error); \
        } \
        else \
        { \
            g_printerr ("Cannot parse arguments.\n"); \
        } \
        g_option_context_free (context); \
        return 1; \
    } \
     \
    gtk_init (&argc, &argv); \
     \
    retval = mate_panel_applet_factory_main (factory_id,TRUE, type, callback, data); \
    g_option_context_free (context); \
     \
    return retval; \
}

#define MATE_PANEL_APPLET_IN_PROCESS_FACTORY(factory_id, type, descr, callback, data) \
gboolean _mate_panel_applet_shlib_factory (void);    \
G_MODULE_EXPORT gint _mate_panel_applet_shlib_factory(void) \
{ \
    _MATE_PANEL_APPLET_SETUP_GETTEXT(FALSE); \
return mate_panel_applet_factory_setup_in_process (factory_id, type,                 \
                                               callback, data);  \
}

G_END_DECLS

#endif /* __MATE_PANEL_APPLET_H__ */