|
Packit Service |
c6b782 |
/* dzl-shortcut-accel-dialog.c
|
|
Packit Service |
c6b782 |
*
|
|
Packit Service |
c6b782 |
* Copyright (C) 2016 Endless, Inc
|
|
Packit Service |
c6b782 |
* (C) 2017 Christian Hergert
|
|
Packit Service |
c6b782 |
*
|
|
Packit Service |
c6b782 |
* This program is free software: you can redistribute it and/or modify
|
|
Packit Service |
c6b782 |
* it under the terms of the GNU General Public License as published by
|
|
Packit Service |
c6b782 |
* the Free Software Foundation, either version 2 of the License, or
|
|
Packit Service |
c6b782 |
* (at your option) any later version.
|
|
Packit Service |
c6b782 |
*
|
|
Packit Service |
c6b782 |
* This program is distributed in the hope that it will be useful,
|
|
Packit Service |
c6b782 |
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
Packit Service |
c6b782 |
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
Packit Service |
c6b782 |
* GNU General Public License for more details.
|
|
Packit Service |
c6b782 |
*
|
|
Packit Service |
c6b782 |
* You should have received a copy of the GNU General Public License
|
|
Packit Service |
c6b782 |
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
|
Packit Service |
c6b782 |
*
|
|
Packit Service |
c6b782 |
* Authors: Georges Basile Stavracas Neto <georges.stavracas@gmail.com>
|
|
Packit Service |
c6b782 |
* Christian Hergert <chergert@redhat.com>
|
|
Packit Service |
c6b782 |
*/
|
|
Packit Service |
c6b782 |
|
|
Packit Service |
c6b782 |
#define G_LOG_DOMAIN "dzl-shortcut-accel-dialog"
|
|
Packit Service |
c6b782 |
|
|
Packit Service |
c6b782 |
#include "config.h"
|
|
Packit Service |
c6b782 |
|
|
Packit Service |
c6b782 |
#include <glib/gi18n.h>
|
|
Packit Service |
c6b782 |
|
|
Packit Service |
c6b782 |
#include "shortcuts/dzl-shortcut-accel-dialog.h"
|
|
Packit Service |
c6b782 |
#include "shortcuts/dzl-shortcut-chord.h"
|
|
Packit Service |
c6b782 |
#include "shortcuts/dzl-shortcut-label.h"
|
|
Packit Service |
c6b782 |
|
|
Packit Service |
c6b782 |
struct _DzlShortcutAccelDialog
|
|
Packit Service |
c6b782 |
{
|
|
Packit Service |
c6b782 |
GtkDialog parent_instance;
|
|
Packit Service |
c6b782 |
|
|
Packit Service |
c6b782 |
GtkStack *stack;
|
|
Packit Service |
c6b782 |
GtkLabel *display_label;
|
|
Packit Service |
c6b782 |
DzlShortcutLabel *display_shortcut;
|
|
Packit Service |
c6b782 |
GtkLabel *selection_label;
|
|
Packit Service |
c6b782 |
GtkButton *button_cancel;
|
|
Packit Service |
c6b782 |
GtkButton *button_set;
|
|
Packit Service |
c6b782 |
|
|
Packit Service |
c6b782 |
GdkDevice *grab_pointer;
|
|
Packit Service |
c6b782 |
|
|
Packit Service |
c6b782 |
gchar *shortcut_title;
|
|
Packit Service |
c6b782 |
DzlShortcutChord *chord;
|
|
Packit Service |
c6b782 |
|
|
Packit Service |
c6b782 |
gulong grab_source;
|
|
Packit Service |
c6b782 |
|
|
Packit Service |
c6b782 |
guint first_modifier;
|
|
Packit Service |
c6b782 |
};
|
|
Packit Service |
c6b782 |
|
|
Packit Service |
c6b782 |
enum {
|
|
Packit Service |
c6b782 |
PROP_0,
|
|
Packit Service |
c6b782 |
PROP_ACCELERATOR,
|
|
Packit Service |
c6b782 |
PROP_SHORTCUT_TITLE,
|
|
Packit Service |
c6b782 |
N_PROPS
|
|
Packit Service |
c6b782 |
};
|
|
Packit Service |
c6b782 |
|
|
Packit Service |
c6b782 |
G_DEFINE_TYPE (DzlShortcutAccelDialog, dzl_shortcut_accel_dialog, GTK_TYPE_DIALOG)
|
|
Packit Service |
c6b782 |
|
|
Packit Service |
c6b782 |
static GParamSpec *properties [N_PROPS];
|
|
Packit Service |
c6b782 |
|
|
Packit Service |
c6b782 |
/*
|
|
Packit Service |
c6b782 |
* dzl_shortcut_accel_dialog_begin_grab:
|
|
Packit Service |
c6b782 |
*
|
|
Packit Service |
c6b782 |
* This function returns %G_SOURCE_REMOVE so that it may be used as
|
|
Packit Service |
c6b782 |
* a GSourceFunc when necessary.
|
|
Packit Service |
c6b782 |
*
|
|
Packit Service |
c6b782 |
* Returns: %G_SOURCE_REMOVE always.
|
|
Packit Service |
c6b782 |
*/
|
|
Packit Service |
c6b782 |
static gboolean
|
|
Packit Service |
c6b782 |
dzl_shortcut_accel_dialog_begin_grab (DzlShortcutAccelDialog *self)
|
|
Packit Service |
c6b782 |
{
|
|
Packit Service |
c6b782 |
g_autoptr(GList) seats = NULL;
|
|
Packit Service |
c6b782 |
GdkWindow *window;
|
|
Packit Service |
c6b782 |
GdkDisplay *display;
|
|
Packit Service |
c6b782 |
GdkSeat *first_seat;
|
|
Packit Service |
c6b782 |
GdkDevice *device;
|
|
Packit Service |
c6b782 |
GdkDevice *pointer;
|
|
Packit Service |
c6b782 |
GdkGrabStatus status;
|
|
Packit Service |
c6b782 |
|
|
Packit Service |
c6b782 |
g_assert (DZL_IS_SHORTCUT_ACCEL_DIALOG (self));
|
|
Packit Service |
c6b782 |
|
|
Packit Service |
c6b782 |
self->grab_source = 0;
|
|
Packit Service |
c6b782 |
|
|
Packit Service |
c6b782 |
if (!gtk_widget_get_mapped (GTK_WIDGET (self)))
|
|
Packit Service |
c6b782 |
return G_SOURCE_REMOVE;
|
|
Packit Service |
c6b782 |
|
|
Packit Service |
c6b782 |
if (NULL == (window = gtk_widget_get_window (GTK_WIDGET (self))))
|
|
Packit Service |
c6b782 |
return G_SOURCE_REMOVE;
|
|
Packit Service |
c6b782 |
|
|
Packit Service |
c6b782 |
display = gtk_widget_get_display (GTK_WIDGET (self));
|
|
Packit Service |
c6b782 |
|
|
Packit Service |
c6b782 |
if (NULL == (seats = gdk_display_list_seats (display)))
|
|
Packit Service |
c6b782 |
return G_SOURCE_REMOVE;
|
|
Packit Service |
c6b782 |
|
|
Packit Service |
c6b782 |
first_seat = seats->data;
|
|
Packit Service |
c6b782 |
device = gdk_seat_get_keyboard (first_seat);
|
|
Packit Service |
c6b782 |
|
|
Packit Service |
c6b782 |
if (device == NULL)
|
|
Packit Service |
c6b782 |
{
|
|
Packit Service |
c6b782 |
g_warning ("Keyboard grab unsuccessful, no keyboard in seat");
|
|
Packit Service |
c6b782 |
return G_SOURCE_REMOVE;
|
|
Packit Service |
c6b782 |
}
|
|
Packit Service |
c6b782 |
|
|
Packit Service |
c6b782 |
if (gdk_device_get_source (device) == GDK_SOURCE_KEYBOARD)
|
|
Packit Service |
c6b782 |
pointer = gdk_device_get_associated_device (device);
|
|
Packit Service |
c6b782 |
else
|
|
Packit Service |
c6b782 |
pointer = device;
|
|
Packit Service |
c6b782 |
|
|
Packit Service |
c6b782 |
status = gdk_seat_grab (gdk_device_get_seat (pointer),
|
|
Packit Service |
c6b782 |
window,
|
|
Packit Service |
c6b782 |
GDK_SEAT_CAPABILITY_KEYBOARD,
|
|
Packit Service |
c6b782 |
FALSE,
|
|
Packit Service |
c6b782 |
NULL,
|
|
Packit Service |
c6b782 |
NULL,
|
|
Packit Service |
c6b782 |
NULL,
|
|
Packit Service |
c6b782 |
NULL);
|
|
Packit Service |
c6b782 |
|
|
Packit Service |
c6b782 |
if (status != GDK_GRAB_SUCCESS)
|
|
Packit Service |
c6b782 |
return G_SOURCE_REMOVE;
|
|
Packit Service |
c6b782 |
|
|
Packit Service |
c6b782 |
self->grab_pointer = pointer;
|
|
Packit Service |
c6b782 |
|
|
Packit Service |
c6b782 |
g_debug ("Grab started on %s with device %s",
|
|
Packit Service |
c6b782 |
G_OBJECT_TYPE_NAME (self),
|
|
Packit Service |
c6b782 |
G_OBJECT_TYPE_NAME (device));
|
|
Packit Service |
c6b782 |
|
|
Packit Service |
c6b782 |
gtk_grab_add (GTK_WIDGET (self));
|
|
Packit Service |
c6b782 |
|
|
Packit Service |
c6b782 |
return G_SOURCE_REMOVE;
|
|
Packit Service |
c6b782 |
}
|
|
Packit Service |
c6b782 |
|
|
Packit Service |
c6b782 |
static void
|
|
Packit Service |
c6b782 |
dzl_shortcut_accel_dialog_release_grab (DzlShortcutAccelDialog *self)
|
|
Packit Service |
c6b782 |
{
|
|
Packit Service |
c6b782 |
g_assert (DZL_IS_SHORTCUT_ACCEL_DIALOG (self));
|
|
Packit Service |
c6b782 |
|
|
Packit Service |
c6b782 |
if (self->grab_pointer != NULL)
|
|
Packit Service |
c6b782 |
{
|
|
Packit Service |
c6b782 |
gdk_seat_ungrab (gdk_device_get_seat (self->grab_pointer));
|
|
Packit Service |
c6b782 |
self->grab_pointer = NULL;
|
|
Packit Service |
c6b782 |
gtk_grab_remove (GTK_WIDGET (self));
|
|
Packit Service |
c6b782 |
}
|
|
Packit Service |
c6b782 |
}
|
|
Packit Service |
c6b782 |
|
|
Packit Service |
c6b782 |
static void
|
|
Packit Service |
c6b782 |
dzl_shortcut_accel_dialog_map (GtkWidget *widget)
|
|
Packit Service |
c6b782 |
{
|
|
Packit Service |
c6b782 |
DzlShortcutAccelDialog *self = (DzlShortcutAccelDialog *)widget;
|
|
Packit Service |
c6b782 |
|
|
Packit Service |
c6b782 |
g_assert (DZL_IS_SHORTCUT_ACCEL_DIALOG (self));
|
|
Packit Service |
c6b782 |
|
|
Packit Service |
c6b782 |
GTK_WIDGET_CLASS (dzl_shortcut_accel_dialog_parent_class)->map (widget);
|
|
Packit Service |
c6b782 |
|
|
Packit Service |
c6b782 |
self->grab_source =
|
|
Packit Service |
c6b782 |
g_timeout_add_full (G_PRIORITY_LOW,
|
|
Packit Service |
c6b782 |
100,
|
|
Packit Service |
c6b782 |
(GSourceFunc) dzl_shortcut_accel_dialog_begin_grab,
|
|
Packit Service |
c6b782 |
g_object_ref (self),
|
|
Packit Service |
c6b782 |
g_object_unref);
|
|
Packit Service |
c6b782 |
}
|
|
Packit Service |
c6b782 |
|
|
Packit Service |
c6b782 |
static void
|
|
Packit Service |
c6b782 |
dzl_shortcut_accel_dialog_unmap (GtkWidget *widget)
|
|
Packit Service |
c6b782 |
{
|
|
Packit Service |
c6b782 |
DzlShortcutAccelDialog *self = (DzlShortcutAccelDialog *)widget;
|
|
Packit Service |
c6b782 |
|
|
Packit Service |
c6b782 |
g_assert (DZL_IS_SHORTCUT_ACCEL_DIALOG (self));
|
|
Packit Service |
c6b782 |
|
|
Packit Service |
c6b782 |
dzl_shortcut_accel_dialog_release_grab (self);
|
|
Packit Service |
c6b782 |
|
|
Packit Service |
c6b782 |
GTK_WIDGET_CLASS (dzl_shortcut_accel_dialog_parent_class)->unmap (widget);
|
|
Packit Service |
c6b782 |
}
|
|
Packit Service |
c6b782 |
|
|
Packit Service |
c6b782 |
static gboolean
|
|
Packit Service |
c6b782 |
dzl_shortcut_accel_dialog_is_editing (DzlShortcutAccelDialog *self)
|
|
Packit Service |
c6b782 |
{
|
|
Packit Service |
c6b782 |
g_assert (DZL_IS_SHORTCUT_ACCEL_DIALOG (self));
|
|
Packit Service |
c6b782 |
|
|
Packit Service |
c6b782 |
return self->grab_pointer != NULL;
|
|
Packit Service |
c6b782 |
}
|
|
Packit Service |
c6b782 |
|
|
Packit Service |
c6b782 |
static void
|
|
Packit Service |
c6b782 |
dzl_shortcut_accel_dialog_apply_state (DzlShortcutAccelDialog *self)
|
|
Packit Service |
c6b782 |
{
|
|
Packit Service |
c6b782 |
g_assert (DZL_IS_SHORTCUT_ACCEL_DIALOG (self));
|
|
Packit Service |
c6b782 |
|
|
Packit Service |
c6b782 |
if (self->chord != NULL)
|
|
Packit Service |
c6b782 |
{
|
|
Packit Service |
c6b782 |
gtk_stack_set_visible_child_name (self->stack, "display");
|
|
Packit Service |
c6b782 |
gtk_dialog_set_response_sensitive (GTK_DIALOG (self), GTK_RESPONSE_ACCEPT, TRUE);
|
|
Packit Service |
c6b782 |
}
|
|
Packit Service |
c6b782 |
else
|
|
Packit Service |
c6b782 |
{
|
|
Packit Service |
c6b782 |
gtk_stack_set_visible_child_name (self->stack, "selection");
|
|
Packit Service |
c6b782 |
gtk_dialog_set_response_sensitive (GTK_DIALOG (self), GTK_RESPONSE_ACCEPT, FALSE);
|
|
Packit Service |
c6b782 |
}
|
|
Packit Service |
c6b782 |
}
|
|
Packit Service |
c6b782 |
|
|
Packit Service |
c6b782 |
static gboolean
|
|
Packit Service |
c6b782 |
dzl_shortcut_accel_dialog_key_press_event (GtkWidget *widget,
|
|
Packit Service |
c6b782 |
GdkEventKey *key)
|
|
Packit Service |
c6b782 |
{
|
|
Packit Service |
c6b782 |
DzlShortcutAccelDialog *self = (DzlShortcutAccelDialog *)widget;
|
|
Packit Service |
c6b782 |
|
|
Packit Service |
c6b782 |
g_assert (DZL_IS_SHORTCUT_ACCEL_DIALOG (self));
|
|
Packit Service |
c6b782 |
g_assert (key != NULL);
|
|
Packit Service |
c6b782 |
|
|
Packit Service |
c6b782 |
if (dzl_shortcut_accel_dialog_is_editing (self))
|
|
Packit Service |
c6b782 |
{
|
|
Packit Service |
c6b782 |
GdkModifierType real_mask;
|
|
Packit Service |
c6b782 |
guint keyval_lower;
|
|
Packit Service |
c6b782 |
|
|
Packit Service |
c6b782 |
if (key->is_modifier)
|
|
Packit Service |
c6b782 |
{
|
|
Packit Service |
c6b782 |
/*
|
|
Packit Service |
c6b782 |
* If we are just starting a chord, we need to stash the modifier
|
|
Packit Service |
c6b782 |
* so that we know when we have finished the sequence.
|
|
Packit Service |
c6b782 |
*/
|
|
Packit Service |
c6b782 |
if (self->chord == NULL && self->first_modifier == 0)
|
|
Packit Service |
c6b782 |
self->first_modifier = key->keyval;
|
|
Packit Service |
c6b782 |
|
|
Packit Service |
c6b782 |
goto chain_up;
|
|
Packit Service |
c6b782 |
}
|
|
Packit Service |
c6b782 |
|
|
Packit Service |
c6b782 |
real_mask = key->state & gtk_accelerator_get_default_mod_mask ();
|
|
Packit Service |
c6b782 |
keyval_lower = gdk_keyval_to_lower (key->keyval);
|
|
Packit Service |
c6b782 |
|
|
Packit Service |
c6b782 |
/* Normalize <Tab> */
|
|
Packit Service |
c6b782 |
if (keyval_lower == GDK_KEY_ISO_Left_Tab)
|
|
Packit Service |
c6b782 |
keyval_lower = GDK_KEY_Tab;
|
|
Packit Service |
c6b782 |
|
|
Packit Service |
c6b782 |
/* Put shift back if it changed the case of the key */
|
|
Packit Service |
c6b782 |
if (keyval_lower != key->keyval)
|
|
Packit Service |
c6b782 |
real_mask |= GDK_SHIFT_MASK;
|
|
Packit Service |
c6b782 |
|
|
Packit Service |
c6b782 |
/* We don't want to use SysRq as a keybinding but we do
|
|
Packit Service |
c6b782 |
* want Alt+Print), so we avoid translation from Alt+Print to SysRq
|
|
Packit Service |
c6b782 |
*/
|
|
Packit Service |
c6b782 |
if (keyval_lower == GDK_KEY_Sys_Req && (real_mask & GDK_MOD1_MASK) != 0)
|
|
Packit Service |
c6b782 |
keyval_lower = GDK_KEY_Print;
|
|
Packit Service |
c6b782 |
|
|
Packit Service |
c6b782 |
/* A single Escape press cancels the editing */
|
|
Packit Service |
c6b782 |
if (!key->is_modifier && real_mask == 0 && keyval_lower == GDK_KEY_Escape)
|
|
Packit Service |
c6b782 |
{
|
|
Packit Service |
c6b782 |
dzl_shortcut_accel_dialog_release_grab (self);
|
|
Packit Service |
c6b782 |
gtk_dialog_response (GTK_DIALOG (self), GTK_RESPONSE_CANCEL);
|
|
Packit Service |
c6b782 |
return GDK_EVENT_STOP;
|
|
Packit Service |
c6b782 |
}
|
|
Packit Service |
c6b782 |
|
|
Packit Service |
c6b782 |
/* Backspace disables the current shortcut */
|
|
Packit Service |
c6b782 |
if (real_mask == 0 && keyval_lower == GDK_KEY_BackSpace)
|
|
Packit Service |
c6b782 |
{
|
|
Packit Service |
c6b782 |
dzl_shortcut_accel_dialog_set_accelerator (self, NULL);
|
|
Packit Service |
c6b782 |
gtk_dialog_response (GTK_DIALOG (self), GTK_RESPONSE_ACCEPT);
|
|
Packit Service |
c6b782 |
return GDK_EVENT_STOP;
|
|
Packit Service |
c6b782 |
}
|
|
Packit Service |
c6b782 |
|
|
Packit Service |
c6b782 |
if (self->chord == NULL)
|
|
Packit Service |
c6b782 |
self->chord = dzl_shortcut_chord_new_from_event (key);
|
|
Packit Service |
c6b782 |
else
|
|
Packit Service |
c6b782 |
dzl_shortcut_chord_append_event (self->chord, key);
|
|
Packit Service |
c6b782 |
|
|
Packit Service |
c6b782 |
dzl_shortcut_accel_dialog_apply_state (self);
|
|
Packit Service |
c6b782 |
|
|
Packit Service |
c6b782 |
g_object_notify_by_pspec (G_OBJECT (self), properties [PROP_ACCELERATOR]);
|
|
Packit Service |
c6b782 |
|
|
Packit Service |
c6b782 |
return GDK_EVENT_STOP;
|
|
Packit Service |
c6b782 |
}
|
|
Packit Service |
c6b782 |
|
|
Packit Service |
c6b782 |
chain_up:
|
|
Packit Service |
c6b782 |
return GTK_WIDGET_CLASS (dzl_shortcut_accel_dialog_parent_class)->key_press_event (widget, key);
|
|
Packit Service |
c6b782 |
}
|
|
Packit Service |
c6b782 |
|
|
Packit Service |
c6b782 |
static gboolean
|
|
Packit Service |
c6b782 |
dzl_shortcut_accel_dialog_key_release_event (GtkWidget *widget,
|
|
Packit Service |
c6b782 |
GdkEventKey *key)
|
|
Packit Service |
c6b782 |
{
|
|
Packit Service |
c6b782 |
DzlShortcutAccelDialog *self = (DzlShortcutAccelDialog *)widget;
|
|
Packit Service |
c6b782 |
|
|
Packit Service |
c6b782 |
g_assert (DZL_IS_SHORTCUT_ACCEL_DIALOG (self));
|
|
Packit Service |
c6b782 |
g_assert (key != NULL);
|
|
Packit Service |
c6b782 |
|
|
Packit Service |
c6b782 |
if (self->chord != NULL)
|
|
Packit Service |
c6b782 |
{
|
|
Packit Service |
c6b782 |
/*
|
|
Packit Service |
c6b782 |
* If we have a chord defined and there was no modifier,
|
|
Packit Service |
c6b782 |
* then any key release should be enough for us to cancel
|
|
Packit Service |
c6b782 |
* our grab.
|
|
Packit Service |
c6b782 |
*/
|
|
Packit Service |
c6b782 |
if (!dzl_shortcut_chord_has_modifier (self->chord))
|
|
Packit Service |
c6b782 |
{
|
|
Packit Service |
c6b782 |
dzl_shortcut_accel_dialog_release_grab (self);
|
|
Packit Service |
c6b782 |
goto chain_up;
|
|
Packit Service |
c6b782 |
}
|
|
Packit Service |
c6b782 |
|
|
Packit Service |
c6b782 |
/*
|
|
Packit Service |
c6b782 |
* If we started our sequence with a modifier, we want to
|
|
Packit Service |
c6b782 |
* release our grab when that modifier has been released.
|
|
Packit Service |
c6b782 |
*/
|
|
Packit Service |
c6b782 |
if (key->is_modifier &&
|
|
Packit Service |
c6b782 |
self->first_modifier != 0 &&
|
|
Packit Service |
c6b782 |
self->first_modifier == key->keyval)
|
|
Packit Service |
c6b782 |
{
|
|
Packit Service |
c6b782 |
self->first_modifier = 0;
|
|
Packit Service |
c6b782 |
dzl_shortcut_accel_dialog_release_grab (self);
|
|
Packit Service |
c6b782 |
goto chain_up;
|
|
Packit Service |
c6b782 |
}
|
|
Packit Service |
c6b782 |
}
|
|
Packit Service |
c6b782 |
|
|
Packit Service |
c6b782 |
/* Clear modifier if it was released before a chord was made */
|
|
Packit Service |
c6b782 |
if (self->first_modifier == key->keyval)
|
|
Packit Service |
c6b782 |
self->first_modifier = 0;
|
|
Packit Service |
c6b782 |
|
|
Packit Service |
c6b782 |
chain_up:
|
|
Packit Service |
c6b782 |
return GTK_WIDGET_CLASS (dzl_shortcut_accel_dialog_parent_class)->key_release_event (widget, key);
|
|
Packit Service |
c6b782 |
}
|
|
Packit Service |
c6b782 |
|
|
Packit Service |
c6b782 |
static void
|
|
Packit Service |
c6b782 |
dzl_shortcut_accel_dialog_destroy (GtkWidget *widget)
|
|
Packit Service |
c6b782 |
{
|
|
Packit Service |
c6b782 |
DzlShortcutAccelDialog *self = (DzlShortcutAccelDialog *)widget;
|
|
Packit Service |
c6b782 |
|
|
Packit Service |
c6b782 |
g_assert (DZL_IS_SHORTCUT_ACCEL_DIALOG (self));
|
|
Packit Service |
c6b782 |
|
|
Packit Service |
c6b782 |
if (self->grab_source != 0)
|
|
Packit Service |
c6b782 |
{
|
|
Packit Service |
c6b782 |
g_source_remove (self->grab_source);
|
|
Packit Service |
c6b782 |
self->grab_source = 0;
|
|
Packit Service |
c6b782 |
}
|
|
Packit Service |
c6b782 |
|
|
Packit Service |
c6b782 |
GTK_WIDGET_CLASS (dzl_shortcut_accel_dialog_parent_class)->destroy (widget);
|
|
Packit Service |
c6b782 |
}
|
|
Packit Service |
c6b782 |
|
|
Packit Service |
c6b782 |
static void
|
|
Packit Service |
c6b782 |
dzl_shortcut_accel_dialog_finalize (GObject *object)
|
|
Packit Service |
c6b782 |
{
|
|
Packit Service |
c6b782 |
DzlShortcutAccelDialog *self = (DzlShortcutAccelDialog *)object;
|
|
Packit Service |
c6b782 |
|
|
Packit Service |
c6b782 |
g_clear_pointer (&self->shortcut_title, g_free);
|
|
Packit Service |
c6b782 |
g_clear_pointer (&self->chord, dzl_shortcut_chord_free);
|
|
Packit Service |
c6b782 |
|
|
Packit Service |
c6b782 |
G_OBJECT_CLASS (dzl_shortcut_accel_dialog_parent_class)->finalize (object);
|
|
Packit Service |
c6b782 |
}
|
|
Packit Service |
c6b782 |
|
|
Packit Service |
c6b782 |
static void
|
|
Packit Service |
c6b782 |
dzl_shortcut_accel_dialog_get_property (GObject *object,
|
|
Packit Service |
c6b782 |
guint prop_id,
|
|
Packit Service |
c6b782 |
GValue *value,
|
|
Packit Service |
c6b782 |
GParamSpec *pspec)
|
|
Packit Service |
c6b782 |
{
|
|
Packit Service |
c6b782 |
DzlShortcutAccelDialog *self = DZL_SHORTCUT_ACCEL_DIALOG (object);
|
|
Packit Service |
c6b782 |
|
|
Packit Service |
c6b782 |
switch (prop_id)
|
|
Packit Service |
c6b782 |
{
|
|
Packit Service |
c6b782 |
case PROP_ACCELERATOR:
|
|
Packit Service |
c6b782 |
g_value_take_string (value, dzl_shortcut_accel_dialog_get_accelerator (self));
|
|
Packit Service |
c6b782 |
break;
|
|
Packit Service |
c6b782 |
|
|
Packit Service |
c6b782 |
case PROP_SHORTCUT_TITLE:
|
|
Packit Service |
c6b782 |
g_value_set_string (value, dzl_shortcut_accel_dialog_get_shortcut_title (self));
|
|
Packit Service |
c6b782 |
break;
|
|
Packit Service |
c6b782 |
|
|
Packit Service |
c6b782 |
default:
|
|
Packit Service |
c6b782 |
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
|
|
Packit Service |
c6b782 |
}
|
|
Packit Service |
c6b782 |
}
|
|
Packit Service |
c6b782 |
|
|
Packit Service |
c6b782 |
static void
|
|
Packit Service |
c6b782 |
dzl_shortcut_accel_dialog_set_property (GObject *object,
|
|
Packit Service |
c6b782 |
guint prop_id,
|
|
Packit Service |
c6b782 |
const GValue *value,
|
|
Packit Service |
c6b782 |
GParamSpec *pspec)
|
|
Packit Service |
c6b782 |
{
|
|
Packit Service |
c6b782 |
DzlShortcutAccelDialog *self = DZL_SHORTCUT_ACCEL_DIALOG (object);
|
|
Packit Service |
c6b782 |
|
|
Packit Service |
c6b782 |
switch (prop_id)
|
|
Packit Service |
c6b782 |
{
|
|
Packit Service |
c6b782 |
case PROP_ACCELERATOR:
|
|
Packit Service |
c6b782 |
dzl_shortcut_accel_dialog_set_accelerator (self, g_value_get_string (value));
|
|
Packit Service |
c6b782 |
break;
|
|
Packit Service |
c6b782 |
|
|
Packit Service |
c6b782 |
case PROP_SHORTCUT_TITLE:
|
|
Packit Service |
c6b782 |
dzl_shortcut_accel_dialog_set_shortcut_title (self, g_value_get_string (value));
|
|
Packit Service |
c6b782 |
break;
|
|
Packit Service |
c6b782 |
|
|
Packit Service |
c6b782 |
default:
|
|
Packit Service |
c6b782 |
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
|
|
Packit Service |
c6b782 |
}
|
|
Packit Service |
c6b782 |
}
|
|
Packit Service |
c6b782 |
|
|
Packit Service |
c6b782 |
static void
|
|
Packit Service |
c6b782 |
dzl_shortcut_accel_dialog_class_init (DzlShortcutAccelDialogClass *klass)
|
|
Packit Service |
c6b782 |
{
|
|
Packit Service |
c6b782 |
GObjectClass *object_class = G_OBJECT_CLASS (klass);
|
|
Packit Service |
c6b782 |
GtkWidgetClass *widget_class = GTK_WIDGET_CLASS (klass);
|
|
Packit Service |
c6b782 |
|
|
Packit Service |
c6b782 |
object_class->finalize = dzl_shortcut_accel_dialog_finalize;
|
|
Packit Service |
c6b782 |
object_class->get_property = dzl_shortcut_accel_dialog_get_property;
|
|
Packit Service |
c6b782 |
object_class->set_property = dzl_shortcut_accel_dialog_set_property;
|
|
Packit Service |
c6b782 |
|
|
Packit Service |
c6b782 |
widget_class->destroy = dzl_shortcut_accel_dialog_destroy;
|
|
Packit Service |
c6b782 |
widget_class->map = dzl_shortcut_accel_dialog_map;
|
|
Packit Service |
c6b782 |
widget_class->unmap = dzl_shortcut_accel_dialog_unmap;
|
|
Packit Service |
c6b782 |
widget_class->key_press_event = dzl_shortcut_accel_dialog_key_press_event;
|
|
Packit Service |
c6b782 |
widget_class->key_release_event = dzl_shortcut_accel_dialog_key_release_event;
|
|
Packit Service |
c6b782 |
|
|
Packit Service |
c6b782 |
properties [PROP_ACCELERATOR] =
|
|
Packit Service |
c6b782 |
g_param_spec_string ("accelerator",
|
|
Packit Service |
c6b782 |
"Accelerator",
|
|
Packit Service |
c6b782 |
"Accelerator",
|
|
Packit Service |
c6b782 |
NULL,
|
|
Packit Service |
c6b782 |
(G_PARAM_READWRITE | G_PARAM_EXPLICIT_NOTIFY | G_PARAM_STATIC_STRINGS));
|
|
Packit Service |
c6b782 |
|
|
Packit Service |
c6b782 |
properties [PROP_SHORTCUT_TITLE] =
|
|
Packit Service |
c6b782 |
g_param_spec_string ("shortcut-title",
|
|
Packit Service |
c6b782 |
"Title",
|
|
Packit Service |
c6b782 |
"Title",
|
|
Packit Service |
c6b782 |
NULL,
|
|
Packit Service |
c6b782 |
(G_PARAM_READWRITE | G_PARAM_EXPLICIT_NOTIFY | G_PARAM_STATIC_STRINGS));
|
|
Packit Service |
c6b782 |
|
|
Packit Service |
c6b782 |
g_object_class_install_properties (object_class, N_PROPS, properties);
|
|
Packit Service |
c6b782 |
|
|
Packit Service |
c6b782 |
gtk_widget_class_set_template_from_resource (widget_class, "/org/gnome/dazzle/ui/dzl-shortcut-accel-dialog.ui");
|
|
Packit Service |
c6b782 |
|
|
Packit Service |
c6b782 |
gtk_widget_class_bind_template_child (widget_class, DzlShortcutAccelDialog, stack);
|
|
Packit Service |
c6b782 |
gtk_widget_class_bind_template_child (widget_class, DzlShortcutAccelDialog, selection_label);
|
|
Packit Service |
c6b782 |
gtk_widget_class_bind_template_child (widget_class, DzlShortcutAccelDialog, display_label);
|
|
Packit Service |
c6b782 |
gtk_widget_class_bind_template_child (widget_class, DzlShortcutAccelDialog, display_shortcut);
|
|
Packit Service |
c6b782 |
gtk_widget_class_bind_template_child (widget_class, DzlShortcutAccelDialog, button_cancel);
|
|
Packit Service |
c6b782 |
gtk_widget_class_bind_template_child (widget_class, DzlShortcutAccelDialog, button_set);
|
|
Packit Service |
c6b782 |
|
|
Packit Service |
c6b782 |
g_type_ensure (DZL_TYPE_SHORTCUT_LABEL);
|
|
Packit Service |
c6b782 |
}
|
|
Packit Service |
c6b782 |
|
|
Packit Service |
c6b782 |
static void
|
|
Packit Service |
c6b782 |
dzl_shortcut_accel_dialog_init (DzlShortcutAccelDialog *self)
|
|
Packit Service |
c6b782 |
{
|
|
Packit Service |
c6b782 |
gtk_widget_init_template (GTK_WIDGET (self));
|
|
Packit Service |
c6b782 |
|
|
Packit Service |
c6b782 |
gtk_dialog_add_buttons (GTK_DIALOG (self),
|
|
Packit Service |
c6b782 |
_("Cancel"), GTK_RESPONSE_CANCEL,
|
|
Packit Service |
c6b782 |
_("Set"), GTK_RESPONSE_ACCEPT,
|
|
Packit Service |
c6b782 |
NULL);
|
|
Packit Service |
c6b782 |
gtk_dialog_set_default_response (GTK_DIALOG (self), GTK_RESPONSE_ACCEPT);
|
|
Packit Service |
c6b782 |
|
|
Packit Service |
c6b782 |
gtk_dialog_set_response_sensitive (GTK_DIALOG (self), GTK_RESPONSE_ACCEPT, FALSE);
|
|
Packit Service |
c6b782 |
|
|
Packit Service |
c6b782 |
g_object_bind_property (self, "accelerator",
|
|
Packit Service |
c6b782 |
self->display_shortcut, "accelerator",
|
|
Packit Service |
c6b782 |
G_BINDING_SYNC_CREATE);
|
|
Packit Service |
c6b782 |
}
|
|
Packit Service |
c6b782 |
|
|
Packit Service |
c6b782 |
gchar *
|
|
Packit Service |
c6b782 |
dzl_shortcut_accel_dialog_get_accelerator (DzlShortcutAccelDialog *self)
|
|
Packit Service |
c6b782 |
{
|
|
Packit Service |
c6b782 |
g_return_val_if_fail (DZL_IS_SHORTCUT_ACCEL_DIALOG (self), NULL);
|
|
Packit Service |
c6b782 |
|
|
Packit Service |
c6b782 |
if (self->chord == NULL)
|
|
Packit Service |
c6b782 |
return NULL;
|
|
Packit Service |
c6b782 |
|
|
Packit Service |
c6b782 |
return dzl_shortcut_chord_to_string (self->chord);
|
|
Packit Service |
c6b782 |
}
|
|
Packit Service |
c6b782 |
|
|
Packit Service |
c6b782 |
void
|
|
Packit Service |
c6b782 |
dzl_shortcut_accel_dialog_set_accelerator (DzlShortcutAccelDialog *self,
|
|
Packit Service |
c6b782 |
const gchar *accelerator)
|
|
Packit Service |
c6b782 |
{
|
|
Packit Service |
c6b782 |
g_autoptr(DzlShortcutChord) chord = NULL;
|
|
Packit Service |
c6b782 |
|
|
Packit Service |
c6b782 |
g_return_if_fail (DZL_IS_SHORTCUT_ACCEL_DIALOG (self));
|
|
Packit Service |
c6b782 |
|
|
Packit Service |
c6b782 |
if (accelerator)
|
|
Packit Service |
c6b782 |
chord = dzl_shortcut_chord_new_from_string (accelerator);
|
|
Packit Service |
c6b782 |
|
|
Packit Service |
c6b782 |
if (!dzl_shortcut_chord_equal (chord, self->chord))
|
|
Packit Service |
c6b782 |
{
|
|
Packit Service |
c6b782 |
dzl_shortcut_chord_free (self->chord);
|
|
Packit Service |
c6b782 |
self->chord = g_steal_pointer (&chord);
|
|
Packit Service |
c6b782 |
gtk_dialog_set_response_sensitive (GTK_DIALOG (self),
|
|
Packit Service |
c6b782 |
GTK_RESPONSE_ACCEPT,
|
|
Packit Service |
c6b782 |
self->chord != NULL);
|
|
Packit Service |
c6b782 |
g_object_notify_by_pspec (G_OBJECT (self), properties [PROP_ACCELERATOR]);
|
|
Packit Service |
c6b782 |
}
|
|
Packit Service |
c6b782 |
}
|
|
Packit Service |
c6b782 |
|
|
Packit Service |
c6b782 |
void
|
|
Packit Service |
c6b782 |
dzl_shortcut_accel_dialog_set_shortcut_title (DzlShortcutAccelDialog *self,
|
|
Packit Service |
c6b782 |
const gchar *shortcut_title)
|
|
Packit Service |
c6b782 |
{
|
|
Packit Service |
c6b782 |
g_return_if_fail (DZL_IS_SHORTCUT_ACCEL_DIALOG (self));
|
|
Packit Service |
c6b782 |
|
|
Packit Service |
c6b782 |
if (g_strcmp0 (shortcut_title, self->shortcut_title) != 0)
|
|
Packit Service |
c6b782 |
{
|
|
Packit Service |
c6b782 |
g_autofree gchar *label = NULL;
|
|
Packit Service |
c6b782 |
|
|
Packit Service |
c6b782 |
if (shortcut_title != NULL)
|
|
Packit Service |
c6b782 |
{
|
|
Packit Service |
c6b782 |
/* Translators: %s is used to show the provided text in bold */
|
|
Packit Service |
c6b782 |
label = g_strdup_printf (_("Enter new shortcut to change %s."), shortcut_title);
|
|
Packit Service |
c6b782 |
}
|
|
Packit Service |
c6b782 |
|
|
Packit Service |
c6b782 |
gtk_label_set_label (self->selection_label, label);
|
|
Packit Service |
c6b782 |
gtk_label_set_label (self->display_label, label);
|
|
Packit Service |
c6b782 |
|
|
Packit Service |
c6b782 |
g_free (self->shortcut_title);
|
|
Packit Service |
c6b782 |
self->shortcut_title = g_strdup (shortcut_title);
|
|
Packit Service |
c6b782 |
|
|
Packit Service |
c6b782 |
g_object_notify_by_pspec (G_OBJECT (self), properties [PROP_SHORTCUT_TITLE]);
|
|
Packit Service |
c6b782 |
}
|
|
Packit Service |
c6b782 |
}
|
|
Packit Service |
c6b782 |
|
|
Packit Service |
c6b782 |
const gchar *
|
|
Packit Service |
c6b782 |
dzl_shortcut_accel_dialog_get_shortcut_title (DzlShortcutAccelDialog *self)
|
|
Packit Service |
c6b782 |
{
|
|
Packit Service |
c6b782 |
g_return_val_if_fail (DZL_IS_SHORTCUT_ACCEL_DIALOG (self), NULL);
|
|
Packit Service |
c6b782 |
|
|
Packit Service |
c6b782 |
return self->shortcut_title;
|
|
Packit Service |
c6b782 |
}
|
|
Packit Service |
c6b782 |
|
|
Packit Service |
c6b782 |
const DzlShortcutChord *
|
|
Packit Service |
c6b782 |
dzl_shortcut_accel_dialog_get_chord (DzlShortcutAccelDialog *self)
|
|
Packit Service |
c6b782 |
{
|
|
Packit Service |
c6b782 |
g_return_val_if_fail (DZL_IS_SHORTCUT_ACCEL_DIALOG (self), NULL);
|
|
Packit Service |
c6b782 |
|
|
Packit Service |
c6b782 |
return self->chord;
|
|
Packit Service |
c6b782 |
}
|