Games-Axmud
view release on metacpan or search on metacpan
lib/Games/Axmud/Win/External.pm view on Meta::CPAN
# Check for improper arguments
if (defined $check) {
return $axmud::CLIENT->writeImproper($self->_objClass . '->winEnable', @_);
}
# Update IVs to be consistent with 'internal' windows
$self->ivPoke('enabledFlag', TRUE);
return 1;
}
sub winDisengage {
# Called by GA::Cmd->BanishWindow->do
#
# Destroys the window object, but not the window itself, leaving the 'external' window free
# to pursue its own dreams
# Marks the area of the zone the window used to occupy as free, and available for other
# workspace grid windows
#
# Expected arguments
# (none besides $self)
#
# Return values
# 'undef' on improper arguments or if the window has already been disengaged in a previous
# call to this function
# 1 if the window is disengaged
my ($self, $check) = @_;
# Local variables
my ($zoneObj, $flag);
# Check for improper arguments
if (defined $check) {
return $axmud::CLIENT->writeImproper($self->_objClass . '->winDisengage', @_);
}
if (! $self->internalID) {
# Window already disengaged in a previous call to this function
return undef;
}
# 'External' windows can't have child windows. But, the IV storing child windows exists, so
# in case someone decides to add some child windows anyway, close them
foreach my $winObj ($self->ivValues('childFreeWinHash')) {
$winObj->winDestroy();
}
# Inform the parent workspace grid object (if any)
if ($self->workspaceGridObj) {
$self->workspaceGridObj->del_gridWin($self);
}
# Inform the desktop object
$axmud::CLIENT->desktopObj->del_gridWin($self);
# Look for other 'grid' windows (besides this one) handling the same 'external' window. If
# there are none, it's safe to minimise the 'external' window
if (defined $self->internalID) {
OUTER: foreach my $winObj ($axmud::CLIENT->desktopObj->ivValues('gridWinHash')) {
if (
$winObj->winType eq 'external'
&& $self->internalID
&& $winObj->internalID
&& $self->internalID eq $winObj->internalID
) {
$flag = TRUE;
last OUTER;
}
}
if (! $flag) {
# Minimise the window so that, visually, it appears to have been removed from
# Axmud's control
$self->minimise();
}
}
# Operation complete
$self->ivUndef('internalID');
return 1;
}
sub winDestroy {
# Called by ->signal_connects in $self->setDeleteEvent and ->setWindowClosedEvent
# Marks the area of the zone the window used to occupy as free, and available for other
# workspace grid windows
#
# Expected arguments
# (none besides $self)
#
# Return values
# 'undef' on improper arguments or if the window has already been disengaged in a previous
# call to this function
# 1 if the window is disengaged
my ($self, $check) = @_;
# Check for improper arguments
if (defined $check) {
return $axmud::CLIENT->writeImproper($self->_objClass . '->winDestroy', @_);
}
if (! $self->internalID) {
# Window already disengaged in a previous call to this function
return undef;
}
# 'External' windows can't have child windows. But, the IV storing child windows exists,
# so in case someone decides to add some child windows anyway, close them
foreach my $winObj ($self->ivValues('childFreeWinHash')) {
$winObj->winDestroy();
}
# Inform the parent workspace grid object (if any)
if ($self->workspaceGridObj) {
$self->workspaceGridObj->del_gridWin($self);
}
# Inform the desktop object
$axmud::CLIENT->desktopObj->del_gridWin($self);
# Inform the ->owner, if there is one
if ($self->owner) {
$self->owner->del_winObj($self);
}
# Operation complete
$self->ivUndef('internalID');
return 1;
}
# sub winShowAll {} # Inherited from GA::Generic::Win
# sub drawWidgets {} # Inherited from GA::Generic::Win
# sub redrawWidgets {} # Inherited from GA::Generic::Win
# ->signal_connects
sub setDeleteEvent {
# Called by $self->winEnable
# Does nothing (there is no way to detect that the 'external' window has closed)
#
# Expected arguments
# (none besides $self)
#
# Return values
# 'undef' on improper arguments
# 1 otherwise
my ($self, $winBox, $check) = @_;
# Check for improper arguments
if (defined $check) {
return $axmud::CLIENT->writeImproper($self->_objClass . '->setDeleteEvent', @_);
}
# (Do nothing)
return 1;
}
sub setWindowClosedEvent {
# Called by $self->winEnable
# Does nothing (there is no way to detect that the 'external' window has closed)
#
# Expected arguments
# (none besides $self)
#
# Return values
# 'undef' on improper arguments
# 1 otherwise
my ($self, $check) = @_;
# Check for improper arguments
if (defined $check) {
return $axmud::CLIENT->writeImproper($self->_objClass . '->setWindowClosedEvent', @_);
}
# (Do nothing)
return 1;
}
# Other functions
sub minimise {
# Can be called by anything
# Minimises the 'external' window
#
# NB The author of X11::WMCtrl reports that 'Currently minimize() and unminimize() don't
# work. This appears to be a problem with wmctrl itself'
#
# Expected arguments
# (none besides $self)
#
# Return values
# 'undef' on improper arguments or if the window can't be minimised
# 1 otherwise
my ($self, $check) = @_;
# Check for improper arguments
if (defined $check) {
return $axmud::CLIENT->writeImproper($self->_objClass . '->minimise', @_);
}
if (! $self->internalID) {
return undef;
} else {
# Unmaximise the window
$axmud::CLIENT->desktopObj->wmCtrlObj->wmctrl(
'-r',
$self->internalID,
'-i',
'-b',
'remove,maximised_vert,maximised_horz',
);
# Then minimise it
$axmud::CLIENT->desktopObj->wmCtrlObj->wmctrl(
'-r',
$self->internalID,
'-i',
'-b',
'add,hidden',
);
return 1
}
}
sub unminimise {
# Can be called by anything
# Unminimises the 'external' window
#
# NB The author of X11::WMCtrl reports that 'Currently minimize() and unminimize() don't
# work. This appears to be a problem with wmctrl itself'
#
# Expected arguments
# (none besides $self)
#
# Return values
# 'undef' on improper arguments or if the window can't be unminimised
# 1 otherwise
my ($self, $check) = @_;
# Check for improper arguments
if (defined $check) {
return $axmud::CLIENT->writeImproper($self->_objClass . '->unminimise', @_);
}
if (! $self->internalID) {
return undef;
} else {
# Unminimise the window
$axmud::CLIENT->desktopObj->wmCtrlObj->wmctrl(
'-r',
$self->internalID,
'-i',
'-b',
'remove,hidden',
);
return 1;
}
}
##################
# Accessors - set
##################
# Accessors - get
sub internalID
{ $_[0]->{internalID} }
}
# Package must return a true value
1
( run in 0.691 second using v1.01-cache-2.11-cpan-f56aa216473 )