fixed memleak in gtk opendlg

git-svn-id: trunk@5320 -
This commit is contained in:
mattias 2004-03-18 00:55:56 +00:00
parent 1dd0201529
commit 53728989e3
3 changed files with 47 additions and 25 deletions

View File

@ -2073,13 +2073,13 @@ var
begin
Result:=false;
if (Data=nil) then ;
theDialog:=TCommonDialog(GetLCLObject(Widget));
theDialog:=TCommonDialog(GetNearestLCLObject(Widget));
if (theDialog is TOpenDialog) then begin
// check if history activated
AHistoryEntry:=gtk_object_get_data(PGtkObject(Widget),
'LCLIsHistoryMenuItem');
if (AHistoryEntry<>nil) and (AHistoryEntry^.Filename<>nil) then begin
// use has choosen a history file
// user has choosen a history file
// -> select it in the filedialog
gtk_file_selection_complete(PGtkFileSelection(theDialog.Handle),
AHistoryEntry^.Filename);
@ -3065,6 +3065,9 @@ end;
{ =============================================================================
$Log$
Revision 1.222 2004/03/18 00:55:56 mattias
fixed memleak in gtk opendlg
Revision 1.221 2004/02/23 18:24:38 mattias
completed new TToolBar

View File

@ -5344,7 +5344,6 @@ begin
// create the menu items in the history menu
MenuItemWidget:=gtk_menu_item_new_with_label(
PFileSelHistoryEntry(HistoryList[i])^.Filename);
SetLCLObject(MenuItemWidget,OpenDialog);
// connect the new MenuItem to the HistoryList entry
gtk_object_set_data(PGtkObject(MenuItemWidget), 'LCLIsHistoryMenuItem',
HistoryList[i]);
@ -5637,51 +5636,52 @@ procedure TGtkWidgetSet.InitializeOpenDialog(OpenDialog: TOpenDialog;
SelWidget: PGtkWidget);
var
FileDetailLabel, HBox, FrameWidget: PGtkWidget;
FileSelWidget: PGtkFileSelection;
begin
FileSelWidget:=GTK_FILE_SELECTION(SelWidget);
// Multiselection
if ofAllowMultiSelect in OpenDialog.Options then
begin
LastFileSelectRow := -1;
g_signal_connect(gtk_object(PGtkCList(
PGtkFileSelection(SelWidget)^.file_list)),
g_signal_connect(gtk_object(FileSelWidget^.file_list),
'select-row',
gtk_signal_func(@gtkOpenDialogRowSelectCB), OpenDialog);
gtk_clist_set_selection_mode(
PGtkCList(PGtkFileSelection(SelWidget)^.file_list),
GTK_SELECTION_MULTIPLE);
PGtkCList(FileSelWidget^.file_list),GTK_SELECTION_MULTIPLE);
end;
// Help button
if (ofShowHelp in OpenDialog.Options)
and (GTK_FILE_SELECTION(SelWidget)^.Help_Button<>nil) then begin
gtk_widget_show(GTK_FILE_SELECTION(SelWidget)^.Help_Button);
g_signal_connect( gtk_object((PGtkFileSelection(SelWidget))^.help_button),
and (FileSelWidget^.Help_Button<>nil) then begin
gtk_widget_show(FileSelWidget^.Help_Button);
g_signal_connect( gtk_object(FileSelWidget^.help_button),
'clicked', gtk_signal_func(@gtkDialogHelpclickedCB), OpenDialog);
end;
// connect selection entry (edit field for filename)
if (GTK_FILE_SELECTION(SelWidget)^.selection_entry<>nil) then begin
SetLCLObject(GTK_FILE_SELECTION(SelWidget)^.selection_entry,OpenDialog);
if (FileSelWidget^.selection_entry<>nil) then begin
SetLCLObject(FileSelWidget^.selection_entry,OpenDialog);
g_signal_connect(
gtk_object((PGtkFileSelection(SelWidget))^.selection_entry),
gtk_object(FileSelWidget^.selection_entry),
'key-press-event', gtk_signal_func(@GTKDialogKeyUpDownCB),
OpenDialog);
g_signal_connect(
gtk_object((PGtkFileSelection(SelWidget))^.selection_entry),
gtk_object(FileSelWidget^.selection_entry),
'focus-in-event', gtk_signal_func(@GTKDialogFocusInCB), OpenDialog);
end;
// connect dir list (list of directories)
if (GTK_FILE_SELECTION(SelWidget)^.dir_list<>nil) then begin
SetLCLObject(GTK_FILE_SELECTION(SelWidget)^.dir_list,OpenDialog);
g_signal_connect(gtk_object((PGtkFileSelection(SelWidget))^.dir_list),
if (FileSelWidget^.dir_list<>nil) then begin
SetLCLObject(FileSelWidget^.dir_list,OpenDialog);
g_signal_connect(gtk_object(FileSelWidget^.dir_list),
'select-row', gtk_signal_func(@GTKDialogSelectRowCB), OpenDialog);
end;
// connect file list (list of files in current directory)
if (GTK_FILE_SELECTION(SelWidget)^.file_list<>nil) then begin
SetLCLObject(GTK_FILE_SELECTION(SelWidget)^.file_list,OpenDialog);
g_signal_connect(gtk_object((PGtkFileSelection(SelWidget))^.file_list),
if (FileSelWidget^.file_list<>nil) then begin
SetLCLObject(FileSelWidget^.file_list,OpenDialog);
g_signal_connect(gtk_object(FileSelWidget^.file_list),
'select-row', gtk_signal_func(@GTKDialogSelectRowCB), OpenDialog);
end;
@ -5695,7 +5695,7 @@ begin
if (ofViewDetail in OpenDialog.Options) then begin
// create the frame around the information
FrameWidget:=gtk_frame_new(PChar(rsFileInformation));
gtk_box_pack_start(GTK_BOX(GTK_FILE_SELECTION(SelWidget)^.main_vbox),
gtk_box_pack_start(GTK_BOX(FileSelWidget^.main_vbox),
FrameWidget,false,false,0);
gtk_widget_show(FrameWidget);
// create a HBox, so that the information is left justified
@ -5716,8 +5716,7 @@ begin
// set initial filename
if OpenDialog.Filename<>'' then
gtk_file_selection_set_filename(GTK_FILE_SELECTION(SelWidget),
PChar(OpenDialog.Filename));
gtk_file_selection_set_filename(FileSelWidget,PChar(OpenDialog.Filename));
end;
{------------------------------------------------------------------------------
@ -9283,6 +9282,9 @@ end;
{ =============================================================================
$Log$
Revision 1.480 2004/03/18 00:55:56 mattias
fixed memleak in gtk opendlg
Revision 1.479 2004/03/09 15:30:15 peter
* fixed gtk2 compilation

View File

@ -2526,6 +2526,8 @@ var
AHistoryEntry: PFileSelHistoryEntry;
AFilterEntry: PFileSelFilterEntry;
i: integer;
FileSelWidget: PGtkFileSelection;
LCLFilterMenu, LCLHistoryMenu: PGTKWidget;
begin
if (ADialog=nil) or (not ADialog.HandleAllocated) then exit;
DlgWindow:=PGtkWidget(ADialog.Handle);
@ -2534,7 +2536,18 @@ begin
{$ENDIF}
gtk_window_set_transient_for(PGtkWindow(DlgWindow),nil);
if ADialog is TOpenDialog then begin
FileSelWidget:=GTK_FILE_SELECTION(DlgWindow);
FreeWinWidgetInfo(FileSelWidget^.selection_entry);
FreeWinWidgetInfo(FileSelWidget^.dir_list);
FreeWinWidgetInfo(FileSelWidget^.file_list);
LCLFilterMenu:=PGTKWidget(gtk_object_get_data(PGtkObject(FileSelWidget),
'LCLFilterMenu'));
if LCLFilterMenu<>nil then FreeWinWidgetInfo(LCLFilterMenu);
LCLHistoryMenu:=PGTKWidget(gtk_object_get_data(PGtkObject(FileSelWidget),
'LCLHistoryMenu'));
if LCLHistoryMenu<>nil then FreeWinWidgetInfo(LCLHistoryMenu);
// free history
HistoryList:=TList(gtk_object_get_data(PGtkObject(DlgWindow),
'LCLHistoryList'));
@ -2974,7 +2987,8 @@ begin
end;
end;
function CreateWidgetInfo(const AHandle: THandle; const AObject: TObject; const AParams: TCreateParams): PWinWidgetInfo;
function CreateWidgetInfo(const AHandle: THandle; const AObject: TObject;
const AParams: TCreateParams): PWinWidgetInfo;
begin
Result := CreateWidgetInfo(Pointer(AHandle));
if Result = nil then Exit;
@ -6635,6 +6649,9 @@ end;
{ =============================================================================
$Log$
Revision 1.269 2004/03/18 00:55:56 mattias
fixed memleak in gtk opendlg
Revision 1.268 2004/03/09 15:30:15 peter
* fixed gtk2 compilation