core: Add MetaCloseDialog

This is an interface that can be used to implement the "application
is not responding" dialog. One instance is created per window, which
is initially hidden, and can be shown/hidden on demand.

https://bugzilla.gnome.org/show_bug.cgi?id=711619
This commit is contained in:
Carlos Garnacho 2016-07-11 13:07:46 +02:00
parent 24195d8d15
commit b47de58edd
3 changed files with 159 additions and 0 deletions

View File

@ -222,6 +222,8 @@ libmutter_@LIBMUTTER_API_VERSION@_la_SOURCES = \
core/constraints.c \
core/constraints.h \
core/core.c \
core/meta-close-dialog.c \
meta/meta-close-dialog.h \
core/delete.c \
core/display.c \
core/display-private.h \
@ -435,6 +437,7 @@ libmutterinclude_headers = \
meta/meta-background-actor.h \
meta/meta-background-image.h \
meta/meta-background-group.h \
meta/meta-close-dialog.h \
meta/meta-cursor-tracker.h \
meta/meta-dnd.h \
meta/meta-idle-monitor.h \

View File

@ -0,0 +1,103 @@
/* -*- mode: C; c-file-style: "gnu"; indent-tabs-mode: nil; -*- */
/*
* Copyright (C) 2016 Red Hat
*
* 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 2 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 <http://www.gnu.org/licenses/>.
*
* Author: Carlos Garnacho <carlosg@gnome.org>
*/
#include "config.h"
#include "window-private.h"
#include "meta/meta-close-dialog.h"
#include "meta/meta-enum-types.h"
enum {
RESPONSE,
N_SIGNALS
};
guint dialog_signals[N_SIGNALS] = { 0 };
G_DEFINE_INTERFACE (MetaCloseDialog, meta_close_dialog, G_TYPE_OBJECT)
static void
meta_close_dialog_default_init (MetaCloseDialogInterface *iface)
{
g_object_interface_install_property (iface,
g_param_spec_object ("window",
"Window",
"Window",
META_TYPE_WINDOW,
G_PARAM_READWRITE |
G_PARAM_CONSTRUCT_ONLY));
dialog_signals[RESPONSE] =
g_signal_new ("response",
G_TYPE_FROM_INTERFACE (iface),
G_SIGNAL_RUN_LAST | G_SIGNAL_ACTION,
0,
NULL, NULL, NULL,
G_TYPE_NONE, 1, META_TYPE_CLOSE_DIALOG_RESPONSE);
}
/**
* meta_close_dialog_show:
* @dialog: a #MetaCloseDialog
*
* Shows the close dialog.
**/
void
meta_close_dialog_show (MetaCloseDialog *dialog)
{
MetaCloseDialogInterface *iface;
g_return_if_fail (META_IS_CLOSE_DIALOG (dialog));
iface = META_CLOSE_DIALOG_GET_IFACE (dialog);
iface->show (dialog);
}
/**
* meta_close_dialog_hide:
* @dialog: a #MetaCloseDialog
*
* Hides the close dialog.
**/
void
meta_close_dialog_hide (MetaCloseDialog *dialog)
{
MetaCloseDialogInterface *iface;
g_return_if_fail (META_IS_CLOSE_DIALOG (dialog));
iface = META_CLOSE_DIALOG_GET_IFACE (dialog);
iface->hide (dialog);
}
/**
* meta_close_dialog_response:
* @dialog: a #MetaCloseDialog
* @response: a #MetaCloseDialogResponse
*
* Responds and closes the dialog. To be called by #MetaCloseDialog
* implementations.
**/
void
meta_close_dialog_response (MetaCloseDialog *dialog,
MetaCloseDialogResponse response)
{
g_signal_emit (dialog, dialog_signals[RESPONSE], 0, response);
meta_close_dialog_hide (dialog);
}

View File

@ -0,0 +1,53 @@
/* -*- mode: C; c-file-style: "gnu"; indent-tabs-mode: nil; -*- */
/*
* Copyright (C) 2016 Red Hat
*
* 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 2 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 <http://www.gnu.org/licenses/>.
*
* Author: Carlos Garnacho <carlosg@gnome.org>
*/
#ifndef META_CLOSE_DIALOG_H
#define META_CLOSE_DIALOG_H
#include <glib-object.h>
#include <meta/window.h>
#define META_TYPE_CLOSE_DIALOG (meta_close_dialog_get_type ())
G_DECLARE_INTERFACE (MetaCloseDialog, meta_close_dialog,
META, CLOSE_DIALOG, GObject)
typedef enum
{
META_CLOSE_DIALOG_RESPONSE_WAIT,
META_CLOSE_DIALOG_RESPONSE_FORCE_CLOSE,
} MetaCloseDialogResponse;
struct _MetaCloseDialogInterface
{
GTypeInterface parent_iface;
void (* show) (MetaCloseDialog *dialog);
void (* hide) (MetaCloseDialog *dialog);
};
void meta_close_dialog_show (MetaCloseDialog *dialog);
void meta_close_dialog_hide (MetaCloseDialog *dialog);
void meta_close_dialog_response (MetaCloseDialog *dialog,
MetaCloseDialogResponse response);
#endif /* META_CLOSE_DIALOG_H */