Crashes on clipboard operations http://mantis.freepascal.org/view.php?id=12396 --- lcl/interfaces/gtk/gtkwidgetset.inc +++ lcl/interfaces/gtk/gtkwidgetset.inc @@ -5055,11 +5055,16 @@ while (CurSelList<>nil) do begin TargetSelList := CurSelList^.Data; gtk_target_list_unref(TargetSelList^.List); + {$ifndef gtk1} + if (gtk_major_version = 2) and (gtk_minor_version > 12) and (@g_slice_free1 <> nil) then + g_slice_free1(SizeOf(TGtkTargetSelectionList), TargetSelList) + else + {$endif} g_free(TargetSelList); CurSelList := CurSelList^.Next; end; g_list_free(SelectionLists); - gtk_object_set_data (PGtkObject(Widget),gtk_selection_handler_key,GtkNil); + gtk_object_set_data (PGtkObject(Widget), gtk_selection_handler_key, GtkNil); {$IFDEF DEBUG_CLIPBOARD} DebugLn(' ClearTargetLists WWW END'); {$ENDIF} --- lcl/interfaces/gtk/gtkextra.pp +++ lcl/interfaces/gtk/gtkextra.pp @@ -54,4 +54,11 @@ {$I gtk2extra.inc} {$endif} +{$ifdef gtk2} +initialization + Initialize; +finalization + Finalize; +{$endif} + end. --- lcl/interfaces/gtk2/gtk2extra.inc +++ lcl/interfaces/gtk2/gtk2extra.inc @@ -53,3 +53,16 @@ end; {$endif} +procedure Initialize; +begin + Pointer(g_slice_free1) := nil; + glibhandle := LoadLibrary(gliblib); + if glibhandle <> 0 then + Pointer(g_slice_free1) := GetProcAddress(glibhandle, 'g_slice_free1'); +end; + +procedure Finalize; +begin + if glibhandle <> 0 then + FreeLibrary(glibhandle); +end; --- lcl/interfaces/gtk2/gtk2extrah.inc +++ lcl/interfaces/gtk2/gtk2extrah.inc @@ -23,7 +23,7 @@ {$ifdef HasGdk2X} gdk2x, {$endif} - Pango; + Pango, dynlibs; const gdkdll = gdklib; @@ -190,3 +190,6 @@ {$ifdef GTK_2_10} function gdk_screen_is_composited(screen: PGdkScreen): gboolean; cdecl; external gdklib; {$endif} +var + glibhandle: PtrUInt = 0; + g_slice_free1: procedure(block_size:gsize; mem_block:gpointer); cdecl;