forked from AuroraMiddleware/gtk
Merge branch 'text' into 'master'
GtkEntry reshuffling Closes #1483 See merge request GNOME/gtk!585
This commit is contained in:
commit
9174616a17
@ -13,7 +13,7 @@ search_changed_cb (GtkSearchEntry *entry,
|
||||
GtkLabel *result_label)
|
||||
{
|
||||
const char *text;
|
||||
text = gtk_entry_get_text (GTK_ENTRY (entry));
|
||||
text = gtk_editable_get_text (GTK_EDITABLE (entry));
|
||||
g_message ("search changed: %s", text);
|
||||
gtk_label_set_text (result_label, text ? text : "");
|
||||
}
|
||||
@ -22,7 +22,7 @@ static void
|
||||
changed_cb (GtkEditable *editable)
|
||||
{
|
||||
const char *text;
|
||||
text = gtk_entry_get_text (GTK_ENTRY (editable));
|
||||
text = gtk_editable_get_text (GTK_EDITABLE (editable));
|
||||
g_message ("changed: %s", text);
|
||||
}
|
||||
|
||||
@ -85,7 +85,7 @@ do_search_entry2 (GtkWidget *do_widget)
|
||||
gtk_widget_set_halign (container, GTK_ALIGN_CENTER);
|
||||
gtk_container_add (GTK_CONTAINER (container), entry);
|
||||
searchbar = gtk_search_bar_new ();
|
||||
gtk_search_bar_connect_entry (GTK_SEARCH_BAR (searchbar), GTK_ENTRY (entry));
|
||||
gtk_search_bar_connect_entry (GTK_SEARCH_BAR (searchbar), GTK_EDITABLE (entry));
|
||||
gtk_search_bar_set_show_close_button (GTK_SEARCH_BAR (searchbar), FALSE);
|
||||
gtk_container_add (GTK_CONTAINER (searchbar), container);
|
||||
gtk_container_add (GTK_CONTAINER (vbox), searchbar);
|
||||
|
@ -474,7 +474,6 @@ Suspendisse feugiat quam quis dolor accumsan cursus.</property>
|
||||
</child>
|
||||
<child>
|
||||
<object class="GtkEntry" id="entry1">
|
||||
<property name="can-focus">1</property>
|
||||
<property name="enable-emoji-completion">1</property>
|
||||
<property name="invisible_char">•</property>
|
||||
<property name="placeholder-text" translatable="yes">Click icon to change mode</property>
|
||||
@ -486,7 +485,6 @@ Suspendisse feugiat quam quis dolor accumsan cursus.</property>
|
||||
<child>
|
||||
<object class="GtkEntry" id="entry2">
|
||||
<property name="sensitive">0</property>
|
||||
<property name="can-focus">1</property>
|
||||
<property name="invisible-char">•</property>
|
||||
<property name="text" translatable="yes">entry</property>
|
||||
</object>
|
||||
@ -498,7 +496,6 @@ Suspendisse feugiat quam quis dolor accumsan cursus.</property>
|
||||
</style>
|
||||
<child>
|
||||
<object class="GtkEntry" id="entry24">
|
||||
<property name="can-focus">1</property>
|
||||
<property name="invisible-char">•</property>
|
||||
<property name="text" translatable="yes">entry</property>
|
||||
<property name="hexpand">1</property>
|
||||
@ -575,7 +572,6 @@ Suspendisse feugiat quam quis dolor accumsan cursus.</property>
|
||||
</child>
|
||||
<child>
|
||||
<object class="GtkSpinButton" id="spinbutton1">
|
||||
<property name="can-focus">1</property>
|
||||
<property name="width-chars">2</property>
|
||||
<property name="max-width-chars">2</property>
|
||||
<property name="adjustment">adjustment2</property>
|
||||
@ -583,7 +579,6 @@ Suspendisse feugiat quam quis dolor accumsan cursus.</property>
|
||||
</child>
|
||||
<child>
|
||||
<object class="GtkSpinButton" id="spinbutton2">
|
||||
<property name="can-focus">1</property>
|
||||
<property name="sensitive">0</property>
|
||||
<property name="width-chars">2</property>
|
||||
<property name="max-width-chars">2</property>
|
||||
@ -3000,14 +2995,12 @@ microphone-sensitivity-medium-symbolic</property>
|
||||
<property name="halign">center</property>
|
||||
<child>
|
||||
<object class="GtkEntry">
|
||||
<property name="can-focus">1</property>
|
||||
<property name="placeholder-text" translatable="yes">Name…</property>
|
||||
<property name="completion">name_completion</property>
|
||||
</object>
|
||||
</child>
|
||||
<child>
|
||||
<object class="GtkEntry">
|
||||
<property name="can-focus">1</property>
|
||||
<property name="show-emoji-icon">1</property>
|
||||
<property name="placeholder-text" translatable="yes">Age…</property>
|
||||
</object>
|
||||
|
@ -138,14 +138,16 @@
|
||||
|
||||
<chapter id="NumericEntry">
|
||||
<title>Numeric and Text Data Entry</title>
|
||||
<xi:include href="xml/gtkentry.xml" />
|
||||
<xi:include href="xml/gtkeditable.xml" />
|
||||
<xi:include href="xml/gtkentrybuffer.xml" />
|
||||
<xi:include href="xml/gtktext.xml" />
|
||||
<xi:include href="xml/gtkentry.xml" />
|
||||
<xi:include href="xml/gtkentrycompletion.xml" />
|
||||
<xi:include href="xml/gtkpasswordentry.xml" />
|
||||
<xi:include href="xml/gtkscale.xml" />
|
||||
<xi:include href="xml/gtkspinbutton.xml" />
|
||||
<xi:include href="xml/gtksearchentry.xml" />
|
||||
<xi:include href="xml/gtksearchbar.xml" />
|
||||
<xi:include href="xml/gtkeditable.xml" />
|
||||
</chapter>
|
||||
|
||||
<chapter id="TextWidgetObjects">
|
||||
|
@ -844,19 +844,30 @@ gtk_drawing_area_get_type
|
||||
<FILE>gtkeditable</FILE>
|
||||
<TITLE>GtkEditable</TITLE>
|
||||
GtkEditable
|
||||
gtk_editable_select_region
|
||||
gtk_editable_get_selection_bounds
|
||||
gtk_editable_get_text
|
||||
gtk_editable_set_text
|
||||
gtk_editable_get_chars
|
||||
gtk_editable_insert_text
|
||||
gtk_editable_delete_text
|
||||
gtk_editable_get_chars
|
||||
gtk_editable_cut_clipboard
|
||||
gtk_editable_copy_clipboard
|
||||
gtk_editable_paste_clipboard
|
||||
gtk_editable_get_selection_bounds
|
||||
gtk_editable_select_region
|
||||
gtk_editable_delete_selection
|
||||
gtk_editable_set_position
|
||||
gtk_editable_get_position
|
||||
gtk_editable_set_editable
|
||||
gtk_editable_get_editable
|
||||
gtk_editable_set_alignment
|
||||
gtk_editable_get_alignment
|
||||
gtk_editable_get_width_chars
|
||||
gtk_editable_set_width_chars
|
||||
gtk_editable_get_max_width_chars
|
||||
gtk_editable_set_max_width_chars
|
||||
<SUBSECTION>
|
||||
gtk_editable_install_properties
|
||||
gtk_editable_init_delegate
|
||||
gtk_editable_finish_delegate
|
||||
gtk_editable_delegate_set_property
|
||||
gtk_editable_delegate_get_property
|
||||
<SUBSECTION Standard>
|
||||
GTK_EDITABLE
|
||||
GTK_IS_EDITABLE
|
||||
@ -866,6 +877,44 @@ GTK_EDITABLE_GET_IFACE
|
||||
gtk_editable_get_type
|
||||
</SECTION>
|
||||
|
||||
<SECTION>
|
||||
<FILE>gtktext</FILE>
|
||||
<TITLE>GtkText</TITLE>
|
||||
GtkText
|
||||
GtkTextClass
|
||||
gtk_text_new
|
||||
gtk_text_new_with_buffer
|
||||
gtk_text_set_buffer
|
||||
gtk_text_get_buffer
|
||||
gtk_text_set_visibility
|
||||
gtk_text_get_visibility
|
||||
gtk_text_set_invisible_char
|
||||
gtk_text_get_invisible_char
|
||||
gtk_text_unset_invisible_char
|
||||
gtk_text_set_has_frame
|
||||
gtk_text_get_has_frame
|
||||
gtk_text_set_overwrite_mode
|
||||
gtk_text_get_overwrite_mode
|
||||
gtk_text_set_max_length
|
||||
gtk_text_get_max_length
|
||||
gtk_text_get_text_length
|
||||
gtk_text_set_activates_default
|
||||
gtk_text_get_activates_default
|
||||
gtk_text_set_placeholder_text
|
||||
gtk_text_get_placeholder_text
|
||||
gtk_text_set_input_purpose
|
||||
gtk_text_get_input_purpose
|
||||
gtk_text_set_input_hints
|
||||
gtk_text_get_input_hints
|
||||
gtk_text_set_attributes
|
||||
gtk_text_get_attributes
|
||||
gtk_text_set_tabs
|
||||
gtk_text_get_tabs
|
||||
gtk_text_grab_focus_without_selecting
|
||||
<SUBSECTION Private>
|
||||
gtk_text_get_type
|
||||
</SECTION>
|
||||
|
||||
<SECTION>
|
||||
<FILE>gtkentry</FILE>
|
||||
<TITLE>GtkEntry</TITLE>
|
||||
@ -899,10 +948,6 @@ gtk_entry_set_placeholder_text
|
||||
gtk_entry_get_placeholder_text
|
||||
gtk_entry_set_overwrite_mode
|
||||
gtk_entry_get_overwrite_mode
|
||||
gtk_entry_get_layout
|
||||
gtk_entry_get_layout_offsets
|
||||
gtk_entry_layout_index_to_text_index
|
||||
gtk_entry_text_index_to_layout_index
|
||||
gtk_entry_set_attributes
|
||||
gtk_entry_get_attributes
|
||||
gtk_entry_set_completion
|
||||
@ -912,7 +957,6 @@ gtk_entry_get_progress_fraction
|
||||
gtk_entry_set_progress_pulse_step
|
||||
gtk_entry_get_progress_pulse_step
|
||||
gtk_entry_progress_pulse
|
||||
gtk_entry_im_context_filter_keypress
|
||||
gtk_entry_reset_im_context
|
||||
gtk_entry_set_tabs
|
||||
gtk_entry_get_tabs
|
||||
@ -958,6 +1002,15 @@ GtkEntryPrivate
|
||||
gtk_entry_get_type
|
||||
</SECTION>
|
||||
|
||||
<SECTION>
|
||||
<FILE>gtkpasswordentry</FILE>
|
||||
<TITLE>GtkPasswordEntry</TITLE>
|
||||
GtkPasswordEntry
|
||||
gtk_password_entry_new
|
||||
<SUBSECTION Private>
|
||||
gtk_password_entry_get_type
|
||||
</SECTION>
|
||||
|
||||
<SECTION>
|
||||
<FILE>gtkentrybuffer</FILE>
|
||||
<TITLE>GtkEntryBuffer</TITLE>
|
||||
|
@ -118,6 +118,7 @@ gtk_page_setup_get_type
|
||||
@DISABLE_ON_W32@gtk_page_setup_unix_dialog_get_type
|
||||
gtk_paned_get_type
|
||||
gtk_paper_size_get_type
|
||||
gtk_password_entry_get_type
|
||||
gtk_picture_get_type
|
||||
gtk_popover_get_type
|
||||
gtk_popover_menu_get_type
|
||||
@ -168,6 +169,7 @@ gtk_style_context_get_type
|
||||
gtk_style_provider_get_type
|
||||
gtk_text_buffer_get_type
|
||||
gtk_text_child_anchor_get_type
|
||||
gtk_text_get_type
|
||||
gtk_text_iter_get_type
|
||||
gtk_text_mark_get_type
|
||||
gtk_text_tag_get_type
|
||||
|
@ -601,6 +601,23 @@
|
||||
to pages. You can easily do that yourself.
|
||||
</para>
|
||||
</section>
|
||||
|
||||
<section>
|
||||
<title>Adapt to changes in the API of GtkEntry and GtkSearchEntry</title>
|
||||
<para>
|
||||
The GtkEditable has been made more useful, and the core functionality of
|
||||
GtkEntry has been broken out as a GtkText widget. GtkEntry, GtkSearchEntry,
|
||||
GtkSpinButton and the new GtkPasswordEntry now use a GtkText widget internally
|
||||
and implement GtkEditable. In particular, this means that it is no longer
|
||||
possible to use GtkEntry API such as gtk_entry_grab_focus_without_selecting()
|
||||
on a search entry.
|
||||
</para>
|
||||
<para>
|
||||
Use GtkEditable API for editable functionality, and widget-specific APIs for
|
||||
things that go beyond the common interface. For password entries, use
|
||||
GtkPasswordEntry.
|
||||
</para>
|
||||
</section>
|
||||
</section>
|
||||
|
||||
</chapter>
|
||||
|
@ -28,7 +28,7 @@ activate_cb (GtkApplication *app,
|
||||
menu_button = gtk_menu_button_new ();
|
||||
gtk_container_add (GTK_CONTAINER (box), menu_button);
|
||||
|
||||
gtk_search_bar_connect_entry (GTK_SEARCH_BAR (search_bar), GTK_ENTRY (entry));
|
||||
gtk_search_bar_connect_entry (GTK_SEARCH_BAR (search_bar), GTK_EDITABLE (entry));
|
||||
gtk_search_bar_set_key_capture_widget (GTK_SEARCH_BAR (search_bar), window);
|
||||
}
|
||||
|
||||
|
@ -26,6 +26,7 @@
|
||||
#include "gtkpango.h"
|
||||
#include "gtkentryaccessible.h"
|
||||
#include "gtkentryprivate.h"
|
||||
#include "gtktextprivate.h"
|
||||
#include "gtkcomboboxaccessible.h"
|
||||
#include "gtkstylecontextprivate.h"
|
||||
#include "gtkwidgetprivate.h"
|
||||
@ -762,7 +763,7 @@ gtk_entry_accessible_get_text (AtkText *atk_text,
|
||||
if (widget == NULL)
|
||||
return NULL;
|
||||
|
||||
return _gtk_entry_get_display_text (GTK_ENTRY (widget), start_pos, end_pos);
|
||||
return gtk_text_get_display_text (gtk_entry_get_text_widget (GTK_ENTRY (widget)), start_pos, end_pos);
|
||||
}
|
||||
|
||||
static gchar *
|
||||
@ -778,7 +779,7 @@ gtk_entry_accessible_get_text_before_offset (AtkText *text,
|
||||
if (widget == NULL)
|
||||
return NULL;
|
||||
|
||||
return _gtk_pango_get_text_before (gtk_entry_get_layout (GTK_ENTRY (widget)),
|
||||
return _gtk_pango_get_text_before (gtk_text_get_layout (gtk_entry_get_text_widget (GTK_ENTRY (widget))),
|
||||
boundary_type, offset,
|
||||
start_offset, end_offset);
|
||||
}
|
||||
@ -796,7 +797,7 @@ gtk_entry_accessible_get_text_at_offset (AtkText *text,
|
||||
if (widget == NULL)
|
||||
return NULL;
|
||||
|
||||
return _gtk_pango_get_text_at (gtk_entry_get_layout (GTK_ENTRY (widget)),
|
||||
return _gtk_pango_get_text_at (gtk_text_get_layout (gtk_entry_get_text_widget (GTK_ENTRY (widget))),
|
||||
boundary_type, offset,
|
||||
start_offset, end_offset);
|
||||
}
|
||||
@ -814,7 +815,7 @@ gtk_entry_accessible_get_text_after_offset (AtkText *text,
|
||||
if (widget == NULL)
|
||||
return NULL;
|
||||
|
||||
return _gtk_pango_get_text_after (gtk_entry_get_layout (GTK_ENTRY (widget)),
|
||||
return _gtk_pango_get_text_after (gtk_text_get_layout (gtk_entry_get_text_widget (GTK_ENTRY (widget))),
|
||||
boundary_type, offset,
|
||||
start_offset, end_offset);
|
||||
}
|
||||
@ -830,7 +831,7 @@ gtk_entry_accessible_get_character_count (AtkText *atk_text)
|
||||
if (widget == NULL)
|
||||
return 0;
|
||||
|
||||
text = _gtk_entry_get_display_text (GTK_ENTRY (widget), 0, -1);
|
||||
text = gtk_text_get_display_text (gtk_entry_get_text_widget (GTK_ENTRY (widget)), 0, -1);
|
||||
|
||||
char_count = 0;
|
||||
if (text)
|
||||
@ -900,7 +901,7 @@ gtk_entry_accessible_get_run_attributes (AtkText *text,
|
||||
attributes = add_text_attribute (attributes, ATK_TEXT_ATTR_DIRECTION,
|
||||
gtk_widget_get_direction (widget));
|
||||
attributes = _gtk_pango_get_run_attributes (attributes,
|
||||
gtk_entry_get_layout (GTK_ENTRY (widget)),
|
||||
gtk_text_get_layout (gtk_entry_get_text_widget (GTK_ENTRY (widget))),
|
||||
offset,
|
||||
start_offset,
|
||||
end_offset);
|
||||
@ -922,7 +923,7 @@ gtk_entry_accessible_get_default_attributes (AtkText *text)
|
||||
attributes = add_text_attribute (attributes, ATK_TEXT_ATTR_DIRECTION,
|
||||
gtk_widget_get_direction (widget));
|
||||
attributes = _gtk_pango_get_default_attributes (attributes,
|
||||
gtk_entry_get_layout (GTK_ENTRY (widget)));
|
||||
gtk_text_get_layout (gtk_entry_get_text_widget (GTK_ENTRY (widget))));
|
||||
attributes = _gtk_style_context_get_attributes (attributes,
|
||||
gtk_widget_get_style_context (widget));
|
||||
|
||||
@ -940,6 +941,7 @@ gtk_entry_accessible_get_character_extents (AtkText *text,
|
||||
{
|
||||
GtkWidget *widget;
|
||||
GtkEntry *entry;
|
||||
GtkText *textw;
|
||||
PangoRectangle char_rect;
|
||||
gchar *entry_text;
|
||||
gint index, x_layout, y_layout;
|
||||
@ -952,13 +954,14 @@ gtk_entry_accessible_get_character_extents (AtkText *text,
|
||||
return;
|
||||
|
||||
entry = GTK_ENTRY (widget);
|
||||
textw = gtk_entry_get_text_widget (entry);
|
||||
|
||||
gtk_entry_get_layout_offsets (entry, &x_layout, &y_layout);
|
||||
entry_text = _gtk_entry_get_display_text (entry, 0, -1);
|
||||
gtk_text_get_layout_offsets (textw, &x_layout, &y_layout);
|
||||
entry_text = gtk_text_get_display_text (textw, 0, -1);
|
||||
index = g_utf8_offset_to_pointer (entry_text, offset) - entry_text;
|
||||
g_free (entry_text);
|
||||
|
||||
pango_layout_index_to_pos (gtk_entry_get_layout (entry), index, &char_rect);
|
||||
pango_layout_index_to_pos (gtk_text_get_layout (textw), index, &char_rect);
|
||||
pango_extents_to_pixels (&char_rect, NULL);
|
||||
|
||||
gtk_widget_get_allocation (widget, &allocation);
|
||||
@ -989,6 +992,7 @@ gtk_entry_accessible_get_offset_at_point (AtkText *atk_text,
|
||||
{
|
||||
GtkWidget *widget;
|
||||
GtkEntry *entry;
|
||||
GtkText *textw;
|
||||
gchar *text;
|
||||
gint index, x_layout, y_layout;
|
||||
gint x_surface, y_surface;
|
||||
@ -1001,8 +1005,9 @@ gtk_entry_accessible_get_offset_at_point (AtkText *atk_text,
|
||||
return -1;
|
||||
|
||||
entry = GTK_ENTRY (widget);
|
||||
textw = gtk_entry_get_text_widget (entry);
|
||||
|
||||
gtk_entry_get_layout_offsets (entry, &x_layout, &y_layout);
|
||||
gtk_text_get_layout_offsets (textw, &x_layout, &y_layout);
|
||||
|
||||
surface = gtk_widget_get_surface (widget);
|
||||
gdk_surface_get_origin (surface, &x_surface, &y_surface);
|
||||
@ -1018,7 +1023,7 @@ gtk_entry_accessible_get_offset_at_point (AtkText *atk_text,
|
||||
x_local += x_surface;
|
||||
y_local += y_surface;
|
||||
}
|
||||
if (!pango_layout_xy_to_index (gtk_entry_get_layout (entry),
|
||||
if (!pango_layout_xy_to_index (gtk_text_get_layout (textw),
|
||||
x_local * PANGO_SCALE,
|
||||
y_local * PANGO_SCALE,
|
||||
&index, NULL))
|
||||
@ -1032,7 +1037,7 @@ gtk_entry_accessible_get_offset_at_point (AtkText *atk_text,
|
||||
offset = -1;
|
||||
if (index != -1)
|
||||
{
|
||||
text = _gtk_entry_get_display_text (entry, 0, -1);
|
||||
text = gtk_text_get_display_text (textw, 0, -1);
|
||||
offset = g_utf8_pointer_to_offset (text, text + index);
|
||||
g_free (text);
|
||||
}
|
||||
@ -1167,7 +1172,7 @@ gtk_entry_accessible_get_character_at_offset (AtkText *atk_text,
|
||||
if (!gtk_entry_get_visibility (GTK_ENTRY (widget)))
|
||||
return result;
|
||||
|
||||
text = _gtk_entry_get_display_text (GTK_ENTRY (widget), 0, -1);
|
||||
text = gtk_text_get_display_text (gtk_entry_get_text_widget (GTK_ENTRY (widget)), 0, -1);
|
||||
if (offset < g_utf8_strlen (text, -1))
|
||||
{
|
||||
index = g_utf8_offset_to_pointer (text, offset);
|
||||
@ -1402,7 +1407,7 @@ delete_text_cb (GtkEditable *editable,
|
||||
{
|
||||
gchar *text;
|
||||
|
||||
text = _gtk_entry_get_display_text (GTK_ENTRY (editable), 0, -1);
|
||||
text = gtk_text_get_display_text (gtk_entry_get_text_widget (GTK_ENTRY (editable)), 0, -1);
|
||||
end = g_utf8_strlen (text, -1);
|
||||
g_free (text);
|
||||
}
|
||||
|
1030
gtk/a11y/gtktextaccessible.c
Normal file
1030
gtk/a11y/gtktextaccessible.c
Normal file
File diff suppressed because it is too large
Load Diff
57
gtk/a11y/gtktextaccessible.h
Normal file
57
gtk/a11y/gtktextaccessible.h
Normal file
@ -0,0 +1,57 @@
|
||||
/* GTK+ - accessibility implementations
|
||||
* Copyright 2001 Sun Microsystems Inc.
|
||||
*
|
||||
* This library is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU Library General Public
|
||||
* License as published by the Free Software Foundation; either
|
||||
* version 2 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
|
||||
* Library General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Library General Public
|
||||
* License along with this library. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
#ifndef __GTK_TEXT_ACCESSIBLE_H__
|
||||
#define __GTK_TEXT_ACCESSIBLE_H__
|
||||
|
||||
#if !defined (__GTK_A11Y_H_INSIDE__) && !defined (GTK_COMPILATION)
|
||||
#error "Only <gtk/gtk-a11y.h> can be included directly."
|
||||
#endif
|
||||
|
||||
#include <gtk/a11y/gtkwidgetaccessible.h>
|
||||
|
||||
G_BEGIN_DECLS
|
||||
|
||||
#define GTK_TYPE_TEXT_ACCESSIBLE (gtk_text_accessible_get_type ())
|
||||
#define GTK_TEXT_ACCESSIBLE(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), GTK_TYPE_TEXT_ACCESSIBLE, GtkTextAccessible))
|
||||
#define GTK_TEXT_ACCESSIBLE_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), GTK_TYPE_TEXT_ACCESSIBLE, GtkTextAccessibleClass))
|
||||
#define GTK_IS_TEXT_ACCESSIBLE(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GTK_TYPE_TEXT_ACCESSIBLE))
|
||||
#define GTK_IS_TEXT_ACCESSIBLE_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), GTK_TYPE_TEXT_ACCESSIBLE))
|
||||
#define GTK_TEXT_ACCESSIBLE_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), GTK_TYPE_TEXT_ACCESSIBLE, GtkTextAccessibleClass))
|
||||
|
||||
typedef struct _GtkTextAccessible GtkTextAccessible;
|
||||
typedef struct _GtkTextAccessibleClass GtkTextAccessibleClass;
|
||||
typedef struct _GtkTextAccessiblePrivate GtkTextAccessiblePrivate;
|
||||
|
||||
struct _GtkTextAccessible
|
||||
{
|
||||
GtkWidgetAccessible parent;
|
||||
|
||||
GtkTextAccessiblePrivate *priv;
|
||||
};
|
||||
|
||||
struct _GtkTextAccessibleClass
|
||||
{
|
||||
GtkWidgetAccessibleClass parent_class;
|
||||
};
|
||||
|
||||
GDK_AVAILABLE_IN_ALL
|
||||
GType gtk_text_accessible_get_type (void);
|
||||
|
||||
G_END_DECLS
|
||||
|
||||
#endif /* __GTK_TEXT_ACCESSIBLE_H__ */
|
@ -46,6 +46,7 @@ a11y_sources = files([
|
||||
'gtkstackaccessible.c',
|
||||
'gtkstatusbaraccessible.c',
|
||||
'gtkswitchaccessible.c',
|
||||
'gtktextaccessible.c',
|
||||
'gtktextcellaccessible.c',
|
||||
'gtktextviewaccessible.c',
|
||||
'gtktogglebuttonaccessible.c',
|
||||
@ -100,6 +101,7 @@ a11y_headers = files([
|
||||
'gtkstackaccessible.h',
|
||||
'gtkstatusbaraccessible.h',
|
||||
'gtkswitchaccessible.h',
|
||||
'gtktextaccessible.h',
|
||||
'gtktextcellaccessible.h',
|
||||
'gtktextviewaccessible.h',
|
||||
'gtktogglebuttonaccessible.h',
|
||||
|
@ -159,8 +159,9 @@
|
||||
#include <gtk/gtkoverlay.h>
|
||||
#include <gtk/gtkpadcontroller.h>
|
||||
#include <gtk/gtkpagesetup.h>
|
||||
#include <gtk/gtkpapersize.h>
|
||||
#include <gtk/gtkpaned.h>
|
||||
#include <gtk/gtkpapersize.h>
|
||||
#include <gtk/gtkpasswordentry.h>
|
||||
#include <gtk/gtkpicture.h>
|
||||
#include <gtk/gtkpopover.h>
|
||||
#include <gtk/gtkpopovermenu.h>
|
||||
@ -211,6 +212,7 @@
|
||||
#include <gtk/gtkstylecontext.h>
|
||||
#include <gtk/gtkstyleprovider.h>
|
||||
#include <gtk/gtkswitch.h>
|
||||
#include <gtk/gtktext.h>
|
||||
#include <gtk/gtktextbuffer.h>
|
||||
#include <gtk/gtktextchild.h>
|
||||
#include <gtk/gtktextiter.h>
|
||||
|
@ -362,7 +362,7 @@ construct_appchooser_widget (GtkAppChooserDialog *self)
|
||||
g_object_unref (info);
|
||||
|
||||
_gtk_app_chooser_widget_set_search_entry (GTK_APP_CHOOSER_WIDGET (self->priv->app_chooser_widget),
|
||||
GTK_ENTRY (self->priv->search_entry));
|
||||
GTK_EDITABLE (self->priv->search_entry));
|
||||
|
||||
gtk_search_bar_set_key_capture_widget (GTK_SEARCH_BAR (self->priv->search_bar),
|
||||
GTK_WIDGET (self));
|
||||
|
@ -45,7 +45,7 @@ struct _GtkAppChooserIface {
|
||||
|
||||
void
|
||||
_gtk_app_chooser_widget_set_search_entry (GtkAppChooserWidget *self,
|
||||
GtkEntry *entry);
|
||||
GtkEditable *editable);
|
||||
|
||||
|
||||
G_END_DECLS
|
||||
|
@ -1489,7 +1489,7 @@ gtk_app_chooser_widget_get_default_text (GtkAppChooserWidget *self)
|
||||
|
||||
void
|
||||
_gtk_app_chooser_widget_set_search_entry (GtkAppChooserWidget *self,
|
||||
GtkEntry *entry)
|
||||
GtkEditable *entry)
|
||||
{
|
||||
gtk_tree_view_set_search_entry (GTK_TREE_VIEW (self->priv->program_list), entry);
|
||||
|
||||
|
File diff suppressed because it is too large
Load Diff
@ -45,82 +45,131 @@ typedef struct _GtkEditableInterface GtkEditableInterface;
|
||||
|
||||
struct _GtkEditableInterface
|
||||
{
|
||||
GTypeInterface base_iface;
|
||||
GTypeInterface base_iface;
|
||||
|
||||
/* signals */
|
||||
void (* insert_text) (GtkEditable *editable,
|
||||
const gchar *new_text,
|
||||
gint new_text_length,
|
||||
gint *position);
|
||||
const gchar *text,
|
||||
int length,
|
||||
int *position);
|
||||
void (* delete_text) (GtkEditable *editable,
|
||||
gint start_pos,
|
||||
gint end_pos);
|
||||
int start_pos,
|
||||
int end_pos);
|
||||
void (* changed) (GtkEditable *editable);
|
||||
|
||||
/* vtable */
|
||||
void (* do_insert_text) (GtkEditable *editable,
|
||||
const gchar *new_text,
|
||||
gint new_text_length,
|
||||
gint *position);
|
||||
void (* do_delete_text) (GtkEditable *editable,
|
||||
gint start_pos,
|
||||
gint end_pos);
|
||||
const char * (* get_text) (GtkEditable *editable);
|
||||
void (* do_insert_text) (GtkEditable *editable,
|
||||
const char *text,
|
||||
int length,
|
||||
int *position);
|
||||
void (* do_delete_text) (GtkEditable *editable,
|
||||
int start_pos,
|
||||
int end_pos);
|
||||
|
||||
gchar* (* get_chars) (GtkEditable *editable,
|
||||
gint start_pos,
|
||||
gint end_pos);
|
||||
void (* set_selection_bounds) (GtkEditable *editable,
|
||||
gint start_pos,
|
||||
gint end_pos);
|
||||
gboolean (* get_selection_bounds) (GtkEditable *editable,
|
||||
gint *start_pos,
|
||||
gint *end_pos);
|
||||
void (* set_position) (GtkEditable *editable,
|
||||
gint position);
|
||||
gint (* get_position) (GtkEditable *editable);
|
||||
int *start_pos,
|
||||
int *end_pos);
|
||||
void (* set_selection_bounds) (GtkEditable *editable,
|
||||
int start_pos,
|
||||
int end_pos);
|
||||
GtkEditable * (* get_delegate) (GtkEditable *editable);
|
||||
};
|
||||
|
||||
GDK_AVAILABLE_IN_ALL
|
||||
GType gtk_editable_get_type (void) G_GNUC_CONST;
|
||||
|
||||
GDK_AVAILABLE_IN_ALL
|
||||
void gtk_editable_select_region (GtkEditable *editable,
|
||||
gint start_pos,
|
||||
gint end_pos);
|
||||
const char * gtk_editable_get_text (GtkEditable *editable);
|
||||
GDK_AVAILABLE_IN_ALL
|
||||
gboolean gtk_editable_get_selection_bounds (GtkEditable *editable,
|
||||
gint *start_pos,
|
||||
gint *end_pos);
|
||||
void gtk_editable_set_text (GtkEditable *editable,
|
||||
const char *text);
|
||||
GDK_AVAILABLE_IN_ALL
|
||||
char * gtk_editable_get_chars (GtkEditable *editable,
|
||||
int start_pos,
|
||||
int end_pos);
|
||||
GDK_AVAILABLE_IN_ALL
|
||||
void gtk_editable_insert_text (GtkEditable *editable,
|
||||
const gchar *new_text,
|
||||
gint new_text_length,
|
||||
gint *position);
|
||||
const char *text,
|
||||
int length,
|
||||
int *position);
|
||||
GDK_AVAILABLE_IN_ALL
|
||||
void gtk_editable_delete_text (GtkEditable *editable,
|
||||
gint start_pos,
|
||||
gint end_pos);
|
||||
int start_pos,
|
||||
int end_pos);
|
||||
|
||||
GDK_AVAILABLE_IN_ALL
|
||||
gchar* gtk_editable_get_chars (GtkEditable *editable,
|
||||
gint start_pos,
|
||||
gint end_pos);
|
||||
GDK_AVAILABLE_IN_ALL
|
||||
void gtk_editable_cut_clipboard (GtkEditable *editable);
|
||||
GDK_AVAILABLE_IN_ALL
|
||||
void gtk_editable_copy_clipboard (GtkEditable *editable);
|
||||
GDK_AVAILABLE_IN_ALL
|
||||
void gtk_editable_paste_clipboard (GtkEditable *editable);
|
||||
gboolean gtk_editable_get_selection_bounds (GtkEditable *editable,
|
||||
int *start_pos,
|
||||
int *end_pos);
|
||||
GDK_AVAILABLE_IN_ALL
|
||||
void gtk_editable_delete_selection (GtkEditable *editable);
|
||||
GDK_AVAILABLE_IN_ALL
|
||||
void gtk_editable_select_region (GtkEditable *editable,
|
||||
int start_pos,
|
||||
int end_pos);
|
||||
|
||||
GDK_AVAILABLE_IN_ALL
|
||||
void gtk_editable_set_position (GtkEditable *editable,
|
||||
gint position);
|
||||
int position);
|
||||
GDK_AVAILABLE_IN_ALL
|
||||
gint gtk_editable_get_position (GtkEditable *editable);
|
||||
GDK_AVAILABLE_IN_ALL
|
||||
void gtk_editable_set_editable (GtkEditable *editable,
|
||||
gboolean is_editable);
|
||||
int gtk_editable_get_position (GtkEditable *editable);
|
||||
|
||||
GDK_AVAILABLE_IN_ALL
|
||||
gboolean gtk_editable_get_editable (GtkEditable *editable);
|
||||
GDK_AVAILABLE_IN_ALL
|
||||
void gtk_editable_set_editable (GtkEditable *editable,
|
||||
gboolean is_editable);
|
||||
|
||||
GDK_AVAILABLE_IN_ALL
|
||||
float gtk_editable_get_alignment (GtkEditable *editable);
|
||||
GDK_AVAILABLE_IN_ALL
|
||||
void gtk_editable_set_alignment (GtkEditable *editable,
|
||||
float xalign);
|
||||
|
||||
GDK_AVAILABLE_IN_ALL
|
||||
int gtk_editable_get_width_chars (GtkEditable *editable);
|
||||
GDK_AVAILABLE_IN_ALL
|
||||
void gtk_editable_set_width_chars (GtkEditable *editable,
|
||||
int n_chars);
|
||||
|
||||
GDK_AVAILABLE_IN_ALL
|
||||
int gtk_editable_get_max_width_chars (GtkEditable *editable);
|
||||
GDK_AVAILABLE_IN_ALL
|
||||
void gtk_editable_set_max_width_chars (GtkEditable *editable,
|
||||
int n_chars);
|
||||
|
||||
/* api for implementations */
|
||||
|
||||
typedef enum {
|
||||
GTK_EDITABLE_PROP_TEXT,
|
||||
GTK_EDITABLE_PROP_CURSOR_POSITION,
|
||||
GTK_EDITABLE_PROP_SELECTION_BOUND,
|
||||
GTK_EDITABLE_PROP_EDITABLE,
|
||||
GTK_EDITABLE_PROP_WIDTH_CHARS,
|
||||
GTK_EDITABLE_PROP_MAX_WIDTH_CHARS,
|
||||
GTK_EDITABLE_PROP_XALIGN,
|
||||
GTK_EDITABLE_NUM_PROPERTIES
|
||||
} GtkEditableProperties;
|
||||
|
||||
GDK_AVAILABLE_IN_ALL
|
||||
guint gtk_editable_install_properties (GObjectClass *object_class,
|
||||
guint first_prop);
|
||||
GDK_AVAILABLE_IN_ALL
|
||||
void gtk_editable_init_delegate (GtkEditable *editable);
|
||||
GDK_AVAILABLE_IN_ALL
|
||||
void gtk_editable_finish_delegate (GtkEditable *editable);
|
||||
GDK_AVAILABLE_IN_ALL
|
||||
gboolean gtk_editable_delegate_set_property (GObject *object,
|
||||
guint prop_id,
|
||||
const GValue *value,
|
||||
GParamSpec *pspec);
|
||||
GDK_AVAILABLE_IN_ALL
|
||||
gboolean gtk_editable_delegate_get_property (GObject *object,
|
||||
guint prop_id,
|
||||
GValue *value,
|
||||
GParamSpec *pspec);
|
||||
|
||||
|
||||
G_END_DECLS
|
||||
|
||||
|
@ -19,7 +19,8 @@
|
||||
|
||||
#include "gtkemojicompletion.h"
|
||||
|
||||
#include "gtkentryprivate.h"
|
||||
#include "gtktextprivate.h"
|
||||
#include "gtkeditable.h"
|
||||
#include "gtkbox.h"
|
||||
#include "gtkcssprovider.h"
|
||||
#include "gtklistbox.h"
|
||||
@ -28,6 +29,7 @@
|
||||
#include "gtkintl.h"
|
||||
#include "gtkprivate.h"
|
||||
#include "gtkgesturelongpress.h"
|
||||
#include "gtkeventcontrollerkey.h"
|
||||
#include "gtkflowbox.h"
|
||||
#include "gtkstack.h"
|
||||
|
||||
@ -35,7 +37,7 @@ struct _GtkEmojiCompletion
|
||||
{
|
||||
GtkPopover parent_instance;
|
||||
|
||||
GtkEntry *entry;
|
||||
GtkText *entry;
|
||||
char *text;
|
||||
guint length;
|
||||
guint offset;
|
||||
@ -54,7 +56,7 @@ struct _GtkEmojiCompletionClass {
|
||||
};
|
||||
|
||||
static void connect_signals (GtkEmojiCompletion *completion,
|
||||
GtkEntry *entry);
|
||||
GtkText *text);
|
||||
static void disconnect_signals (GtkEmojiCompletion *completion);
|
||||
static int populate_completion (GtkEmojiCompletion *completion,
|
||||
const char *text,
|
||||
@ -86,7 +88,7 @@ update_completion (GtkEmojiCompletion *completion)
|
||||
|
||||
n_matches = 0;
|
||||
|
||||
text = gtk_entry_get_text (GTK_ENTRY (completion->entry));
|
||||
text = gtk_editable_get_text (GTK_EDITABLE (completion->entry));
|
||||
length = strlen (text);
|
||||
|
||||
if (length > 0)
|
||||
@ -125,7 +127,8 @@ next:
|
||||
}
|
||||
|
||||
static void
|
||||
entry_changed (GtkEntry *entry, GtkEmojiCompletion *completion)
|
||||
changed_cb (GtkText *text,
|
||||
GtkEmojiCompletion *completion)
|
||||
{
|
||||
update_completion (completion);
|
||||
}
|
||||
@ -143,9 +146,9 @@ emoji_activated (GtkWidget *row,
|
||||
|
||||
g_signal_handler_block (completion->entry, completion->changed_id);
|
||||
|
||||
length = g_utf8_strlen (gtk_entry_get_text (completion->entry), -1);
|
||||
gtk_entry_set_positions (completion->entry, length - completion->length, length);
|
||||
gtk_entry_enter_text (completion->entry, emoji);
|
||||
length = g_utf8_strlen (gtk_editable_get_text (GTK_EDITABLE (completion->entry)), -1);
|
||||
gtk_editable_select_region (GTK_EDITABLE (completion->entry), length - completion->length, length);
|
||||
gtk_text_enter_text (completion->entry, emoji);
|
||||
|
||||
g_signal_handler_unblock (completion->entry, completion->changed_id);
|
||||
}
|
||||
@ -167,7 +170,6 @@ child_activated (GtkFlowBox *box,
|
||||
{
|
||||
GtkEmojiCompletion *completion = data;
|
||||
|
||||
g_print ("child activated\n");
|
||||
emoji_activated (GTK_WIDGET (child), completion);
|
||||
}
|
||||
|
||||
@ -300,11 +302,11 @@ move_active_variation (GtkEmojiCompletion *completion,
|
||||
}
|
||||
|
||||
static gboolean
|
||||
entry_key_press (GtkEventControllerKey *key,
|
||||
guint keyval,
|
||||
guint keycode,
|
||||
GdkModifierType modifiers,
|
||||
GtkEmojiCompletion *completion)
|
||||
key_press_cb (GtkEventControllerKey *key,
|
||||
guint keyval,
|
||||
guint keycode,
|
||||
GdkModifierType modifiers,
|
||||
GtkEmojiCompletion *completion)
|
||||
{
|
||||
if (!gtk_widget_get_visible (GTK_WIDGET (completion)))
|
||||
return FALSE;
|
||||
@ -368,27 +370,27 @@ entry_key_press (GtkEventControllerKey *key,
|
||||
}
|
||||
|
||||
static gboolean
|
||||
entry_focus_out (GtkWidget *entry,
|
||||
GParamSpec *pspec,
|
||||
GtkEmojiCompletion *completion)
|
||||
focus_out_cb (GtkWidget *text,
|
||||
GParamSpec *pspec,
|
||||
GtkEmojiCompletion *completion)
|
||||
{
|
||||
if (!gtk_widget_has_focus (entry))
|
||||
if (!gtk_widget_has_focus (text))
|
||||
gtk_popover_popdown (GTK_POPOVER (completion));
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
static void
|
||||
connect_signals (GtkEmojiCompletion *completion,
|
||||
GtkEntry *entry)
|
||||
GtkText *entry)
|
||||
{
|
||||
GtkEventController *key_controller;
|
||||
|
||||
completion->entry = g_object_ref (entry);
|
||||
key_controller = gtk_entry_get_key_controller (entry);
|
||||
key_controller = gtk_text_get_key_controller (entry);
|
||||
|
||||
completion->changed_id = g_signal_connect (entry, "changed", G_CALLBACK (entry_changed), completion);
|
||||
g_signal_connect (key_controller, "key-pressed", G_CALLBACK (entry_key_press), completion);
|
||||
g_signal_connect (entry, "notify::has-focus", G_CALLBACK (entry_focus_out), completion);
|
||||
g_signal_connect (key_controller, "key-pressed", G_CALLBACK (key_press_cb), completion);
|
||||
completion->changed_id = g_signal_connect (entry, "changed", G_CALLBACK (changed_cb), completion);
|
||||
g_signal_connect (entry, "notify::has-focus", G_CALLBACK (focus_out_cb), completion);
|
||||
}
|
||||
|
||||
static void
|
||||
@ -396,11 +398,11 @@ disconnect_signals (GtkEmojiCompletion *completion)
|
||||
{
|
||||
GtkEventController *key_controller;
|
||||
|
||||
key_controller = gtk_entry_get_key_controller (completion->entry);
|
||||
key_controller = gtk_text_get_key_controller (completion->entry);
|
||||
|
||||
g_signal_handlers_disconnect_by_func (completion->entry, entry_changed, completion);
|
||||
g_signal_handlers_disconnect_by_func (key_controller, entry_key_press, completion);
|
||||
g_signal_handlers_disconnect_by_func (completion->entry, entry_focus_out, completion);
|
||||
g_signal_handlers_disconnect_by_func (completion->entry, changed_cb, completion);
|
||||
g_signal_handlers_disconnect_by_func (key_controller, key_press_cb, completion);
|
||||
g_signal_handlers_disconnect_by_func (completion->entry, focus_out_cb, completion);
|
||||
|
||||
g_clear_object (&completion->entry);
|
||||
}
|
||||
@ -554,8 +556,8 @@ add_emoji (GtkWidget *list,
|
||||
|
||||
static int
|
||||
populate_completion (GtkEmojiCompletion *completion,
|
||||
const char *text,
|
||||
guint offset)
|
||||
const char *text,
|
||||
guint offset)
|
||||
{
|
||||
GList *children, *l;
|
||||
guint n_matches;
|
||||
@ -657,15 +659,15 @@ gtk_emoji_completion_class_init (GtkEmojiCompletionClass *klass)
|
||||
}
|
||||
|
||||
GtkWidget *
|
||||
gtk_emoji_completion_new (GtkEntry *entry)
|
||||
gtk_emoji_completion_new (GtkText *text)
|
||||
{
|
||||
GtkEmojiCompletion *completion;
|
||||
|
||||
completion = GTK_EMOJI_COMPLETION (g_object_new (GTK_TYPE_EMOJI_COMPLETION,
|
||||
"relative-to", entry,
|
||||
"relative-to", text,
|
||||
NULL));
|
||||
|
||||
connect_signals (completion, entry);
|
||||
connect_signals (completion, text);
|
||||
|
||||
return GTK_WIDGET (completion);
|
||||
}
|
||||
|
@ -21,7 +21,7 @@
|
||||
#error "Only <gtk/gtk.h> can be included directly."
|
||||
#endif
|
||||
|
||||
#include <gtk/gtkentry.h>
|
||||
#include <gtk/gtktext.h>
|
||||
|
||||
G_BEGIN_DECLS
|
||||
|
||||
@ -36,6 +36,6 @@ typedef struct _GtkEmojiCompletion GtkEmojiCompletion;
|
||||
typedef struct _GtkEmojiCompletionClass GtkEmojiCompletionClass;
|
||||
|
||||
GType gtk_emoji_completion_get_type (void) G_GNUC_CONST;
|
||||
GtkWidget *gtk_emoji_completion_new (GtkEntry *entry);
|
||||
GtkWidget *gtk_emoji_completion_new (GtkText *text);
|
||||
|
||||
G_END_DECLS
|
||||
|
6216
gtk/gtkentry.c
6216
gtk/gtkentry.c
File diff suppressed because it is too large
Load Diff
@ -115,28 +115,9 @@ struct _GtkEntryClass
|
||||
{
|
||||
GtkWidgetClass parent_class;
|
||||
|
||||
/* Hook to customize right-click popup */
|
||||
void (* populate_popup) (GtkEntry *entry,
|
||||
GtkWidget *popup);
|
||||
|
||||
/* Action signals
|
||||
*/
|
||||
void (* activate) (GtkEntry *entry);
|
||||
void (* move_cursor) (GtkEntry *entry,
|
||||
GtkMovementStep step,
|
||||
gint count,
|
||||
gboolean extend_selection);
|
||||
void (* insert_at_cursor) (GtkEntry *entry,
|
||||
const gchar *str);
|
||||
void (* delete_from_cursor) (GtkEntry *entry,
|
||||
GtkDeleteType type,
|
||||
gint count);
|
||||
void (* backspace) (GtkEntry *entry);
|
||||
void (* cut_clipboard) (GtkEntry *entry);
|
||||
void (* copy_clipboard) (GtkEntry *entry);
|
||||
void (* paste_clipboard) (GtkEntry *entry);
|
||||
void (* toggle_overwrite) (GtkEntry *entry);
|
||||
void (* insert_emoji) (GtkEntry *entry);
|
||||
|
||||
/*< private >*/
|
||||
|
||||
@ -224,12 +205,6 @@ void gtk_entry_set_text (GtkEntry *entry,
|
||||
GDK_AVAILABLE_IN_ALL
|
||||
const gchar* gtk_entry_get_text (GtkEntry *entry);
|
||||
|
||||
GDK_AVAILABLE_IN_ALL
|
||||
PangoLayout* gtk_entry_get_layout (GtkEntry *entry);
|
||||
GDK_AVAILABLE_IN_ALL
|
||||
void gtk_entry_get_layout_offsets (GtkEntry *entry,
|
||||
gint *x,
|
||||
gint *y);
|
||||
GDK_AVAILABLE_IN_ALL
|
||||
void gtk_entry_set_alignment (GtkEntry *entry,
|
||||
gfloat xalign);
|
||||
@ -242,13 +217,6 @@ void gtk_entry_set_completion (GtkEntry *entry,
|
||||
GDK_AVAILABLE_IN_ALL
|
||||
GtkEntryCompletion *gtk_entry_get_completion (GtkEntry *entry);
|
||||
|
||||
GDK_AVAILABLE_IN_ALL
|
||||
gint gtk_entry_layout_index_to_text_index (GtkEntry *entry,
|
||||
gint layout_index);
|
||||
GDK_AVAILABLE_IN_ALL
|
||||
gint gtk_entry_text_index_to_layout_index (GtkEntry *entry,
|
||||
gint text_index);
|
||||
|
||||
/* Progress API
|
||||
*/
|
||||
GDK_AVAILABLE_IN_ALL
|
||||
@ -341,9 +309,6 @@ void gtk_entry_get_icon_area (GtkEntry *
|
||||
GdkRectangle *icon_area);
|
||||
|
||||
GDK_AVAILABLE_IN_ALL
|
||||
gboolean gtk_entry_im_context_filter_keypress (GtkEntry *entry,
|
||||
GdkEventKey *event);
|
||||
GDK_AVAILABLE_IN_ALL
|
||||
void gtk_entry_reset_im_context (GtkEntry *entry);
|
||||
|
||||
GDK_AVAILABLE_IN_ALL
|
||||
|
@ -67,6 +67,7 @@
|
||||
#include "gtkentrycompletion.h"
|
||||
|
||||
#include "gtkentryprivate.h"
|
||||
#include "gtktextprivate.h"
|
||||
#include "gtkcelllayout.h"
|
||||
#include "gtkcellareabox.h"
|
||||
|
||||
@ -496,8 +497,9 @@ propagate_to_entry (GtkEventControllerKey *key,
|
||||
GtkEntryCompletion *completion)
|
||||
{
|
||||
GtkEntryCompletionPrivate *priv = completion->priv;
|
||||
GtkText *text = gtk_entry_get_text_widget (GTK_ENTRY (priv->entry));
|
||||
|
||||
return gtk_event_controller_key_forward (key, priv->entry);
|
||||
return gtk_event_controller_key_forward (key, GTK_WIDGET (text));
|
||||
}
|
||||
|
||||
static void
|
||||
@ -894,6 +896,7 @@ gtk_entry_completion_list_activated (GtkTreeView *treeview,
|
||||
gboolean entry_set;
|
||||
GtkTreeModel *model;
|
||||
GtkTreeIter child_iter;
|
||||
GtkText *text = gtk_entry_get_text_widget (GTK_ENTRY (completion->priv->entry));
|
||||
|
||||
gtk_tree_model_get_iter (GTK_TREE_MODEL (completion->priv->filter_model), &iter, path);
|
||||
gtk_tree_model_filter_convert_iter_to_child_iter (completion->priv->filter_model,
|
||||
@ -901,12 +904,10 @@ gtk_entry_completion_list_activated (GtkTreeView *treeview,
|
||||
&iter);
|
||||
model = gtk_tree_model_filter_get_model (completion->priv->filter_model);
|
||||
|
||||
g_signal_handler_block (completion->priv->entry,
|
||||
completion->priv->changed_id);
|
||||
g_signal_handler_block (text, completion->priv->changed_id);
|
||||
g_signal_emit (completion, entry_completion_signals[MATCH_SELECTED],
|
||||
0, model, &child_iter, &entry_set);
|
||||
g_signal_handler_unblock (completion->priv->entry,
|
||||
completion->priv->changed_id);
|
||||
g_signal_handler_unblock (text, completion->priv->changed_id);
|
||||
|
||||
_gtk_entry_completion_popdown (completion);
|
||||
}
|
||||
@ -1493,14 +1494,15 @@ static void
|
||||
gtk_entry_completion_popup (GtkEntryCompletion *completion)
|
||||
{
|
||||
GtkWidget *toplevel;
|
||||
GtkText *text = gtk_entry_get_text_widget (GTK_ENTRY (completion->priv->entry));
|
||||
|
||||
if (gtk_widget_get_mapped (completion->priv->popup_window))
|
||||
return;
|
||||
|
||||
if (!gtk_widget_get_mapped (completion->priv->entry))
|
||||
if (!gtk_widget_get_mapped (GTK_WIDGET (text)))
|
||||
return;
|
||||
|
||||
if (!gtk_widget_has_focus (completion->priv->entry))
|
||||
if (!gtk_widget_has_focus (GTK_WIDGET (text)))
|
||||
return;
|
||||
|
||||
if (completion->priv->has_grab)
|
||||
@ -1709,29 +1711,30 @@ gtk_entry_completion_get_completion_prefix (GtkEntryCompletion *completion)
|
||||
|
||||
static void
|
||||
gtk_entry_completion_insert_completion_text (GtkEntryCompletion *completion,
|
||||
const gchar *text)
|
||||
const gchar *new_text)
|
||||
{
|
||||
GtkEntryCompletionPrivate *priv = completion->priv;
|
||||
gint len;
|
||||
GtkText *text = gtk_entry_get_text_widget (GTK_ENTRY (priv->entry));
|
||||
|
||||
priv = completion->priv;
|
||||
|
||||
if (priv->changed_id > 0)
|
||||
g_signal_handler_block (priv->entry, priv->changed_id);
|
||||
g_signal_handler_block (text, priv->changed_id);
|
||||
|
||||
if (priv->insert_text_id > 0)
|
||||
g_signal_handler_block (priv->entry, priv->insert_text_id);
|
||||
g_signal_handler_block (text, priv->insert_text_id);
|
||||
|
||||
gtk_entry_set_text (GTK_ENTRY (priv->entry), text);
|
||||
gtk_editable_set_text (GTK_EDITABLE (priv->entry), new_text);
|
||||
|
||||
len = strlen (priv->completion_prefix);
|
||||
gtk_editable_select_region (GTK_EDITABLE (priv->entry), len, -1);
|
||||
|
||||
if (priv->changed_id > 0)
|
||||
g_signal_handler_unblock (priv->entry, priv->changed_id);
|
||||
g_signal_handler_unblock (text, priv->changed_id);
|
||||
|
||||
if (priv->insert_text_id > 0)
|
||||
g_signal_handler_unblock (priv->entry, priv->insert_text_id);
|
||||
g_signal_handler_unblock (text, priv->insert_text_id);
|
||||
}
|
||||
|
||||
static gboolean
|
||||
@ -1766,13 +1769,13 @@ gtk_entry_completion_insert_prefix (GtkEntryCompletion *completion)
|
||||
{
|
||||
gboolean done;
|
||||
gchar *prefix;
|
||||
GtkText *text = gtk_entry_get_text_widget (GTK_ENTRY (completion->priv->entry));
|
||||
|
||||
if (completion->priv->insert_text_id > 0)
|
||||
g_signal_handler_block (completion->priv->entry,
|
||||
completion->priv->insert_text_id);
|
||||
g_signal_handler_block (text, completion->priv->insert_text_id);
|
||||
|
||||
prefix = gtk_entry_completion_compute_prefix (completion,
|
||||
gtk_entry_get_text (GTK_ENTRY (completion->priv->entry)));
|
||||
gtk_editable_get_text (GTK_EDITABLE (completion->priv->entry)));
|
||||
|
||||
if (prefix)
|
||||
{
|
||||
@ -1782,8 +1785,7 @@ gtk_entry_completion_insert_prefix (GtkEntryCompletion *completion)
|
||||
}
|
||||
|
||||
if (completion->priv->insert_text_id > 0)
|
||||
g_signal_handler_unblock (completion->priv->entry,
|
||||
completion->priv->insert_text_id);
|
||||
g_signal_handler_unblock (text, completion->priv->insert_text_id);
|
||||
}
|
||||
|
||||
/**
|
||||
@ -2066,6 +2068,7 @@ gtk_entry_completion_key_pressed (GtkEventControllerKey *controller,
|
||||
gint matches, actions = 0;
|
||||
GtkEntryCompletion *completion = GTK_ENTRY_COMPLETION (user_data);
|
||||
GtkWidget *widget = completion->priv->entry;
|
||||
GtkText *text = gtk_entry_get_text_widget (GTK_ENTRY (widget));
|
||||
|
||||
if (!completion->priv->popup_completion)
|
||||
return FALSE;
|
||||
@ -2296,10 +2299,10 @@ keypress_completion_out:
|
||||
{
|
||||
gtk_tree_model_filter_convert_iter_to_child_iter (GTK_TREE_MODEL_FILTER (model), &child_iter, &iter);
|
||||
child_model = gtk_tree_model_filter_get_model (GTK_TREE_MODEL_FILTER (model));
|
||||
g_signal_handler_block (widget, completion->priv->changed_id);
|
||||
g_signal_handler_block (text, completion->priv->changed_id);
|
||||
g_signal_emit_by_name (completion, "match-selected",
|
||||
child_model, &child_iter, &entry_set);
|
||||
g_signal_handler_unblock (widget, completion->priv->changed_id);
|
||||
g_signal_handler_unblock (text, completion->priv->changed_id);
|
||||
|
||||
if (!entry_set)
|
||||
{
|
||||
@ -2349,7 +2352,6 @@ gtk_entry_completion_changed (GtkWidget *widget,
|
||||
gpointer user_data)
|
||||
{
|
||||
GtkEntryCompletion *completion = GTK_ENTRY_COMPLETION (user_data);
|
||||
GtkEntry *entry = GTK_ENTRY (widget);
|
||||
GdkDevice *device;
|
||||
|
||||
if (!completion->priv->popup_completion)
|
||||
@ -2362,12 +2364,12 @@ gtk_entry_completion_changed (GtkWidget *widget,
|
||||
completion->priv->completion_timeout = 0;
|
||||
}
|
||||
|
||||
if (!gtk_entry_get_text (entry))
|
||||
if (!gtk_editable_get_text (GTK_EDITABLE (widget)))
|
||||
return;
|
||||
|
||||
/* no need to normalize for this test */
|
||||
if (completion->priv->minimum_key_length > 0 &&
|
||||
strcmp ("", gtk_entry_get_text (entry)) == 0)
|
||||
strcmp ("", gtk_editable_get_text (GTK_EDITABLE (widget))) == 0)
|
||||
{
|
||||
if (gtk_widget_get_visible (completion->priv->popup_window))
|
||||
_gtk_entry_completion_popdown (completion);
|
||||
@ -2401,11 +2403,10 @@ check_completion_callback (GtkEntryCompletion *completion)
|
||||
}
|
||||
|
||||
static void
|
||||
clear_completion_callback (GtkEntry *entry,
|
||||
GParamSpec *pspec)
|
||||
clear_completion_callback (GObject *text,
|
||||
GParamSpec *pspec,
|
||||
GtkEntryCompletion *completion)
|
||||
{
|
||||
GtkEntryCompletion *completion = gtk_entry_get_completion (entry);
|
||||
|
||||
if (!completion->priv->inline_completion)
|
||||
return;
|
||||
|
||||
@ -2415,22 +2416,20 @@ clear_completion_callback (GtkEntry *entry,
|
||||
}
|
||||
|
||||
static gboolean
|
||||
accept_completion_callback (GtkEntry *entry)
|
||||
accept_completion_callback (GtkEntryCompletion *completion)
|
||||
{
|
||||
GtkEntryCompletion *completion = gtk_entry_get_completion (entry);
|
||||
|
||||
if (!completion->priv->inline_completion)
|
||||
return FALSE;
|
||||
|
||||
if (completion->priv->has_completion)
|
||||
gtk_editable_set_position (GTK_EDITABLE (entry),
|
||||
gtk_entry_buffer_get_length (gtk_entry_get_buffer (entry)));
|
||||
gtk_editable_set_position (GTK_EDITABLE (completion->priv->entry),
|
||||
gtk_entry_buffer_get_length (gtk_entry_get_buffer (GTK_ENTRY (completion->priv->entry))));
|
||||
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
static void
|
||||
completion_insert_text_callback (GtkEntry *entry,
|
||||
completion_insert_text_callback (GtkText *entry,
|
||||
const gchar *text,
|
||||
gint length,
|
||||
gint position,
|
||||
@ -2457,26 +2456,21 @@ connect_completion_signals (GtkEntryCompletion *completion)
|
||||
{
|
||||
GtkEntryCompletionPrivate *priv = completion->priv;
|
||||
GtkEventController *controller;
|
||||
GtkText *text = gtk_entry_get_text_widget (GTK_ENTRY (priv->entry));
|
||||
|
||||
controller = priv->entry_key_controller = gtk_event_controller_key_new ();
|
||||
g_signal_connect (controller, "key-pressed",
|
||||
G_CALLBACK (gtk_entry_completion_key_pressed), completion);
|
||||
g_signal_connect_swapped (controller, "focus-out",
|
||||
G_CALLBACK (accept_completion_callback),
|
||||
completion->priv->entry);
|
||||
gtk_widget_add_controller (completion->priv->entry, controller);
|
||||
g_signal_connect_swapped (controller, "focus-out", G_CALLBACK (accept_completion_callback), completion);
|
||||
gtk_widget_add_controller (GTK_WIDGET (text), controller);
|
||||
|
||||
completion->priv->changed_id =
|
||||
g_signal_connect (completion->priv->entry, "changed",
|
||||
G_CALLBACK (gtk_entry_completion_changed), completion);
|
||||
g_signal_connect (text, "changed", G_CALLBACK (gtk_entry_completion_changed), completion);
|
||||
|
||||
completion->priv->insert_text_id =
|
||||
g_signal_connect (completion->priv->entry, "insert-text",
|
||||
G_CALLBACK (completion_insert_text_callback), completion);
|
||||
g_signal_connect (completion->priv->entry, "notify",
|
||||
G_CALLBACK (clear_completion_callback), completion);
|
||||
g_signal_connect (completion->priv->entry, "activate",
|
||||
G_CALLBACK (accept_completion_callback), completion);
|
||||
g_signal_connect (text, "insert-text", G_CALLBACK (completion_insert_text_callback), completion);
|
||||
g_signal_connect (text, "notify", G_CALLBACK (clear_completion_callback), completion);
|
||||
g_signal_connect_swapped (text, "activate", G_CALLBACK (accept_completion_callback), completion);
|
||||
}
|
||||
|
||||
static void
|
||||
@ -2512,31 +2506,25 @@ unset_accessible_relation (GtkWidget *window,
|
||||
static void
|
||||
disconnect_completion_signals (GtkEntryCompletion *completion)
|
||||
{
|
||||
gtk_widget_remove_controller (completion->priv->entry,
|
||||
completion->priv->entry_key_controller);
|
||||
GtkText *text = gtk_entry_get_text_widget (GTK_ENTRY (completion->priv->entry));
|
||||
|
||||
gtk_widget_remove_controller (GTK_WIDGET (text), completion->priv->entry_key_controller);
|
||||
|
||||
if (completion->priv->changed_id > 0 &&
|
||||
g_signal_handler_is_connected (completion->priv->entry,
|
||||
completion->priv->changed_id))
|
||||
g_signal_handler_is_connected (text, completion->priv->changed_id))
|
||||
{
|
||||
g_signal_handler_disconnect (completion->priv->entry,
|
||||
completion->priv->changed_id);
|
||||
g_signal_handler_disconnect (text, completion->priv->changed_id);
|
||||
completion->priv->changed_id = 0;
|
||||
}
|
||||
if (completion->priv->insert_text_id > 0 &&
|
||||
g_signal_handler_is_connected (completion->priv->entry,
|
||||
completion->priv->insert_text_id))
|
||||
g_signal_handler_is_connected (text, completion->priv->insert_text_id))
|
||||
{
|
||||
g_signal_handler_disconnect (completion->priv->entry,
|
||||
completion->priv->insert_text_id);
|
||||
g_signal_handler_disconnect (text, completion->priv->insert_text_id);
|
||||
completion->priv->insert_text_id = 0;
|
||||
}
|
||||
g_signal_handlers_disconnect_by_func (completion->priv->entry,
|
||||
G_CALLBACK (completion_insert_text_callback), completion);
|
||||
g_signal_handlers_disconnect_by_func (completion->priv->entry,
|
||||
G_CALLBACK (clear_completion_callback), completion);
|
||||
g_signal_handlers_disconnect_by_func (completion->priv->entry,
|
||||
G_CALLBACK (accept_completion_callback), completion);
|
||||
g_signal_handlers_disconnect_by_func (text, G_CALLBACK (completion_insert_text_callback), completion);
|
||||
g_signal_handlers_disconnect_by_func (text, G_CALLBACK (clear_completion_callback), completion);
|
||||
g_signal_handlers_disconnect_by_func (text, G_CALLBACK (accept_completion_callback), completion);
|
||||
}
|
||||
|
||||
void
|
||||
|
@ -26,6 +26,7 @@
|
||||
#include "gtktreemodelfilter.h"
|
||||
#include "gtktreeviewcolumn.h"
|
||||
#include "gtkeventcontrollerkey.h"
|
||||
#include "gtktextprivate.h"
|
||||
|
||||
G_BEGIN_DECLS
|
||||
|
||||
@ -84,17 +85,12 @@ void _gtk_entry_completion_connect (GtkEntryCompletion *completion,
|
||||
GtkEntry *entry);
|
||||
void _gtk_entry_completion_disconnect (GtkEntryCompletion *completion);
|
||||
|
||||
gchar* _gtk_entry_get_display_text (GtkEntry *entry,
|
||||
gint start_pos,
|
||||
gint end_pos);
|
||||
GtkIMContext* _gtk_entry_get_im_context (GtkEntry *entry);
|
||||
void gtk_entry_enter_text (GtkEntry *entry,
|
||||
const char *text);
|
||||
void gtk_entry_set_positions (GtkEntry *entry,
|
||||
int current_pos,
|
||||
int selection_bound);
|
||||
|
||||
GtkEventController * gtk_entry_get_key_controller (GtkEntry *entry);
|
||||
GtkText *gtk_entry_get_text_widget (GtkEntry *entry);
|
||||
|
||||
G_END_DECLS
|
||||
|
||||
|
@ -3064,7 +3064,7 @@ operation_mode_set_search (GtkFileChooserWidget *impl)
|
||||
gtk_stack_set_visible_child_name (GTK_STACK (priv->browse_files_stack), "list");
|
||||
}
|
||||
|
||||
gtk_entry_grab_focus_without_selecting (GTK_ENTRY (priv->search_entry));
|
||||
gtk_widget_grab_focus (priv->search_entry);
|
||||
gtk_stack_set_visible_child_name (GTK_STACK (priv->browse_header_stack), "search");
|
||||
gtk_revealer_set_reveal_child (GTK_REVEALER (priv->browse_header_revealer), TRUE);
|
||||
location_bar_update (impl);
|
||||
@ -7043,7 +7043,7 @@ search_engine_finished_cb (GtkSearchEngine *engine,
|
||||
if (gtk_tree_model_iter_n_children (GTK_TREE_MODEL (priv->search_model), NULL) == 0)
|
||||
{
|
||||
gtk_stack_set_visible_child_name (GTK_STACK (priv->browse_files_stack), "empty");
|
||||
gtk_entry_grab_focus_without_selecting (GTK_ENTRY (priv->search_entry));
|
||||
gtk_widget_grab_focus (priv->search_entry);
|
||||
}
|
||||
}
|
||||
|
||||
@ -7084,7 +7084,7 @@ search_stop_searching (GtkFileChooserWidget *impl,
|
||||
|
||||
if (remove_query && priv->search_entry)
|
||||
{
|
||||
gtk_entry_set_text (GTK_ENTRY (priv->search_entry), "");
|
||||
gtk_editable_set_text (GTK_EDITABLE (priv->search_entry), "");
|
||||
}
|
||||
|
||||
if (priv->search_engine)
|
||||
@ -7218,7 +7218,7 @@ search_entry_activate_cb (GtkFileChooserWidget *impl)
|
||||
if (priv->operation_mode != OPERATION_MODE_SEARCH)
|
||||
return;
|
||||
|
||||
text = gtk_entry_get_text (GTK_ENTRY (priv->search_entry));
|
||||
text = gtk_editable_get_text (GTK_EDITABLE (priv->search_entry));
|
||||
|
||||
/* reset any existing query object */
|
||||
g_set_object (&priv->search_query, NULL);
|
||||
@ -7254,7 +7254,7 @@ search_setup_widgets (GtkFileChooserWidget *impl)
|
||||
query = gtk_query_get_text (priv->search_query);
|
||||
if (query)
|
||||
{
|
||||
gtk_entry_set_text (GTK_ENTRY (priv->search_entry), query);
|
||||
gtk_editable_set_text (GTK_EDITABLE (priv->search_entry), query);
|
||||
search_start_query (impl, query);
|
||||
}
|
||||
else
|
||||
|
@ -372,11 +372,11 @@ text_changed_cb (GtkEntry *entry,
|
||||
}
|
||||
|
||||
static void
|
||||
stop_search_cb (GtkEntry *entry,
|
||||
stop_search_cb (GtkSearchEntry *entry,
|
||||
GtkFontChooserWidget *fc)
|
||||
{
|
||||
if (gtk_entry_get_text (entry)[0] != 0)
|
||||
gtk_entry_set_text (entry, "");
|
||||
if (gtk_editable_get_text (GTK_EDITABLE (entry))[0] != 0)
|
||||
gtk_editable_set_text (GTK_EDITABLE (entry), "");
|
||||
else
|
||||
{
|
||||
GtkWidget *dialog;
|
||||
@ -623,7 +623,7 @@ gtk_font_chooser_widget_map (GtkWidget *widget)
|
||||
GtkFontChooserWidget *fontchooser = GTK_FONT_CHOOSER_WIDGET (widget);
|
||||
GtkFontChooserWidgetPrivate *priv = fontchooser->priv;
|
||||
|
||||
gtk_entry_set_text (GTK_ENTRY (priv->search_entry), "");
|
||||
gtk_editable_set_text (GTK_EDITABLE (priv->search_entry), "");
|
||||
gtk_stack_set_visible_child_name (GTK_STACK (priv->stack), "list");
|
||||
g_simple_action_set_state (G_SIMPLE_ACTION (priv->tweak_action), g_variant_new_boolean (FALSE));
|
||||
|
||||
@ -767,7 +767,7 @@ change_tweak (GSimpleAction *action,
|
||||
}
|
||||
else
|
||||
{
|
||||
gtk_entry_grab_focus_without_selecting (GTK_ENTRY (fontchooser->priv->search_entry));
|
||||
gtk_widget_grab_focus (fontchooser->priv->search_entry);
|
||||
gtk_stack_set_visible_child_name (GTK_STACK (fontchooser->priv->stack), "list");
|
||||
}
|
||||
|
||||
@ -1034,7 +1034,7 @@ visible_func (GtkTreeModel *model,
|
||||
}
|
||||
|
||||
/* If there's no filter string we show the item */
|
||||
search_text = gtk_entry_get_text (GTK_ENTRY (priv->search_entry));
|
||||
search_text = gtk_editable_get_text (GTK_EDITABLE (priv->search_entry));
|
||||
if (strlen (search_text) == 0)
|
||||
return TRUE;
|
||||
|
||||
|
271
gtk/gtkpasswordentry.c
Normal file
271
gtk/gtkpasswordentry.c
Normal file
@ -0,0 +1,271 @@
|
||||
/* GTK - The GIMP Toolkit
|
||||
* Copyright (C) 2019 Red Hat, Inc.
|
||||
*
|
||||
* Authors:
|
||||
* - Matthias Clasen <mclasen@redhat.com>
|
||||
*
|
||||
* 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 2 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 <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
#include "config.h"
|
||||
|
||||
#include "gtkpasswordentry.h"
|
||||
|
||||
#include "gtkaccessible.h"
|
||||
#include "gtkbindings.h"
|
||||
#include "gtktextprivate.h"
|
||||
#include "gtkeditable.h"
|
||||
#include "gtkbox.h"
|
||||
#include "gtkimage.h"
|
||||
#include "gtkintl.h"
|
||||
#include "gtkmarshalers.h"
|
||||
#include "gtkstylecontext.h"
|
||||
#include "gtkeventcontrollerkey.h"
|
||||
|
||||
#include "a11y/gtkentryaccessible.h"
|
||||
|
||||
/**
|
||||
* SECTION:gtkpasswordhentry
|
||||
* @Short_description: An entry for secrets
|
||||
* @Title: GtkPasswordEntry
|
||||
*
|
||||
* #GtkPasswordEntry is entry that has been tailored for
|
||||
* entering secrets.
|
||||
*/
|
||||
|
||||
typedef struct {
|
||||
GtkWidget *box;
|
||||
GtkWidget *entry;
|
||||
GtkWidget *icon;
|
||||
GdkKeymap *keymap;
|
||||
} GtkPasswordEntryPrivate;
|
||||
|
||||
static void gtk_password_entry_editable_init (GtkEditableInterface *iface);
|
||||
|
||||
G_DEFINE_TYPE_WITH_CODE (GtkPasswordEntry, gtk_password_entry, GTK_TYPE_WIDGET,
|
||||
G_ADD_PRIVATE (GtkPasswordEntry)
|
||||
G_IMPLEMENT_INTERFACE (GTK_TYPE_EDITABLE, gtk_password_entry_editable_init))
|
||||
|
||||
static void
|
||||
keymap_state_changed (GdkKeymap *keymap,
|
||||
GtkWidget *widget)
|
||||
{
|
||||
GtkPasswordEntry *entry = GTK_PASSWORD_ENTRY (widget);
|
||||
GtkPasswordEntryPrivate *priv = gtk_password_entry_get_instance_private (entry);
|
||||
|
||||
if (gtk_editable_get_editable (GTK_EDITABLE (entry)) &&
|
||||
gtk_widget_has_focus (priv->entry) &&
|
||||
gdk_keymap_get_caps_lock_state (priv->keymap))
|
||||
gtk_widget_show (priv->icon);
|
||||
else
|
||||
gtk_widget_hide (priv->icon);
|
||||
}
|
||||
|
||||
static void
|
||||
focus_changed (GtkWidget *widget)
|
||||
{
|
||||
GtkPasswordEntry *entry = GTK_PASSWORD_ENTRY (widget);
|
||||
GtkPasswordEntryPrivate *priv = gtk_password_entry_get_instance_private (entry);
|
||||
|
||||
if (priv->keymap)
|
||||
keymap_state_changed (priv->keymap, widget);
|
||||
}
|
||||
|
||||
static void
|
||||
gtk_password_entry_init (GtkPasswordEntry *entry)
|
||||
{
|
||||
GtkPasswordEntryPrivate *priv = gtk_password_entry_get_instance_private (entry);
|
||||
|
||||
gtk_widget_set_has_surface (GTK_WIDGET (entry), FALSE);
|
||||
|
||||
priv->box = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 0);
|
||||
gtk_widget_set_parent (priv->box, GTK_WIDGET (entry));
|
||||
|
||||
priv->entry = gtk_text_new ();
|
||||
gtk_text_set_visibility (GTK_TEXT (priv->entry), FALSE);
|
||||
gtk_widget_set_hexpand (priv->entry, TRUE);
|
||||
gtk_widget_set_vexpand (priv->entry, TRUE);
|
||||
gtk_container_add (GTK_CONTAINER (priv->box), priv->entry);
|
||||
gtk_editable_init_delegate (GTK_EDITABLE (entry));
|
||||
g_signal_connect_swapped (priv->entry, "notify::has-focus", G_CALLBACK (focus_changed), entry);
|
||||
|
||||
priv->icon = gtk_image_new_from_icon_name ("dialog-warning-symbolic");
|
||||
gtk_widget_set_tooltip_text (priv->icon, _("Caps Lock is on"));
|
||||
gtk_container_add (GTK_CONTAINER (priv->box), priv->icon);
|
||||
|
||||
gtk_style_context_add_class (gtk_widget_get_style_context (GTK_WIDGET (entry)), I_("password"));
|
||||
}
|
||||
|
||||
static void
|
||||
gtk_password_entry_realize (GtkWidget *widget)
|
||||
{
|
||||
GtkPasswordEntry *entry = GTK_PASSWORD_ENTRY (widget);
|
||||
GtkPasswordEntryPrivate *priv = gtk_password_entry_get_instance_private (entry);
|
||||
|
||||
GTK_WIDGET_CLASS (gtk_password_entry_parent_class)->realize (widget);
|
||||
|
||||
priv->keymap = gdk_display_get_keymap (gtk_widget_get_display (widget));
|
||||
g_signal_connect (priv->keymap, "state-changed", G_CALLBACK (keymap_state_changed), entry);
|
||||
}
|
||||
|
||||
static void
|
||||
gtk_password_entry_dispose (GObject *object)
|
||||
{
|
||||
GtkPasswordEntry *entry = GTK_PASSWORD_ENTRY (object);
|
||||
GtkPasswordEntryPrivate *priv = gtk_password_entry_get_instance_private (entry);
|
||||
|
||||
if (priv->keymap)
|
||||
g_signal_handlers_disconnect_by_func (priv->keymap, keymap_state_changed, entry);
|
||||
|
||||
if (priv->entry)
|
||||
gtk_editable_finish_delegate (GTK_EDITABLE (entry));
|
||||
|
||||
g_clear_pointer (&priv->entry, gtk_widget_unparent);
|
||||
g_clear_pointer (&priv->icon, gtk_widget_unparent);
|
||||
g_clear_pointer (&priv->box, gtk_widget_unparent);
|
||||
|
||||
G_OBJECT_CLASS (gtk_password_entry_parent_class)->dispose (object);
|
||||
}
|
||||
|
||||
static void
|
||||
gtk_password_entry_finalize (GObject *object)
|
||||
{
|
||||
G_OBJECT_CLASS (gtk_password_entry_parent_class)->finalize (object);
|
||||
}
|
||||
|
||||
static void
|
||||
gtk_password_entry_set_property (GObject *object,
|
||||
guint prop_id,
|
||||
const GValue *value,
|
||||
GParamSpec *pspec)
|
||||
{
|
||||
if (gtk_editable_delegate_set_property (object, prop_id, value, pspec))
|
||||
return;
|
||||
|
||||
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
|
||||
}
|
||||
|
||||
static void
|
||||
gtk_password_entry_get_property (GObject *object,
|
||||
guint prop_id,
|
||||
GValue *value,
|
||||
GParamSpec *pspec)
|
||||
{
|
||||
if (gtk_editable_delegate_get_property (object, prop_id, value, pspec))
|
||||
return;
|
||||
|
||||
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
|
||||
}
|
||||
|
||||
static void
|
||||
gtk_password_entry_measure (GtkWidget *widget,
|
||||
GtkOrientation orientation,
|
||||
int for_size,
|
||||
int *minimum,
|
||||
int *natural,
|
||||
int *minimum_baseline,
|
||||
int *natural_baseline)
|
||||
{
|
||||
GtkPasswordEntry *entry = GTK_PASSWORD_ENTRY (widget);
|
||||
GtkPasswordEntryPrivate *priv = gtk_password_entry_get_instance_private (entry);
|
||||
|
||||
gtk_widget_measure (priv->box, orientation, for_size,
|
||||
minimum, natural,
|
||||
minimum_baseline, natural_baseline);
|
||||
}
|
||||
|
||||
static void
|
||||
gtk_password_entry_size_allocate (GtkWidget *widget,
|
||||
int width,
|
||||
int height,
|
||||
int baseline)
|
||||
{
|
||||
GtkPasswordEntry *entry = GTK_PASSWORD_ENTRY (widget);
|
||||
GtkPasswordEntryPrivate *priv = gtk_password_entry_get_instance_private (entry);
|
||||
|
||||
gtk_widget_size_allocate (priv->box,
|
||||
&(GtkAllocation) { 0, 0, width, height },
|
||||
baseline);
|
||||
}
|
||||
|
||||
static AtkObject *
|
||||
gtk_password_entry_get_accessible (GtkWidget *widget)
|
||||
{
|
||||
AtkObject *atk_obj;
|
||||
|
||||
atk_obj = GTK_WIDGET_CLASS (gtk_password_entry_parent_class)->get_accessible (widget);
|
||||
atk_object_set_name (atk_obj, _("Password"));
|
||||
|
||||
return atk_obj;
|
||||
}
|
||||
|
||||
static void
|
||||
gtk_password_entry_grab_focus (GtkWidget *widget)
|
||||
{
|
||||
GtkPasswordEntry *entry = GTK_PASSWORD_ENTRY (widget);
|
||||
GtkPasswordEntryPrivate *priv = gtk_password_entry_get_instance_private (entry);
|
||||
|
||||
gtk_widget_grab_focus (priv->entry);
|
||||
}
|
||||
|
||||
static void
|
||||
gtk_password_entry_class_init (GtkPasswordEntryClass *klass)
|
||||
{
|
||||
GObjectClass *object_class = G_OBJECT_CLASS (klass);
|
||||
GtkWidgetClass *widget_class = GTK_WIDGET_CLASS (klass);
|
||||
|
||||
object_class->dispose = gtk_password_entry_dispose;
|
||||
object_class->finalize = gtk_password_entry_finalize;
|
||||
object_class->get_property = gtk_password_entry_get_property;
|
||||
object_class->set_property = gtk_password_entry_set_property;
|
||||
|
||||
widget_class->realize = gtk_password_entry_realize;
|
||||
widget_class->measure = gtk_password_entry_measure;
|
||||
widget_class->size_allocate = gtk_password_entry_size_allocate;
|
||||
widget_class->get_accessible = gtk_password_entry_get_accessible;
|
||||
widget_class->grab_focus = gtk_password_entry_grab_focus;
|
||||
|
||||
gtk_editable_install_properties (object_class, 1);
|
||||
|
||||
gtk_widget_class_set_accessible_type (widget_class, GTK_TYPE_ENTRY_ACCESSIBLE);
|
||||
gtk_widget_class_set_css_name (widget_class, I_("entry"));
|
||||
}
|
||||
|
||||
static GtkEditable *
|
||||
gtk_password_entry_get_delegate (GtkEditable *editable)
|
||||
{
|
||||
GtkPasswordEntry *entry = GTK_PASSWORD_ENTRY (editable);
|
||||
GtkPasswordEntryPrivate *priv = gtk_password_entry_get_instance_private (entry);
|
||||
|
||||
return GTK_EDITABLE (priv->entry);
|
||||
}
|
||||
|
||||
static void
|
||||
gtk_password_entry_editable_init (GtkEditableInterface *iface)
|
||||
{
|
||||
iface->get_delegate = gtk_password_entry_get_delegate;
|
||||
}
|
||||
|
||||
/**
|
||||
* gtk_password_entry_new:
|
||||
*
|
||||
* Creates a #GtkPasswordEntry.
|
||||
*
|
||||
* Returns: a new #GtkPasswordEntry
|
||||
*/
|
||||
GtkWidget *
|
||||
gtk_password_entry_new (void)
|
||||
{
|
||||
return GTK_WIDGET (g_object_new (GTK_TYPE_PASSWORD_ENTRY, NULL));
|
||||
}
|
60
gtk/gtkpasswordentry.h
Normal file
60
gtk/gtkpasswordentry.h
Normal file
@ -0,0 +1,60 @@
|
||||
/* GTK - The GIMP Toolkit
|
||||
* Copyright (C) 2019 Red Hat, Inc.
|
||||
*
|
||||
* Authors:
|
||||
* - MAtthias Clasen <mclasen@redhat.com>
|
||||
*
|
||||
* 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 2 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 <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
#ifndef __GTK_PASSWORD_ENTRY_H__
|
||||
#define __GTK_PASSWORD_ENTRY_H__
|
||||
|
||||
#if !defined (__GTK_H_INSIDE__) && !defined (GTK_COMPILATION)
|
||||
#error "Only <gtk/gtk.h> can be included directly."
|
||||
#endif
|
||||
|
||||
#include <gtk/gtkentry.h>
|
||||
|
||||
G_BEGIN_DECLS
|
||||
|
||||
#define GTK_TYPE_PASSWORD_ENTRY (gtk_password_entry_get_type ())
|
||||
#define GTK_PASSWORD_ENTRY(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), GTK_TYPE_PASSWORD_ENTRY, GtkPasswordEntry))
|
||||
#define GTK_PASSWORD_ENTRY_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), GTK_TYPE_PASSWORD_ENTRY, GtkPasswordEntryClass))
|
||||
#define GTK_IS_PASSWORD_ENTRY(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GTK_TYPE_PASSWORD_ENTRY))
|
||||
#define GTK_IS_PASSWORD_ENTRY_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), GTK_TYPE_PASSWORD_ENTRY))
|
||||
#define GTK_PASSWORD_ENTRY_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), GTK_TYPE_PASSWORD_ENTRY, GtkPasswordEntryClass))
|
||||
|
||||
typedef struct _GtkPasswordEntry GtkPasswordEntry;
|
||||
typedef struct _GtkPasswordEntryClass GtkPasswordEntryClass;
|
||||
|
||||
struct _GtkPasswordEntry
|
||||
{
|
||||
GtkWidget parent;
|
||||
};
|
||||
|
||||
struct _GtkPasswordEntryClass
|
||||
{
|
||||
GtkWidgetClass parent_class;
|
||||
};
|
||||
|
||||
GDK_AVAILABLE_IN_ALL
|
||||
GType gtk_password_entry_get_type (void) G_GNUC_CONST;
|
||||
|
||||
GDK_AVAILABLE_IN_ALL
|
||||
GtkWidget * gtk_password_entry_new (void);
|
||||
|
||||
G_END_DECLS
|
||||
|
||||
#endif /* __GTK_PASSWORD_ENTRY_H__ */
|
@ -148,9 +148,9 @@ gtk_search_bar_handle_event_for_entry (GtkSearchBar *bar,
|
||||
preedit_change_id = g_signal_connect (priv->entry, "preedit-changed",
|
||||
G_CALLBACK (preedit_changed_cb), &preedit_changed);
|
||||
|
||||
old_text = g_strdup (gtk_entry_get_text (GTK_ENTRY (priv->entry)));
|
||||
old_text = g_strdup (gtk_editable_get_text (GTK_EDITABLE (priv->entry)));
|
||||
res = gtk_widget_event (priv->entry, event);
|
||||
new_text = g_strdup (gtk_entry_get_text (GTK_ENTRY (priv->entry)));
|
||||
new_text = g_strdup (gtk_editable_get_text (GTK_EDITABLE (priv->entry)));
|
||||
|
||||
g_signal_handler_disconnect (priv->entry, preedit_change_id);
|
||||
|
||||
@ -255,10 +255,12 @@ reveal_child_changed_cb (GObject *object,
|
||||
|
||||
if (priv->entry)
|
||||
{
|
||||
if (reveal_child)
|
||||
if (reveal_child && GTK_IS_ENTRY (priv->entry))
|
||||
gtk_entry_grab_focus_without_selecting (GTK_ENTRY (priv->entry));
|
||||
else if (GTK_IS_SEARCH_ENTRY (priv->entry))
|
||||
gtk_widget_grab_focus (priv->entry);
|
||||
else
|
||||
gtk_entry_set_text (GTK_ENTRY (priv->entry), "");
|
||||
gtk_editable_set_text (GTK_EDITABLE (priv->entry), "");
|
||||
}
|
||||
|
||||
g_object_notify (G_OBJECT (bar), "search-mode-enabled");
|
||||
@ -284,8 +286,8 @@ gtk_search_bar_add (GtkContainer *container,
|
||||
/* If an entry is the only child, save the developer a couple of
|
||||
* lines of code
|
||||
*/
|
||||
if (GTK_IS_ENTRY (child))
|
||||
gtk_search_bar_connect_entry (bar, GTK_ENTRY (child));
|
||||
if (GTK_IS_EDITABLE (child))
|
||||
gtk_search_bar_connect_entry (bar, GTK_EDITABLE (child));
|
||||
|
||||
_gtk_bin_set_child (GTK_BIN (container), child);
|
||||
}
|
||||
@ -297,7 +299,7 @@ gtk_search_bar_remove (GtkContainer *container,
|
||||
GtkSearchBar *bar = GTK_SEARCH_BAR (container);
|
||||
GtkSearchBarPrivate *priv = gtk_search_bar_get_instance_private (bar);
|
||||
|
||||
if (GTK_IS_ENTRY (child))
|
||||
if (GTK_IS_EDITABLE (child))
|
||||
gtk_search_bar_connect_entry (bar, NULL);
|
||||
|
||||
gtk_center_box_set_center_widget (GTK_CENTER_BOX (priv->box_center), NULL);
|
||||
@ -350,7 +352,7 @@ gtk_search_bar_get_property (GObject *object,
|
||||
}
|
||||
|
||||
static void gtk_search_bar_set_entry (GtkSearchBar *bar,
|
||||
GtkEntry *entry);
|
||||
GtkEditable *editable);
|
||||
|
||||
static void
|
||||
gtk_search_bar_dispose (GObject *object)
|
||||
@ -494,7 +496,7 @@ gtk_search_bar_new (void)
|
||||
|
||||
static void
|
||||
gtk_search_bar_set_entry (GtkSearchBar *bar,
|
||||
GtkEntry *entry)
|
||||
GtkEditable *entry)
|
||||
{
|
||||
GtkSearchBarPrivate *priv = gtk_search_bar_get_instance_private (bar);
|
||||
|
||||
@ -527,7 +529,7 @@ gtk_search_bar_set_entry (GtkSearchBar *bar,
|
||||
/**
|
||||
* gtk_search_bar_connect_entry:
|
||||
* @bar: a #GtkSearchBar
|
||||
* @entry: a #GtkEntry
|
||||
* @entry: a #GtkEditable
|
||||
*
|
||||
* Connects the #GtkEntry widget passed as the one to be used in
|
||||
* this search bar. The entry should be a descendant of the search bar.
|
||||
@ -536,10 +538,10 @@ gtk_search_bar_set_entry (GtkSearchBar *bar,
|
||||
*/
|
||||
void
|
||||
gtk_search_bar_connect_entry (GtkSearchBar *bar,
|
||||
GtkEntry *entry)
|
||||
GtkEditable *entry)
|
||||
{
|
||||
g_return_if_fail (GTK_IS_SEARCH_BAR (bar));
|
||||
g_return_if_fail (entry == NULL || GTK_IS_ENTRY (entry));
|
||||
g_return_if_fail (entry == NULL || GTK_IS_EDITABLE (entry));
|
||||
|
||||
gtk_search_bar_set_entry (bar, entry);
|
||||
}
|
||||
|
@ -78,7 +78,7 @@ GtkWidget* gtk_search_bar_new (void);
|
||||
|
||||
GDK_AVAILABLE_IN_ALL
|
||||
void gtk_search_bar_connect_entry (GtkSearchBar *bar,
|
||||
GtkEntry *entry);
|
||||
GtkEditable *entry);
|
||||
|
||||
GDK_AVAILABLE_IN_ALL
|
||||
gboolean gtk_search_bar_get_search_mode (GtkSearchBar *bar);
|
||||
|
@ -31,7 +31,13 @@
|
||||
|
||||
#include "gtkaccessible.h"
|
||||
#include "gtkbindings.h"
|
||||
#include "gtkeditable.h"
|
||||
#include "gtkbox.h"
|
||||
#include "gtkgesturemultipress.h"
|
||||
#include "gtktextprivate.h"
|
||||
#include "gtkimage.h"
|
||||
#include "gtkintl.h"
|
||||
#include "gtkprivate.h"
|
||||
#include "gtkmarshalers.h"
|
||||
#include "gtkstylecontext.h"
|
||||
#include "gtkeventcontrollerkey.h"
|
||||
@ -69,6 +75,7 @@
|
||||
*/
|
||||
|
||||
enum {
|
||||
ACTIVATE,
|
||||
SEARCH_CHANGED,
|
||||
NEXT_MATCH,
|
||||
PREVIOUS_MATCH,
|
||||
@ -76,25 +83,33 @@ enum {
|
||||
LAST_SIGNAL
|
||||
};
|
||||
|
||||
enum {
|
||||
PROP_0,
|
||||
PROP_PLACEHOLDER_TEXT,
|
||||
PROP_ACTIVATES_DEFAULT,
|
||||
NUM_PROPERTIES,
|
||||
};
|
||||
|
||||
static guint signals[LAST_SIGNAL] = { 0 };
|
||||
|
||||
static GParamSpec *props[NUM_PROPERTIES] = { NULL, };
|
||||
|
||||
typedef struct {
|
||||
GtkWidget *capture_widget;
|
||||
GtkEventController *capture_widget_controller;
|
||||
|
||||
GtkWidget *box;
|
||||
GtkWidget *entry;
|
||||
GtkWidget *icon;
|
||||
|
||||
guint delayed_changed_id;
|
||||
gboolean content_changed;
|
||||
gboolean search_stopped;
|
||||
} GtkSearchEntryPrivate;
|
||||
|
||||
static void gtk_search_entry_icon_release (GtkEntry *entry,
|
||||
GtkEntryIconPosition icon_pos);
|
||||
static void gtk_search_entry_changed (GtkEditable *editable);
|
||||
static void gtk_search_entry_editable_init (GtkEditableInterface *iface);
|
||||
|
||||
static GtkEditableInterface *parent_editable_iface;
|
||||
|
||||
G_DEFINE_TYPE_WITH_CODE (GtkSearchEntry, gtk_search_entry, GTK_TYPE_ENTRY,
|
||||
G_DEFINE_TYPE_WITH_CODE (GtkSearchEntry, gtk_search_entry, GTK_TYPE_WIDGET,
|
||||
G_ADD_PRIVATE (GtkSearchEntry)
|
||||
G_IMPLEMENT_INTERFACE (GTK_TYPE_EDITABLE,
|
||||
gtk_search_entry_editable_init))
|
||||
@ -102,36 +117,23 @@ G_DEFINE_TYPE_WITH_CODE (GtkSearchEntry, gtk_search_entry, GTK_TYPE_ENTRY,
|
||||
/* 150 mseconds of delay */
|
||||
#define DELAYED_TIMEOUT_ID 150
|
||||
|
||||
/* This widget got created without a private structure, meaning
|
||||
* that we cannot now have one without breaking ABI */
|
||||
#define GET_PRIV(e) ((GtkSearchEntryPrivate *) gtk_search_entry_get_instance_private ((GtkSearchEntry *) (e)))
|
||||
|
||||
static void
|
||||
gtk_search_entry_preedit_changed (GtkEntry *entry,
|
||||
const gchar *preedit)
|
||||
text_changed (GtkSearchEntry *entry)
|
||||
{
|
||||
GtkSearchEntryPrivate *priv = GET_PRIV (entry);
|
||||
GtkSearchEntryPrivate *priv = gtk_search_entry_get_instance_private (entry);
|
||||
|
||||
priv->content_changed = TRUE;
|
||||
}
|
||||
|
||||
static void
|
||||
gtk_search_entry_notify (GObject *object,
|
||||
GParamSpec *pspec)
|
||||
{
|
||||
GtkSearchEntryPrivate *priv = GET_PRIV (object);
|
||||
|
||||
if (strcmp (pspec->name, "text") == 0)
|
||||
priv->content_changed = TRUE;
|
||||
|
||||
if (G_OBJECT_CLASS (gtk_search_entry_parent_class)->notify)
|
||||
G_OBJECT_CLASS (gtk_search_entry_parent_class)->notify (object, pspec);
|
||||
}
|
||||
|
||||
static void
|
||||
gtk_search_entry_finalize (GObject *object)
|
||||
{
|
||||
GtkSearchEntryPrivate *priv = GET_PRIV (object);
|
||||
GtkSearchEntry *entry = GTK_SEARCH_ENTRY (object);
|
||||
GtkSearchEntryPrivate *priv = gtk_search_entry_get_instance_private (entry);
|
||||
|
||||
gtk_editable_finish_delegate (GTK_EDITABLE (entry));
|
||||
|
||||
g_clear_pointer (&priv->box, gtk_widget_unparent);
|
||||
|
||||
if (priv->delayed_changed_id > 0)
|
||||
g_source_remove (priv->delayed_changed_id);
|
||||
@ -144,29 +146,147 @@ gtk_search_entry_finalize (GObject *object)
|
||||
static void
|
||||
gtk_search_entry_stop_search (GtkSearchEntry *entry)
|
||||
{
|
||||
GtkSearchEntryPrivate *priv = GET_PRIV (entry);
|
||||
GtkSearchEntryPrivate *priv = gtk_search_entry_get_instance_private (entry);
|
||||
|
||||
priv->search_stopped = TRUE;
|
||||
}
|
||||
|
||||
static void
|
||||
gtk_search_entry_set_property (GObject *object,
|
||||
guint prop_id,
|
||||
const GValue *value,
|
||||
GParamSpec *pspec)
|
||||
{
|
||||
GtkSearchEntry *entry = GTK_SEARCH_ENTRY (object);
|
||||
GtkSearchEntryPrivate *priv = gtk_search_entry_get_instance_private (entry);
|
||||
|
||||
if (gtk_editable_delegate_set_property (object, prop_id, value, pspec))
|
||||
return;
|
||||
|
||||
switch (prop_id)
|
||||
{
|
||||
case PROP_PLACEHOLDER_TEXT:
|
||||
gtk_text_set_placeholder_text (GTK_TEXT (priv->entry), g_value_get_string (value));
|
||||
break;
|
||||
|
||||
case PROP_ACTIVATES_DEFAULT:
|
||||
gtk_text_set_activates_default (GTK_TEXT (priv->entry), g_value_get_boolean (value));
|
||||
break;
|
||||
|
||||
default:
|
||||
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
|
||||
}
|
||||
}
|
||||
|
||||
static void
|
||||
gtk_search_entry_get_property (GObject *object,
|
||||
guint prop_id,
|
||||
GValue *value,
|
||||
GParamSpec *pspec)
|
||||
{
|
||||
GtkSearchEntry *entry = GTK_SEARCH_ENTRY (object);
|
||||
GtkSearchEntryPrivate *priv = gtk_search_entry_get_instance_private (entry);
|
||||
|
||||
if (gtk_editable_delegate_get_property (object, prop_id, value, pspec))
|
||||
return;
|
||||
|
||||
switch (prop_id)
|
||||
{
|
||||
case PROP_PLACEHOLDER_TEXT:
|
||||
g_value_set_string (value, gtk_text_get_placeholder_text (GTK_TEXT (priv->entry)));
|
||||
break;
|
||||
|
||||
case PROP_ACTIVATES_DEFAULT:
|
||||
g_value_set_boolean (value, gtk_text_get_activates_default (GTK_TEXT (priv->entry)));
|
||||
break;
|
||||
|
||||
default:
|
||||
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
|
||||
}
|
||||
}
|
||||
|
||||
static void
|
||||
gtk_search_entry_measure (GtkWidget *widget,
|
||||
GtkOrientation orientation,
|
||||
int for_size,
|
||||
int *minimum,
|
||||
int *natural,
|
||||
int *minimum_baseline,
|
||||
int *natural_baseline)
|
||||
{
|
||||
GtkSearchEntry *entry = GTK_SEARCH_ENTRY (widget);
|
||||
GtkSearchEntryPrivate *priv = gtk_search_entry_get_instance_private (entry);
|
||||
|
||||
gtk_widget_measure (priv->box, orientation, for_size,
|
||||
minimum, natural,
|
||||
minimum_baseline, natural_baseline);
|
||||
}
|
||||
|
||||
static void
|
||||
gtk_search_entry_size_allocate (GtkWidget *widget,
|
||||
int width,
|
||||
int height,
|
||||
int baseline)
|
||||
{
|
||||
GtkSearchEntry *entry = GTK_SEARCH_ENTRY (widget);
|
||||
GtkSearchEntryPrivate *priv = gtk_search_entry_get_instance_private (entry);
|
||||
|
||||
gtk_widget_size_allocate (priv->box,
|
||||
&(GtkAllocation) { 0, 0, width, height },
|
||||
baseline);
|
||||
}
|
||||
|
||||
static void
|
||||
gtk_search_entry_grab_focus (GtkWidget *widget)
|
||||
{
|
||||
GtkSearchEntry *entry = GTK_SEARCH_ENTRY (widget);
|
||||
GtkSearchEntryPrivate *priv = gtk_search_entry_get_instance_private (entry);
|
||||
|
||||
gtk_text_grab_focus_without_selecting (GTK_TEXT (priv->entry));
|
||||
}
|
||||
|
||||
static void
|
||||
gtk_search_entry_class_init (GtkSearchEntryClass *klass)
|
||||
{
|
||||
GObjectClass *object_class = G_OBJECT_CLASS (klass);
|
||||
GtkWidgetClass *widget_class = GTK_WIDGET_CLASS (klass);
|
||||
GtkBindingSet *binding_set;
|
||||
|
||||
object_class->finalize = gtk_search_entry_finalize;
|
||||
object_class->notify = gtk_search_entry_notify;
|
||||
object_class->get_property = gtk_search_entry_get_property;
|
||||
object_class->set_property = gtk_search_entry_set_property;
|
||||
|
||||
widget_class->measure = gtk_search_entry_measure;
|
||||
widget_class->size_allocate = gtk_search_entry_size_allocate;
|
||||
widget_class->grab_focus = gtk_search_entry_grab_focus;
|
||||
|
||||
klass->stop_search = gtk_search_entry_stop_search;
|
||||
|
||||
g_signal_override_class_handler ("icon-release",
|
||||
GTK_TYPE_SEARCH_ENTRY,
|
||||
G_CALLBACK (gtk_search_entry_icon_release));
|
||||
props[PROP_PLACEHOLDER_TEXT] =
|
||||
g_param_spec_string ("placeholder-text",
|
||||
P_("Placeholder text"),
|
||||
P_("Show text in the entry when it’s empty and unfocused"),
|
||||
NULL,
|
||||
GTK_PARAM_READWRITE|G_PARAM_EXPLICIT_NOTIFY);
|
||||
|
||||
g_signal_override_class_handler ("preedit-changed",
|
||||
GTK_TYPE_SEARCH_ENTRY,
|
||||
G_CALLBACK (gtk_search_entry_preedit_changed));
|
||||
props[PROP_ACTIVATES_DEFAULT] =
|
||||
g_param_spec_boolean ("activates-default",
|
||||
P_("Activates default"),
|
||||
P_("Whether to activate the default widget (such as the default button in a dialog) when Enter is pressed"),
|
||||
FALSE,
|
||||
GTK_PARAM_READWRITE|G_PARAM_EXPLICIT_NOTIFY);
|
||||
|
||||
g_object_class_install_properties (object_class, NUM_PROPERTIES, props);
|
||||
gtk_editable_install_properties (object_class, NUM_PROPERTIES);
|
||||
|
||||
signals[ACTIVATE] =
|
||||
g_signal_new (I_("activate"),
|
||||
G_OBJECT_CLASS_TYPE (object_class),
|
||||
G_SIGNAL_RUN_LAST | G_SIGNAL_ACTION,
|
||||
G_STRUCT_OFFSET (GtkSearchEntryClass, activate),
|
||||
NULL, NULL,
|
||||
NULL,
|
||||
G_TYPE_NONE, 0);
|
||||
|
||||
/**
|
||||
* GtkSearchEntry::search-changed:
|
||||
@ -257,37 +377,42 @@ gtk_search_entry_class_init (GtkSearchEntryClass *klass)
|
||||
"previous-match", 0);
|
||||
gtk_binding_entry_add_signal (binding_set, GDK_KEY_Escape, 0,
|
||||
"stop-search", 0);
|
||||
|
||||
gtk_widget_class_set_css_name (widget_class, I_("entry"));
|
||||
}
|
||||
|
||||
static GtkEditable *
|
||||
gtk_search_entry_get_delegate (GtkEditable *editable)
|
||||
{
|
||||
GtkSearchEntry *entry = GTK_SEARCH_ENTRY (editable);
|
||||
GtkSearchEntryPrivate *priv = gtk_search_entry_get_instance_private (entry);
|
||||
|
||||
return GTK_EDITABLE (priv->entry);
|
||||
}
|
||||
|
||||
static void
|
||||
gtk_search_entry_editable_init (GtkEditableInterface *iface)
|
||||
{
|
||||
parent_editable_iface = g_type_interface_peek_parent (iface);
|
||||
iface->do_insert_text = parent_editable_iface->do_insert_text;
|
||||
iface->do_delete_text = parent_editable_iface->do_delete_text;
|
||||
iface->insert_text = parent_editable_iface->insert_text;
|
||||
iface->delete_text = parent_editable_iface->delete_text;
|
||||
iface->get_chars = parent_editable_iface->get_chars;
|
||||
iface->set_selection_bounds = parent_editable_iface->set_selection_bounds;
|
||||
iface->get_selection_bounds = parent_editable_iface->get_selection_bounds;
|
||||
iface->set_position = parent_editable_iface->set_position;
|
||||
iface->get_position = parent_editable_iface->get_position;
|
||||
iface->changed = gtk_search_entry_changed;
|
||||
iface->get_delegate = gtk_search_entry_get_delegate;
|
||||
}
|
||||
|
||||
static void
|
||||
gtk_search_entry_icon_release (GtkEntry *entry,
|
||||
GtkEntryIconPosition icon_pos)
|
||||
gtk_search_entry_icon_release (GtkGestureMultiPress *press,
|
||||
int n_press,
|
||||
double x,
|
||||
double y,
|
||||
GtkSearchEntry *entry)
|
||||
{
|
||||
if (icon_pos == GTK_ENTRY_ICON_SECONDARY)
|
||||
gtk_entry_set_text (entry, "");
|
||||
GtkSearchEntryPrivate *priv = gtk_search_entry_get_instance_private (entry);
|
||||
|
||||
gtk_editable_set_text (GTK_EDITABLE (priv->entry), "");
|
||||
}
|
||||
|
||||
static gboolean
|
||||
gtk_search_entry_changed_timeout_cb (gpointer user_data)
|
||||
{
|
||||
GtkSearchEntry *entry = user_data;
|
||||
GtkSearchEntryPrivate *priv = GET_PRIV (entry);
|
||||
GtkSearchEntryPrivate *priv = gtk_search_entry_get_instance_private (entry);
|
||||
|
||||
g_signal_emit (entry, signals[SEARCH_CHANGED], 0);
|
||||
priv->delayed_changed_id = 0;
|
||||
@ -298,7 +423,7 @@ gtk_search_entry_changed_timeout_cb (gpointer user_data)
|
||||
static void
|
||||
reset_timeout (GtkSearchEntry *entry)
|
||||
{
|
||||
GtkSearchEntryPrivate *priv = GET_PRIV (entry);
|
||||
GtkSearchEntryPrivate *priv = gtk_search_entry_get_instance_private (entry);
|
||||
|
||||
if (priv->delayed_changed_id > 0)
|
||||
g_source_remove (priv->delayed_changed_id);
|
||||
@ -309,35 +434,19 @@ reset_timeout (GtkSearchEntry *entry)
|
||||
}
|
||||
|
||||
static void
|
||||
gtk_search_entry_changed (GtkEditable *editable)
|
||||
gtk_search_entry_changed (GtkEditable *editable,
|
||||
GtkSearchEntry *entry)
|
||||
{
|
||||
GtkSearchEntry *entry = GTK_SEARCH_ENTRY (editable);
|
||||
GtkSearchEntryPrivate *priv = GET_PRIV (entry);
|
||||
const char *str, *icon_name;
|
||||
gboolean cleared;
|
||||
GtkSearchEntryPrivate *priv = gtk_search_entry_get_instance_private (entry);
|
||||
const char *str;
|
||||
|
||||
/* Update the icons first */
|
||||
str = gtk_entry_get_text (GTK_ENTRY (entry));
|
||||
str = gtk_editable_get_text (GTK_EDITABLE (priv->entry));
|
||||
|
||||
if (str == NULL || *str == '\0')
|
||||
{
|
||||
icon_name = NULL;
|
||||
cleared = TRUE;
|
||||
}
|
||||
else
|
||||
{
|
||||
icon_name = "edit-clear-symbolic";
|
||||
cleared = FALSE;
|
||||
}
|
||||
gtk_widget_hide (priv->icon);
|
||||
|
||||
g_object_set (entry,
|
||||
"secondary-icon-name", icon_name,
|
||||
"secondary-icon-activatable", !cleared,
|
||||
"secondary-icon-sensitive", !cleared,
|
||||
NULL);
|
||||
|
||||
if (cleared)
|
||||
{
|
||||
if (priv->delayed_changed_id > 0)
|
||||
{
|
||||
g_source_remove (priv->delayed_changed_id);
|
||||
@ -347,21 +456,62 @@ gtk_search_entry_changed (GtkEditable *editable)
|
||||
}
|
||||
else
|
||||
{
|
||||
gtk_widget_show (priv->icon);
|
||||
|
||||
/* Queue up the timeout */
|
||||
reset_timeout (entry);
|
||||
}
|
||||
}
|
||||
|
||||
static void
|
||||
notify_cb (GObject *object,
|
||||
GParamSpec *pspec,
|
||||
gpointer data)
|
||||
{
|
||||
/* The editable interface properties are already forwarded by the editable delegate setup */
|
||||
if (g_str_equal (pspec->name, "placeholder-text") ||
|
||||
g_str_equal (pspec->name, "activates-default"))
|
||||
g_object_notify (data, pspec->name);
|
||||
}
|
||||
|
||||
static void
|
||||
activate_cb (GtkText *text,
|
||||
gpointer data)
|
||||
{
|
||||
g_signal_emit (data, signals[ACTIVATE], 0);
|
||||
}
|
||||
|
||||
static void
|
||||
gtk_search_entry_init (GtkSearchEntry *entry)
|
||||
{
|
||||
GtkSearchEntryPrivate *priv = gtk_search_entry_get_instance_private (entry);
|
||||
AtkObject *atk_obj;
|
||||
GtkGesture *press;
|
||||
|
||||
g_object_set (entry,
|
||||
"primary-icon-name", "edit-find-symbolic",
|
||||
"primary-icon-activatable", FALSE,
|
||||
"primary-icon-sensitive", FALSE,
|
||||
NULL);
|
||||
gtk_widget_set_has_surface (GTK_WIDGET (entry), FALSE);
|
||||
|
||||
priv->box = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 0);
|
||||
gtk_widget_set_parent (priv->box, GTK_WIDGET (entry));
|
||||
|
||||
priv->entry = gtk_text_new ();
|
||||
gtk_widget_set_hexpand (priv->entry, TRUE);
|
||||
gtk_widget_set_vexpand (priv->entry, TRUE);
|
||||
gtk_container_add (GTK_CONTAINER (priv->box), GTK_WIDGET (priv->entry));
|
||||
gtk_editable_init_delegate (GTK_EDITABLE (entry));
|
||||
g_signal_connect_swapped (priv->entry, "changed", G_CALLBACK (text_changed), entry);
|
||||
g_signal_connect_after (priv->entry, "changed", G_CALLBACK (gtk_search_entry_changed), entry);
|
||||
g_signal_connect_swapped (priv->entry, "preedit-changed", G_CALLBACK (text_changed), entry);
|
||||
g_signal_connect (priv->entry, "notify", G_CALLBACK (notify_cb), entry);
|
||||
g_signal_connect (priv->entry, "activate", G_CALLBACK (activate_cb), entry);
|
||||
|
||||
priv->icon = gtk_image_new_from_icon_name ("edit-clear-symbolic");
|
||||
gtk_widget_set_tooltip_text (priv->icon, _("Clear entry"));
|
||||
gtk_container_add (GTK_CONTAINER (priv->box), GTK_WIDGET (priv->icon));
|
||||
gtk_widget_hide (priv->icon);
|
||||
|
||||
press = gtk_gesture_multi_press_new ();
|
||||
g_signal_connect (press, "released", G_CALLBACK (gtk_search_entry_icon_release), entry);
|
||||
gtk_widget_add_controller (priv->icon, GTK_EVENT_CONTROLLER (press));
|
||||
|
||||
atk_obj = gtk_widget_get_accessible (GTK_WIDGET (entry));
|
||||
if (GTK_IS_ACCESSIBLE (atk_obj))
|
||||
@ -431,7 +581,7 @@ gboolean
|
||||
gtk_search_entry_handle_event (GtkSearchEntry *entry,
|
||||
GdkEvent *event)
|
||||
{
|
||||
GtkSearchEntryPrivate *priv = GET_PRIV (entry);
|
||||
GtkSearchEntryPrivate *priv = gtk_search_entry_get_instance_private (entry);
|
||||
gboolean handled;
|
||||
guint keyval, state;
|
||||
|
||||
@ -544,3 +694,10 @@ gtk_search_entry_get_key_capture_widget (GtkSearchEntry *entry)
|
||||
return priv->capture_widget;
|
||||
}
|
||||
|
||||
GtkEventController *
|
||||
gtk_search_entry_get_key_controller (GtkSearchEntry *entry)
|
||||
{
|
||||
GtkSearchEntryPrivate *priv = gtk_search_entry_get_instance_private (entry);
|
||||
|
||||
return gtk_text_get_key_controller (GTK_TEXT (priv->entry));
|
||||
}
|
||||
|
@ -48,17 +48,18 @@ typedef struct _GtkSearchEntryClass GtkSearchEntryClass;
|
||||
|
||||
struct _GtkSearchEntry
|
||||
{
|
||||
GtkEntry parent;
|
||||
GtkWidget parent;
|
||||
};
|
||||
|
||||
struct _GtkSearchEntryClass
|
||||
{
|
||||
GtkEntryClass parent_class;
|
||||
GtkWidgetClass parent_class;
|
||||
|
||||
void (*search_changed) (GtkSearchEntry *entry);
|
||||
void (*next_match) (GtkSearchEntry *entry);
|
||||
void (*previous_match) (GtkSearchEntry *entry);
|
||||
void (*stop_search) (GtkSearchEntry *entry);
|
||||
void (* activate) (GtkSearchEntry *entry);
|
||||
void (* search_changed) (GtkSearchEntry *entry);
|
||||
void (* next_match) (GtkSearchEntry *entry);
|
||||
void (* previous_match) (GtkSearchEntry *entry);
|
||||
void (* stop_search) (GtkSearchEntry *entry);
|
||||
};
|
||||
|
||||
GDK_AVAILABLE_IN_ALL
|
||||
@ -78,7 +79,6 @@ GDK_AVAILABLE_IN_ALL
|
||||
GtkWidget* gtk_search_entry_get_key_capture_widget (GtkSearchEntry *entry);
|
||||
|
||||
|
||||
|
||||
G_END_DECLS
|
||||
|
||||
#endif /* __GTK_SEARCH_ENTRY_H__ */
|
||||
|
@ -32,6 +32,8 @@ G_BEGIN_DECLS
|
||||
gboolean gtk_search_entry_is_keynav (guint keyval,
|
||||
GdkModifierType state);
|
||||
|
||||
GtkEventController * gtk_search_entry_get_key_controller (GtkSearchEntry *entry);
|
||||
|
||||
G_END_DECLS
|
||||
|
||||
#endif /* __GTK_SEARCH_ENTRY_PRIVATE_H__ */
|
||||
|
@ -35,7 +35,8 @@
|
||||
#include "gtkbutton.h"
|
||||
#include "gtkcssstylepropertyprivate.h"
|
||||
#include "gtkeditable.h"
|
||||
#include "gtkentry.h"
|
||||
#include "gtkimage.h"
|
||||
#include "gtktext.h"
|
||||
#include "gtkeventcontrollerkey.h"
|
||||
#include "gtkeventcontrollermotion.h"
|
||||
#include "gtkeventcontrollerscroll.h"
|
||||
@ -94,7 +95,7 @@
|
||||
* |[<!-- language="plain" -->
|
||||
* spinbutton.horizontal
|
||||
* ╰── box.horizontal
|
||||
* ├── entry
|
||||
* ├── text
|
||||
* │ ├── undershoot.left
|
||||
* │ ╰── undershoot.right
|
||||
* ├── button.down
|
||||
@ -105,7 +106,7 @@
|
||||
* spinbutton.vertical
|
||||
* ╰── box.vertical
|
||||
* ├── button.up
|
||||
* ├── entry
|
||||
* ├── text
|
||||
* │ ├── undershoot.left
|
||||
* │ ╰── undershoot.right
|
||||
* ╰── button.down
|
||||
@ -113,8 +114,8 @@
|
||||
*
|
||||
* GtkSpinButtons main CSS node has the name spinbutton. It creates subnodes
|
||||
* for the entry and the two buttons, with these names. The button nodes have
|
||||
* the style classes .up and .down. The GtkEntry subnodes (if present) are put
|
||||
* below the entry node. The orientation of the spin button is reflected in
|
||||
* the style classes .up and .down. The GtkText subnodes (if present) are put
|
||||
* below the text node. The orientation of the spin button is reflected in
|
||||
* the .vertical or .horizontal style class on the main node.
|
||||
*
|
||||
* ## Using a GtkSpinButton to get an integer
|
||||
@ -221,11 +222,8 @@ enum {
|
||||
PROP_WRAP,
|
||||
PROP_UPDATE_POLICY,
|
||||
PROP_VALUE,
|
||||
PROP_WIDTH_CHARS,
|
||||
PROP_MAX_WIDTH_CHARS,
|
||||
PROP_TEXT,
|
||||
NUM_SPINBUTTON_PROPS,
|
||||
PROP_ORIENTATION,
|
||||
PROP_ORIENTATION = NUM_SPINBUTTON_PROPS
|
||||
};
|
||||
|
||||
/* Signals */
|
||||
@ -271,7 +269,7 @@ static gboolean gtk_spin_button_stop_spinning (GtkSpinButton *spin);
|
||||
static void gtk_spin_button_value_changed (GtkAdjustment *adjustment,
|
||||
GtkSpinButton *spin_button);
|
||||
|
||||
static void gtk_spin_button_activate (GtkEntry *entry,
|
||||
static void gtk_spin_button_activate (GtkText *entry,
|
||||
gpointer user_data);
|
||||
static void gtk_spin_button_unset_adjustment (GtkSpinButton *spin_button);
|
||||
static void gtk_spin_button_set_orientation (GtkSpinButton *spin_button,
|
||||
@ -385,33 +383,9 @@ gtk_spin_button_class_init (GtkSpinButtonClass *class)
|
||||
-G_MAXDOUBLE, G_MAXDOUBLE, 0.0,
|
||||
GTK_PARAM_READWRITE|G_PARAM_EXPLICIT_NOTIFY);
|
||||
|
||||
spinbutton_props[PROP_WIDTH_CHARS] =
|
||||
g_param_spec_int ("width-chars",
|
||||
P_("Width in chars"),
|
||||
P_("Number of characters to leave space for in the entry"),
|
||||
-1, G_MAXINT,
|
||||
0,
|
||||
GTK_PARAM_READWRITE|G_PARAM_EXPLICIT_NOTIFY);
|
||||
|
||||
spinbutton_props[PROP_MAX_WIDTH_CHARS] =
|
||||
g_param_spec_int ("max-width-chars",
|
||||
P_("Maximum width in characters"),
|
||||
P_("The desired maximum width of the entry, in characters"),
|
||||
-1, G_MAXINT,
|
||||
0,
|
||||
GTK_PARAM_READWRITE|G_PARAM_EXPLICIT_NOTIFY);
|
||||
|
||||
spinbutton_props[PROP_TEXT] =
|
||||
g_param_spec_string ("text",
|
||||
P_("Text"),
|
||||
P_("The contents of the entry"),
|
||||
"0", /* Default value of the default adjustment */
|
||||
GTK_PARAM_READWRITE|G_PARAM_EXPLICIT_NOTIFY);
|
||||
|
||||
g_object_class_install_properties (gobject_class, NUM_SPINBUTTON_PROPS, spinbutton_props);
|
||||
g_object_class_override_property (gobject_class,
|
||||
PROP_ORIENTATION,
|
||||
"orientation");
|
||||
g_object_class_override_property (gobject_class, PROP_ORIENTATION, "orientation");
|
||||
gtk_editable_install_properties (gobject_class, PROP_ORIENTATION + 1);
|
||||
|
||||
/**
|
||||
* GtkSpinButton::input:
|
||||
@ -549,9 +523,19 @@ gtk_spin_button_class_init (GtkSpinButtonClass *class)
|
||||
gtk_widget_class_set_css_name (widget_class, I_("spinbutton"));
|
||||
}
|
||||
|
||||
static GtkEditable *
|
||||
gtk_spin_button_get_delegate (GtkEditable *editable)
|
||||
{
|
||||
GtkSpinButton *spin_button = GTK_SPIN_BUTTON (editable);
|
||||
GtkSpinButtonPrivate *priv = gtk_spin_button_get_instance_private (spin_button);
|
||||
|
||||
return GTK_EDITABLE (priv->entry);
|
||||
}
|
||||
|
||||
static void
|
||||
gtk_spin_button_editable_init (GtkEditableInterface *iface)
|
||||
{
|
||||
iface->get_delegate = gtk_spin_button_get_delegate;
|
||||
iface->insert_text = gtk_spin_button_insert_text;
|
||||
}
|
||||
|
||||
@ -564,6 +548,9 @@ gtk_spin_button_set_property (GObject *object,
|
||||
GtkSpinButton *spin_button = GTK_SPIN_BUTTON (object);
|
||||
GtkSpinButtonPrivate *priv = gtk_spin_button_get_instance_private (spin_button);
|
||||
|
||||
if (gtk_editable_delegate_set_property (object, prop_id, value, pspec))
|
||||
return;
|
||||
|
||||
switch (prop_id)
|
||||
{
|
||||
GtkAdjustment *adjustment;
|
||||
@ -602,15 +589,6 @@ gtk_spin_button_set_property (GObject *object,
|
||||
case PROP_ORIENTATION:
|
||||
gtk_spin_button_set_orientation (spin_button, g_value_get_enum (value));
|
||||
break;
|
||||
case PROP_WIDTH_CHARS:
|
||||
gtk_spin_button_set_width_chars (spin_button, g_value_get_int (value));
|
||||
break;
|
||||
case PROP_MAX_WIDTH_CHARS:
|
||||
gtk_spin_button_set_max_width_chars (spin_button, g_value_get_int (value));
|
||||
break;
|
||||
case PROP_TEXT:
|
||||
gtk_spin_button_set_text (spin_button, g_value_get_string (value));
|
||||
break;
|
||||
default:
|
||||
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
|
||||
break;
|
||||
@ -626,6 +604,9 @@ gtk_spin_button_get_property (GObject *object,
|
||||
GtkSpinButton *spin_button = GTK_SPIN_BUTTON (object);
|
||||
GtkSpinButtonPrivate *priv = gtk_spin_button_get_instance_private (spin_button);
|
||||
|
||||
if (gtk_editable_delegate_get_property (object, prop_id, value, pspec))
|
||||
return;
|
||||
|
||||
switch (prop_id)
|
||||
{
|
||||
case PROP_ADJUSTMENT:
|
||||
@ -655,15 +636,6 @@ gtk_spin_button_get_property (GObject *object,
|
||||
case PROP_ORIENTATION:
|
||||
g_value_set_enum (value, priv->orientation);
|
||||
break;
|
||||
case PROP_WIDTH_CHARS:
|
||||
g_value_set_int (value, gtk_spin_button_get_width_chars (spin_button));
|
||||
break;
|
||||
case PROP_MAX_WIDTH_CHARS:
|
||||
g_value_set_int (value, gtk_spin_button_get_max_width_chars (spin_button));
|
||||
break;
|
||||
case PROP_TEXT:
|
||||
g_value_set_string (value, gtk_spin_button_get_text (spin_button));
|
||||
break;
|
||||
default:
|
||||
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
|
||||
break;
|
||||
@ -861,20 +833,19 @@ gtk_spin_button_init (GtkSpinButton *spin_button)
|
||||
priv->orientation = GTK_ORIENTATION_HORIZONTAL;
|
||||
|
||||
_gtk_orientable_set_style_classes (GTK_ORIENTABLE (spin_button));
|
||||
gtk_widget_set_focus_on_click (GTK_WIDGET (spin_button), TRUE);
|
||||
|
||||
priv->box = gtk_box_new (priv->orientation, 0);
|
||||
gtk_widget_set_parent (priv->box, GTK_WIDGET (spin_button));
|
||||
|
||||
priv->entry = gtk_entry_new ();
|
||||
gtk_entry_set_width_chars (GTK_ENTRY (priv->entry), 0);
|
||||
gtk_entry_set_max_width_chars (GTK_ENTRY (priv->entry), 0);
|
||||
priv->entry = gtk_text_new ();
|
||||
gtk_editable_init_delegate (GTK_EDITABLE (spin_button));
|
||||
gtk_editable_set_width_chars (GTK_EDITABLE (priv->entry), 0);
|
||||
gtk_editable_set_max_width_chars (GTK_EDITABLE (priv->entry), 0);
|
||||
gtk_widget_set_hexpand (priv->entry, TRUE);
|
||||
gtk_widget_set_vexpand (priv->entry, TRUE);
|
||||
g_signal_connect (priv->entry, "activate", G_CALLBACK (gtk_spin_button_activate), spin_button);
|
||||
gtk_container_add (GTK_CONTAINER (priv->box), priv->entry);
|
||||
|
||||
|
||||
priv->down_button = gtk_button_new ();
|
||||
gtk_container_add (GTK_CONTAINER (priv->down_button), gtk_image_new_from_icon_name ("value-decrease-symbolic"));
|
||||
gtk_style_context_add_class (gtk_widget_get_style_context (priv->down_button), "image-button");
|
||||
@ -941,6 +912,8 @@ gtk_spin_button_finalize (GObject *object)
|
||||
|
||||
gtk_spin_button_unset_adjustment (spin_button);
|
||||
|
||||
gtk_editable_finish_delegate (GTK_EDITABLE (spin_button));
|
||||
|
||||
gtk_widget_unparent (priv->box);
|
||||
|
||||
G_OBJECT_CLASS (gtk_spin_button_parent_class)->finalize (object);
|
||||
@ -960,6 +933,7 @@ gtk_spin_button_realize (GtkWidget *widget)
|
||||
GtkSpinButton *spin_button = GTK_SPIN_BUTTON (widget);
|
||||
GtkSpinButtonPrivate *priv = gtk_spin_button_get_instance_private (spin_button);
|
||||
gboolean return_val;
|
||||
const char *text;
|
||||
|
||||
GTK_WIDGET_CLASS (gtk_spin_button_parent_class)->realize (widget);
|
||||
|
||||
@ -969,8 +943,8 @@ gtk_spin_button_realize (GtkWidget *widget)
|
||||
/* If output wasn't processed explicitly by the method connected to the
|
||||
* 'output' signal; and if we don't have any explicit 'text' set initially,
|
||||
* fallback to the default output. */
|
||||
if (!return_val &&
|
||||
(priv->numeric || gtk_entry_get_text (GTK_ENTRY (priv->entry)) == NULL))
|
||||
text = gtk_editable_get_text (GTK_EDITABLE (priv->entry));
|
||||
if (!return_val && (priv->numeric || text == NULL || *text == '\0'))
|
||||
gtk_spin_button_default_output (spin_button);
|
||||
}
|
||||
|
||||
@ -1026,7 +1000,7 @@ gtk_spin_button_set_orientation (GtkSpinButton *spin,
|
||||
GtkOrientation orientation)
|
||||
{
|
||||
GtkSpinButtonPrivate *priv = gtk_spin_button_get_instance_private (spin);
|
||||
GtkEntry *entry = GTK_ENTRY (priv->entry);
|
||||
GtkEditable *editable = GTK_EDITABLE (priv->entry);
|
||||
|
||||
if (priv->orientation == orientation)
|
||||
return;
|
||||
@ -1036,11 +1010,11 @@ gtk_spin_button_set_orientation (GtkSpinButton *spin,
|
||||
|
||||
/* change alignment if it's the default */
|
||||
if (priv->orientation == GTK_ORIENTATION_VERTICAL &&
|
||||
gtk_entry_get_alignment (entry) == 0.0)
|
||||
gtk_entry_set_alignment (entry, 0.5);
|
||||
gtk_editable_get_alignment (editable) == 0.0)
|
||||
gtk_editable_set_alignment (editable, 0.5);
|
||||
else if (priv->orientation == GTK_ORIENTATION_HORIZONTAL &&
|
||||
gtk_entry_get_alignment (entry) == 0.5)
|
||||
gtk_entry_set_alignment (entry, 0.0);
|
||||
gtk_editable_get_alignment (editable) == 0.5)
|
||||
gtk_editable_set_alignment (editable, 0.0);
|
||||
|
||||
if (priv->orientation == GTK_ORIENTATION_HORIZONTAL)
|
||||
{
|
||||
@ -1330,7 +1304,7 @@ gtk_spin_button_snap (GtkSpinButton *spin_button,
|
||||
}
|
||||
|
||||
static void
|
||||
gtk_spin_button_activate (GtkEntry *entry,
|
||||
gtk_spin_button_activate (GtkText *entry,
|
||||
gpointer user_data)
|
||||
{
|
||||
GtkSpinButton *spin_button = user_data;
|
||||
@ -1348,11 +1322,6 @@ gtk_spin_button_insert_text (GtkEditable *editable,
|
||||
{
|
||||
GtkSpinButton *spin = GTK_SPIN_BUTTON (editable);
|
||||
GtkSpinButtonPrivate *priv = gtk_spin_button_get_instance_private (spin);
|
||||
GtkEntry *entry = GTK_ENTRY (priv->entry);
|
||||
GtkEditableInterface *parent_editable_iface;
|
||||
|
||||
parent_editable_iface = g_type_interface_peek (gtk_spin_button_parent_class,
|
||||
GTK_TYPE_EDITABLE);
|
||||
|
||||
if (priv->numeric)
|
||||
{
|
||||
@ -1365,8 +1334,8 @@ gtk_spin_button_insert_text (GtkEditable *editable,
|
||||
gint entry_length;
|
||||
const gchar *entry_text;
|
||||
|
||||
entry_length = gtk_entry_get_text_length (entry);
|
||||
entry_text = gtk_entry_get_text (entry);
|
||||
entry_text = gtk_editable_get_text (GTK_EDITABLE (priv->entry));
|
||||
entry_length = g_utf8_strlen (entry_text, -1);
|
||||
|
||||
lc = localeconv ();
|
||||
|
||||
@ -1444,8 +1413,8 @@ gtk_spin_button_insert_text (GtkEditable *editable,
|
||||
}
|
||||
}
|
||||
|
||||
parent_editable_iface->insert_text (editable, new_text,
|
||||
new_text_length, position);
|
||||
gtk_editable_insert_text (GTK_EDITABLE (priv->entry),
|
||||
new_text, new_text_length, position);
|
||||
}
|
||||
|
||||
static void
|
||||
@ -1505,8 +1474,9 @@ gtk_spin_button_default_input (GtkSpinButton *spin_button,
|
||||
{
|
||||
GtkSpinButtonPrivate *priv = gtk_spin_button_get_instance_private (spin_button);
|
||||
gchar *err = NULL;
|
||||
const char *text = gtk_editable_get_text (GTK_EDITABLE (priv->entry));
|
||||
|
||||
*new_val = g_strtod (gtk_entry_get_text (GTK_ENTRY (priv->entry)), &err);
|
||||
*new_val = g_strtod (text, &err);
|
||||
if (*err)
|
||||
return GTK_INPUT_ERROR;
|
||||
else
|
||||
@ -1520,8 +1490,8 @@ gtk_spin_button_default_output (GtkSpinButton *spin_button)
|
||||
gchar *buf = gtk_spin_button_format_for_value (spin_button,
|
||||
gtk_adjustment_get_value (priv->adjustment));
|
||||
|
||||
if (strcmp (buf, gtk_entry_get_text (GTK_ENTRY (priv->entry))))
|
||||
gtk_entry_set_text (GTK_ENTRY (priv->entry), buf);
|
||||
if (strcmp (buf, gtk_editable_get_text (GTK_EDITABLE (priv->entry))))
|
||||
gtk_editable_set_text (GTK_EDITABLE (priv->entry), buf);
|
||||
|
||||
g_free (buf);
|
||||
}
|
||||
@ -2260,7 +2230,7 @@ gtk_spin_button_get_text (GtkSpinButton *spin_button)
|
||||
|
||||
g_return_val_if_fail (GTK_IS_SPIN_BUTTON (spin_button), NULL);
|
||||
|
||||
return gtk_entry_get_text (GTK_ENTRY (priv->entry));
|
||||
return gtk_editable_get_text (GTK_EDITABLE (priv->entry));
|
||||
}
|
||||
|
||||
/**
|
||||
@ -2279,9 +2249,7 @@ gtk_spin_button_set_text (GtkSpinButton *spin_button,
|
||||
|
||||
g_return_if_fail (GTK_IS_SPIN_BUTTON (spin_button));
|
||||
|
||||
gtk_entry_set_text (GTK_ENTRY (priv->entry), text);
|
||||
|
||||
g_object_notify_by_pspec (G_OBJECT (spin_button), spinbutton_props[PROP_TEXT]);
|
||||
gtk_editable_set_text (GTK_EDITABLE (priv->entry), text);
|
||||
}
|
||||
|
||||
/**
|
||||
@ -2303,7 +2271,7 @@ gtk_spin_button_get_max_width_chars (GtkSpinButton *spin_button)
|
||||
|
||||
g_return_val_if_fail (GTK_IS_SPIN_BUTTON (spin_button), -1);
|
||||
|
||||
return gtk_entry_get_max_width_chars (GTK_ENTRY (priv->entry));
|
||||
return gtk_editable_get_max_width_chars (GTK_EDITABLE (priv->entry));
|
||||
}
|
||||
|
||||
/**
|
||||
@ -2323,11 +2291,7 @@ gtk_spin_button_set_max_width_chars (GtkSpinButton *spin_button,
|
||||
|
||||
g_return_if_fail (GTK_IS_SPIN_BUTTON (spin_button));
|
||||
|
||||
if (max_width_chars != gtk_entry_get_max_width_chars (GTK_ENTRY (priv->entry)))
|
||||
{
|
||||
gtk_entry_set_max_width_chars (GTK_ENTRY (priv->entry), max_width_chars);
|
||||
g_object_notify_by_pspec (G_OBJECT (spin_button), spinbutton_props[PROP_MAX_WIDTH_CHARS]);
|
||||
}
|
||||
gtk_editable_set_max_width_chars (GTK_EDITABLE (priv->entry), max_width_chars);
|
||||
}
|
||||
|
||||
/**
|
||||
@ -2347,7 +2311,7 @@ gtk_spin_button_get_width_chars (GtkSpinButton *spin_button)
|
||||
|
||||
g_return_val_if_fail (GTK_IS_SPIN_BUTTON (spin_button), -1);
|
||||
|
||||
return gtk_entry_get_width_chars (GTK_ENTRY (priv->entry));
|
||||
return gtk_editable_get_width_chars (GTK_EDITABLE (priv->entry));
|
||||
}
|
||||
|
||||
/**
|
||||
@ -2366,9 +2330,5 @@ gtk_spin_button_set_width_chars (GtkSpinButton *spin_button,
|
||||
|
||||
g_return_if_fail (GTK_IS_SPIN_BUTTON (spin_button));
|
||||
|
||||
if (width_chars != gtk_entry_get_width_chars (GTK_ENTRY (priv->entry)))
|
||||
{
|
||||
gtk_entry_set_width_chars (GTK_ENTRY (priv->entry), width_chars);
|
||||
g_object_notify_by_pspec (G_OBJECT (spin_button), spinbutton_props[PROP_WIDTH_CHARS]);
|
||||
}
|
||||
gtk_editable_set_width_chars (GTK_EDITABLE (priv->entry), width_chars);
|
||||
}
|
||||
|
6710
gtk/gtktext.c
Normal file
6710
gtk/gtktext.c
Normal file
File diff suppressed because it is too large
Load Diff
223
gtk/gtktext.h
Normal file
223
gtk/gtktext.h
Normal file
@ -0,0 +1,223 @@
|
||||
/* GTK - The GIMP Toolkit
|
||||
* Copyright (C) 1995-1997 Peter Mattis, Spencer Kimball and Josh MacDonald
|
||||
*
|
||||
* Copyright (C) 2004-2006 Christian Hammond
|
||||
* Copyright (C) 2008 Cody Russell
|
||||
* Copyright (C) 2008 Red Hat, Inc.
|
||||
*
|
||||
* 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 2 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 <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
/*
|
||||
* Modified by the GTK+ Team and others 1997-2000. See the AUTHORS
|
||||
* file for a list of people on the GTK+ Team. See the ChangeLog
|
||||
* files for a list of changes. These files are distributed with
|
||||
* GTK+ at ftp://ftp.gtk.org/pub/gtk/.
|
||||
*/
|
||||
|
||||
#ifndef __GTK_TEXT_H__
|
||||
#define __GTK_TEXT_H__
|
||||
|
||||
|
||||
#if !defined (__GTK_H_INSIDE__) && !defined (GTK_COMPILATION)
|
||||
#error "Only <gtk/gtk.h> can be included directly."
|
||||
#endif
|
||||
|
||||
#include <gtk/gtkeditable.h>
|
||||
#include <gtk/gtkentrybuffer.h>
|
||||
|
||||
|
||||
G_BEGIN_DECLS
|
||||
|
||||
#define GTK_TYPE_TEXT (gtk_text_get_type ())
|
||||
#define GTK_TEXT(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), GTK_TYPE_TEXT, GtkText))
|
||||
#define GTK_TEXT_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), GTK_TYPE_TEXT, GtkTextClass))
|
||||
#define GTK_IS_TEXT(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GTK_TYPE_TEXT))
|
||||
#define GTK_IS_TEXT_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), GTK_TYPE_TEXT))
|
||||
#define GTK_TEXT_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), GTK_TYPE_TEXT, GtkTextClass))
|
||||
|
||||
typedef struct _GtkText GtkText;
|
||||
typedef struct _GtkTextClass GtkTextClass;
|
||||
|
||||
struct _GtkText
|
||||
{
|
||||
/*< private >*/
|
||||
GtkWidget parent_instance;
|
||||
};
|
||||
|
||||
/**
|
||||
* GtkTextClass:
|
||||
* @parent_class: The parent class.
|
||||
* @populate_popup: Class handler for the #GtkText::populate-popup signal. If
|
||||
* non-%NULL, this will be called to add additional entries to the context
|
||||
* menu when it is displayed.
|
||||
* @activate: Class handler for the #GtkText::activate signal. The default
|
||||
* implementation calls gtk_window_activate_default() on the entry’s top-level
|
||||
* window.
|
||||
* @move_cursor: Class handler for the #GtkText::move-cursor signal. The
|
||||
* default implementation specifies the standard #GtkText cursor movement
|
||||
* behavior.
|
||||
* @insert_at_cursor: Class handler for the #GtkText::insert-at-cursor signal.
|
||||
* The default implementation inserts text at the cursor.
|
||||
* @delete_from_cursor: Class handler for the #GtkText::delete-from-cursor
|
||||
* signal. The default implementation deletes the selection or the specified
|
||||
* number of characters or words.
|
||||
* @backspace: Class handler for the #GtkText::backspace signal. The default
|
||||
* implementation deletes the selection or a single character or word.
|
||||
* @cut_clipboard: Class handler for the #GtkText::cut-clipboard signal. The
|
||||
* default implementation cuts the selection, if one exists.
|
||||
* @copy_clipboard: Class handler for the #GtkText::copy-clipboard signal. The
|
||||
* default implementation copies the selection, if one exists.
|
||||
* @paste_clipboard: Class handler for the #GtkText::paste-clipboard signal.
|
||||
* The default implementation pastes at the current cursor position or over
|
||||
* the current selection if one exists.
|
||||
* @toggle_overwrite: Class handler for the #GtkText::toggle-overwrite signal.
|
||||
* The default implementation toggles overwrite mode and blinks the cursor.
|
||||
* @insert_emoji: Class handler for the #GtkText::insert-emoji signal.
|
||||
*
|
||||
* Class structure for #GtkText. All virtual functions have a default
|
||||
* implementation. Derived classes may set the virtual function pointers for the
|
||||
* signal handlers to %NULL, but must keep @get_text_area_size and
|
||||
* @get_frame_size non-%NULL; either use the default implementation, or provide
|
||||
* a custom one.
|
||||
*/
|
||||
struct _GtkTextClass
|
||||
{
|
||||
GtkWidgetClass parent_class;
|
||||
|
||||
/* Hook to customize right-click popup */
|
||||
void (* populate_popup) (GtkText *self,
|
||||
GtkWidget *popup);
|
||||
|
||||
/* Action signals
|
||||
*/
|
||||
void (* activate) (GtkText *self);
|
||||
void (* move_cursor) (GtkText *self,
|
||||
GtkMovementStep step,
|
||||
gint count,
|
||||
gboolean extend);
|
||||
void (* insert_at_cursor) (GtkText *self,
|
||||
const gchar *str);
|
||||
void (* delete_from_cursor) (GtkText *self,
|
||||
GtkDeleteType type,
|
||||
gint count);
|
||||
void (* backspace) (GtkText *self);
|
||||
void (* cut_clipboard) (GtkText *self);
|
||||
void (* copy_clipboard) (GtkText *self);
|
||||
void (* paste_clipboard) (GtkText *self);
|
||||
void (* toggle_overwrite) (GtkText *self);
|
||||
void (* insert_emoji) (GtkText *self);
|
||||
|
||||
/*< private >*/
|
||||
|
||||
/* Padding for future expansion */
|
||||
void (*_gtk_reserved1) (void);
|
||||
void (*_gtk_reserved2) (void);
|
||||
void (*_gtk_reserved3) (void);
|
||||
void (*_gtk_reserved4) (void);
|
||||
void (*_gtk_reserved5) (void);
|
||||
void (*_gtk_reserved6) (void);
|
||||
};
|
||||
|
||||
GDK_AVAILABLE_IN_ALL
|
||||
GType gtk_text_get_type (void) G_GNUC_CONST;
|
||||
|
||||
GDK_AVAILABLE_IN_ALL
|
||||
GtkWidget * gtk_text_new (void);
|
||||
GDK_AVAILABLE_IN_ALL
|
||||
GtkWidget * gtk_text_new_with_buffer (GtkEntryBuffer *buffer);
|
||||
|
||||
GDK_AVAILABLE_IN_ALL
|
||||
GtkEntryBuffer *gtk_text_get_buffer (GtkText *self);
|
||||
GDK_AVAILABLE_IN_ALL
|
||||
void gtk_text_set_buffer (GtkText *self,
|
||||
GtkEntryBuffer *buffer);
|
||||
|
||||
GDK_AVAILABLE_IN_ALL
|
||||
void gtk_text_set_visibility (GtkText *self,
|
||||
gboolean visible);
|
||||
GDK_AVAILABLE_IN_ALL
|
||||
gboolean gtk_text_get_visibility (GtkText *self);
|
||||
|
||||
GDK_AVAILABLE_IN_ALL
|
||||
void gtk_text_set_invisible_char (GtkText *self,
|
||||
gunichar ch);
|
||||
GDK_AVAILABLE_IN_ALL
|
||||
gunichar gtk_text_get_invisible_char (GtkText *self);
|
||||
GDK_AVAILABLE_IN_ALL
|
||||
void gtk_text_unset_invisible_char (GtkText *self);
|
||||
|
||||
GDK_AVAILABLE_IN_ALL
|
||||
void gtk_text_set_has_frame (GtkText *self,
|
||||
gboolean has_frame);
|
||||
GDK_AVAILABLE_IN_ALL
|
||||
gboolean gtk_text_get_has_frame (GtkText *self);
|
||||
|
||||
GDK_AVAILABLE_IN_ALL
|
||||
void gtk_text_set_overwrite_mode (GtkText *self,
|
||||
gboolean overwrite);
|
||||
GDK_AVAILABLE_IN_ALL
|
||||
gboolean gtk_text_get_overwrite_mode (GtkText *self);
|
||||
|
||||
GDK_AVAILABLE_IN_ALL
|
||||
void gtk_text_set_max_length (GtkText *self,
|
||||
int length);
|
||||
GDK_AVAILABLE_IN_ALL
|
||||
gint gtk_text_get_max_length (GtkText *self);
|
||||
GDK_AVAILABLE_IN_ALL
|
||||
guint16 gtk_text_get_text_length (GtkText *self);
|
||||
|
||||
GDK_AVAILABLE_IN_ALL
|
||||
void gtk_text_set_activates_default (GtkText *self,
|
||||
gboolean activates);
|
||||
GDK_AVAILABLE_IN_ALL
|
||||
gboolean gtk_text_get_activates_default (GtkText *self);
|
||||
|
||||
GDK_AVAILABLE_IN_ALL
|
||||
const char * gtk_text_get_placeholder_text (GtkText *self);
|
||||
GDK_AVAILABLE_IN_ALL
|
||||
void gtk_text_set_placeholder_text (GtkText *self,
|
||||
const char *text);
|
||||
|
||||
GDK_AVAILABLE_IN_ALL
|
||||
void gtk_text_set_input_purpose (GtkText *self,
|
||||
GtkInputPurpose purpose);
|
||||
GDK_AVAILABLE_IN_ALL
|
||||
GtkInputPurpose gtk_text_get_input_purpose (GtkText *self);
|
||||
|
||||
GDK_AVAILABLE_IN_ALL
|
||||
void gtk_text_set_input_hints (GtkText *self,
|
||||
GtkInputHints hints);
|
||||
GDK_AVAILABLE_IN_ALL
|
||||
GtkInputHints gtk_text_get_input_hints (GtkText *self);
|
||||
|
||||
GDK_AVAILABLE_IN_ALL
|
||||
void gtk_text_set_attributes (GtkText *self,
|
||||
PangoAttrList *attrs);
|
||||
GDK_AVAILABLE_IN_ALL
|
||||
PangoAttrList * gtk_text_get_attributes (GtkText *self);
|
||||
|
||||
GDK_AVAILABLE_IN_ALL
|
||||
void gtk_text_set_tabs (GtkText *self,
|
||||
PangoTabArray *tabs);
|
||||
|
||||
GDK_AVAILABLE_IN_ALL
|
||||
PangoTabArray * gtk_text_get_tabs (GtkText *self);
|
||||
|
||||
GDK_AVAILABLE_IN_ALL
|
||||
void gtk_text_grab_focus_without_selecting (GtkText *self);
|
||||
|
||||
G_END_DECLS
|
||||
|
||||
#endif /* __GTK_TEXT_H__ */
|
46
gtk/gtktextprivate.h
Normal file
46
gtk/gtktextprivate.h
Normal file
@ -0,0 +1,46 @@
|
||||
/* gtkentryprivate.h
|
||||
* Copyright (C) 2019 Red Hat, Inc.
|
||||
*
|
||||
* This library is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU Library General Public
|
||||
* License as published by the Free Software Foundation; either
|
||||
* version 2 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
|
||||
* Library General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Library General Public
|
||||
* License along with this library. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
#ifndef __GTK_TEXT_PRIVATE_H__
|
||||
#define __GTK_TEXT_PRIVATE_H__
|
||||
|
||||
#include "gtktext.h"
|
||||
|
||||
#include "gtkeventcontroller.h"
|
||||
#include "gtkimcontext.h"
|
||||
|
||||
G_BEGIN_DECLS
|
||||
|
||||
char * gtk_text_get_display_text (GtkText *entry,
|
||||
int start_pos,
|
||||
int end_pos);
|
||||
GtkIMContext * gtk_text_get_im_context (GtkText *entry);
|
||||
void gtk_text_enter_text (GtkText *entry,
|
||||
const char *text);
|
||||
void gtk_text_set_positions (GtkText *entry,
|
||||
int current_pos,
|
||||
int selection_bound);
|
||||
PangoLayout * gtk_text_get_layout (GtkText *entry);
|
||||
void gtk_text_get_layout_offsets (GtkText *entry,
|
||||
int *x,
|
||||
int *y);
|
||||
void gtk_text_reset_im_context (GtkText *entry);
|
||||
GtkEventController *gtk_text_get_key_controller (GtkText *entry);
|
||||
|
||||
G_END_DECLS
|
||||
|
||||
#endif /* __GTK_TEXT_PRIVATE_H__ */
|
@ -34,6 +34,7 @@
|
||||
#include "gtkdragdest.h"
|
||||
#include "gtkdragsource.h"
|
||||
#include "gtkentryprivate.h"
|
||||
#include "gtksearchentryprivate.h"
|
||||
#include "gtkeventcontrollerkey.h"
|
||||
#include "gtkeventcontrollermotion.h"
|
||||
#include "gtkeventcontrollerscroll.h"
|
||||
@ -46,6 +47,7 @@
|
||||
#include "gtkmain.h"
|
||||
#include "gtkmarshalers.h"
|
||||
#include "gtkprivate.h"
|
||||
#include "gtktext.h"
|
||||
#include "gtktreerbtreeprivate.h"
|
||||
#include "gtkrendericonprivate.h"
|
||||
#include "gtkscrollable.h"
|
||||
@ -799,10 +801,10 @@ static void gtk_tree_view_search_position_func (GtkTreeView *tree_
|
||||
static void gtk_tree_view_search_disable_popdown (GtkEntry *entry,
|
||||
GtkMenu *menu,
|
||||
gpointer data);
|
||||
static void gtk_tree_view_search_preedit_changed (GtkIMContext *im_context,
|
||||
static void gtk_tree_view_search_preedit_changed (GtkText *text,
|
||||
const char *preedit,
|
||||
GtkTreeView *tree_view);
|
||||
static void gtk_tree_view_search_commit (GtkIMContext *im_context,
|
||||
gchar *buf,
|
||||
static void gtk_tree_view_search_changed (GtkEditable *editable,
|
||||
GtkTreeView *tree_view);
|
||||
static void gtk_tree_view_search_activate (GtkEntry *entry,
|
||||
GtkTreeView *tree_view);
|
||||
@ -2110,10 +2112,17 @@ gtk_tree_view_destroy (GtkWidget *widget)
|
||||
|
||||
if (tree_view->priv->search_custom_entry_set)
|
||||
{
|
||||
GtkEventController *controller;
|
||||
|
||||
g_signal_handlers_disconnect_by_func (tree_view->priv->search_entry,
|
||||
G_CALLBACK (gtk_tree_view_search_init),
|
||||
tree_view);
|
||||
g_signal_handlers_disconnect_by_func (gtk_entry_get_key_controller (GTK_ENTRY (tree_view->priv->search_entry)),
|
||||
|
||||
if (GTK_IS_ENTRY (tree_view->priv->search_entry))
|
||||
controller = gtk_entry_get_key_controller (GTK_ENTRY (tree_view->priv->search_entry));
|
||||
else
|
||||
controller = gtk_search_entry_get_key_controller (GTK_SEARCH_ENTRY (tree_view->priv->search_entry));
|
||||
g_signal_handlers_disconnect_by_func (controller,
|
||||
G_CALLBACK (gtk_tree_view_search_key_pressed),
|
||||
tree_view);
|
||||
|
||||
@ -5383,7 +5392,7 @@ gtk_tree_view_key_controller_key_pressed (GtkEventControllerKey *key,
|
||||
}
|
||||
else
|
||||
{
|
||||
gtk_entry_set_text (GTK_ENTRY (tree_view->priv->search_entry), "");
|
||||
gtk_editable_set_text (GTK_EDITABLE (tree_view->priv->search_entry), "");
|
||||
return FALSE;
|
||||
}
|
||||
}
|
||||
@ -10239,23 +10248,15 @@ gtk_tree_view_ensure_interactive_directory (GtkTreeView *tree_view)
|
||||
gtk_container_add (GTK_CONTAINER (frame), vbox);
|
||||
|
||||
/* add entry */
|
||||
tree_view->priv->search_entry = gtk_entry_new ();
|
||||
gtk_widget_show (tree_view->priv->search_entry);
|
||||
tree_view->priv->search_entry = gtk_text_new ();
|
||||
g_signal_connect (tree_view->priv->search_entry, "populate-popup",
|
||||
G_CALLBACK (gtk_tree_view_search_disable_popdown),
|
||||
tree_view);
|
||||
g_signal_connect (tree_view->priv->search_entry,
|
||||
"activate", G_CALLBACK (gtk_tree_view_search_activate),
|
||||
tree_view);
|
||||
|
||||
g_signal_connect (_gtk_entry_get_im_context (GTK_ENTRY (tree_view->priv->search_entry)),
|
||||
"preedit-changed",
|
||||
G_CALLBACK (gtk_tree_view_search_preedit_changed),
|
||||
tree_view);
|
||||
g_signal_connect (_gtk_entry_get_im_context (GTK_ENTRY (tree_view->priv->search_entry)),
|
||||
"commit",
|
||||
G_CALLBACK (gtk_tree_view_search_commit),
|
||||
tree_view);
|
||||
G_CALLBACK (gtk_tree_view_search_disable_popdown), tree_view);
|
||||
g_signal_connect (tree_view->priv->search_entry, "activate",
|
||||
G_CALLBACK (gtk_tree_view_search_activate), tree_view);
|
||||
g_signal_connect (tree_view->priv->search_entry, "preedit-changed",
|
||||
G_CALLBACK (gtk_tree_view_search_preedit_changed), tree_view);
|
||||
g_signal_connect (tree_view->priv->search_entry, "changed",
|
||||
G_CALLBACK (gtk_tree_view_search_changed), tree_view);
|
||||
|
||||
gtk_container_add (GTK_CONTAINER (vbox),
|
||||
tree_view->priv->search_entry);
|
||||
@ -10317,13 +10318,16 @@ gtk_tree_view_real_start_interactive_search (GtkTreeView *tree_view,
|
||||
gtk_tree_view_ensure_interactive_directory (tree_view);
|
||||
|
||||
if (keybinding)
|
||||
gtk_entry_set_text (GTK_ENTRY (tree_view->priv->search_entry), "");
|
||||
gtk_editable_set_text (GTK_EDITABLE (tree_view->priv->search_entry), "");
|
||||
|
||||
/* done, show it */
|
||||
tree_view->priv->search_position_func (tree_view, tree_view->priv->search_window, tree_view->priv->search_position_user_data);
|
||||
|
||||
/* Grab focus without selecting all the text. */
|
||||
gtk_entry_grab_focus_without_selecting (GTK_ENTRY (tree_view->priv->search_entry));
|
||||
if (GTK_IS_ENTRY (tree_view->priv->search_entry))
|
||||
gtk_entry_grab_focus_without_selecting (GTK_ENTRY (tree_view->priv->search_entry));
|
||||
else
|
||||
gtk_widget_grab_focus (tree_view->priv->search_entry);
|
||||
|
||||
gtk_widget_show (tree_view->priv->search_window);
|
||||
if (tree_view->priv->search_entry_changed_id == 0)
|
||||
@ -13639,13 +13643,13 @@ gtk_tree_view_set_search_equal_func (GtkTreeView *tree_view,
|
||||
*
|
||||
* Returns: (transfer none): the entry currently in use as search entry.
|
||||
*/
|
||||
GtkEntry *
|
||||
GtkEditable *
|
||||
gtk_tree_view_get_search_entry (GtkTreeView *tree_view)
|
||||
{
|
||||
g_return_val_if_fail (GTK_IS_TREE_VIEW (tree_view), NULL);
|
||||
|
||||
if (tree_view->priv->search_custom_entry_set)
|
||||
return GTK_ENTRY (tree_view->priv->search_entry);
|
||||
return GTK_EDITABLE (tree_view->priv->search_entry);
|
||||
|
||||
return NULL;
|
||||
}
|
||||
@ -13663,10 +13667,10 @@ gtk_tree_view_get_search_entry (GtkTreeView *tree_view)
|
||||
*/
|
||||
void
|
||||
gtk_tree_view_set_search_entry (GtkTreeView *tree_view,
|
||||
GtkEntry *entry)
|
||||
GtkEditable *entry)
|
||||
{
|
||||
g_return_if_fail (GTK_IS_TREE_VIEW (tree_view));
|
||||
g_return_if_fail (entry == NULL || GTK_IS_ENTRY (entry));
|
||||
g_return_if_fail (entry == NULL || GTK_IS_ENTRY (entry) || GTK_IS_SEARCH_ENTRY (entry));
|
||||
|
||||
if (tree_view->priv->search_custom_entry_set)
|
||||
{
|
||||
@ -13690,6 +13694,8 @@ gtk_tree_view_set_search_entry (GtkTreeView *tree_view,
|
||||
|
||||
if (entry)
|
||||
{
|
||||
GtkEventController *controller;
|
||||
|
||||
tree_view->priv->search_entry = GTK_WIDGET (g_object_ref (entry));
|
||||
tree_view->priv->search_custom_entry_set = TRUE;
|
||||
|
||||
@ -13701,10 +13707,12 @@ gtk_tree_view_set_search_entry (GtkTreeView *tree_view,
|
||||
tree_view);
|
||||
}
|
||||
|
||||
g_signal_connect (gtk_entry_get_key_controller (GTK_ENTRY (tree_view->priv->search_entry)),
|
||||
"key-pressed",
|
||||
G_CALLBACK (gtk_tree_view_search_key_pressed),
|
||||
tree_view);
|
||||
if (GTK_IS_ENTRY (entry))
|
||||
controller = gtk_entry_get_key_controller (GTK_ENTRY (entry));
|
||||
else
|
||||
controller = gtk_search_entry_get_key_controller (GTK_SEARCH_ENTRY (entry));
|
||||
g_signal_connect (controller, "key-pressed",
|
||||
G_CALLBACK (gtk_tree_view_search_key_pressed), tree_view);
|
||||
|
||||
gtk_tree_view_search_init (tree_view->priv->search_entry, tree_view);
|
||||
}
|
||||
@ -13846,7 +13854,8 @@ gtk_tree_view_search_disable_popdown (GtkEntry *entry,
|
||||
* callback.
|
||||
*/
|
||||
static void
|
||||
gtk_tree_view_search_preedit_changed (GtkIMContext *im_context,
|
||||
gtk_tree_view_search_preedit_changed (GtkText *text,
|
||||
const char *predit,
|
||||
GtkTreeView *tree_view)
|
||||
{
|
||||
tree_view->priv->imcontext_changed = 1;
|
||||
@ -13863,9 +13872,8 @@ gtk_tree_view_search_preedit_changed (GtkIMContext *im_context,
|
||||
}
|
||||
|
||||
static void
|
||||
gtk_tree_view_search_commit (GtkIMContext *im_context,
|
||||
gchar *buf,
|
||||
GtkTreeView *tree_view)
|
||||
gtk_tree_view_search_changed (GtkEditable *editable,
|
||||
GtkTreeView *tree_view)
|
||||
{
|
||||
tree_view->priv->imcontext_changed = 1;
|
||||
}
|
||||
@ -14273,10 +14281,9 @@ gtk_tree_view_search_init (GtkWidget *entry,
|
||||
GtkTreeModel *model;
|
||||
GtkTreeSelection *selection;
|
||||
|
||||
g_return_if_fail (GTK_IS_ENTRY (entry));
|
||||
g_return_if_fail (GTK_IS_TREE_VIEW (tree_view));
|
||||
|
||||
text = gtk_entry_get_text (GTK_ENTRY (entry));
|
||||
text = gtk_editable_get_text (GTK_EDITABLE (entry));
|
||||
|
||||
model = gtk_tree_view_get_model (tree_view);
|
||||
selection = gtk_tree_view_get_selection (tree_view);
|
||||
|
@ -433,10 +433,10 @@ void gtk_tree_view_set_search_equal_func (GtkTreeView
|
||||
GDestroyNotify search_destroy);
|
||||
|
||||
GDK_AVAILABLE_IN_ALL
|
||||
GtkEntry *gtk_tree_view_get_search_entry (GtkTreeView *tree_view);
|
||||
GtkEditable *gtk_tree_view_get_search_entry (GtkTreeView *tree_view);
|
||||
GDK_AVAILABLE_IN_ALL
|
||||
void gtk_tree_view_set_search_entry (GtkTreeView *tree_view,
|
||||
GtkEntry *entry);
|
||||
GtkEditable *entry);
|
||||
GDK_AVAILABLE_IN_ALL
|
||||
GtkTreeViewSearchPositionFunc gtk_tree_view_get_search_position_func (GtkTreeView *tree_view);
|
||||
GDK_AVAILABLE_IN_ALL
|
||||
|
@ -916,7 +916,7 @@ search (GtkInspectorObjectTree *wt,
|
||||
guint i, selected, n, row;
|
||||
const char *text;
|
||||
|
||||
text = gtk_entry_get_text (GTK_ENTRY (priv->search_entry));
|
||||
text = gtk_editable_get_text (GTK_EDITABLE (priv->search_entry));
|
||||
if (gtk_list_box_get_selected_row (priv->list))
|
||||
{
|
||||
selected = gtk_list_box_row_get_index (gtk_list_box_get_selected_row (priv->list));
|
||||
@ -998,7 +998,7 @@ static void
|
||||
stop_search (GtkWidget *entry,
|
||||
GtkInspectorObjectTree *wt)
|
||||
{
|
||||
gtk_entry_set_text (GTK_ENTRY (wt->priv->search_entry), "");
|
||||
gtk_editable_set_text (GTK_EDITABLE (wt->priv->search_entry), "");
|
||||
gtk_search_bar_set_search_mode (GTK_SEARCH_BAR (wt->priv->search_bar), FALSE);
|
||||
}
|
||||
|
||||
@ -1155,7 +1155,7 @@ gtk_inspector_object_tree_init (GtkInspectorObjectTree *wt)
|
||||
gtk_widget_init_template (GTK_WIDGET (wt));
|
||||
|
||||
gtk_search_bar_connect_entry (GTK_SEARCH_BAR (wt->priv->search_bar),
|
||||
GTK_ENTRY (wt->priv->search_entry));
|
||||
GTK_EDITABLE (wt->priv->search_entry));
|
||||
|
||||
root_model = create_root_model ();
|
||||
wt->priv->tree_model = gtk_tree_list_model_new (FALSE,
|
||||
|
@ -79,7 +79,7 @@ static void
|
||||
search_close_clicked (GtkWidget *button,
|
||||
GtkInspectorPropList *pl)
|
||||
{
|
||||
gtk_entry_set_text (GTK_ENTRY (pl->priv->search_entry), "");
|
||||
gtk_editable_set_text (GTK_EDITABLE (pl->priv->search_entry), "");
|
||||
gtk_stack_set_visible_child_name (GTK_STACK (pl->priv->search_stack), "title");
|
||||
}
|
||||
|
||||
@ -275,7 +275,7 @@ constructed (GObject *object)
|
||||
pl->priv->search_stack = gtk_widget_get_parent (pl->priv->search_entry);
|
||||
|
||||
gtk_tree_view_set_search_entry (GTK_TREE_VIEW (pl->priv->tree),
|
||||
GTK_ENTRY (pl->priv->search_entry));
|
||||
GTK_EDITABLE (pl->priv->search_entry));
|
||||
|
||||
g_signal_connect (pl->priv->search_entry, "stop-search",
|
||||
G_CALLBACK (search_close_clicked), pl);
|
||||
@ -525,7 +525,7 @@ gtk_inspector_prop_list_set_object (GtkInspectorPropList *pl,
|
||||
|
||||
cleanup_object (pl);
|
||||
|
||||
gtk_entry_set_text (GTK_ENTRY (pl->priv->search_entry), "");
|
||||
gtk_editable_set_text (GTK_EDITABLE (pl->priv->search_entry), "");
|
||||
gtk_stack_set_visible_child_name (GTK_STACK (pl->priv->search_stack), "title");
|
||||
|
||||
if (pl->priv->child_properties)
|
||||
|
@ -548,7 +548,7 @@ match_row (GtkTreeModel *model,
|
||||
const gchar *text;
|
||||
gboolean match;
|
||||
|
||||
text = gtk_entry_get_text (GTK_ENTRY (sl->priv->search_entry));
|
||||
text = gtk_editable_get_text (GTK_EDITABLE (sl->priv->search_entry));
|
||||
gtk_tree_model_get (model, iter,
|
||||
COLUMN_NAME, &name,
|
||||
COLUMN_PATH, &path,
|
||||
@ -622,7 +622,7 @@ gtk_inspector_resource_list_init (GtkInspectorResourceList *sl)
|
||||
g_signal_connect (sl, "map", G_CALLBACK (on_map), NULL);
|
||||
|
||||
gtk_search_bar_connect_entry (GTK_SEARCH_BAR (sl->priv->search_bar),
|
||||
GTK_ENTRY (sl->priv->search_entry));
|
||||
GTK_EDITABLE (sl->priv->search_entry));
|
||||
|
||||
g_signal_connect (sl->priv->search_bar, "notify::search-mode-enabled",
|
||||
G_CALLBACK (search_mode_changed), sl);
|
||||
|
@ -374,7 +374,7 @@ gtk_inspector_statistics_init (GtkInspectorStatistics *sl)
|
||||
GINT_TO_POINTER (COLUMN_CUMULATIVE2), NULL);
|
||||
sl->priv->counts = g_hash_table_new_full (NULL, NULL, NULL, type_data_free);
|
||||
|
||||
gtk_tree_view_set_search_entry (sl->priv->view, GTK_ENTRY (sl->priv->search_entry));
|
||||
gtk_tree_view_set_search_entry (sl->priv->view, GTK_EDITABLE (sl->priv->search_entry));
|
||||
gtk_tree_view_set_search_equal_func (sl->priv->view, match_row, sl, NULL);
|
||||
g_signal_connect (sl, "hierarchy-changed", G_CALLBACK (hierarchy_changed), NULL);
|
||||
}
|
||||
|
@ -293,6 +293,7 @@ gtk_public_sources = files([
|
||||
'gtkpagesetup.c',
|
||||
'gtkpaned.c',
|
||||
'gtkpapersize.c',
|
||||
'gtkpasswordentry.c',
|
||||
'gtkpicture.c',
|
||||
'gtkpopover.c',
|
||||
'gtkpopovermenu.c',
|
||||
@ -352,6 +353,7 @@ gtk_public_sources = files([
|
||||
'gtkstyleprovider.c',
|
||||
'gtkswitch.c',
|
||||
'gtktestutils.c',
|
||||
'gtktext.c',
|
||||
'gtktextattributes.c',
|
||||
'gtktextbuffer.c',
|
||||
'gtktextchild.c',
|
||||
@ -537,6 +539,7 @@ gtk_public_headers = files([
|
||||
'gtkpagesetup.h',
|
||||
'gtkpaned.h',
|
||||
'gtkpapersize.h',
|
||||
'gtkpasswordentry.h',
|
||||
'gtkpicture.h',
|
||||
'gtkpopover.h',
|
||||
'gtkpopovermenu.h',
|
||||
@ -588,6 +591,7 @@ gtk_public_headers = files([
|
||||
'gtkstyleprovider.h',
|
||||
'gtkswitch.h',
|
||||
'gtktestutils.h',
|
||||
'gtktext.h',
|
||||
'gtktextbuffer.h',
|
||||
'gtktextchild.h',
|
||||
'gtktextiter.h',
|
||||
|
@ -36,14 +36,8 @@
|
||||
<property name="column-spacing">6</property>
|
||||
<child>
|
||||
<object class="GtkSearchEntry" id="search_entry">
|
||||
<property name="can-focus">1</property>
|
||||
<property name="hexpand">1</property>
|
||||
<property name="activates-default">1</property>
|
||||
<property name="primary-icon-name">edit-find-symbolic</property>
|
||||
<property name="primary-icon-activatable">0</property>
|
||||
<property name="secondary-icon-activatable">0</property>
|
||||
<property name="primary-icon-sensitive">0</property>
|
||||
<property name="secondary-icon-sensitive">0</property>
|
||||
<property name="placeholder-text" translatable="yes">Search font name</property>
|
||||
<signal name="search-changed" handler="text_changed_cb" swapped="no"/>
|
||||
<signal name="stop-search" handler="stop_search_cb" swapped="no"/>
|
||||
|
@ -241,22 +241,9 @@ main (int argc, char **argv)
|
||||
gtk_widget_set_halign (label, GTK_ALIGN_START);
|
||||
gtk_widget_set_valign (label, GTK_ALIGN_CENTER);
|
||||
|
||||
entry = gtk_entry_new ();
|
||||
entry = gtk_password_entry_new ();
|
||||
gtk_widget_set_hexpand (entry, TRUE);
|
||||
gtk_grid_attach (GTK_GRID (grid), entry, 1, 3, 1, 1);
|
||||
gtk_entry_set_visibility (GTK_ENTRY (entry), FALSE);
|
||||
|
||||
gtk_entry_set_icon_from_icon_name (GTK_ENTRY (entry),
|
||||
GTK_ENTRY_ICON_PRIMARY,
|
||||
"dialog-password-symbolic");
|
||||
|
||||
gtk_entry_set_icon_activatable (GTK_ENTRY (entry),
|
||||
GTK_ENTRY_ICON_PRIMARY,
|
||||
FALSE);
|
||||
|
||||
gtk_entry_set_icon_tooltip_text (GTK_ENTRY (entry),
|
||||
GTK_ENTRY_ICON_PRIMARY,
|
||||
"The password is hidden for security");
|
||||
|
||||
/* Name - Does not set any icons. */
|
||||
label = gtk_label_new ("Name:");
|
||||
|
@ -87,7 +87,7 @@ switch_search_method (GtkWidget *button,
|
||||
if (!gtk_tree_view_get_search_entry (GTK_TREE_VIEW (tree_view)))
|
||||
{
|
||||
gpointer data = g_object_get_data (tree_view, "my-search-entry");
|
||||
gtk_tree_view_set_search_entry (GTK_TREE_VIEW (tree_view), GTK_ENTRY (data));
|
||||
gtk_tree_view_set_search_entry (GTK_TREE_VIEW (tree_view), GTK_EDITABLE (data));
|
||||
}
|
||||
else
|
||||
gtk_tree_view_set_search_entry (GTK_TREE_VIEW (tree_view), NULL);
|
||||
@ -145,7 +145,7 @@ main (int argc, char *argv[])
|
||||
*/
|
||||
tree_view = gtk_tree_view_new_with_model (GTK_TREE_MODEL (model));
|
||||
|
||||
gtk_tree_view_set_search_entry (GTK_TREE_VIEW (tree_view), GTK_ENTRY (entry));
|
||||
gtk_tree_view_set_search_entry (GTK_TREE_VIEW (tree_view), GTK_EDITABLE (entry));
|
||||
g_object_set_data (G_OBJECT (tree_view), "my-search-entry", entry);
|
||||
g_signal_connect (button, "clicked",
|
||||
G_CALLBACK (switch_search_method), tree_view);
|
||||
|
@ -60,8 +60,7 @@ window1
|
||||
<AtkText>
|
||||
text: FancyPants
|
||||
character count: 10
|
||||
caret offset: 10
|
||||
selection 0: (0, 10) FancyPants
|
||||
caret offset: 0
|
||||
default attributes: bg-color: <omitted>
|
||||
bg-full-height: 0
|
||||
direction: <omitted>
|
||||
@ -365,7 +364,7 @@ See the GNU General Public License, version 3 or later for details.
|
||||
"filler"
|
||||
parent: headerbar1
|
||||
index: 0
|
||||
state: enabled horizontal sensitive
|
||||
state: enabled horizontal sensitive showing visible
|
||||
toolkit: gtk
|
||||
<AtkComponent>
|
||||
layer: widget
|
||||
@ -375,7 +374,7 @@ See the GNU General Public License, version 3 or later for details.
|
||||
parent: stack_switcher
|
||||
index: 0
|
||||
name: About
|
||||
state: checked enabled focusable sensitive visible
|
||||
state: checked enabled focusable sensitive showing visible
|
||||
toolkit: gtk
|
||||
<AtkComponent>
|
||||
layer: widget
|
||||
@ -391,7 +390,7 @@ See the GNU General Public License, version 3 or later for details.
|
||||
parent: stack_switcher
|
||||
index: 1
|
||||
name: Credits
|
||||
state: enabled focusable sensitive
|
||||
state: enabled focusable sensitive showing visible
|
||||
toolkit: gtk
|
||||
<AtkComponent>
|
||||
layer: widget
|
||||
@ -423,7 +422,7 @@ See the GNU General Public License, version 3 or later for details.
|
||||
parent: stack_switcher
|
||||
index: 3
|
||||
name: System
|
||||
state: enabled focusable sensitive
|
||||
state: enabled focusable sensitive showing visible
|
||||
toolkit: gtk
|
||||
<AtkComponent>
|
||||
layer: widget
|
||||
|
@ -109,7 +109,7 @@ window1
|
||||
"text"
|
||||
parent: combo2
|
||||
index: 1
|
||||
state: editable enabled focusable sensitive showing single-line visible
|
||||
state: editable enabled sensitive showing single-line visible
|
||||
toolkit: gtk
|
||||
<AtkComponent>
|
||||
layer: widget
|
||||
@ -196,7 +196,7 @@ window1
|
||||
"text"
|
||||
parent: combo4
|
||||
index: 1
|
||||
state: editable enabled focusable sensitive showing single-line visible
|
||||
state: editable enabled sensitive showing single-line visible
|
||||
toolkit: gtk
|
||||
<AtkComponent>
|
||||
layer: widget
|
||||
|
@ -144,7 +144,7 @@ window1
|
||||
parent: box1
|
||||
index: 3
|
||||
labelled-by: label1
|
||||
state: editable enabled focusable sensitive showing single-line visible
|
||||
state: editable enabled sensitive showing single-line visible
|
||||
toolkit: gtk
|
||||
<AtkComponent>
|
||||
layer: widget
|
||||
@ -188,7 +188,7 @@ window1
|
||||
parent: box1
|
||||
index: 4
|
||||
labelled-by: label2
|
||||
state: editable enabled focusable sensitive showing single-line visible
|
||||
state: editable enabled sensitive showing single-line visible
|
||||
toolkit: gtk
|
||||
<AtkComponent>
|
||||
layer: widget
|
||||
@ -230,7 +230,7 @@ window1
|
||||
"text"
|
||||
parent: box1
|
||||
index: 5
|
||||
state: editable enabled focusable sensitive showing single-line visible
|
||||
state: editable enabled sensitive showing single-line visible
|
||||
toolkit: gtk
|
||||
<AtkComponent>
|
||||
layer: widget
|
||||
|
@ -62,7 +62,7 @@ window1
|
||||
parent: box1
|
||||
index: 1
|
||||
labelled-by: label1
|
||||
state: editable enabled focusable sensitive showing single-line visible
|
||||
state: editable enabled sensitive showing single-line visible
|
||||
toolkit: gtk
|
||||
<AtkComponent>
|
||||
layer: widget
|
||||
|
@ -22,7 +22,6 @@ window1
|
||||
index: 0
|
||||
state: editable enabled focusable sensitive showing single-line visible
|
||||
toolkit: gtk
|
||||
placeholder-text: Subject or Addresses contain
|
||||
<AtkComponent>
|
||||
layer: widget
|
||||
alpha: 1
|
||||
@ -64,7 +63,6 @@ window1
|
||||
index: 1
|
||||
state: editable enabled focusable sensitive showing single-line visible
|
||||
toolkit: gtk
|
||||
placeholder-text: Message contains
|
||||
<AtkComponent>
|
||||
layer: widget
|
||||
alpha: 1
|
||||
@ -106,7 +104,6 @@ window1
|
||||
index: 2
|
||||
state: editable enabled focusable sensitive showing single-line visible
|
||||
toolkit: gtk
|
||||
placeholder-text: Body contains
|
||||
<AtkComponent>
|
||||
layer: widget
|
||||
alpha: 1
|
||||
|
@ -27,8 +27,8 @@ set_text (GtkWidget *widget,
|
||||
{
|
||||
if (GTK_IS_LABEL (widget))
|
||||
gtk_label_set_text (GTK_LABEL (widget), text);
|
||||
else if (GTK_IS_ENTRY (widget))
|
||||
gtk_entry_set_text (GTK_ENTRY (widget), text);
|
||||
else if (GTK_IS_EDITABLE (widget))
|
||||
gtk_editable_set_text (GTK_EDITABLE (widget), text);
|
||||
else if (GTK_IS_TEXT_VIEW (widget))
|
||||
gtk_text_buffer_set_text (gtk_text_view_get_buffer (GTK_TEXT_VIEW (widget)), text, -1);
|
||||
else
|
||||
@ -47,12 +47,12 @@ append_text (GtkWidget *widget,
|
||||
gtk_label_set_text (GTK_LABEL (widget), tmp);
|
||||
g_free (tmp);
|
||||
}
|
||||
else if (GTK_IS_ENTRY (widget))
|
||||
else if (GTK_IS_EDITABLE (widget))
|
||||
{
|
||||
gchar *tmp;
|
||||
|
||||
tmp = g_strconcat (gtk_entry_get_text (GTK_ENTRY (widget)), text, NULL);
|
||||
gtk_entry_set_text (GTK_ENTRY (widget), tmp);
|
||||
tmp = g_strconcat (gtk_editable_get_text (GTK_EDITABLE (widget)), text, NULL);
|
||||
gtk_editable_set_text (GTK_EDITABLE (widget), tmp);
|
||||
g_free (tmp);
|
||||
}
|
||||
else if (GTK_IS_TEXT_VIEW (widget))
|
||||
@ -134,7 +134,7 @@ test_text_changed (GtkWidget *widget)
|
||||
SignalData insert_data;
|
||||
gboolean cant_append = FALSE;
|
||||
|
||||
if (GTK_IS_LABEL (widget) || GTK_IS_ENTRY (widget))
|
||||
if (GTK_IS_LABEL (widget) || GTK_IS_TEXT (widget))
|
||||
cant_append = TRUE;
|
||||
|
||||
atk_text = ATK_TEXT (gtk_widget_get_accessible (widget));
|
||||
@ -874,9 +874,9 @@ test_words (GtkWidget *widget)
|
||||
|
||||
for (i = 0; expected[i].offset != -1; i++)
|
||||
{
|
||||
if (GTK_IS_ENTRY (widget))
|
||||
if (GTK_IS_TEXT (widget))
|
||||
{
|
||||
/* GtkEntry sets single-paragraph mode on its pango layout */
|
||||
/* GtkText sets single-paragraph mode on its pango layout */
|
||||
if (expected[i].boundary == ATK_TEXT_BOUNDARY_LINE_START ||
|
||||
expected[i].boundary == ATK_TEXT_BOUNDARY_LINE_END)
|
||||
continue;
|
||||
@ -1094,7 +1094,7 @@ main (int argc, char *argv[])
|
||||
g_test_add_func ("/text/bold/GtkLabel", test_bold_label);
|
||||
|
||||
add_text_tests (gtk_label_new (""));
|
||||
add_text_tests (gtk_entry_new ());
|
||||
add_text_tests (gtk_text_new ());
|
||||
add_text_tests (gtk_text_view_new ());
|
||||
|
||||
return g_test_run ();
|
||||
|
@ -21,8 +21,9 @@
|
||||
combobox:dir(ltr)
|
||||
box.linked.horizontal:dir(ltr)
|
||||
entry.combo:dir(ltr)
|
||||
undershoot.left:dir(ltr)
|
||||
undershoot.right:dir(ltr)
|
||||
text.flat:dir(ltr)
|
||||
undershoot.left:dir(ltr)
|
||||
undershoot.right:dir(ltr)
|
||||
button.combo:dir(ltr)
|
||||
box.horizontal:dir(ltr)
|
||||
arrow:dir(ltr)
|
||||
|
@ -5,22 +5,25 @@
|
||||
label:dir(ltr)
|
||||
label:dir(ltr)
|
||||
entry:dir(ltr)
|
||||
undershoot.left:dir(ltr)
|
||||
undershoot.right:dir(ltr)
|
||||
text.flat:dir(ltr)
|
||||
undershoot.left:dir(ltr)
|
||||
undershoot.right:dir(ltr)
|
||||
progress.horizontal:dir(ltr)
|
||||
trough:dir(ltr)
|
||||
progress.left:dir(ltr)
|
||||
entry:dir(ltr)
|
||||
undershoot.left:dir(ltr)
|
||||
undershoot.right:dir(ltr)
|
||||
text.flat:dir(ltr)
|
||||
undershoot.left:dir(ltr)
|
||||
undershoot.right:dir(ltr)
|
||||
entry:dir(ltr)
|
||||
image.left:dir(ltr)
|
||||
undershoot.left:dir(ltr)
|
||||
undershoot.right:dir(ltr)
|
||||
text.flat:dir(ltr)
|
||||
undershoot.left:dir(ltr)
|
||||
undershoot.right:dir(ltr)
|
||||
image.right:dir(ltr)
|
||||
spinbutton.horizontal:dir(ltr)
|
||||
box.horizontal:dir(ltr)
|
||||
entry:dir(ltr)
|
||||
text.flat:dir(ltr)
|
||||
undershoot.left:dir(ltr)
|
||||
undershoot.right:dir(ltr)
|
||||
button.image-button.down:dir(ltr)
|
||||
|
@ -228,12 +228,19 @@ G_GNUC_BEGIN_IGNORE_DEPRECATIONS
|
||||
|
||||
G_GNUC_END_IGNORE_DEPRECATIONS
|
||||
|
||||
/* Default invisible char is determined at runtime */
|
||||
/* Default invisible char is determined at runtime,
|
||||
* and buffer gets created on-demand
|
||||
*/
|
||||
if (g_type_is_a (type, GTK_TYPE_ENTRY) &&
|
||||
(strcmp (pspec->name, "invisible-char") == 0 ||
|
||||
strcmp (pspec->name, "buffer") == 0))
|
||||
continue;
|
||||
|
||||
if (g_type_is_a (type, GTK_TYPE_TEXT) &&
|
||||
(strcmp (pspec->name, "invisible-char") == 0 ||
|
||||
strcmp (pspec->name, "buffer") == 0))
|
||||
continue;
|
||||
|
||||
G_GNUC_BEGIN_IGNORE_DEPRECATIONS
|
||||
|
||||
if (g_type_is_a (type, GTK_TYPE_ENTRY_COMPLETION) &&
|
||||
|
@ -12,10 +12,10 @@ test_window_focus (void)
|
||||
box = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 0);
|
||||
gtk_container_add (GTK_CONTAINER (window), box);
|
||||
gtk_container_add (GTK_CONTAINER (box), gtk_label_new ("label1"));
|
||||
entry1 = gtk_entry_new ();
|
||||
entry1 = gtk_text_new ();
|
||||
gtk_container_add (GTK_CONTAINER (box), entry1);
|
||||
gtk_container_add (GTK_CONTAINER (box), gtk_label_new ("label2"));
|
||||
entry2 = gtk_entry_new ();
|
||||
entry2 = gtk_text_new ();
|
||||
gtk_container_add (GTK_CONTAINER (box), entry2);
|
||||
|
||||
g_assert_null (gtk_window_get_focus (GTK_WINDOW (window)));
|
||||
|
Loading…
Reference in New Issue
Block a user