Schrift
[thread]4789[/thread]

magnetische Fenster: unter win

Leser: 1


<< |< 1 2 >| >> 12 Einträge, 2 Seiten
anti
 2004-06-07 22:57
#42220 #42220
User since
2003-11-29
155 Artikel
BenutzerIn
[default_avatar]
Hi,
gibt es für Perl/Tk ein Modul, mit dem magnetische Fenster wie unter Linux zu erzeugen sind?

Gibt es ausserdem eine einfache Möglichkeit Fenster an einer bestimmten Stelle (z.B. neben dem MainWindow) zu positionieren?

Danke, anti
ptk
 2004-06-07 23:28
#42221 #42221
User since
2003-11-28
3645 Artikel
ModeratorIn
[default_avatar]
Was ist ein magnetisches Fenster? Man kann mit geometry ein Fenster positionieren, und mit geometry bekommt man auch die Groesse eines Fensters heraus. Das sollte reichen, um ein Toplevel/MainWindow genau zu positionieren. Allerdings kann es sein, dass geometry die Window-Dekoration (Rahmen, Titelleiste) nicht beruecksichtigt.
Crian
 2004-06-08 00:47
#42222 #42222
User since
2003-08-04
5866 Artikel
ModeratorIn
[Homepage]
user image
Ich glaub anti meint das "Anrasten" an die Bildschirmränder und andere Fenster unter KDE.

Das funktioniert doch aber nur, wenn der Benutzer das Fenster verschiebt, nicht beim Platzieren durch das Programm.\n\n

<!--EDIT|Crian|1086641279-->
s--Pevna-;s.([a-z]).chr((ord($1)-84)%26+97).gee; s^([A-Z])^chr((ord($1)-52)%26+65)^gee;print;

use strict; use warnings; Link zu meiner Perlseite
coax
 2004-06-08 12:03
#42223 #42223
User since
2003-08-11
457 Artikel
BenutzerIn
[default_avatar]
ich hab da mal fix was zusammengeschustert.

Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
use Tk;

my $mw = tkinit;

$mw->bind('<Configure>' => sub { $mw->dock_window(50) });

MainLoop();

package MainWindow;

sub dock_window {
   my $self = shift;
   my $px = shift || 10;    # Pixel vom Bildschirmrand
   
   my $sh = $self->screenheight();
   my $sw  = $self->screenwidth();
   
   my($width, $height, $pos_x, $pos_y) = split(/[x+-]/, $self->geometry());
   
   my $pos_x2 = $pos_x + $width;
   my $pos_y2 = $pos_y + $height;
   
   return if ($pos_x  == 0   || $pos_x  > $px)
          && ($pos_x2 == $sw || $pos_x2 < ($sw - $px))
          && ($pos_y  == 0   || $pos_y  > $px)
          && ($pos_y2 == $sh || $pos_y2 < ($sh - $px));

   $pos_x = $pos_x <= $px ? 0 : $pos_x;
   $pos_y = $pos_y <= $px ? 0 : $pos_y;
   
   $pos_x = $pos_x2 > ($sw - $px) ? $sw - $width  : $pos_x;
   $pos_y = $pos_y2 > ($sh - $px) ? $sh - $height : $pos_y;

   $self->geometry(sprintf("+%s+%s", $pos_x, $pos_y));
}

dock_window kannst du angeben ab wie viel Pixel vom Bildschirmrand es das Fenster andocken soll, ohne Angabe dockt es immer bei 10 Pixel.

Es wird aber so sein, dass das Fenster in der y-Position unter der Taskleiste landet weil man die nicht so einfach einkalkulieren kann. (Ich weisz zumindest nicht wie).
,,Das perlt aber heute wieder...'' -- Dittsche
ptk
 2004-06-08 12:34
#42224 #42224
User since
2003-11-28
3645 Artikel
ModeratorIn
[default_avatar]
Fuer Win32 gibt es das Modul Win32Util, welches Funktionen zum Feststellen des nicht durch die Taskleiste verdeckt wird. Die Funktion sollte auch korrekt funktionieren, wenn sich die Taskleiste an der Seite befindet.

Fuer KDE gibt es KDEUtil. Ich glaube, fuer GNOME sollte die gleiche Funktion funktionieren.
coax
 2004-06-08 13:08
#42225 #42225
User since
2003-08-11
457 Artikel
BenutzerIn
[default_avatar]
kann ja dann jeder machen wie er mag oder es brauch :)
,,Das perlt aber heute wieder...'' -- Dittsche
Crian
 2004-06-08 17:03
#42226 #42226
User since
2003-08-04
5866 Artikel
ModeratorIn
[Homepage]
user image
[quote=coax,08.06.2004, 10:03]
Code: (dl )
    my($width, $height, $pos_x, $pos_y) = split(/[x+-]/, $self->geometry());
[/quote]
Ich fürchte, das kannst Du so nicht machen. Du musst schon unterscheiden, ob da + oder - steht und die --Werte korrekt umrechnen.
s--Pevna-;s.([a-z]).chr((ord($1)-84)%26+97).gee; s^([A-Z])^chr((ord($1)-52)%26+65)^gee;print;

use strict; use warnings; Link zu meiner Perlseite
ptk
 2004-06-08 17:50
#42227 #42227
User since
2003-11-28
3645 Artikel
ModeratorIn
[default_avatar]
Ich benutze folgendes zum Parsen:
Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
sub parse_geometry_string {
my $geometry = shift;
my @extends = (0, 0, 0, 0);
if ($geometry =~ /([-+]?\d+)x([-+]?\d+)/) {
$extends[GEOMETRY_WIDTH] = $1;
$extends[GEOMETRY_HEIGHT] = $2;
}
if ($geometry =~ /[-+]([-+]?\d+)[-+]([-+]?\d+)/) {
$extends[GEOMETRY_X] = $1;
$extends[GEOMETRY_Y] = $2;
}
@extends;
}
Crian
 2004-06-08 18:45
#42228 #42228
User since
2003-08-04
5866 Artikel
ModeratorIn
[Homepage]
user image
Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
#!/usr/bin/perl
use strict;
use warnings;

use constant GEOMETRY_WIDTH  => 0;
use constant GEOMETRY_HEIGHT => 1;
use constant GEOMETRY_X      => 2;
use constant GEOMETRY_Y      => 3;


my $geom = "800x600-750-1010";

print "'$geom' liefert '", join(", ", parse_geometry_string($geom)), "'.\n";

sub parse_geometry_string {
  my $geometry = shift;
  my @extends = (0, 0, 0, 0);
  if ($geometry =~ /([-+]?\d+)x([-+]?\d+)/) {
      $extends[GEOMETRY_WIDTH] = $1;
      $extends[GEOMETRY_HEIGHT] = $2;
  }
  if ($geometry =~ /[-+]([-+]?\d+)[-+]([-+]?\d+)/) {
      $extends[GEOMETRY_X] = $1;
      $extends[GEOMETRY_Y] = $2;
  }
  @extends;
}


=>

Code: (dl )
'800x600-750-1010' liefert '800, 600, 750, 1010'.


Richtig wäre aber, entweder die Bildschirmgröße zu bestimmen und die negativen Werte von den Ausdehnungen abzuziehen, oder aber die negativen Werte als solche weiter zu reichen.


Die negativen Werte zu bekommen, erreicht man z.B. so:

Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
#!/usr/bin/perl
use strict;
use warnings;

use constant GEOMETRY_WIDTH  => 0;
use constant GEOMETRY_HEIGHT => 1;
use constant GEOMETRY_X      => 2;
use constant GEOMETRY_Y      => 3;


my $geom = "800x600-750-1010";

print "'$geom' liefert '", join(", ", parse_geometry_string2($geom)), "'.\n";

sub parse_geometry_string {
  my $geometry = shift;
  my @extends = (0, 0, 0, 0);
  if ($geometry =~ /([-+]?\d+)x([-+]?\d+)/) {
      $extends[GEOMETRY_WIDTH] = $1;
      $extends[GEOMETRY_HEIGHT] = $2;
  }
  if ($geometry =~ /[-+]([-+]?\d+)[-+]([-+]?\d+)/) {
      $extends[GEOMETRY_X] = $1;
      $extends[GEOMETRY_Y] = $2;
  }
  @extends;
}

sub parse_geometry_string2 {
  my $geometry = shift;
  my @extends = (0, 0, 0, 0);
  if ($geometry =~ /([-+]?\d+)x([-+]?\d+)/) {
      $extends[GEOMETRY_WIDTH] = $1;
      $extends[GEOMETRY_HEIGHT] = $2;
  }
  if ($geometry =~ /([-+]\d+)([-+]\d+)/) {
      $extends[GEOMETRY_X] = $1;
      $extends[GEOMETRY_Y] = $2;
  }
  @extends;
}


=>

Code: (dl )
'800x600-750-1010' liefert '800, 600, -750, -1010'.




Will man den anderen Weg beschreiten, bekommt man die Auflösung so heraus:

Code: (dl )
1
2
my $screenHeight = $mw->screenheight();
my $screenWidth = $mw->screenwidth();
\n\n

<!--EDIT|Crian|1086706900-->
s--Pevna-;s.([a-z]).chr((ord($1)-84)%26+97).gee; s^([A-Z])^chr((ord($1)-52)%26+65)^gee;print;

use strict; use warnings; Link zu meiner Perlseite
ptk
 2004-06-08 19:02
#42229 #42229
User since
2003-11-28
3645 Artikel
ModeratorIn
[default_avatar]
Stimmt.
<< |< 1 2 >| >> 12 Einträge, 2 Seiten



View all threads created 2004-06-07 22:57.