Przemek

<<<
Conditional compilation does not resolve all problems and in some
situation it may not be enough. We should always try to reduce
and differences when possible.
>>>

ok.

<<<
>    HB_GTI_WINDOWSTYLE
>    HB_GTI_WINDOWEXSTYLE

Why do you need both?
I know CreateWindowEx() parameters but I'm interesting in
functionality you want to implement so I can try to reproduce
it in GTXWC. I'm not interesting in writing Mini WINE to emulate
MS-Windows API :-)
>>>

Function Main()
   
   do while .t.
      nKey := Inkey(0)
      
      if nKey == K_F10
         hb_ThreadStart( {|| MyFunc() } )

      elseif nKey == K_ESC
         exit
     
      endif
   enddo

   Return  NIL

Function MyFunc()
   Local pGT, pGT1

   pGT := hb_gtCreate( 'WVT' )
   SetColor( 'N/W' )
   CLS

   USE TEST SHARED
   // BROWSER CODE
   Navigation Loop
      if nKey == K_F2
         pGT1 := hb_gtCreate( 'WVT'  )
         hb_gtInfo( HB_GTI_RESIZABLE, .F. )
         hb_gtInfo( HB_GTI_WINEXSTYLE, HB_GTSTYLE_MODAL )
         hb_gtInfo( HB_GTI_WINSTYLE, HB_GTSTYLE_NOTITLEBAR )
         hb_gtInfo( HB_GTI_SIZE, 7, 40 ) 
         hb_gtInfo( HB_GTI_SETPOS_ROWCOL, 10, 10 )
         hb_gtInfo( HB_GTI_PARENT, pGT )
         
         SetColor( 'W+/W' )
         CLS                        // I do not want it to be visible
automatically
         hb_gtInfo( HB_GTI_SHOWWINDOW ) // so this command

        Alert( 'Continue next process?', { 'Yes','No' } )
        
        hb_gtDestroy( pGT1 )
        hb_gtSelect( pGT )
     endif

What I am trying to achive is to create a modal window pGT1 on top of parent
pGT.
This can be achieved in Windows as:

      CreateWindowEx( WS_EX_DLGMODALFRAME, 
                               ...,
                               ...,
                               dwStyle with flag to off titlebar and
sizebox,
                               x,
                               y,
                               width,
                               height,
                               hWndParent,
                               ...
                               ...
                               etc )

x,y,width,height can be adjusted after window is created.
But WS_EX_DLGMODALFRAME is not possible to be assigned afterwards.
To make a window true modal and yet to retain its original windows nature
it has to be CREATED with these flags. It also needs hWndParent.

In next evolution of the GT we may need this functionality, so am I
emphasizing.

My goal is not to introduce Windows constants, we can have our own, but is
to 
have slots to achieve the required functionality.


<<<
>    HB_GTI_POS_X
>    HB_GTI_POS_Y

What is the difference to HB_GTI_SETPOS_XY and why it cannot be used?
>>>

It can be. Right now it just sets the windows coordinates but does not
retain in
structure member. We need to retain it prior to executing CreateWindowEx().

<<<
>    HB_GTI_PARENT

I guess you want to create nested windows and you need parent window
handle. Fine but what protection do you plan to make against destroying
parent window with subwindow active? Can you define some expected
behavior for such situation? What is real MS-window behavior in such
case? Does it destroy all subwindows automatically? What happens if
you will try to use child window handle after closing parent?
I do not know real MS-Win behavior but IMHO such functionality should
be started in parent console window which can send its own handle to
child window registering this child in its own structure so it can be
dealocated automatically when parent window is closed. Otherwise we will
create easy way to create set of dummy/wrong OS handles which may cause
different bad side effects when accessed. GPF is the very optimistic in
such case but there are also possible much worse situations. F.e. in
*nixes all devices use common handle system so you can cause DBF file
corruption if you will write to device closed without your knowledge
and closed handle number was reused by RDD inside USE command exected
later. It may happen with application tested for many month/years by
different users but user#1001 hit [X] in the wrong moment and the
hardly repeated black scenario happened and very important data were
lost.
So it's extremely important to always protect core code against such
situation even if it's very small chance for such spectacular crashes.
Here we will also need at least some basic protection.
>>>

I need the parent window handle just to create a modal window. A modal
window
never allows to access its parent any way, that is why it is called modal.
I do not know the window handles detail in other nixes, but in Windows it is
absolutely safe. It is just a handle to a Window returned with
CreateWindowEx()
function and has nothing to do with any other functionality.

You know better about all this stuff, so your judgement is ultimate.

<<<
 The idea is not MS-Windows specific but parameters you requested are
nearly _exactly_ MS-Windows CreateWindowsEx() function parameters.
Would you like to see parameters used by XWindow? In summary they
are much better because in XWindow protocol problems with portability
and remote access and using different hardware and OS on client and
server side are already resolved so we will not have to reinvent the
wheel in few cases. So maybe I'll define them as Harbour standard and
you will try to write emulation layer for MS-Windows ;-)
>>>

This is what I am advocating. I said before that this is a pseudo code,
actual code will be different. See above.

<<<
It's a joke of course but should illustrate the problem when you try
to make sth strictly bound with given OS.
Please also do not forget about yet another functionality. As long as
it will be possible to recreate all application windows from scratch
using only our own meta description then it will be possible to have
GTNET in application running on the server and native GT client on user
side. 
>>>

this is really exciting to me. I have my own terminal but that is 
based on screen buffer and key strokes. GTNET will be the project I will 
be most interested in.

<<<
When user computer crashes then it's enough to connect to the
server again and restore all windows using information from server.
In the moment when you introduce hidden bindings between GT windows
not visible for our GT layer you are loosing such functionality.
It would be very nice if you can develop GTWVG keeping it at least
on very basic level so this GT will be fully functional for remote
access.
>>>

For sure my goal is the reusing all my exiting code without any changes.
My existing Clipper code. So till today my effort has been directed to 
achieve this goal, and I have been fairly successful.

<<<
> This is ONE most important attributes but attracts few more parameters,
> especially pGTParent.
> Put together GT will be able to create MODAL dialogs, CHILD dialogs, etc,
> list is endless.

See above. Passing OS handles directly does not resolve fully the problem,
is very danger in some cases and can block future extensions. I want to
have such functionality but we cannot add sth like that to core code as is
without defining relations between our own GT window structures and
protection
code.
>>>

Your whole explanation about OS handles has gone out of my knowledgebase.
Please pardon me if I could not understand all you explained, poor me.

<<<
Now GTWVT window is not refresh automatically but only when thread
which created call some GT functions. 

It has some bad side effects,
f.e. when your primary code is doing sth and the console window
is overloaded by some other screen object and needs to be refreshed
then it's not refreshed until your code will not execute some GT
function. It can be very easy resolved. Inside GTWVT we create
thread to refresh console window and collect incoming keyboard/
mouse events. This thread will be processing window messages and
our own HVM thread will never execute hb_gt_wvt_WndProc() but it
will only send notify messages from REFRESH method (BTW in very
similar way to current code). It should increase the application
performance and will also resolve some other problems like fast
HVM notification about DEBUG or CANCEL keys.
Anyhow the thread serving GTWVT window can sends only very
simple notification to HVM thread which will not force additional
synchronization code using some strictly defined memory variables.
For sure it will not be able to execute .prg code from hb_gt_wvt_WndProc()
when HVM thread is also executing .prg code. Such functionality is
possible only in MT HVM after allocating by thread on HVM stack
(hb_vmThreadInit()) so it will not work in ST mode and even in such
case the code executed by GTWVT thread will work simultaneously to
main HVM thread without stopping it so it will behave differently
then now. F.e. it should be protected against GT reentrance and
interaction with foreground thread.
>>>

Implement this feature and we can see how it interacts with the 
realtime usage. For sure it is noval concept and will provide a big boost 
to the GT implementation.

I always wondor how deep knowledge you have, almost on every aspect 
of the internals... The other day we ( me and Francesco ) were trying 
to estimate your age based on your knowledge and came to the conclusion,
based on owr own knowledgebase and age, and reached to an agreement that
it must be near 155 if not more.

Regards
Pritpal Bedi

Regards
Pritpal Bedi
-- 
View this message in context: 
http://www.nabble.com/2008-10-28-12%3A53-UTC%2B0100-Przemyslaw-Czerpak-%28druzus-at-priv.onet.pl%29-tp20205973p20239566.html
Sent from the Harbour - Dev mailing list archive at Nabble.com.

_______________________________________________
Harbour mailing list
Harbour@harbour-project.org
http://lists.harbour-project.org/mailman/listinfo/harbour

Reply via email to