/* vim: set sts=4 sw=4 et : */
/* Author: Nirbheek Chauhan
 * License: MIT
 */

#include <stdlib.h>

#include <gdk-pixbuf/gdk-pixbuf.h>
#include <gtk/gtk.h>
#include <webkit/webkit.h>

struct screenshot_data {
    GtkWidget *widget;
    gchar *image_file;
};

void save_screenshot (struct screenshot_data *data)
{
    GError *error;
    gint width, height;
    GdkWindow *window;
    GdkPixbuf *pixbuf;

    error = NULL;
    width = gtk_widget_get_allocated_width (data->widget);
    height = gtk_widget_get_allocated_height (data->widget);
    g_debug ("Widget height is %d, width is %d\n", height, width);

    window = gtk_widget_get_window (data->widget);
    if (!window) {
        g_error ("Got NULL instead of *window. Window not realized?");
        goto out;
    }

    pixbuf = gdk_pixbuf_get_from_window (window, 0, 0, width, height);
    if (!pixbuf) {
        g_printerr ("Got NULL instead of a pixbuf from *window?!");
        goto out;
    }

    gdk_pixbuf_save (pixbuf, data->image_file,
                     "png", &error, NULL);
    if (error) {
        g_error ("Unable to save pixbuf as png: %s\n", error->message);
        g_error_free (error);
        goto out;
    }

out:
    return;
}

void take_screenshot_cb (GObject* object, GParamSpec* pspec, struct screenshot_data *data)
{
    g_debug ("Take Screenshot Callback\n");
    WebKitLoadStatus status = webkit_web_view_get_load_status(WEBKIT_WEB_VIEW(object));

    switch (status) {
        case WEBKIT_LOAD_FINISHED:
            save_screenshot (data);
            break;
        default:
            goto out;
    }

out:
    return;
}

void prog_usage (char *prog_name)
{
    g_printerr ("Usage: %s <URL to open> <filename.png>\n", prog_name);
}

int main (int argc, char *argv[])
{
    GtkWidget *win;
    GtkWidget *web_view;
    struct screenshot_data *data;

    if (argc < 3) {
        prog_usage (argv[0]);
        exit (EXIT_FAILURE);
    } else if (argc > 3) {
        g_warning ("Only the first two arguments are used, the rest are ignored");
    }

    if (g_strcmp0 (argv[1], "--help") == 0 || 
        g_strcmp0 (argv[2], "--help") == 0) {
        prog_usage (argv[0]);
        goto success;
    }

    gtk_init (&argc, &argv);

    data = g_malloc (sizeof(data));

    web_view = webkit_web_view_new ();

    win = gtk_window_new (GTK_WINDOW_TOPLEVEL);
    gtk_window_set_decorated (GTK_WINDOW(win), FALSE);
    gtk_window_fullscreen (GTK_WINDOW(win));
    gtk_container_add (GTK_CONTAINER(win), web_view);

    data->widget = win;
    data->image_file = argv[2];

    g_signal_connect (win, "destroy", gtk_main_quit, NULL);
    g_signal_connect (web_view, "notify::load-status", G_CALLBACK(take_screenshot_cb), data);
    //g_signal_connect (win, "button_release_event", G_CALLBACK(take_screenshot_cb), win);

    gtk_widget_show_all (win);

    webkit_web_view_load_uri (WEBKIT_WEB_VIEW(web_view), argv[1]);

    gtk_main ();

success:
    exit (EXIT_SUCCESS);
}
