PIKApp/app/display/pikadisplay-handlers.c

150 lines
5.1 KiB
C

/* PIKA - Photo and Image Kooker Application
* a rebranding of The GNU Image Manipulation Program (created with heckimp)
* A derived work which may be trivial. However, any changes may be (C)2023 by Aldercone Studio
*
* Original copyright, applying to most contents (license remains unchanged):
* Copyright (C) 1995 Spencer Kimball and Peter Mattis
*
* 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 3 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 General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
#include "config.h"
#include <gegl.h>
#include <gtk/gtk.h>
#include "display-types.h"
#include "core/pikaimage.h"
#include "pikadisplay.h"
#include "pikadisplay-handlers.h"
/* local function prototypes */
static void pika_display_update_handler (PikaProjection *projection,
gboolean now,
gint x,
gint y,
gint w,
gint h,
PikaDisplay *display);
static void pika_display_bounds_changed_handler (PikaImage *image,
gint old_x,
gint old_y,
PikaDisplay *display);
static void pika_display_flush_handler (PikaImage *image,
gboolean invalidate_preview,
PikaDisplay *display);
static gboolean
pika_display_flush_handler_idle (gpointer user_data);
/* public functions */
void
pika_display_connect (PikaDisplay *display)
{
PikaImage *image;
g_return_if_fail (PIKA_IS_DISPLAY (display));
image = pika_display_get_image (display);
g_return_if_fail (PIKA_IS_IMAGE (image));
g_signal_connect (pika_image_get_projection (image), "update",
G_CALLBACK (pika_display_update_handler),
display);
g_signal_connect (image, "bounds-changed",
G_CALLBACK (pika_display_bounds_changed_handler),
display);
g_signal_connect_swapped (image, "flush",
G_CALLBACK (pika_display_flush),
display);
g_signal_connect_swapped (image, "selected-layers-changed",
G_CALLBACK (pika_display_flush),
display);
}
void
pika_display_disconnect (PikaDisplay *display)
{
PikaImage *image;
g_return_if_fail (PIKA_IS_DISPLAY (display));
image = pika_display_get_image (display);
g_return_if_fail (PIKA_IS_IMAGE (image));
g_signal_handlers_disconnect_by_func (image,
pika_display_flush,
display);
g_signal_handlers_disconnect_by_func (image,
pika_display_bounds_changed_handler,
display);
g_signal_handlers_disconnect_by_func (pika_image_get_projection (image),
pika_display_update_handler,
display);
}
/* private functions */
static void
pika_display_update_handler (PikaProjection *projection,
gboolean now,
gint x,
gint y,
gint w,
gint h,
PikaDisplay *display)
{
pika_display_update_area (display, now, x, y, w, h);
}
static void
pika_display_bounds_changed_handler (PikaImage *image,
gint old_x,
gint old_y,
PikaDisplay *display)
{
pika_display_update_bounding_box (display);
}
static void
pika_display_flush_handler (PikaImage *image,
gboolean invalidate_preview,
PikaDisplay *display)
{
g_idle_add_full (G_PRIORITY_LOW,
(GSourceFunc) pika_display_flush_handler_idle,
g_object_ref (display), g_object_unref);
}
static gboolean
pika_display_flush_handler_idle (gpointer user_data)
{
PikaDisplay *display = user_data;
pika_display_flush (display);
return G_SOURCE_REMOVE;
}