Games-Axmud
view release on metacpan or search on metacpan
lib/Games/Axmud/Win/Internal.pm view on Meta::CPAN
# Inform the desktop object
$axmud::CLIENT->desktopObj->del_gridWin($self);
# Halt the client
$axmud::CLIENT->stop();
# Allow Gtk3 to close the window directly
return undef;
});
} else {
$self->winBox->signal_connect('delete-event' => sub {
# Prompt the user for confirmation, if required
if ($self->winType eq 'main' && ! $self->checkConnectedSessions()) {
# Don't close the 'main' window
return 1;
}
# Prevent Gtk3 from taking action directly. Instead redirect the request to
# $self->winDestroy, which does things like resetting a portion of the workspace
# grid, as well as actually destroying the window
return $self->winDestroy();
});
}
return 1;
}
sub setKeyPressEvent {
# Called by $self->winSetup
# Set up a ->signal_connect to watch out for certain key presses
#
# Expected arguments
# (none besides $self)
#
# Return values
# 'undef' on improper arguments or if the ->signal_connect doesn't interfere with the key
# press
# 1 if the ->signal_connect does interfere with the key press, or when the
# ->signal_connect is first set up
my ($self, $check) = @_;
# Check for improper arguments
if (defined $check) {
return $axmud::CLIENT->writeImproper($self->_objClass . '->setKeyPressEvent', @_);
}
$self->winBox->signal_connect('key-press-event' => sub {
my ($widget, $event) = @_;
# Local variables
my (
$keycode, $standard, $string, $directFlag, $stripObj, $paneObj, $tabObj,
$splitScreenMode, $textView, $slice, $clipboard, $vAdjust, $high, $length,
$modValue, $entryText, $bufferObj, $startIter, $endIter,
@list,
);
# Get the system keycode for this keypress
$keycode = Gtk3::Gdk::keyval_name($event->keyval);
# Translate it into a standard Axmud keycode
$standard = $axmud::CLIENT->reverseKeycode($keycode);
# If it's a CTRL, SHIFT, ALT or ALT-GR keypress, set IVs
if ($standard eq 'ctrl') {
$self->ivPoke('ctrlKeyFlag', TRUE);
$self->ivPoke('modifierKeyFlag', TRUE);
} elsif ($standard eq 'shift') {
$self->ivPoke('shiftKeyFlag', TRUE);
$self->ivPoke('modifierKeyFlag', TRUE);
} elsif ($standard eq 'alt') {
$self->ivPoke('altKeyFlag', TRUE);
$self->ivPoke('modifierKeyFlag', TRUE);
} elsif ($standard eq 'alt_gr') {
$self->ivPoke('altGrKeyFlag', TRUE);
$self->ivPoke('modifierKeyFlag', TRUE);
}
# Now, create a keycode string, containing a sequence of keycodes (for example, the F5
# key creates a keycode string containing a single keycode - 'F5' - but CTRL+SHIFT+F5
# produces the keycode string 'ctrl shift f5')
if ($self->ctrlKeyFlag) {
if ($standard ne 'ctrl') {
push (@list, 'ctrl');
}
}
if ($self->shiftKeyFlag) {
if ($standard ne 'shift') {
push (@list, 'shift');
}
}
if ($self->altKeyFlag) {
if ($standard ne 'alt') {
push (@list, 'alt');
}
}
if ($self->altGrKeyFlag) {
lib/Games/Axmud/Win/Internal.pm view on Meta::CPAN
)
) {
# Return 1 to show that we have interfered with this keypress
return 1;
}
}
}
# We don't want to call GA::Session->checkMacros for every keypress (that would be
# inefficient)
# Instead, call it if this is a 'main' window, and if this keycode string is being used
# by any macro in any session (not perfectly efficient, but better)
if (
$self->visibleSession
&& $axmud::CLIENT->ivExists('activeKeycodeHash', $string)
&& $self->visibleSession->checkMacros($string)
) {
# Return 1 to show that we have interfered with this keypress (by firing a macro)
return 1;
}
# If no macro fired as a result of the keypress, then we can process some special keys
# The first pane object in the entry strip object's ->paneObjList is the one to which
# keypresses are applied
if ($stripObj) {
$paneObj = $stripObj->ivFirst('paneObjList');
} else {
# If there's no entry, then use the first pane object created in this window
$paneObj = $self->findTableObj('pane');
}
if ($paneObj) {
# Get the pane's visible tab and the scrollable Gtk3::Textview
$tabObj = $paneObj->getVisibleTab();
if ($tabObj) {
$splitScreenMode = $tabObj->textViewObj->splitScreenMode;
if ($splitScreenMode eq 'split') {
$textView = $tabObj->textViewObj->textView2;
} else {
$textView = $tabObj->textViewObj->textView;
}
}
}
# The CTRL+C combination tends to be CTRL+SHIFT+C in Gtk, which is very inconvenient.
# Implement a quick-and-dirty CTRL+C instead
if ($string eq 'ctrl c' && $tabObj) {
($startIter, $endIter) = $tabObj->textViewObj->buffer->get_selection_bounds();
if (defined $endIter) {
$slice = $tabObj->textViewObj->buffer->get_slice($startIter, $endIter, FALSE);
if (defined $slice && $slice ne '') {
$clipboard = Gtk3::Clipboard::get(Gtk3::Gdk::Atom::intern('CLIPBOARD', 0));
if ($clipboard) {
$clipboard->set_text($slice);
# Return 1 to show that we have interfered with this keypress
return 1;
}
}
}
# If the page up/page down/home/end keys have been pressed, scroll the vertical
# scrollbar containing the textview object
} elsif (
(
$standard eq 'page_up' || $standard eq 'page_down' || $standard eq 'home'
|| $standard eq 'end'
)
&& $tabObj
&& $axmud::CLIENT->useScrollKeysFlag
) {
$vAdjust = $textView->get_vadjustment();
# Get the lowest and highest vertical positions of the scrollbar, and the distance
# between them
$high = ($vAdjust->get_upper() - $vAdjust->get_page_size());
$length = $high - $vAdjust->get_lower();
$modValue = $vAdjust->get_value();
# Set the new position of the vertical scrollbar (assuming one is visible)
if ($length) {
if (
$axmud::CLIENT->autoSplitKeysFlag
&& $modValue >= $high
&& (
(
$splitScreenMode ne 'split'
&& ($standard eq 'page_up' || $standard eq 'home')
) || (
$splitScreenMode eq 'split'
&& ($standard eq 'page_down' || $standard eq 'end')
)
)
) {
# Engage/disengage the textview object's split screen mode, if necessary
$paneObj->toggleSplitScreen();
} else {
if ($standard eq 'page_up') {
# Scroll up
if (! $axmud::CLIENT->smoothScrollKeysFlag) {
$modValue -= $vAdjust->get_page_size();
} else {
$modValue -= $vAdjust->get_page_increment();
}
if ($modValue < 0) {
$modValue = 0;
}
( run in 0.696 second using v1.01-cache-2.11-cpan-84e82930d8c )