mirror of
https://gitlab.com/freepascal.org/lazarus/lazarus.git
synced 2025-06-03 18:18:15 +02:00
Gtk2: fixed wrong selStart result after pasting data into GtkEntry. issue #7243
git-svn-id: trunk@35982 -
This commit is contained in:
parent
f2155a0f4b
commit
3fcf97aadc
@ -396,6 +396,21 @@ begin
|
|||||||
DeliverMessage(Data, Mess);
|
DeliverMessage(Data, Mess);
|
||||||
end;
|
end;
|
||||||
|
|
||||||
|
function GtkEntryDelayCursorPos(AGtkWidget: Pointer): GBoolean; cdecl;
|
||||||
|
var
|
||||||
|
Info: PWidgetInfo;
|
||||||
|
begin
|
||||||
|
Result := AGtkWidget <> nil;
|
||||||
|
if AGtkWidget <> nil then
|
||||||
|
begin
|
||||||
|
g_idle_remove_by_data(AGtkWidget);
|
||||||
|
Info := GetWidgetInfo(AGtkWidget);
|
||||||
|
if Info <> nil then
|
||||||
|
gtkchanged_editbox(PGtkWidget(AGtkWidget),
|
||||||
|
Info^.LCLObject);
|
||||||
|
end;
|
||||||
|
end;
|
||||||
|
|
||||||
function gtkchanged_editbox( widget: PGtkWidget; data: gPointer) : GBoolean; cdecl;
|
function gtkchanged_editbox( widget: PGtkWidget; data: gPointer) : GBoolean; cdecl;
|
||||||
var
|
var
|
||||||
Mess : TLMessage;
|
Mess : TLMessage;
|
||||||
@ -422,13 +437,31 @@ begin
|
|||||||
Info := GetWidgetInfo(Widget, False);
|
Info := GetWidgetInfo(Widget, False);
|
||||||
{do not update position if backspace or delete pressed}
|
{do not update position if backspace or delete pressed}
|
||||||
if wwiInvalidEvent in Info^.Flags then
|
if wwiInvalidEvent in Info^.Flags then
|
||||||
exclude(Info^.Flags, wwiInvalidEvent)
|
begin
|
||||||
else
|
Exclude(Info^.Flags, wwiInvalidEvent);
|
||||||
|
|
||||||
|
{take care of pasted data since it does not return proper cursor pos.}
|
||||||
|
// issue #7243
|
||||||
|
if g_object_get_data(PGObject(Widget),'lcl-delay-cm_textchaged') <> nil then
|
||||||
|
begin
|
||||||
|
g_object_set_data(PGObject(Widget),'lcl-delay-cm_textchaged',nil);
|
||||||
|
g_object_set_data(PGObject(Widget),'lcl-gtkentry-pasted-data',Widget);
|
||||||
|
g_idle_add(@GtkEntryDelayCursorPos, Widget);
|
||||||
|
exit;
|
||||||
|
end;
|
||||||
|
end else
|
||||||
begin
|
begin
|
||||||
// if we change selstart in OnChange event new cursor pos need to
|
// if we change selstart in OnChange event new cursor pos need to
|
||||||
// be postponed in TGtk2WSCustomEdit.SetSelStart
|
// be postponed in TGtk2WSCustomEdit.SetSelStart
|
||||||
NeedCursorCheck := True;
|
if g_object_get_data(PGObject(Widget),'lcl-gtkentry-pasted-data') <> nil then
|
||||||
gtk_editable_set_position(PGtkEditable(Widget), GStart+1);
|
begin
|
||||||
|
g_object_set_data(PGObject(Widget),'lcl-gtkentry-pasted-data',nil);
|
||||||
|
gtk_editable_set_position(PGtkEditable(Widget), GStart);
|
||||||
|
end else
|
||||||
|
begin
|
||||||
|
NeedCursorCheck := True;
|
||||||
|
gtk_editable_set_position(PGtkEditable(Widget), GStart+1);
|
||||||
|
end;
|
||||||
end;
|
end;
|
||||||
end;
|
end;
|
||||||
end;
|
end;
|
||||||
@ -2571,13 +2604,14 @@ var
|
|||||||
begin
|
begin
|
||||||
EventTrace('Paste from clip', data);
|
EventTrace('Paste from clip', data);
|
||||||
if (Widget=nil) then ;
|
if (Widget=nil) then ;
|
||||||
if (gtk_major_version = 2) and (gtk_minor_version < 17) then
|
|
||||||
|
// we must update cursor pos with delay otherwise selStart is wrong.issue #7243
|
||||||
|
if (Widget <> nil) and (GTK_IS_ENTRY(Widget)) then
|
||||||
begin
|
begin
|
||||||
if (Widget <> nil) and (GTK_IS_ENTRY(Widget)) then
|
Info := GetWidgetInfo(Widget, False);
|
||||||
begin
|
Include(Info^.Flags, wwiInvalidEvent);
|
||||||
Info := GetWidgetInfo(Widget, False);
|
// happy end is inside gtkchanged_editbox() above.
|
||||||
include(Info^.Flags, wwiInvalidEvent);
|
g_object_set_data(PGObject(Widget),'lcl-delay-cm_textchaged', data);
|
||||||
end;
|
|
||||||
end;
|
end;
|
||||||
Mess.msg := LM_PASTE;
|
Mess.msg := LM_PASTE;
|
||||||
Result:= DeliverMessage(Data, Mess) = 0;
|
Result:= DeliverMessage(Data, Mess) = 0;
|
||||||
|
Loading…
Reference in New Issue
Block a user