Compare commits
25 Commits
wip/matthi
...
4.8.2
Author | SHA1 | Date | |
---|---|---|---|
|
81b8426360 | ||
|
b760f57ae1 | ||
|
070926a4cc | ||
|
7a183681b1 | ||
|
14c7a001a6 | ||
|
bcad03da6c | ||
|
5d9576abb9 | ||
|
b86c91de1d | ||
|
a0d85f36ab | ||
|
8455b9ac74 | ||
|
e87801f7e6 | ||
|
a4df9f3d09 | ||
|
f2ccb4192e | ||
|
b71b7ea47f | ||
|
ec9f9d9e96 | ||
|
52dd917c6a | ||
|
8070cfd173 | ||
|
47b7988ccb | ||
|
79eab08797 | ||
|
2ca2a15637 | ||
|
82ca302ec4 | ||
|
6387863256 | ||
|
8c24e1467d | ||
|
e7984a84cb | ||
|
a66b3caa1a |
62
NEWS
62
NEWS
@@ -1,3 +1,65 @@
|
||||
Overview of Changes in 4.8.2, 24-10-2022
|
||||
========================================
|
||||
|
||||
* Input:
|
||||
- Give input methods more control over resets and allow
|
||||
them to preserve state
|
||||
- Align interpretation of modifiers in key events
|
||||
in X11 and Wayland
|
||||
|
||||
* GtkColumnView:
|
||||
- Fixes to focus handling
|
||||
|
||||
* GtkPopover:
|
||||
- Fix problems with focus when dismissing popovers
|
||||
- Fix problems with focusing editable labels in popovers
|
||||
|
||||
* Build:
|
||||
- Fix build problems with resources and non-gnu linkers
|
||||
- Fix gi-docgen detection in cross builds
|
||||
- Require meson 0.60
|
||||
|
||||
* Debugging:
|
||||
- Make more debug options available in no-debug builds
|
||||
- Improve consistency of debug logging
|
||||
- Give names to all sources
|
||||
|
||||
* Accessibility:
|
||||
- Introduce GtkAccessibleRange
|
||||
|
||||
* Wayland:
|
||||
- Make monitor bounds handling more robust
|
||||
- Prevent shrinking clients due to wrong toplevel bounds
|
||||
|
||||
* Broadway:
|
||||
- Return correct pointer coordinates from device queries
|
||||
|
||||
* Windows:
|
||||
- Use native API to translate key events
|
||||
|
||||
* Translation updates:
|
||||
Brazilian Portuguese
|
||||
British English
|
||||
Bulgarian
|
||||
Catalan
|
||||
Croatian
|
||||
Czech
|
||||
Friulian
|
||||
Galician
|
||||
Georgian
|
||||
German
|
||||
Indonesian
|
||||
Lithuanian
|
||||
Polish
|
||||
Portuguese
|
||||
Russian
|
||||
Serbian
|
||||
Slovenian
|
||||
Swedish
|
||||
Turkish
|
||||
Ukrainian
|
||||
|
||||
|
||||
Overview of Changes in 4.8.1, 16-09-2022
|
||||
========================================
|
||||
|
||||
|
@@ -262,7 +262,8 @@ _gdk_broadway_events_got_input (GdkDisplay *display,
|
||||
message->key.state,
|
||||
FALSE,
|
||||
&translated,
|
||||
&translated);
|
||||
&translated,
|
||||
NULL);
|
||||
|
||||
node = _gdk_event_queue_append (display, event);
|
||||
_gdk_windowing_got_event (display, node, event, message->base.serial);
|
||||
|
@@ -1517,6 +1517,16 @@ gdk_button_event_get_button (GdkEvent *event)
|
||||
* An event related to a key-based device.
|
||||
*/
|
||||
|
||||
static void
|
||||
gdk_key_event_finalize (GdkEvent *event)
|
||||
{
|
||||
GdkKeyEvent *self = (GdkKeyEvent *) event;
|
||||
|
||||
g_free (self->compose_sequence);
|
||||
|
||||
GDK_EVENT_SUPER (event)->finalize (event);
|
||||
}
|
||||
|
||||
static GdkModifierType
|
||||
gdk_key_event_get_state (GdkEvent *event)
|
||||
{
|
||||
@@ -1528,7 +1538,7 @@ gdk_key_event_get_state (GdkEvent *event)
|
||||
static const GdkEventTypeInfo gdk_key_event_info = {
|
||||
sizeof (GdkKeyEvent),
|
||||
NULL,
|
||||
NULL,
|
||||
gdk_key_event_finalize,
|
||||
gdk_key_event_get_state,
|
||||
NULL,
|
||||
NULL,
|
||||
@@ -1552,6 +1562,10 @@ GDK_DEFINE_EVENT_TYPE (GdkKeyEvent, gdk_key_event,
|
||||
* @is_modifier: whether the event is a modifiers only event
|
||||
* @translated: the translated key data for the given @state
|
||||
* @no_lock: the translated key data without the given @state
|
||||
* @compose_sequence: (transfer none) (nullable):
|
||||
* The compose sequence string, either partial or only the
|
||||
* final composed string, if that can be determined at event
|
||||
* creation time. Used by selected IM modules.
|
||||
*
|
||||
* Creates a new `GdkKeyEvent`.
|
||||
*
|
||||
@@ -1566,7 +1580,8 @@ gdk_key_event_new (GdkEventType type,
|
||||
GdkModifierType state,
|
||||
gboolean is_modifier,
|
||||
GdkTranslatedKey *translated,
|
||||
GdkTranslatedKey *no_lock)
|
||||
GdkTranslatedKey *no_lock,
|
||||
char *compose_sequence)
|
||||
{
|
||||
g_return_val_if_fail (type == GDK_KEY_PRESS ||
|
||||
type == GDK_KEY_RELEASE, NULL);
|
||||
@@ -1579,6 +1594,7 @@ gdk_key_event_new (GdkEventType type,
|
||||
self->key_is_modifier = is_modifier;
|
||||
self->translated[0] = *translated;
|
||||
self->translated[1] = *no_lock;
|
||||
self->compose_sequence = g_strdup (compose_sequence);
|
||||
|
||||
return event;
|
||||
}
|
||||
@@ -1609,6 +1625,26 @@ gdk_key_event_get_translated_key (GdkEvent *event,
|
||||
return &(self->translated[0]);
|
||||
}
|
||||
|
||||
/*< private >
|
||||
* gdk_key_event_get_compose_sequence:
|
||||
* @event: (type GdkKeyEvent): a key event
|
||||
*
|
||||
* Extracts the compose sequence string from a key event.
|
||||
*
|
||||
* Returns: (transfer none): the compose sequence string
|
||||
*/
|
||||
char *
|
||||
gdk_key_event_get_compose_sequence (GdkEvent *event)
|
||||
{
|
||||
GdkKeyEvent *self = (GdkKeyEvent *) event;
|
||||
|
||||
g_return_val_if_fail (GDK_IS_EVENT (event), 0);
|
||||
g_return_val_if_fail (GDK_IS_EVENT_TYPE (event, GDK_KEY_PRESS) ||
|
||||
GDK_IS_EVENT_TYPE (event, GDK_KEY_RELEASE), FALSE);
|
||||
|
||||
return self->compose_sequence;
|
||||
}
|
||||
|
||||
/**
|
||||
* gdk_key_event_get_keyval:
|
||||
* @event: (type GdkKeyEvent): a key event
|
||||
|
@@ -259,6 +259,9 @@ typedef struct {
|
||||
* @keycode: the raw code of the key that was pressed or released.
|
||||
* @translated: the result of translating @keycode. First with the full
|
||||
* @state, then while ignoring Caps Lock.
|
||||
* @compose_sequence: optional string for use by selected IM modules.
|
||||
* Contains either partial compose sequences or the final composed
|
||||
* string of the keystroke sequence.
|
||||
*
|
||||
* Describes a key press or key release event.
|
||||
*/
|
||||
@@ -270,6 +273,7 @@ struct _GdkKeyEvent
|
||||
guint32 keycode;
|
||||
gboolean key_is_modifier;
|
||||
GdkTranslatedKey translated[2];
|
||||
char *compose_sequence;
|
||||
};
|
||||
|
||||
/*
|
||||
@@ -470,7 +474,8 @@ GdkEvent * gdk_key_event_new (GdkEventType type,
|
||||
GdkModifierType modifiers,
|
||||
gboolean is_modifier,
|
||||
GdkTranslatedKey *translated,
|
||||
GdkTranslatedKey *no_lock);
|
||||
GdkTranslatedKey *no_lock,
|
||||
char *compose_sequence);
|
||||
|
||||
GdkEvent * gdk_focus_event_new (GdkSurface *surface,
|
||||
GdkDevice *device,
|
||||
@@ -597,6 +602,8 @@ GdkEvent * gdk_grab_broken_event_new (GdkSurface *surface,
|
||||
GdkTranslatedKey * gdk_key_event_get_translated_key (GdkEvent *event,
|
||||
gboolean no_lock);
|
||||
|
||||
char * gdk_key_event_get_compose_sequence (GdkEvent *event);
|
||||
|
||||
typedef enum
|
||||
{
|
||||
/* Following flag is set for events on the event queue during
|
||||
@@ -626,7 +633,6 @@ void _gdk_event_queue_flush (GdkDisplay *display);
|
||||
|
||||
double * gdk_event_dup_axes (GdkEvent *event);
|
||||
|
||||
|
||||
G_END_DECLS
|
||||
|
||||
#endif /* __GDK_EVENTS_PRIVATE_H__ */
|
||||
|
@@ -32,6 +32,9 @@ G_DEFINE_POINTER_TYPE (GdkToplevelSize, gdk_toplevel_size)
|
||||
#define UNCONFIGURED_WIDTH 400
|
||||
#define UNCONFIGURED_HEIGHT 300
|
||||
|
||||
#define DEFAULT_BOUNDS_WIDTH INT_MAX
|
||||
#define DEFAULT_BOUNDS_HEIGHT INT_MAX
|
||||
|
||||
void
|
||||
gdk_toplevel_size_init (GdkToplevelSize *size,
|
||||
int bounds_width,
|
||||
@@ -68,8 +71,15 @@ gdk_toplevel_size_get_bounds (GdkToplevelSize *size,
|
||||
g_return_if_fail (bounds_width);
|
||||
g_return_if_fail (bounds_height);
|
||||
|
||||
*bounds_width = size->bounds_width;
|
||||
*bounds_height = size->bounds_height;
|
||||
if (size->bounds_width > 0)
|
||||
*bounds_width = size->bounds_width;
|
||||
else
|
||||
*bounds_width = DEFAULT_BOUNDS_WIDTH;
|
||||
|
||||
if (size->bounds_height > 0)
|
||||
*bounds_height = size->bounds_height;
|
||||
else
|
||||
*bounds_height = DEFAULT_BOUNDS_HEIGHT;
|
||||
}
|
||||
|
||||
/**
|
||||
|
@@ -431,7 +431,8 @@ fill_key_event (GdkMacosDisplay *display,
|
||||
state,
|
||||
is_modifier,
|
||||
&translated,
|
||||
&no_lock);
|
||||
&no_lock,
|
||||
NULL);
|
||||
}
|
||||
|
||||
static GdkEvent *
|
||||
|
@@ -944,7 +944,8 @@ _gdk_macos_surface_synthesize_null_key (GdkMacosSurface *self)
|
||||
0,
|
||||
FALSE,
|
||||
&translated,
|
||||
&no_lock);
|
||||
&no_lock,
|
||||
NULL);
|
||||
_gdk_event_queue_append (display, event);
|
||||
}
|
||||
|
||||
|
@@ -2205,7 +2205,8 @@ deliver_key_event (GdkWaylandSeat *seat,
|
||||
device_get_modifiers (seat->logical_pointer),
|
||||
_gdk_wayland_keymap_key_is_modifier (keymap, key),
|
||||
&translated,
|
||||
&no_lock);
|
||||
&no_lock,
|
||||
NULL);
|
||||
|
||||
_gdk_wayland_display_deliver_event (seat->display, event);
|
||||
|
||||
|
@@ -1419,10 +1419,18 @@ configure_toplevel_geometry (GdkSurface *surface)
|
||||
GdkRectangle monitor_geometry;
|
||||
|
||||
monitor = g_list_model_get_item (gdk_display_get_monitors (display), 0);
|
||||
gdk_monitor_get_geometry (monitor, &monitor_geometry);
|
||||
bounds_width = monitor_geometry.width;
|
||||
bounds_height = monitor_geometry.height;
|
||||
g_object_unref (monitor);
|
||||
if (monitor)
|
||||
{
|
||||
gdk_monitor_get_geometry (monitor, &monitor_geometry);
|
||||
bounds_width = monitor_geometry.width;
|
||||
bounds_height = monitor_geometry.height;
|
||||
g_object_unref (monitor);
|
||||
}
|
||||
else
|
||||
{
|
||||
bounds_width = 0;
|
||||
bounds_height = 0;
|
||||
}
|
||||
}
|
||||
|
||||
gdk_toplevel_size_init (&size, bounds_width, bounds_height);
|
||||
|
@@ -1857,7 +1857,8 @@ gdk_event_translate (MSG *msg,
|
||||
0,
|
||||
FALSE,
|
||||
&translated,
|
||||
&translated);
|
||||
&translated,
|
||||
NULL);
|
||||
_gdk_win32_append_event (event);
|
||||
}
|
||||
break;
|
||||
@@ -1906,8 +1907,12 @@ gdk_event_translate (MSG *msg,
|
||||
GdkTranslatedKey translated;
|
||||
GdkTranslatedKey no_lock;
|
||||
BYTE key_state[256];
|
||||
wchar_t wbuf[100];
|
||||
int ccount = 0;
|
||||
GArray *translation;
|
||||
MSG msg2;
|
||||
int level = 0;
|
||||
int effective_group = 0;
|
||||
GdkModifierType consumed = 0;
|
||||
char *composed = NULL;
|
||||
|
||||
/* Ignore key messages intended for the IME */
|
||||
if (msg->wParam == VK_PROCESSKEY || in_ime_composition)
|
||||
@@ -1929,34 +1934,41 @@ gdk_event_translate (MSG *msg,
|
||||
|
||||
API_CALL (GetKeyboardState, (key_state));
|
||||
|
||||
ccount = 0;
|
||||
|
||||
if (msg->wParam == VK_PACKET)
|
||||
{
|
||||
ccount = ToUnicode (VK_PACKET, HIWORD (msg->lParam), key_state, wbuf, 1, 0);
|
||||
if (ccount == 1)
|
||||
{
|
||||
if (wbuf[0] >= 0xD800 && wbuf[0] < 0xDC00)
|
||||
{
|
||||
if (msg->message == WM_KEYDOWN)
|
||||
impl->leading_surrogate_keydown = wbuf[0];
|
||||
else
|
||||
impl->leading_surrogate_keyup = wbuf[0];
|
||||
|
||||
/* don't emit an event */
|
||||
return_val = TRUE;
|
||||
break;
|
||||
}
|
||||
else
|
||||
{
|
||||
/* wait until an event is created */;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
keyval = GDK_KEY_VoidSymbol;
|
||||
keycode = msg->wParam;
|
||||
|
||||
/* Get the WinAPI translation of the WM_KEY messages to characters.
|
||||
|
||||
The WM_CHAR messages are generated by a previous call to TranslateMessage() and always
|
||||
follow directly after the corresponding WM_KEY* messages.
|
||||
There could be 0 or more WM_CHAR messages following (for example dead keys don't generate
|
||||
WM_CHAR messages - they generate WM_DEAD_CHAR instead, but we are not interested in those
|
||||
messages). */
|
||||
|
||||
translation = g_array_sized_new (FALSE, FALSE, sizeof (gunichar2), 2);
|
||||
while (PeekMessageW (&msg2, msg->hwnd, 0, 0, 0) && (msg2.message == WM_CHAR || msg2.message == WM_SYSCHAR))
|
||||
{
|
||||
/* The character is encoded in WPARAM as UTF-16. */
|
||||
gunichar2 c = msg2.wParam;
|
||||
|
||||
/* Append character to translation string. */
|
||||
g_array_append_val (translation, c);
|
||||
|
||||
/* Remove message from queue */
|
||||
GetMessageW (&msg2, msg->hwnd, 0, 0);
|
||||
}
|
||||
|
||||
if (translation->len > 0)
|
||||
composed = g_utf16_to_utf8 ((gunichar2*)translation->data,
|
||||
translation->len, NULL, NULL, NULL);
|
||||
|
||||
g_array_unref (translation);
|
||||
translation = NULL;
|
||||
|
||||
/* Ignore control sequences like Backspace */
|
||||
if (composed && g_unichar_iscntrl (g_utf8_get_char (composed)))
|
||||
g_clear_pointer (&composed, g_free);
|
||||
|
||||
if (HIWORD (msg->lParam) & KF_EXTENDED)
|
||||
{
|
||||
switch (msg->wParam)
|
||||
@@ -1985,61 +1997,20 @@ gdk_event_translate (MSG *msg,
|
||||
state = build_key_event_state (key_state);
|
||||
group = get_active_group ();
|
||||
|
||||
if (msg->wParam == VK_PACKET && ccount == 1)
|
||||
{
|
||||
if (wbuf[0] >= 0xD800 && wbuf[0] < 0xDC00)
|
||||
{
|
||||
g_assert_not_reached ();
|
||||
}
|
||||
else if (wbuf[0] >= 0xDC00 && wbuf[0] < 0xE000)
|
||||
{
|
||||
wchar_t leading;
|
||||
gdk_keymap_translate_keyboard_state ((GdkKeymap*) win32_keymap, keycode, state, group,
|
||||
&keyval, &effective_group, &level, &consumed);
|
||||
translated.keyval = keyval;
|
||||
translated.consumed = consumed;
|
||||
translated.layout = effective_group;
|
||||
translated.level = level;
|
||||
|
||||
if (msg->message == WM_KEYDOWN)
|
||||
leading = impl->leading_surrogate_keydown;
|
||||
else
|
||||
leading = impl->leading_surrogate_keyup;
|
||||
|
||||
keyval = gdk_unicode_to_keyval ((leading - 0xD800) * 0x400 + wbuf[0] - 0xDC00 + 0x10000);
|
||||
}
|
||||
else
|
||||
{
|
||||
keyval = gdk_unicode_to_keyval (wbuf[0]);
|
||||
}
|
||||
|
||||
translated.keyval = keyval;
|
||||
translated.consumed = 0;
|
||||
translated.layout = 0;
|
||||
translated.level = 0;
|
||||
|
||||
no_lock = translated;
|
||||
}
|
||||
else
|
||||
{
|
||||
int level = 0;
|
||||
int effective_group = 0;
|
||||
GdkModifierType consumed = 0;
|
||||
|
||||
gdk_keymap_translate_keyboard_state ((GdkKeymap*) win32_keymap, keycode, state, group,
|
||||
&keyval, &effective_group, &level, &consumed);
|
||||
translated.keyval = keyval;
|
||||
translated.consumed = consumed;
|
||||
translated.layout = effective_group;
|
||||
translated.level = level;
|
||||
|
||||
gdk_keymap_translate_keyboard_state ((GdkKeymap*) win32_keymap, keycode,
|
||||
state & ~GDK_LOCK_MASK, group, &keyval,
|
||||
&effective_group, &level, &consumed);
|
||||
no_lock.keyval = keyval;
|
||||
no_lock.consumed = consumed;
|
||||
no_lock.layout = effective_group;
|
||||
no_lock.level = level;
|
||||
}
|
||||
|
||||
if (msg->message == WM_KEYDOWN)
|
||||
impl->leading_surrogate_keydown = 0;
|
||||
else
|
||||
impl->leading_surrogate_keyup = 0;
|
||||
gdk_keymap_translate_keyboard_state ((GdkKeymap*) win32_keymap, keycode,
|
||||
state & ~GDK_LOCK_MASK, group, &keyval,
|
||||
&effective_group, &level, &consumed);
|
||||
no_lock.keyval = keyval;
|
||||
no_lock.consumed = consumed;
|
||||
no_lock.layout = effective_group;
|
||||
no_lock.level = level;
|
||||
|
||||
/* Only one release key event is fired when both shift keys are pressed together
|
||||
and then released. In order to send the missing event, press events for shift
|
||||
@@ -2087,10 +2058,12 @@ gdk_event_translate (MSG *msg,
|
||||
state,
|
||||
is_modifier,
|
||||
&translated,
|
||||
&no_lock);
|
||||
&no_lock,
|
||||
composed);
|
||||
|
||||
_gdk_win32_append_event (event);
|
||||
|
||||
g_free (composed);
|
||||
return_val = TRUE;
|
||||
}
|
||||
break;
|
||||
@@ -2169,7 +2142,8 @@ gdk_event_translate (MSG *msg,
|
||||
build_key_event_state (key_state),
|
||||
FALSE,
|
||||
&translated,
|
||||
&translated);
|
||||
&translated,
|
||||
NULL);
|
||||
|
||||
_gdk_win32_append_event (event);
|
||||
|
||||
@@ -2182,7 +2156,8 @@ gdk_event_translate (MSG *msg,
|
||||
build_key_event_state (key_state),
|
||||
FALSE,
|
||||
&translated,
|
||||
&translated);
|
||||
&translated,
|
||||
NULL);
|
||||
|
||||
_gdk_win32_append_event (event);
|
||||
}
|
||||
|
@@ -235,14 +235,6 @@ struct _GdkWin32Surface
|
||||
/* The cursor that GDK set for this window via GdkDevice */
|
||||
GdkWin32HCursor *cursor;
|
||||
|
||||
/* When VK_PACKET sends us a leading surrogate, it's stashed here.
|
||||
* Later, when another VK_PACKET sends a tailing surrogate, we make up
|
||||
* a full unicode character from them, or discard the leading surrogate,
|
||||
* if the next key is not a tailing surrogate.
|
||||
*/
|
||||
wchar_t leading_surrogate_keydown;
|
||||
wchar_t leading_surrogate_keyup;
|
||||
|
||||
/* Window size hints */
|
||||
int hint_flags;
|
||||
GdkGeometry hints;
|
||||
|
@@ -1595,7 +1595,8 @@ gdk_x11_device_manager_xi2_translate_event (GdkEventTranslator *translator,
|
||||
state,
|
||||
gdk_x11_keymap_key_is_modifier (keymap, xev->detail),
|
||||
&translated,
|
||||
&no_lock);
|
||||
&no_lock,
|
||||
NULL);
|
||||
|
||||
if (ev->evtype == XI_KeyPress)
|
||||
set_user_time (event);
|
||||
|
@@ -659,6 +659,8 @@ gtk_column_view_class_init (GtkColumnViewClass *klass)
|
||||
GObjectClass *gobject_class = G_OBJECT_CLASS (klass);
|
||||
gpointer iface;
|
||||
|
||||
widget_class->focus = gtk_widget_focus_child;
|
||||
widget_class->grab_focus = gtk_widget_grab_focus_child;
|
||||
widget_class->measure = gtk_column_view_measure;
|
||||
widget_class->size_allocate = gtk_column_view_allocate;
|
||||
|
||||
@@ -1314,7 +1316,6 @@ gtk_column_view_init (GtkColumnView *self)
|
||||
g_quark_from_static_string (I_("view")));
|
||||
|
||||
gtk_widget_set_overflow (GTK_WIDGET (self), GTK_OVERFLOW_HIDDEN);
|
||||
gtk_widget_set_focusable (GTK_WIDGET (self), TRUE);
|
||||
|
||||
self->reorderable = TRUE;
|
||||
}
|
||||
|
@@ -192,11 +192,23 @@ gtk_editable_label_prepare_drag (GtkDragSource *source,
|
||||
gtk_label_get_label (GTK_LABEL (self->label)));
|
||||
}
|
||||
|
||||
static gboolean
|
||||
stop_editing_soon (gpointer data)
|
||||
{
|
||||
GtkEventController *controller = data;
|
||||
GtkWidget *widget = gtk_event_controller_get_widget (controller);
|
||||
|
||||
if (!gtk_event_controller_focus_contains_focus (GTK_EVENT_CONTROLLER_FOCUS (controller)))
|
||||
gtk_editable_label_stop_editing (GTK_EDITABLE_LABEL (widget), TRUE);
|
||||
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
static void
|
||||
gtk_editable_label_focus_out (GtkEventController *controller,
|
||||
GtkEditableLabel *self)
|
||||
{
|
||||
gtk_editable_label_stop_editing (self, TRUE);
|
||||
g_timeout_add (100, stop_editing_soon, controller);
|
||||
}
|
||||
|
||||
static void
|
||||
|
@@ -607,7 +607,8 @@ gtk_im_context_filter_key (GtkIMContext *context,
|
||||
state,
|
||||
FALSE, /* FIXME */
|
||||
&translated,
|
||||
&no_lock);
|
||||
&no_lock,
|
||||
NULL);
|
||||
|
||||
ret = GTK_IM_CONTEXT_GET_CLASS (context)->filter_keypress (context, key);
|
||||
|
||||
|
@@ -34,6 +34,7 @@
|
||||
#include "imm-extra.h"
|
||||
|
||||
#include "gdk/gdkkeysyms.h"
|
||||
#include "gdk/gdkeventsprivate.h"
|
||||
#include "gdk/win32/gdkwin32.h"
|
||||
#include "gtk/gtkimmodule.h"
|
||||
#include "gtk/gtkstylecontextprivate.h"
|
||||
@@ -61,9 +62,6 @@ typedef enum {
|
||||
GTK_WIN32_IME_FOCUS_BEHAVIOR_FOLLOW,
|
||||
} GtkWin32IMEFocusBehavior;
|
||||
|
||||
#define IS_DEAD_KEY(k) \
|
||||
((k) >= GDK_KEY_dead_grave && (k) <= (GDK_KEY_dead_dasia+1))
|
||||
|
||||
struct _GtkIMContextIMEPrivate
|
||||
{
|
||||
/* When pretend_empty_preedit is set to TRUE,
|
||||
@@ -81,7 +79,6 @@ struct _GtkIMContextIMEPrivate
|
||||
* https://gitlab.gnome.org/GNOME/gtk/commit/c255ba68fc2c918dd84da48a472e7973d3c00b03
|
||||
*/
|
||||
gboolean pretend_empty_preedit;
|
||||
guint32 dead_key_keyval;
|
||||
GtkWin32IMEFocusBehavior focus_behavior;
|
||||
};
|
||||
|
||||
@@ -277,134 +274,26 @@ gtk_im_context_ime_set_client_widget (GtkIMContext *context,
|
||||
context_ime->client_surface = surface;
|
||||
}
|
||||
|
||||
static gunichar
|
||||
_gtk_im_context_ime_dead_key_unichar (guint keyval,
|
||||
gboolean spacing)
|
||||
{
|
||||
switch (keyval)
|
||||
{
|
||||
#define CASE(keysym, unicode, spacing_unicode) \
|
||||
case GDK_KEY_dead_##keysym: return (spacing) ? spacing_unicode : unicode;
|
||||
|
||||
CASE (grave, 0x0300, 0x0060);
|
||||
CASE (acute, 0x0301, 0x00b4);
|
||||
CASE (circumflex, 0x0302, 0x005e);
|
||||
CASE (tilde, 0x0303, 0x007e); /* Also used with perispomeni, 0x342. */
|
||||
CASE (macron, 0x0304, 0x00af);
|
||||
CASE (breve, 0x0306, 0x02d8);
|
||||
CASE (abovedot, 0x0307, 0x02d9);
|
||||
CASE (diaeresis, 0x0308, 0x00a8);
|
||||
CASE (hook, 0x0309, 0);
|
||||
CASE (abovering, 0x030A, 0x02da);
|
||||
CASE (doubleacute, 0x030B, 0x2dd);
|
||||
CASE (caron, 0x030C, 0x02c7);
|
||||
CASE (abovecomma, 0x0313, 0); /* Equivalent to psili */
|
||||
CASE (abovereversedcomma, 0x0314, 0); /* Equivalent to dasia */
|
||||
CASE (horn, 0x031B, 0); /* Legacy use for psili, 0x313 (or 0x343). */
|
||||
CASE (belowdot, 0x0323, 0);
|
||||
CASE (cedilla, 0x0327, 0x00b8);
|
||||
CASE (ogonek, 0x0328, 0); /* Legacy use for dasia, 0x314.*/
|
||||
CASE (iota, 0x0345, 0);
|
||||
|
||||
#undef CASE
|
||||
default:
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
|
||||
static void
|
||||
_gtk_im_context_ime_commit_unichar (GtkIMContextIME *context_ime,
|
||||
gunichar c)
|
||||
{
|
||||
char utf8[10];
|
||||
int len;
|
||||
|
||||
if (context_ime->priv->dead_key_keyval != 0)
|
||||
{
|
||||
gunichar combining;
|
||||
|
||||
combining =
|
||||
_gtk_im_context_ime_dead_key_unichar (context_ime->priv->dead_key_keyval,
|
||||
FALSE);
|
||||
g_unichar_compose (c, combining, &c);
|
||||
}
|
||||
|
||||
len = g_unichar_to_utf8 (c, utf8);
|
||||
utf8[len] = 0;
|
||||
|
||||
g_signal_emit_by_name (context_ime, "commit", utf8);
|
||||
context_ime->priv->dead_key_keyval = 0;
|
||||
}
|
||||
|
||||
static gboolean
|
||||
gtk_im_context_ime_filter_keypress (GtkIMContext *context,
|
||||
GdkEvent *event)
|
||||
{
|
||||
GtkIMContextIME *context_ime;
|
||||
gboolean retval = FALSE;
|
||||
guint32 c;
|
||||
GdkModifierType state, consumed_modifiers, no_text_input_mask;
|
||||
guint keyval;
|
||||
char *compose_sequence = NULL;
|
||||
|
||||
g_return_val_if_fail (GTK_IS_IM_CONTEXT_IME (context), FALSE);
|
||||
g_return_val_if_fail (event, FALSE);
|
||||
|
||||
if (gdk_event_get_event_type ((GdkEvent *) event) == GDK_KEY_RELEASE)
|
||||
return FALSE;
|
||||
|
||||
no_text_input_mask = GDK_ALT_MASK|GDK_CONTROL_MASK;
|
||||
|
||||
state = gdk_event_get_modifier_state ((GdkEvent *) event);
|
||||
consumed_modifiers = gdk_key_event_get_consumed_modifiers (event);
|
||||
|
||||
if (state & no_text_input_mask & ~consumed_modifiers)
|
||||
return FALSE;
|
||||
|
||||
context_ime = GTK_IM_CONTEXT_IME (context);
|
||||
|
||||
if (!context_ime->focus)
|
||||
return FALSE;
|
||||
|
||||
if (!GDK_IS_SURFACE (context_ime->client_surface))
|
||||
return FALSE;
|
||||
|
||||
keyval = gdk_key_event_get_keyval ((GdkEvent *) event);
|
||||
|
||||
if (keyval == GDK_KEY_space &&
|
||||
context_ime->priv->dead_key_keyval != 0)
|
||||
compose_sequence = gdk_key_event_get_compose_sequence (event);
|
||||
if (compose_sequence)
|
||||
{
|
||||
c = _gtk_im_context_ime_dead_key_unichar (context_ime->priv->dead_key_keyval, TRUE);
|
||||
context_ime->priv->dead_key_keyval = 0;
|
||||
_gtk_im_context_ime_commit_unichar (context_ime, c);
|
||||
g_signal_emit_by_name (context_ime, "commit", compose_sequence);
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
c = gdk_keyval_to_unicode (keyval);
|
||||
|
||||
if (c && !g_unichar_iscntrl(c))
|
||||
{
|
||||
_gtk_im_context_ime_commit_unichar (context_ime, c);
|
||||
retval = TRUE;
|
||||
}
|
||||
else if (IS_DEAD_KEY (keyval))
|
||||
{
|
||||
gunichar dead_key;
|
||||
|
||||
dead_key = _gtk_im_context_ime_dead_key_unichar (keyval, FALSE);
|
||||
|
||||
/* Emulate double input of dead keys */
|
||||
if (dead_key && keyval == context_ime->priv->dead_key_keyval)
|
||||
{
|
||||
c = _gtk_im_context_ime_dead_key_unichar (context_ime->priv->dead_key_keyval, TRUE);
|
||||
context_ime->priv->dead_key_keyval = 0;
|
||||
_gtk_im_context_ime_commit_unichar (context_ime, c);
|
||||
_gtk_im_context_ime_commit_unichar (context_ime, c);
|
||||
}
|
||||
else
|
||||
context_ime->priv->dead_key_keyval = keyval;
|
||||
}
|
||||
|
||||
return retval;
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
|
||||
|
@@ -663,7 +663,8 @@ no_sequence_matches (GtkIMContextSimple *context_simple,
|
||||
gdk_event_get_modifier_state (event),
|
||||
FALSE,
|
||||
&translated,
|
||||
&translated);
|
||||
&translated,
|
||||
NULL);
|
||||
|
||||
gtk_im_context_filter_keypress (context, tmp_event);
|
||||
gdk_event_unref (tmp_event);
|
||||
|
@@ -569,6 +569,20 @@ gtk_list_base_focus (GtkWidget *widget,
|
||||
return gtk_widget_child_focus (item->widget, direction);
|
||||
}
|
||||
|
||||
static gboolean
|
||||
gtk_list_base_grab_focus (GtkWidget *widget)
|
||||
{
|
||||
GtkListBase *self = GTK_LIST_BASE (widget);
|
||||
GtkListBasePrivate *priv = gtk_list_base_get_instance_private (self);
|
||||
guint pos;
|
||||
|
||||
pos = gtk_list_item_tracker_get_position (priv->item_manager, priv->focus);
|
||||
if (gtk_list_base_grab_focus_on_item (self, pos, FALSE, FALSE, FALSE))
|
||||
return TRUE;
|
||||
|
||||
return GTK_WIDGET_CLASS (gtk_list_base_parent_class)->grab_focus (widget);
|
||||
}
|
||||
|
||||
static void
|
||||
gtk_list_base_dispose (GObject *object)
|
||||
{
|
||||
@@ -1120,6 +1134,7 @@ gtk_list_base_class_init (GtkListBaseClass *klass)
|
||||
gpointer iface;
|
||||
|
||||
widget_class->focus = gtk_list_base_focus;
|
||||
widget_class->grab_focus = gtk_list_base_grab_focus;
|
||||
|
||||
gobject_class->dispose = gtk_list_base_dispose;
|
||||
gobject_class->get_property = gtk_list_base_get_property;
|
||||
|
@@ -1084,7 +1084,8 @@ rewrite_event_for_toplevel (GdkEvent *event)
|
||||
gdk_key_event_get_keycode (event),
|
||||
gdk_event_get_modifier_state (event),
|
||||
gdk_key_event_is_modifier (event),
|
||||
key, key_no_lock);
|
||||
key, key_no_lock,
|
||||
gdk_key_event_get_compose_sequence (event));
|
||||
}
|
||||
|
||||
static gboolean
|
||||
|
@@ -184,6 +184,7 @@ typedef struct
|
||||
|
||||
GtkWidget *default_widget;
|
||||
GtkWidget *focus_widget;
|
||||
GtkWidget *move_focus_widget;
|
||||
GtkWindow *transient_parent;
|
||||
GtkWindowGeometryInfo *geometry_info;
|
||||
GtkWindowGroup *group;
|
||||
@@ -2003,7 +2004,12 @@ gtk_window_root_set_focus (GtkRoot *root,
|
||||
|
||||
if (focus == priv->focus_widget)
|
||||
{
|
||||
priv->move_focus = FALSE;
|
||||
if (priv->move_focus &&
|
||||
focus && gtk_widget_is_visible (focus))
|
||||
{
|
||||
priv->move_focus = FALSE;
|
||||
g_clear_object (&priv->move_focus_widget);
|
||||
}
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -2023,7 +2029,12 @@ gtk_window_root_set_focus (GtkRoot *root,
|
||||
|
||||
g_clear_object (&old_focus);
|
||||
|
||||
priv->move_focus = FALSE;
|
||||
if (priv->move_focus &&
|
||||
focus && gtk_widget_is_visible (focus))
|
||||
{
|
||||
priv->move_focus = FALSE;
|
||||
g_clear_object (&priv->move_focus_widget);
|
||||
}
|
||||
|
||||
g_object_notify (G_OBJECT (self), "focus-widget");
|
||||
}
|
||||
@@ -2547,6 +2558,7 @@ gtk_window_dispose (GObject *object)
|
||||
g_list_free_full (priv->foci, (GDestroyNotify) gtk_pointer_focus_unref);
|
||||
priv->foci = NULL;
|
||||
|
||||
g_clear_object (&priv->move_focus_widget);
|
||||
gtk_window_set_focus (window, NULL);
|
||||
gtk_window_set_default_widget (window, NULL);
|
||||
|
||||
@@ -4675,7 +4687,25 @@ maybe_unset_focus_and_default (GtkWindow *window)
|
||||
GtkWindowPrivate *priv = gtk_window_get_instance_private (window);
|
||||
|
||||
if (priv->move_focus)
|
||||
gtk_widget_child_focus (GTK_WIDGET (window), GTK_DIR_TAB_FORWARD);
|
||||
{
|
||||
GtkWidget *parent;
|
||||
|
||||
parent = _gtk_widget_get_parent (priv->move_focus_widget);
|
||||
|
||||
while (parent)
|
||||
{
|
||||
if (_gtk_widget_get_visible (parent))
|
||||
{
|
||||
if (gtk_widget_grab_focus (parent))
|
||||
break;
|
||||
}
|
||||
|
||||
parent = _gtk_widget_get_parent (parent);
|
||||
}
|
||||
|
||||
priv->move_focus = FALSE;
|
||||
g_clear_object (&priv->move_focus_widget);
|
||||
}
|
||||
|
||||
if (priv->unset_default)
|
||||
gtk_window_set_default_widget (window, NULL);
|
||||
@@ -5134,7 +5164,10 @@ _gtk_window_unset_focus_and_default (GtkWindow *window,
|
||||
|
||||
child = priv->focus_widget;
|
||||
if (child && (child == widget || gtk_widget_is_ancestor (child, widget)))
|
||||
priv->move_focus = TRUE;
|
||||
{
|
||||
priv->move_focus_widget = g_object_ref (widget);
|
||||
priv->move_focus = TRUE;
|
||||
}
|
||||
|
||||
child = priv->default_widget;
|
||||
if (child && (child == widget || gtk_widget_is_ancestor (child, widget)))
|
||||
|
@@ -1,5 +1,5 @@
|
||||
project('gtk', 'c',
|
||||
version: '4.8.1',
|
||||
version: '4.8.2',
|
||||
default_options: [
|
||||
'buildtype=debugoptimized',
|
||||
'warning_level=1',
|
||||
|
46
po/hr.po
46
po/hr.po
@@ -5,8 +5,8 @@ msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: gtk+ 0\n"
|
||||
"Report-Msgid-Bugs-To: https://gitlab.gnome.org/GNOME/gtk/-/issues/\n"
|
||||
"POT-Creation-Date: 2022-09-26 16:01+0000\n"
|
||||
"PO-Revision-Date: 2022-09-26 21:29+0200\n"
|
||||
"POT-Creation-Date: 2022-10-01 12:58+0000\n"
|
||||
"PO-Revision-Date: 2022-10-02 16:02+0200\n"
|
||||
"Last-Translator: gogo <trebelnik2@gmail.com>\n"
|
||||
"Language-Team: Croatian <lokalizacija@linux.hr>\n"
|
||||
"Language: hr\n"
|
||||
@@ -1035,7 +1035,7 @@ msgstr "Mozilla javna licenca 2.0"
|
||||
|
||||
#: gtk/gtkaboutdialog.c:937
|
||||
msgid "Website"
|
||||
msgstr "Web stranica"
|
||||
msgstr "Web naslovnica"
|
||||
|
||||
#: gtk/gtkaboutdialog.c:973 gtk/ui/gtkapplication-quartz.ui:6
|
||||
#, c-format
|
||||
@@ -1044,11 +1044,11 @@ msgstr "O %s"
|
||||
|
||||
#: gtk/gtkaboutdialog.c:2074
|
||||
msgid "Created by"
|
||||
msgstr "Stvorio"
|
||||
msgstr "Stvorili"
|
||||
|
||||
#: gtk/gtkaboutdialog.c:2077
|
||||
msgid "Documented by"
|
||||
msgstr "Dokumentirao"
|
||||
msgstr "Dokumentirali"
|
||||
|
||||
#: gtk/gtkaboutdialog.c:2087
|
||||
msgid "Translated by"
|
||||
@@ -1056,7 +1056,7 @@ msgstr "Preveli"
|
||||
|
||||
#: gtk/gtkaboutdialog.c:2092
|
||||
msgid "Design by"
|
||||
msgstr "Dizajnirao"
|
||||
msgstr "Dizajnirali"
|
||||
|
||||
#. Translators: this is the license preamble; the string at the end
|
||||
#. * contains the name of the license as link text.
|
||||
@@ -2125,7 +2125,7 @@ msgstr "Datoteka s tim nazivom već postoji"
|
||||
#: gtk/gtkmountoperation.c:608 gtk/gtkpagesetupunixdialog.c:283
|
||||
#: gtk/gtkprintbackend.c:637 gtk/gtkprinteroptionwidget.c:721
|
||||
#: gtk/gtkprintunixdialog.c:651 gtk/gtkprintunixdialog.c:807
|
||||
#: gtk/gtkwindow.c:6113 gtk/inspector/css-editor.c:248
|
||||
#: gtk/gtkwindow.c:6116 gtk/inspector/css-editor.c:248
|
||||
#: gtk/inspector/recorder.c:1723 gtk/ui/gtkappchooserdialog.ui:45
|
||||
#: gtk/ui/gtkassistant.ui:52 gtk/ui/gtkcolorchooserdialog.ui:33
|
||||
#: gtk/ui/gtkfontchooserdialog.ui:24
|
||||
@@ -2216,7 +2216,7 @@ msgid "If you delete an item, it will be permanently lost."
|
||||
msgstr "Ako obrišete stavku, biti će trajno izgubljena."
|
||||
|
||||
#: gtk/gtkfilechooserwidget.c:1211 gtk/gtkfilechooserwidget.c:1827
|
||||
#: gtk/gtklabel.c:5652 gtk/gtktext.c:6051 gtk/gtktextview.c:8968
|
||||
#: gtk/gtklabel.c:5652 gtk/gtktext.c:6049 gtk/gtktextview.c:8966
|
||||
msgid "_Delete"
|
||||
msgstr "_Obriši"
|
||||
|
||||
@@ -2416,7 +2416,7 @@ msgstr "Ne možete pristupiti određenoj mapi."
|
||||
msgid "Could not send the search request"
|
||||
msgstr "Nemoguće slanje zahtjeva pretrage"
|
||||
|
||||
#: gtk/gtkfilechooserwidget.c:6876
|
||||
#: gtk/gtkfilechooserwidget.c:6877
|
||||
msgid "Accessed"
|
||||
msgstr "Pristupljeno"
|
||||
|
||||
@@ -2508,19 +2508,19 @@ msgstr "Varijacije znaka"
|
||||
msgid "OpenGL context creation failed"
|
||||
msgstr "Neuspjelo stvaranje OpenGL sadržaja"
|
||||
|
||||
#: gtk/gtklabel.c:5649 gtk/gtktext.c:6039 gtk/gtktextview.c:8956
|
||||
#: gtk/gtklabel.c:5649 gtk/gtktext.c:6037 gtk/gtktextview.c:8954
|
||||
msgid "Cu_t"
|
||||
msgstr "Iz_reži"
|
||||
|
||||
#: gtk/gtklabel.c:5650 gtk/gtktext.c:6043 gtk/gtktextview.c:8960
|
||||
#: gtk/gtklabel.c:5650 gtk/gtktext.c:6041 gtk/gtktextview.c:8958
|
||||
msgid "_Copy"
|
||||
msgstr "_Kopiraj"
|
||||
|
||||
#: gtk/gtklabel.c:5651 gtk/gtktext.c:6047 gtk/gtktextview.c:8964
|
||||
#: gtk/gtklabel.c:5651 gtk/gtktext.c:6045 gtk/gtktextview.c:8962
|
||||
msgid "_Paste"
|
||||
msgstr "_Zalijepi"
|
||||
|
||||
#: gtk/gtklabel.c:5657 gtk/gtktext.c:6060 gtk/gtktextview.c:8989
|
||||
#: gtk/gtklabel.c:5657 gtk/gtktext.c:6058 gtk/gtktextview.c:8987
|
||||
msgid "Select _All"
|
||||
msgstr "Odaberi _sve"
|
||||
|
||||
@@ -2630,7 +2630,7 @@ msgid "%d:%02d"
|
||||
msgstr "%d:%02d"
|
||||
|
||||
#: gtk/gtkmessagedialog.c:158 gtk/gtkmessagedialog.c:176
|
||||
#: gtk/gtkprintbackend.c:638 gtk/gtkwindow.c:6114
|
||||
#: gtk/gtkprintbackend.c:638 gtk/gtkwindow.c:6117
|
||||
msgid "_OK"
|
||||
msgstr "_U redu"
|
||||
|
||||
@@ -3507,15 +3507,15 @@ msgctxt "accessibility"
|
||||
msgid "Sidebar"
|
||||
msgstr "Bočna traka"
|
||||
|
||||
#: gtk/gtktext.c:6065 gtk/gtktextview.c:8994
|
||||
#: gtk/gtktext.c:6063 gtk/gtktextview.c:8992
|
||||
msgid "Insert _Emoji"
|
||||
msgstr "Umetni _emotikoin"
|
||||
|
||||
#: gtk/gtktextview.c:8976
|
||||
#: gtk/gtktextview.c:8974
|
||||
msgid "_Undo"
|
||||
msgstr "_Vrati"
|
||||
|
||||
#: gtk/gtktextview.c:8980
|
||||
#: gtk/gtktextview.c:8978
|
||||
msgid "_Redo"
|
||||
msgstr "_Ponovi"
|
||||
|
||||
@@ -3542,12 +3542,12 @@ msgctxt "volume percentage"
|
||||
msgid "%d %%"
|
||||
msgstr "%d %%"
|
||||
|
||||
#: gtk/gtkwindow.c:6101
|
||||
#: gtk/gtkwindow.c:6104
|
||||
#, c-format
|
||||
msgid "Do you want to use GTK Inspector?"
|
||||
msgstr "Želite li koristiti GTK Inspektora?"
|
||||
|
||||
#: gtk/gtkwindow.c:6103
|
||||
#: gtk/gtkwindow.c:6106
|
||||
#, c-format
|
||||
msgid ""
|
||||
"GTK Inspector is an interactive debugger that lets you explore and modify "
|
||||
@@ -3558,7 +3558,7 @@ msgstr ""
|
||||
"otkrivanje i promjenu unutrašnjosti bilo koje GTK aplikacije. Njegovo "
|
||||
"korištenje može uzrokovati rušenje ili prekid u radu aplikacije."
|
||||
|
||||
#: gtk/gtkwindow.c:6108
|
||||
#: gtk/gtkwindow.c:6111
|
||||
msgid "Don’t show this message again"
|
||||
msgstr "Ne prikazuj više ovu poruku"
|
||||
|
||||
@@ -6973,15 +6973,15 @@ msgstr "Datoteka"
|
||||
msgid "_Output format"
|
||||
msgstr "_Izlazni format"
|
||||
|
||||
#: modules/printbackends/gtkprintbackendlpr.c:371
|
||||
#: modules/printbackends/gtkprintbackendlpr.c:372
|
||||
msgid "Print to LPR"
|
||||
msgstr "Ispiši do LPR"
|
||||
|
||||
#: modules/printbackends/gtkprintbackendlpr.c:400
|
||||
#: modules/printbackends/gtkprintbackendlpr.c:401
|
||||
msgid "Pages Per Sheet"
|
||||
msgstr "Stranica po listu"
|
||||
|
||||
#: modules/printbackends/gtkprintbackendlpr.c:406
|
||||
#: modules/printbackends/gtkprintbackendlpr.c:407
|
||||
msgid "Command Line"
|
||||
msgstr "Naredbeni redak"
|
||||
|
||||
|
Reference in New Issue
Block a user