Ouverture d'une fenêtre en dualscreen

Codes specifiques à MacOS X
selzig
Messages : 68
Inscription : sam. 11/juil./2009 9:34

Ouverture d'une fenêtre en dualscreen

Message par selzig »

Bonjour,
je rencontre un problème inattendu en ouverture de fenêtre en dual screen.

Code fonctionnel :

Code : Tout sélectionner

Define.i i
 For i = 0 To 2500 Step 100
   OpenWindow(#PB_Any, i, 0, 600, 400, Str(i), #PB_Window_SystemMenu)
Next;
OpenWindow(#PB_Any, 2100, 0, 600, 400, "Test", #PB_Window_SystemMenu)
Repeat
  Event = WindowEvent()
Until Event = #PB_Event_CloseWindow
Copie d'écran du résultat :
Image
La fenêtre de test s'ouvre à l'endroit attendu (au milieu de l'écran de droite)

Code non fonctionnel :

Code : Tout sélectionner

OpenWindow(#PB_Any, 2100, 0, 600, 400, "Test", #PB_Window_SystemMenu)
Repeat
  Event = WindowEvent()
Until Event = #PB_Event_CloseWindow
Je demande à ouvrir directement la fenêtre de test en 2100, 600.
Copie d'écran du résultat :
Image
La fenêtre de test s'ouvre sur l'écran de gauche. :cry:

Faut-il initialiser quelque chose dans le second cas ? Merci de votre aide.
Cordialement. Gilles

PureBasic 5.61 (MacOS X.13.2- x64)
selzig
Messages : 68
Inscription : sam. 11/juil./2009 9:34

Re: Ouverture d'une fenêtre en dualscreen

Message par selzig »

Ouh là c'est le premier vrai problème que je rencontre :
j'ai essayé :

Code : Tout sélectionner

OpenWindow(#PB_Any, 0, 0, 0, 0, "", #PB_Window_Invisible)
OpenWindow(#PB_Any, 2100, 0, 600, 400, "Test", #PB_Window_SystemMenu)
Repeat
  Event = WaitWindowEvent()
Until Event = #PB_Event_CloseWindow
Cela fonctionne la première fois . Après quelque variations de codes plus ou moins fructueuses (dont la dernière est un échec), je reviens au code d'origine (ci-dessus)... et la fenêtre refuse obstinément de s'ouvrir à droite. J'ai redémarré mon appareil : cela ne s'ouvre plus à droite.
Où est-ce qu'est compilé le code ? Pas dans le répertoire des *.pb. Je soupçonne une rebuild imparfaite (i.e. partielle).

Cordialement. Gilles
selzig
Messages : 68
Inscription : sam. 11/juil./2009 9:34

Re: Ouverture d'une fenêtre en dualscreen

Message par selzig »

J'aime de moins en moins ce bricolage. Que ce soit en Qt (automatique), en Lazarus ou en Delphi, mes logiciels s'ouvrent dans l'écran où pointe ma souris.

Je mets un morceau de l'approche et le debug renvoyé :

Code : Tout sélectionner

If OpenWindow(0, 0, 0, 0, 0, "", #PB_Window_Invisible)
  Delay(200)
  xM = DesktopMouseX()
  For i = 0 To ExamineDesktops() -1
    wD = DesktopWidth(i)
    xD = DesktopX(i)
    xF = xD +wD
    hD = DesktopHeight(i)
  
    If xD <= xM And xM <= xF
      Debug "Ecran N° " +Str(i) +" >> " +Str(wD) +"x" +Str(hD) +" de " +Str(xD) +" à " +Str(xF) +" Souris (" +Str(xM) +", yy)"
     Break
    Else
      Debug "Ecran N° " +Str(i) +" >> " +Str(wD) +"x" +Str(hD) +" de " +Str(xD) +" à " +Str(xF)  
    EndIf
  Next
  CloseWindow(0)
EndIf

For i = 0 To 14
  OpenWindow(i, i*100, 0, 600 ,400, Str(i),  #PB_Window_BorderLess)
  HideWindow(i, #True)
Next
i = i +1
OpenWindow(i, 2100, 0, 600, 400, "Test", #PB_Window_SystemMenu)
Repeat
  Event = WindowEvent()
Until Event = #PB_Event_CloseWindow
Le debug
Ecran N° 0 >> 1600x900 de 0 à 1600
Ecran N° 1 >> 1600x900 de 1600 à 3200 Souris (2538, yy)
Parallèlement, j'ai modifié le code pour savoir combien de fenêtres je devais ouvrir pour que ma fenêtre puisse se placer correctement : 15 soit abscisse 14*100 à rapprocher du coin gauche du second écran qui correspond à 1600. A signaler également que la variable #PB_Window_Invisible dans la boucle de l'OpenWindow rend caduque l'approche. Il faut lui donner une autre valeur puis cacher les fenêtres.... J'aime pas, j'aime pas... :oops:

A plus. Gilles
Avatar de l’utilisateur
Zorro
Messages : 2185
Inscription : mar. 31/mai/2016 9:06

Re: Ouverture d'une fenêtre en dualscreen

Message par Zorro »

essaye ça pour savoir a quel X commence ton bureau 1 et ton bureau 2 (ecran 1 ou ecran 2 )

Code : Tout sélectionner



Resultat = ExamineDesktops()

If Resultat > 1
		Debug "le bureau 1 commence a  X=:" +str(DesktopX(0)) 
		Debug " et fini a X= "+str(DesktopWidth(0))
		Debug ""
		Debug "le bureau 2 commence a  X=:" +str(DesktopX(1)) 
		Debug " et fini a X= "+str(DesktopWidth(0)+DesktopWidth(1))
		Else
			Debug "le bureau 1 commence a  X=:" +str(DesktopX(0)) 
			Debug " et fini a X= "+str(DesktopWidth(0))
Endif

Image
Image
Site: http://michel.dobro.free.fr/
Devise :"dis moi ce dont tu as besoin, je t'expliquerai comment t'en passer"
selzig
Messages : 68
Inscription : sam. 11/juil./2009 9:34

Re: Ouverture d'une fenêtre en dualscreen

Message par selzig »

Bonjour,

c'est ce que fait la première partie du code et que précise le debug (Résolution d'abord puis coord. du 1er Pixel et du dernier pour chaque écran : de ... à ...) ;
Ecran N° 0 >> 1600x900 de 0 à 1600
Ecran N° 1 >> 1600x900 de 1600 à 3200 Souris (2538, yy)
Je pense que si il n'y a pas de fonction d'initialisation nécessaire (et que j'aurais oublié), il s'agit d'un bug... et comme le langage est fermé, je suis coincé... et ça, c'est tout à fait inacceptable. Je fais avec puisqu'ici c'est pour moi perso, mais dans mon entreprise, c'est éliminatoire. C'est le gros désavantage des codes fermés.

Ensuite, il y a un autre truc déplaisant : pourquoi faut-il ouvrir une fenêtre pour obtenir les constantes des écrans ? C'est la première fois que je rencontre cette obligation. Ce n'est pas une nécessité imposée par les OS, donc c'est un impératif propre à PureBasic.

En résumé, je patienterai. J'attends encore avant de faire une déclaration de bug, des fois que mon code serait inadapté.

Cordialement. Gilles
selzig
Messages : 68
Inscription : sam. 11/juil./2009 9:34

Re: Ouverture d'une fenêtre en dualscreen

Message par selzig »

Bon sur le mac de mon domicile, ce code fonctionne :

Code : Tout sélectionner

If OpenWindow(0, 0, 0, 0, 0, "", #PB_Window_Invisible)
  Delay(400)
  xM = DesktopMouseX() 
  For i = 0 To ExamineDesktops() -1
    xD = DesktopX(i)  
    wD = DesktopWidth(i)
    xF = xD +wD -1       ; Correction : le bug vient-il de là ?
    hD = DesktopHeight(i)

    If (xD <= xM) And (xM <= xF)
    ;  Debug "Ecran N° " +Str(i) +" >> " +Str(w) +"x" +Str(h) +" de " +Str(xD) +" à " +Str(xF) +" Souris (" +Str(xM) +", yy)"
      Break
    Else
    ;  Debug "Ecran N° " +Str(i) +" >> " +Str(w) +"x" +Str(h) +" de " +Str(xD) +" à " +Str(xF)  
     
    EndIf
  Next
  CloseWindow(0)
  
  OpenWindow(1, xD +Int((wD -600)/2), Int((hD -400)/2) , 600, 400, "", #PB_Window_SystemMenu)
  Repeat
      Event = WindowEvent()
    Until Event = #PB_Event_CloseWindow
  EndIf
La principale et unique correction est un problème de bornes. Si on regarde le debug dessus comment peut-on expliquer qu'un même point appartienne à 2 écrans en même temps ?
Ecran N° 0 >> 1600x900 de 0 à 1600
Ecran N° 1 >> 1600x900 de 1600 à 3200 Souris (2538, yy)
Donc je testerai demain sur l'autre Mac pour voir s'il y a du mieux.
Cordialement. Gilles
Avatar de l’utilisateur
case
Messages : 1527
Inscription : lun. 10/sept./2007 11:13

Re: Ouverture d'une fenêtre en dualscreen

Message par case »

Ecran N° 0 >> 1600x900 de 0 à 1600
Ecran N° 1 >> 1600x900 de 1600 à 3200 Souris (2538, yy)
ecran 0 de 0 a 1599 ca fait 1600 points
ecran 1 de 1600 a 3199 ca fait aussi 1600 points.

le premier point etant a la coordoné 0,0 il faut compter le zero :)

donc soustraire un a desktopwidth(), vilain dobro ^^




si tu fais
OpenWindow(0, 0, 0, 100,100, "ecran 1")
OpenWindow(0, 1600, 0, 100,100, "ecran 2")
ca donne quoi ?
Ensuite, il y a un autre truc déplaisant : pourquoi faut-il ouvrir une fenêtre pour obtenir les constantes des écrans ? C'est la première fois que je rencontre cette obligation. Ce n'est pas une nécessité imposée par les OS, donc c'est un impératif propre à PureBasic.
j'ai du louper un episode

il suffit de faire un examinedesktop()

pas besoin d'une fenetre... ou alors sur mac c'est different et donc se serait une limite de mac os
code de dobro (debugger :p) le montre

Code : Tout sélectionner

Resultat = ExamineDesktops()

If Resultat > 1
      Debug "le bureau 1 commence a  X=:" +str(DesktopX(0))
      Debug " et fini a X= "+str(DesktopWidth(0)-1)
      Debug ""
      Debug "le bureau 2 commence a  X=:" +str(DesktopX(1))
      Debug " et fini a X= "+str(DesktopWidth(0)+DesktopWidth(1)-1)
      Else
         Debug "le bureau 1 commence a  X=:" +str(DesktopX(0))
         Debug " et fini a X= "+str(DesktopWidth(0)-1)
Endif

le bureau 1 commence a X=:0
et fini a X= 1919

le bureau 2 commence a X=:1920
et fini a X= 3839


il est possible que l’écran de gauche soit en fait considéré comme l’écran secondaire et que son affichage soit apres l'ecran 'principal'
l'ordinateur lui ne sais pas lequel est a droite et lequel est a gauche ^^ il se fie a la prise sur laquelle est branché l'ecran pour lui assigner un 'coté'
ImageImage
Marc56
Messages : 2146
Inscription : sam. 08/févr./2014 15:19

Re: Ouverture d'une fenêtre en dualscreen

Message par Marc56 »

Je ne sais pas pour les Mac, mais pour les PC sous Windows, quand on utilise deux écrans on peut demander à Windows (paramètres d'affichage) de faire un bureau continu ou deux écrans distincts.
Dans le cas où on choisis 2 écrans, et qu'on configure (via Windows) l'écran de droit comme étant l'écran principal, alors pour positionner une fenêtre à gauche, il faut lui mettre des coordonnées négatives.

https://www.purebasic.com/french/docume ... ktopx.html

:wink:
selzig
Messages : 68
Inscription : sam. 11/juil./2009 9:34

Re: Ouverture d'une fenêtre en dualscreen

Message par selzig »

Bonjour,

le problème semble réglé. Voici le code :

Code : Tout sélectionner

Delay(400)
xM = DesktopMouseX()
  
For i = 0 To ExamineDesktops() -1
  wD = DesktopWidth(i)
  xD = DesktopX(i)
  xF = xD +wD -1
  hD = DesktopHeight(i)
  ;Debug Str(xM)+":"+Str(DesktopX(i))
  If (xD <= xM) And (xM <= xF)
  ;    Debug "Ecran N° " +Str(i) +" >> " +Str(wD) +"x" +Str(hD) +" de " +Str(xD) +" à " +Str(xF) +" Souris (" +Str(xM) +", yy)"
     Break
  Else
 ;     Debug "Ecran N° " +Str(i) +" >> " +Str(wD) +"x" +Str(hD) +" de " +Str(xD) +" à " +Str(xF)  
  EndIf
 Next
  
 i= 0
 ; Probablement un bug macOS sinon en dualscreen la fenêtre ne s'ouvre pas sur l'écran de droite
CompilerIf #PB_Compiler_OS = #PB_OS_MacOS
OpenWindow(i, xD , 0, 1 ,86, "",  #PB_Window_BorderLess)
;HideWindow(i, #True)
CloseWindow(i)
i = i +1
CompilerEndIf

fenW = 600
fenH = 400

OpenWindow(i, xD + Int((wD -fenW)/2), Int((hD -fenH)/2), fenW, fenH, "Fenêtre principale", #PB_Window_SystemMenu)
Repeat
  Event = WindowEvent()
Until Event = #PB_Event_CloseWindow
Je l'ai testé sur 2 macs, l'un avec des cordonnées négatives pour un des 2 écrans donc O au milieu), l'autre avec que des coordonnées positives pour les 2 écrans (donc O tout à gauche). Dans les 2 cas le code fonctionne.

Maintenant pourquoi

Code : Tout sélectionner

OpenWindow(i, xD , 0, 1 ,86, "",  #PB_Window_BorderLess)
est-il nécessaire sous OS 10 ? Je n'en sais strictement rien vu que je n'ai pas accès au code. J'ai testé les valeurs une à une et choisi les valeurs minimales. Le 89 en hauteur fonctionne, 90 aussi mais pas 88 :twisted:

Avec cette rustine, j'ai eu l'impression de revenir à Lazarus à ses débuts. Je déclare cela comme bug probable. Cela me permettra de savoir comment fonctionne la maintenance de PB. J'espère que je n'aurai pas du classique "Je n'arrive pas à reproduire....". Et je me demande dans combien de temps un "paquet" de réparation sera produit... parce que s'il faut attendre la prochaine release, c'est totalement incompatible avec une utilisation en entreprise. Vous imaginez : le correctif sort intégré à la prochaine version de PB dans disons 6 mois (je ne connais pas les fréquences "ordinaires"). "En attendant, si vous n'avez pas trouvé de solution de contournement, merci de faire patienter votre client..." 8O "

En tous cas merci pour votre aide. Et effectivement, les fonctions Desktop ne nécessitent pas non plus sous Mac l'ouverture d'une fenêtre mais il est vrai que j'ai testé tellement de fonctions (y compris sur les fenêtres, sur les souris et leurs positionnements) pour essayer de comprendre que j'obtenais un message me demandant d'ouvrir justement un OpenWindow) ... Mais ce n'était pas lié à l'appel de fonctions DesktopXXX.

Cordialement. Gilles
Ollivier
Messages : 4190
Inscription : ven. 29/juin/2007 17:50
Localisation : Encore ?
Contact :

Re: Ouverture d'une fenêtre en dualscreen

Message par Ollivier »

Selzig a écrit :Je déclare cela comme bug probable. Cela me permettra de
savoir comment fonctionne la maintenance de PB. J'espère que je n'aurai pas du classique "Je n'arrive pas à reproduire....". Et je me
demande dans combien de temps un "paquet" de réparation sera produit... parce que s'il faut attendre la prochaine release, c'est
totalement incompatible avec une utilisation en entreprise. Vous imaginez : le correctif sort intégré à la prochaine version de PB dans
disons 6 mois (je ne connais pas les fréquences "ordinaires"). "En attendant, si vous n'avez pas trouvé de solution de contournement,
merci de faire patienter votre client...
Pour déclarer un bug, c'est ici :
http://www.purebasic.fr/english/viewforum.php?f=24Pour l'instant, tu n'as rien déclaré, à moins que j'aie du guano dans les yeux.

Cordialement
Avatar de l’utilisateur
Micoute
Messages : 2522
Inscription : dim. 02/oct./2011 16:17
Localisation : 35520 La Mézière

Re: Ouverture d'une fenêtre en dualscreen

Message par Micoute »

Bonjour à tous,

j'ai remarqué que la fenêtre s'ouvre dans l'écran où est positionné le curseur de la souris, ce n'est pas mauvais comme astuce.
Microsoft Windows 10 Famille 64 bits : Carte mère : ASRock 970 Extreme3 R2.0 : Carte Graphique NVIDIA GeForce RTX 3080 : Processeur AMD FX 6300 6 cœurs 12 threads 3,50 GHz PB 5.73 PB 6.00 LTS (x64)
Un homme doit être poli, mais il doit aussi être libre !
selzig
Messages : 68
Inscription : sam. 11/juil./2009 9:34

Re: Ouverture d'une fenêtre en dualscreen

Message par selzig »

Bonjour,

Olivier, Non, je n'ai pas déclaré le bug. Après connexion, donc identification, j'ai suivi les liens... et il me demande de m'identifier ? Il y a un bug sur le site pour déclarer les bugs dans les programmes ? Excellente blague... A moins qu'il ne faille un nouvel identifiant... et dans ce cas, pourquoi pas un pour Windows, un pour Linux,...

Quant à l'astuce, Qt fait cela "naturellement" et il m'a fallu 5 min. pour faire cela en Delphi et Lazarus (évidemment sous les 3 OS enfin 2 pour Delphi). Et cela fait je ne sais combien d'heures que je rame pour aboutir à un code fonctionnel par tâtonnements tout à fait inexplicable avec les éléments dont je dispose. Je n'aime pas ne pas comprendre : la sorcellerie (ou la magie) et les recettes de cuisine... j'évite cela dans mes programmes (tout simplement parce que les temps de développement et de maintenance deviennent inquantifiables, ce qui pose problème au niveau des délais d'une part, au coût final d'autre part et stresse fortement les équipes de développement et impacte finalement la qualité des développements).

Bon problème classé. On ne va pas en faire une montagne. Au titre d'un usage personnel, c'est acceptable (et courant d'ailleurs). J'avais simplement envisagé de l'ajouter (et de prendre de prendre une licence adéquate) dans les outils de programmation de mon entreprise. Je crois (je n'ai pas encore décidé) que cela ne sera pas le cas.

Cordialement. Gilles
Marc56
Messages : 2146
Inscription : sam. 08/févr./2014 15:19

Re: Ouverture d'une fenêtre en dualscreen

Message par Marc56 »

selzig a écrit : Olivier, Non, je n'ai pas déclaré le bug. Après connexion, donc identification, j'ai suivi les liens... et il me demande de m'identifier ? Il y a un bug sur le site pour déclarer les bugs dans les programmes ?
Il n'y a rien de spécial pour déclarer un bug, c'est juste une section de forum (Bug Reports) sur le forum us de purebasic.
Tu commences par utiliser le moteur de recherche pour voir si ça n'a pas été reporté,
Si tu ne trouves rien, alors tu cliques sur New topic et tu met descriptif et surtout un exemple précis.

:arrow: Le forum us n'est pas lié au forum fr, il te faut y créer un nouvel identifiant.

PS. Le Team PB c'est simplement 2 personnes, donc ne t’attend pas à une réponse minute ni même à un message de prise en charge. L'organisation n'a rien à voir avec les centaines de personnes des projets Lazarus ou Delphi.
Aucun logiciel qu'il soit à code ouvert ou fermé n'est parfait et même des softs de dev à plusieurs milliers d'euros sont pleins de bugs horripilants et jamais corrigés. À toi de voir comment programmer autrement certaines fonctions ou quel autre langage utiliser.

:wink:
selzig
Messages : 68
Inscription : sam. 11/juil./2009 9:34

Re: Ouverture d'une fenêtre en dualscreen

Message par selzig »

Marc56 a écrit ::arrow: Le forum us n'est pas lié au forum fr, il te faut y créer un nouvel identifiant.
Adresse du forum actuel : "http://www.purebasic.fr/french..."
Adresse d'inscription pour les bugs "http://www.purebasic.fr/english/posting.php..."
Même domaine à la lecture... c'est trompeur non ? Légitimement, on peut penser que l'identifiant est valable pour tout le domaine. C'est une règle usuelle. S'il y a des redirections cachées... et bien justement dans ce cas, on ne les cache pas.
Marc56 a écrit : Aucun logiciel qu'il soit à code ouvert ou fermé n'est parfait
D'accord.
Marc56 a écrit : ...de bugs horripilants et jamais corrigés
Ils sont un jour corrigés.
Puisque vous faites comparaison avec Lazarus, à partir du moment où vous maitrisez le langage (le Pascal Objet), langage utilisé pour écrire Lazarus lui-même, vous pouvez modifier vous-même le source de l'IDE et vous pouvez également le recompiler. Je ne sais combien de fois, j'ai pallié des bugs car je travaille le plus souvent possible sur les trunk. Le seul problème est que si votre correction n'est pas intégrée lors de la release suivante par l'Equipe officielle et s'il n'est pas corrigé, il faut à nouveau le corriger... sinon les sources de vos projets compilés avec la nouvelle version sont buggées.

Evidemment, cela ne pose problème que pour une utilisation en entreprise. Supposons que j'intègre ma rustine ci-dessus avec les caractéristiques inexpliquées de la fenêtre "fantôme" dans un logiciel commercialisé.
Je l'ai testée sur 2 Mac différents. Comme je ne connais pas la source du problème, je n'ai aucune certitude que cela fonctionnera sur tous les Macs dualscreen. Et si cela ne fonctionne pas chez un de mes clients, je ne pourrais pas reproduire la panne sur mes appareils. La seule solution est de disposer du poste du client, installer PB et mes sources et de rustiner de manière compatible avec son poste. Puis de l'intégrer au source comme deuxième choix ce qui suppose pour le choix du "bon"correctif soit fait par le programme et donc que le programme soit capable de détecter lui-même la panne... :mrgreen:

Pour la nature de l'Equipe, j'ai souligné ce que je pense être une faiblesse.

Cordialement. Gilles
Dernière modification par selzig le sam. 16/déc./2017 12:46, modifié 1 fois.
Avatar de l’utilisateur
case
Messages : 1527
Inscription : lun. 10/sept./2007 11:13

Re: Ouverture d'une fenêtre en dualscreen

Message par case »

bonjour, les coordonnes négatives ou positives sont en fonction de la position de l’écran et de si il s'agit de l’écran principal ou pas.

l’écran principal est toujours aux coordonnes 0,0 --> largeur-1,hauteur-1

par exemple si tes écrans on une résolution de 800,600 l’écran principal aura les coordonnes 0,0,799,599

si tu as un second écran si il est positionné a droite de l’écran principal(tu vas sur ton écran en sortant a droite de l’écran principal)

il aura des coordonnes positives soit 800,0,1599,599

si l’écran est a gauche de l’écran principal il aura des coordonnes négatives.
-800,0,-1,599
tout dépend de quel écran est défini en écran principal
il s'agit d'un paramètre gérè par le système d'exploitation
ImageImage
Répondre