/* LIBPIKA - The PIKA Library
 * Copyright (C) 1995-2000 Peter Mattis and Spencer Kimball
 *
 * pikadisplay.c
 * Copyright (C) Jehan
 *
 * This library is free software: you can redistribute it and/or
 * modify it under the terms of the GNU Lesser General Public
 * License as published by the Free Software Foundation; either
 * version 3 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
 * Lesser General Public License for more details.
 *
 * You should have received a copy of the GNU Lesser General Public
 * License along with this library.  If not, see
 * <https://www.gnu.org/licenses/>.
 */

#include "config.h"

#include "pika.h"

#include "libpikabase/pikawire.h" /* FIXME kill this include */

#include "pikaplugin-private.h"
#include "pikaprocedure-private.h"


enum
{
  PROP_0,
  PROP_ID,
  N_PROPS
};


struct _PikaDisplayPrivate
{
  gint id;
};


static void   pika_display_set_property  (GObject      *object,
                                          guint         property_id,
                                          const GValue *value,
                                          GParamSpec   *pspec);
static void   pika_display_get_property  (GObject      *object,
                                          guint         property_id,
                                          GValue       *value,
                                          GParamSpec   *pspec);


G_DEFINE_TYPE_WITH_PRIVATE (PikaDisplay, pika_display, G_TYPE_OBJECT)

#define parent_class pika_display_parent_class

static GParamSpec *props[N_PROPS] = { NULL, };


static void
pika_display_class_init (PikaDisplayClass *klass)
{
  GObjectClass *object_class = G_OBJECT_CLASS (klass);

  object_class->set_property = pika_display_set_property;
  object_class->get_property = pika_display_get_property;

  props[PROP_ID] =
    g_param_spec_int ("id",
                      "The display id",
                      "The display id for internal use",
                      0, G_MAXINT32, 0,
                      PIKA_PARAM_READWRITE |
                      G_PARAM_CONSTRUCT_ONLY);

  g_object_class_install_properties (object_class, N_PROPS, props);
}

static void
pika_display_init (PikaDisplay *display)
{
  display->priv = pika_display_get_instance_private (display);
}

static void
pika_display_set_property (GObject      *object,
                           guint         property_id,
                           const GValue *value,
                           GParamSpec   *pspec)
{
  PikaDisplay *display = PIKA_DISPLAY (object);

  switch (property_id)
    {
    case PROP_ID:
      display->priv->id = g_value_get_int (value);
      break;

    default:
      G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec);
      break;
    }
}

static void
pika_display_get_property (GObject    *object,
                           guint       property_id,
                           GValue     *value,
                           GParamSpec *pspec)
{
  PikaDisplay *display = PIKA_DISPLAY (object);

  switch (property_id)
    {
    case PROP_ID:
      g_value_set_int (value, display->priv->id);
      break;

    default:
      G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec);
      break;
    }
}


/* Public API */

/**
 * pika_display_get_id:
 * @display: The display.
 *
 * Returns: the display ID.
 *
 * Since: 3.0
 **/
gint32
pika_display_get_id (PikaDisplay *display)
{
  return display ? display->priv->id : -1;
}

/**
 * pika_display_get_by_id:
 * @display_id: The display id.
 *
 * Returns a #PikaDisplay representing @display_id.
 *
 * Returns: (nullable) (transfer none): a #PikaDisplay for @display_id or
 *          %NULL if @display_id does not represent a valid display.
 *          The object belongs to libpika and you must not modify or
 *          unref it.
 *
 * Since: 3.0
 **/
PikaDisplay *
pika_display_get_by_id (gint32 display_id)
{
  if (display_id > 0)
    {
      PikaPlugIn    *plug_in   = pika_get_plug_in ();
      PikaProcedure *procedure = _pika_plug_in_get_procedure (plug_in);

      return _pika_procedure_get_display (procedure, display_id);
    }

  return NULL;
}

/**
 * pika_display_is_valid:
 * @display: The display to check.
 *
 * Returns TRUE if the display is valid.
 *
 * This procedure checks if the given display is valid and refers to
 * an existing display.
 *
 * Returns: Whether the display is valid.
 *
 * Since: 2.4
 **/
gboolean
pika_display_is_valid (PikaDisplay *display)
{
  return pika_display_id_is_valid (pika_display_get_id (display));
}
