From: Reini U. <ru...@x-...> - 2006-03-08 14:57:44
Attachments:
DragDrop.pod
dragdrop.patch
|
Hi I just finished adding DragDrop to Win32::GUI. I didn't like the Loft methods and it's Win32::API dependency, so it's a good GUI.xs and Window.xs integration with the "DropFiles" NEM and OEM events supported. Attached is the generated pod and patch. A Window can use the -dropfiles =3D> 0|1 option to accept dropping files, or the DragAcceptFiles() method. The event can be registered via <name>_DropFiles or via -onDropFiles. Sample: sub Main_DropFiles { # check if called as method or function if ($_[0] =3D~ /Win32::GUI::(Window|DialogBox)/) { shift; } # now the DragDrop handle should be on the stack. (not an object yet thou= gh) my $files =3D Win32::GUI::DragDrop::DragQueryFiles(shift); return 0 unless @$files; ... } Some notes: The DragDrop handle passed to the event is no object yet. So only the function call is supported yet, not as method. sub win_DropFiles { $files =3D $_[0]->DragQueryFiles(); } # invalid! I didn't care to stash the handle in XS yet. It's just a long. -- Reini Urban http://phpwiki.org/ http://spacemovie.mur.at/ http://helsinki.at/ |
From: Reini U. <ru...@x-...> - 2006-03-09 13:21:43
|
I simplified and fixed some code in the XS part of DragDrop. The second argument to the DropFiles event is now a proper Win32::GUI::DragDrop object with the HDROP handle as -handle. Unicode filenames not yet supported. And I wonder if we should not support a higher level interface, by filling the needed properties of this object on creation, with the files and the mousepoint automatically. Then none of the 4 DragDrop functions would be needed and the event would be much simplier to use. Now: sub Main_DropFiles { my $win =3D shift; # dropped on which window my @files; if (ref $_[0] eq 'Win32::GUI::DragDrop') { # GUI 1.04 #my $pos =3D $_[0]->DragQueryPoint(); #my $l =3D $_[0]->DragQueryFile(0xFFFFFFFF); #my $f0 =3D $_[0]->DragQueryFile(0); @files =3D $_[0]->DragQueryFiles(); # and from here on the HDROP ressource behind the $_[0] object is destr= oyed. } else { @files =3D Win32::GUI::DragDrop::GetDroppedFiles(shift); # Loft } return 0 unless @files; .. do something with the files } Then: sub Main_DropFiles { my $win =3D shift; # dropped on which window my @files; if (ref $_[0] eq 'Win32::GUI::DragDrop') { # GUI 1.04 @files =3D $_[0]->DragFiles; $pos =3D $_[0]->DragPos; # pos stored in the perl object } else { @files =3D Win32::GUI::DragDrop::GetDroppedFiles(shift); # Loft } return 0 unless @files; .. do something with the files } Now I will finish all the needed support functions for CustomDraw and make a simplier example without Win32::API. 2006/3/8, Reini Urban <ru...@x-...>: > Hi > I just finished adding DragDrop to Win32::GUI. > > I didn't like the Loft methods and it's Win32::API dependency, > so it's a good GUI.xs and Window.xs integration with the "DropFiles" > NEM and OEM events supported. > Attached is the generated pod and patch. > > A Window can use the -dropfiles =3D> 0|1 option to accept dropping files, > or the DragAcceptFiles() method. > The event can be registered via <name>_DropFiles or via -onDropFiles. > Sample: > sub Main_DropFiles { > # check if called as method or function > if ($_[0] =3D~ /Win32::GUI::(Window|DialogBox)/) { > shift; > } > # now the DragDrop handle should be on the stack. (not an object yet th= ough) > my $files =3D Win32::GUI::DragDrop::DragQueryFiles(shift); > return 0 unless @$files; > ... > } > > Some notes: > The DragDrop handle passed to the event is no object yet. > So only the function call is supported yet, not as method. > > sub win_DropFiles { $files =3D $_[0]->DragQueryFiles(); } # invalid! > I didn't care to stash the handle in XS yet. It's just a long. -- Reini Urban http://phpwiki.org/ http://spacemovie.mur.at/ http://helsinki.at/ |
From: Reini U. <ru...@x-...> - 2006-03-09 13:23:27
Attachments:
DragDrop.pod
dragdrop.patch.gz
|
oops, forgot to attach the patch... 2006/3/9, Reini Urban <ru...@x-...>: > I simplified and fixed some code in the XS part of DragDrop. > The second argument to the DropFiles event is now a proper > Win32::GUI::DragDrop object with the HDROP handle as -handle. > > Unicode filenames not yet supported. > > And I wonder if we should not support a higher level interface, by fillin= g > the needed properties of this object on creation, with the files > and the mousepoint automatically. > Then none of the 4 DragDrop functions would be needed and the > event would be much simplier to use. > > Now: > sub Main_DropFiles { > my $win =3D shift; # dropped on which window > my @files; > if (ref $_[0] eq 'Win32::GUI::DragDrop') { # GUI 1.04 > #my $pos =3D $_[0]->DragQueryPoint(); > #my $l =3D $_[0]->DragQueryFile(0xFFFFFFFF); > #my $f0 =3D $_[0]->DragQueryFile(0); > @files =3D $_[0]->DragQueryFiles(); > # and from here on the HDROP ressource behind the $_[0] object is des= troyed. > } else { > @files =3D Win32::GUI::DragDrop::GetDroppedFiles(shift); # Loft > } > return 0 unless @files; > .. do something with the files > } > > Then: > sub Main_DropFiles { > my $win =3D shift; # dropped on which window > my @files; > if (ref $_[0] eq 'Win32::GUI::DragDrop') { # GUI 1.04 > @files =3D $_[0]->DragFiles; > $pos =3D $_[0]->DragPos; # pos stored in the perl object > } else { > @files =3D Win32::GUI::DragDrop::GetDroppedFiles(shift); # Loft > } > return 0 unless @files; > .. do something with the files > } > > Now I will finish all the needed support functions for CustomDraw and > make a simplier example without Win32::API. > > 2006/3/8, Reini Urban <ru...@x-...>: > > Hi > > I just finished adding DragDrop to Win32::GUI. > > > > I didn't like the Loft methods and it's Win32::API dependency, > > so it's a good GUI.xs and Window.xs integration with the "DropFiles" > > NEM and OEM events supported. > > Attached is the generated pod and patch. > > > > A Window can use the -dropfiles =3D> 0|1 option to accept dropping file= s, > > or the DragAcceptFiles() method. > > The event can be registered via <name>_DropFiles or via -onDropFiles. > > Sample: > > sub Main_DropFiles { > > # check if called as method or function > > if ($_[0] =3D~ /Win32::GUI::(Window|DialogBox)/) { > > shift; > > } > > # now the DragDrop handle should be on the stack. (not an object yet = though) > > my $files =3D Win32::GUI::DragDrop::DragQueryFiles(shift); > > return 0 unless @$files; > > ... > > } > > > > Some notes: > > The DragDrop handle passed to the event is no object yet. > > So only the function call is supported yet, not as method. > > > > sub win_DropFiles { $files =3D $_[0]->DragQueryFiles(); } # invalid! > > I didn't care to stash the handle in XS yet. It's just a long. > -- > Reini Urban > http://phpwiki.org/ > http://spacemovie.mur.at/ http://helsinki.at/ > -- Reini Urban http://phpwiki.org/ http://spacemovie.mur.at/ http://helsinki.at/ |
From: Jeremy W. <jez...@ho...> - 2006-03-09 17:13:18
|
>And I wonder if we should not support a higher level interface, by filling >the needed properties of this object on creation, with the files >and the mousepoint automatically. >Then none of the 4 DragDrop functions would be needed and the >event would be much simplier to use. Yeah, I think that would be a better interface - how "easy" would that be to implement? In the end I guess you would end up with an event handler like: sub { my $xpos=shift; #the X cor of the mouse when dropped my $ypos=shift; #the Y cor of the mouse when dropped foreach $myfile (@_) { #for each file dropped on the window ... } } Cheers, jez. |
From: Reini U. <ru...@x-...> - 2006-03-11 23:40:51
|
2006/3/9, Jeremy White <jez...@ho...>: > >And I wonder if we should not support a higher level interface, by filli= ng > >the needed properties of this object on creation, with the files > >and the mousepoint automatically. > >Then none of the 4 DragDrop functions would be needed and the > >event would be much simplier to use. > > Yeah, I think that would be a better interface - how "easy" would that be= to > implement? I just did that for the CustomDraw object, which passes a struct to the event, which really should be accessed as tied object, a la WindowProps. When I got that finished, I will port DragDrop to pass such an object to the event also. The main XS machinery is already there. CreateObjectbyHandle() ... It's very easy to make terrible mistakes in the XS part. Devel::LeakTrace helps. I don't like leaks in MessageLoop events. > In the end I guess you would end up with an event handler like: > > sub { > my $xpos=3Dshift; #the X cor of the mouse when dropped > my $ypos=3Dshift; #the Y cor of the mouse when dropped > foreach $myfile (@_) { > #for each file dropped on the window > ... > } > } No, more like: -onDragDrop =3D> sub { my ($win, $drag) =3D @_; # dragged to win print "Mouse: ", join(", ", $drag->MousePosition), "\n"; print "Files: ", join(", ", $drag->Files), "\n"; } -- Reini Urban http://phpwiki.org/ http://spacemovie.mur.at/ http://helsinki.at/ |
From: Jeremy W. <jez...@ho...> - 2006-03-12 15:29:48
|
>It's very easy to make terrible mistakes in the XS part. >Devel::LeakTrace helps. I don't like leaks in MessageLoop events. I'll have a look at that module. >No, more like: >-onDragDrop => sub { > my ($win, $drag) = @_; # dragged to win > print "Mouse: ", join(", ", $drag->MousePosition), "\n"; > print "Files: ", join(", ", $drag->Files), "\n"; >} Looks good. Is there any chance that you could provide a simple working example that could also be added to CVS? Cheers, jez. |