Browser
/* $Id$ */
							/* Copyright (c) 2016-2020 Pierre Pronchery <khorben@defora.org> */
							/* This file is part of DeforaOS Desktop Browser */
							/* Redistribution and use in source and binary forms, with or without
							 * modification, are permitted provided that the following conditions are
							 * met:
							 *
							 * 1. Redistributions of source code must retain the above copyright notice,
							 *    this list of conditions and the following disclaimer.
							 *
							 * 2. Redistributions in binary form must reproduce the above copyright notice,
							 *    this list of conditions and the following disclaimer in the documentation
							 *    and/or other materials provided with the distribution.
							 *
							 * THIS SOFTWARE IS PROVIDED BY ITS AUTHORS AND CONTRIBUTORS "AS IS" AND ANY
							 * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
							 * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
							 * DISCLAIMED.  IN NO EVENT SHALL THE AUTHORS OR CONTRIBUTORS BE LIABLE FOR ANY
							 * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
							 * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
							 * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
							 * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
							 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
							 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */
							#ifdef DEBUG
							# include <stdio.h>
							#endif
							#include <string.h>
							#include <gtk/gtk.h>
							#include <System.h>
							#include "desktop.h"
							#include "desktopicon.h"
							#include "desktopiconwindow.h"
							/* private */
							/* types */
							struct _DesktopIconWindow
							{
								DesktopIcon * icon;
								/* widgets */
								GtkWidget * widget;
							};
							/* public */
							/* functions */
							/* desktopiconwindow_new */
							static gboolean _on_desktopiconwindow_closex(void);
							DesktopIconWindow * desktopiconwindow_new(DesktopIcon * icon)
							{
								DesktopIconWindow * window;
								Desktop * desktop;
								GtkWindow * w;
								GtkWidget * widget;
								unsigned int width;
								unsigned int height;
								unsigned int size;
							#ifdef DEBUG
								fprintf(stderr, "DEBUG: %s(%p)\n", __func__, icon);
							#endif
								if((window = object_new(sizeof(*window))) == NULL)
									return NULL;
								/* window */
								window->widget = gtk_window_new(GTK_WINDOW_TOPLEVEL);
								w = GTK_WINDOW(window->widget);
								gtk_window_set_decorated(w, FALSE);
							#if GTK_CHECK_VERSION(2, 6, 0)
								gtk_window_set_focus_on_map(w, FALSE);
							#endif
								gtk_window_set_keep_below(w, TRUE);
								gtk_window_set_skip_pager_hint(w, TRUE);
							#ifdef EMBEDDED
								gtk_window_set_type_hint(w, GDK_WINDOW_TYPE_HINT_UTILITY);
							#else
								gtk_window_set_type_hint(w, GDK_WINDOW_TYPE_HINT_DOCK);
							#endif
								desktop = desktopicon_get_desktop(icon);
								desktop_get_icon_size(desktop, &width, &height, &size);
								gtk_window_set_default_size(w, width, height);
								g_signal_connect(window->widget, "delete-event", G_CALLBACK(
											_on_desktopiconwindow_closex), NULL);
								/* icon */
								widget = desktopicon_get_widget(icon);
								gtk_container_add(GTK_CONTAINER(window->widget), widget);
								window->icon = icon;
								desktopicon_set_window(icon, window->widget);
								return window;
							}
							static gboolean _on_desktopiconwindow_closex(void)
							{
								return TRUE;
							}
							/* desktopiconwindow_delete */
							void desktopiconwindow_delete(DesktopIconWindow * window)
							{
								desktopicon_delete(window->icon);
								object_delete(window);
							}
							/* accessors */
							/* desktopiconwindow_get_icon */
							DesktopIcon * desktopiconwindow_get_icon(DesktopIconWindow * window)
							{
								return window->icon;
							}
							/* useful */
							/* desktopiconwindow_move */
							void desktopiconwindow_move(DesktopIconWindow * window, int x, int y)
							{
							#ifdef DEBUG
								fprintf(stderr, "DEBUG: %s(%d, %d)\n", __func__, x, y);
							#endif
								gtk_window_move(GTK_WINDOW(window->widget), x, y);
							}
							/* desktopiconwindow_show */
							void desktopiconwindow_show(DesktopIconWindow * window)
							{
								gtk_widget_show_all(window->widget);
							}
							