Author: dylan
Date: 2004-05-27 00:47:45 -0400 (Thu, 27 May 2004)
New Revision: 170
Added:
trunk/haver-gtk/Build.PL
trunk/haver-gtk/COPYING
trunk/haver-gtk/MANIFEST.SKIP
trunk/haver-gtk/bin/
trunk/haver-gtk/bin/haver-gtk.pl
Removed:
trunk/haver-gtk/haver-gtk.pl
Log:
CPAN-ified haver-gtk. :)
Added: trunk/haver-gtk/Build.PL
===================================================================
--- trunk/haver-gtk/Build.PL 2004-05-27 03:45:57 UTC (rev 169)
+++ trunk/haver-gtk/Build.PL 2004-05-27 04:47:45 UTC (rev 170)
@@ -0,0 +1,23 @@
+#!/usr/bin/perl
+use Module::Build;
+my $build = Module::Build->new(
+# module_name => 'Haver::Client::Gtk',
+ dist_name => 'haver-gtk',
+ dist_version_from => 'bin/haver-gtk.pl',
+ dist_author => 'Bryan Donlan <[EMAIL PROTECTED]>',
+ dist_abstract => 'Gtk haver client',
+ license => 'gpl',
+ requires => {
+ 'perl' => '5.8.0',
+ POE => 0.27,
+ Gtk => 0.7009,
+ Haver => 0.06,
+ 'POE::Component::Client::Haver' => 0.06
+ },
+ create_makefile_pl => 'passthrough',
+ script_files => [glob('bin/*.pl')],
+);
+
+$build->create_build_script;
+
+
Property changes on: trunk/haver-gtk/Build.PL
___________________________________________________________________
Name: svn:executable
+ *
Added: trunk/haver-gtk/COPYING
===================================================================
--- trunk/haver-gtk/COPYING 2004-05-27 03:45:57 UTC (rev 169)
+++ trunk/haver-gtk/COPYING 2004-05-27 04:47:45 UTC (rev 170)
@@ -0,0 +1,326 @@
+ GNU GENERAL PUBLIC LICENSE
+ Version 2, June 1991
+
+ Copyright (C) 1989, 1991 Free Software Foundation, Inc.
+ 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+ Preamble
+
+ The licenses for most software are designed to take away your freedom to
+share and change it. By contrast, the GNU General Public License is intended
+to guarantee your freedom to share and change free software--to make sure the
+software is free for all its users. This General Public License applies to
+most of the Free Software Foundation's software and to any other program whose
+authors commit to using it. (Some other Free Software Foundation software is
+covered by the GNU Library General Public License instead.) You can apply it
+to your programs, too.
+
+ When we speak of free software, we are referring to freedom, not price. Our
+General Public Licenses are designed to make sure that you have the freedom to
+distribute copies of free software (and charge for this service if you wish),
+that you receive source code or can get it if you want it, that you can change
+the software or use pieces of it in new free programs; and that you know you
+can do these things.
+
+ To protect your rights, we need to make restrictions that forbid anyone to
+deny you these rights or to ask you to surrender the rights. These
+restrictions translate to certain responsibilities for you if you distribute
+copies of the software, or if you modify it.
+
+ For example, if you distribute copies of such a program, whether gratis or
+for a fee, you must give the recipients all the rights that you have. You
+must make sure that they, too, receive or can get the source code. And you
+must show them these terms so they know their rights.
+
+ We protect your rights with two steps: (1) copyright the software, and (2)
+offer you this license which gives you legal permission to copy, distribute
+and/or modify the software.
+
+ Also, for each author's protection and ours, we want to make certain that
+everyone understands that there is no warranty for this free software. If the
+software is modified by someone else and passed on, we want its recipients to
+know that what they have is not the original, so that any problems introduced
+by others will not reflect on the original authors' reputations.
+
+ Finally, any free program is threatened constantly by software patents. We
+wish to avoid the danger that redistributors of a free program will
+individually obtain patent licenses, in effect making the program proprietary.
+To prevent this, we have made it clear that any patent must be licensed for
+everyone's free use or not licensed at all.
+
+ The precise terms and conditions for copying, distribution and modification
+follow.
+
+ GNU GENERAL PUBLIC LICENSE
+ TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
+
+ 0. This License applies to any program or other work which contains a notice
+placed by the copyright holder saying it may be distributed under the terms of
+this General Public License. The "Program", below, refers to any such program
+or work, and a "work based on the Program" means either the Program or any
+derivative work under copyright law: that is to say, a work containing the
+Program or a portion of it, either verbatim or with modifications and/or
+translated into another language. (Hereinafter, translation is included
+without limitation in the term "modification".) Each licensee is addressed as
+"you".
+
+Activities other than copying, distribution and modification are not covered
+by this License; they are outside its scope. The act of running the Program
+is not restricted, and the output from the Program is covered only if its
+contents constitute a work based on the Program (independent of having been
+made by running the Program). Whether that is true depends on what the
+Program does.
+
+ 1. You may copy and distribute verbatim copies of the Program's source code
+as you receive it, in any medium, provided that you conspicuously and
+appropriately publish on each copy an appropriate copyright notice and
+disclaimer of warranty; keep intact all the notices that refer to this License
+and to the absence of any warranty; and give any other recipients of the
+Program a copy of this License along with the Program.
+
+You may charge a fee for the physical act of transferring a copy, and you may
+at your option offer warranty protection in exchange for a fee.
+
+ 2. You may modify your copy or copies of the Program or any portion of it,
+thus forming a work based on the Program, and copy and distribute such
+modifications or work under the terms of Section 1 above, provided that you
+also meet all of these conditions:
+
+ a) You must cause the modified files to carry prominent notices
+ stating that you changed the files and the date of any change.
+
+ b) You must cause any work that you distribute or publish, that in
+ whole or in part contains or is derived from the Program or any
+ part thereof, to be licensed as a whole at no charge to all third
+ parties under the terms of this License.
+
+ c) If the modified program normally reads commands interactively
+ when run, you must cause it, when started running for such
+ interactive use in the most ordinary way, to print or display an
+ announcement including an appropriate copyright notice and a
+ notice that there is no warranty (or else, saying that you provide
+ a warranty) and that users may redistribute the program under
+ these conditions, and telling the user how to view a copy of this
+ License. (Exception: if the Program itself is interactive but
+ does not normally print such an announcement, your work based on
+ the Program is not required to print an announcement.)
+
+These requirements apply to the modified work as a whole. If identifiable
+sections of that work are not derived from the Program, and can be reasonably
+considered independent and separate works in themselves, then this License,
+and its terms, do not apply to those sections when you distribute them as
+separate works. But when you distribute the same sections as part of a whole
+which is a work based on the Program, the distribution of the whole must be on
+the terms of this License, whose permissions for other licensees extend to the
+entire whole, and thus to each and every part regardless of who wrote it.
+
+Thus, it is not the intent of this section to claim rights or contest your
+rights to work written entirely by you; rather, the intent is to exercise the
+right to control the distribution of derivative or collective works based on
+the Program.
+
+In addition, mere aggregation of another work not based on the Program with
+the Program (or with a work based on the Program) on a volume of a storage or
+distribution medium does not bring the other work under the scope of this
+License.
+
+ 3. You may copy and distribute the Program (or a work based on it, under
+Section 2) in object code or executable form under the terms of Sections 1 and
+2 above provided that you also do one of the following:
+
+ a) Accompany it with the complete corresponding machine-readable
+ source code, which must be distributed under the terms of Sections
+ 1 and 2 above on a medium customarily used for software interchange; or,
+
+ b) Accompany it with a written offer, valid for at least three
+ years, to give any third party, for a charge no more than your
+ cost of physically performing source distribution, a complete
+ machine-readable copy of the corresponding source code, to be
+ distributed under the terms of Sections 1 and 2 above on a medium
+ customarily used for software interchange; or,
+
+ c) Accompany it with the information you received as to the offer
+ to distribute corresponding source code. (This alternative is
+ allowed only for noncommercial distribution and only if you
+ received the program in object code or executable form with such
+ an offer, in accord with Subsection b above.)
+
+The source code for a work means the preferred form of the work for making
+modifications to it. For an executable work, complete source code means all
+the source code for all modules it contains, plus any associated interface
+definition files, plus the scripts used to control compilation and
+installation of the executable. However, as a special exception, the source
+code distributed need not include anything that is normally distributed (in
+either source or binary form) with the major components (compiler, kernel, and
+so on) of the operating system on which the executable runs, unless that
+component itself accompanies the executable.
+
+If distribution of executable or object code is made by offering access to
+copy from a designated place, then offering equivalent access to copy the
+source code from the same place counts as distribution of the source code,
+even though third parties are not compelled to copy the source along with the
+object code.
+
+ 4. You may not copy, modify, sublicense, or distribute the Program except as
+expressly provided under this License. Any attempt otherwise to copy, modify,
+sublicense or distribute the Program is void, and will automatically terminate
+your rights under this License. However, parties who have received copies, or
+rights, from you under this License will not have their licenses terminated so
+long as such parties remain in full compliance.
+
+ 5. You are not required to accept this License, since you have not signed
+it. However, nothing else grants you permission to modify or distribute the
+Program or its derivative works. These actions are prohibited by law if you
+do not accept this License. Therefore, by modifying or distributing the
+Program (or any work based on the Program), you indicate your acceptance of
+this License to do so, and all its terms and conditions for copying,
+distributing or modifying the Program or works based on it.
+
+ 6. Each time you redistribute the Program (or any work based on the
+Program), the recipient automatically receives a license from the original
+licensor to copy, distribute or modify the Program subject to these terms and
+conditions. You may not impose any further restrictions on the recipients'
+exercise of the rights granted herein. You are not responsible for enforcing
+compliance by third parties to this License.
+
+ 7. If, as a consequence of a court judgment or allegation of patent
+infringement or for any other reason (not limited to patent issues),
+conditions are imposed on you (whether by court order, agreement or otherwise)
+that contradict the conditions of this License, they do not excuse you from
+the conditions of this License. If you cannot distribute so as to satisfy
+simultaneously your obligations under this License and any other pertinent
+obligations, then as a consequence you may not distribute the Program at all.
+For example, if a patent license would not permit royalty-free redistribution
+of the Program by all those who receive copies directly or indirectly through
+you, then the only way you could satisfy both it and this License would be to
+refrain entirely from distribution of the Program.
+
+If any portion of this section is held invalid or unenforceable under any
+particular circumstance, the balance of the section is intended to apply and
+the section as a whole is intended to apply in other circumstances.
+
+It is not the purpose of this section to induce you to infringe any patents or
+other property right claims or to contest validity of any such claims; this
+section has the sole purpose of protecting the integrity of the free software
+distribution system, which is implemented by public license practices. Many
+people have made generous contributions to the wide range of software
+distributed through that system in reliance on consistent application of that
+system; it is up to the author/donor to decide if he or she is willing to
+distribute software through any other system and a licensee cannot impose that
+choice.
+
+This section is intended to make thoroughly clear what is believed to be a
+consequence of the rest of this License.
+
+ 8. If the distribution and/or use of the Program is restricted in certain
+countries either by patents or by copyrighted interfaces, the original
+copyright holder who places the Program under this License may add an explicit
+geographical distribution limitation excluding those countries, so that
+distribution is permitted only in or among countries not thus excluded. In
+such case, this License incorporates the limitation as if written in the body
+of this License.
+
+ 9. The Free Software Foundation may publish revised and/or new versions of
+the General Public License from time to time. Such new versions will be
+similar in spirit to the present version, but may differ in detail to address
+new problems or concerns.
+
+Each version is given a distinguishing version number. If the Program
+specifies a version number of this License which applies to it and "any later
+version", you have the option of following the terms and conditions either of
+that version or of any later version published by the Free Software
+Foundation. If the Program does not specify a version number of this License,
+you may choose any version ever published by the Free Software Foundation.
+
+ 10. If you wish to incorporate parts of the Program into other free programs
+whose distribution conditions are different, write to the author to ask for
+permission. For software which is copyrighted by the Free Software
+Foundation, write to the Free Software Foundation; we sometimes make
+exceptions for this. Our decision will be guided by the two goals of
+preserving the free status of all derivatives of our free software and of
+promoting the sharing and reuse of software generally.
+
+ NO WARRANTY
+
+ 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY FOR
+THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE
+STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE
+PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED,
+INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND
+PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE,
+YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
+
+ 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
+WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR
+REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES,
+INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING
+OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO
+LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR
+THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS),
+EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
+DAMAGES.
+
+ END OF TERMS AND CONDITIONS
+
+ How to Apply These Terms to Your New Programs
+
+ If you develop a new program, and you want it to be of the greatest possible
+use to the public, the best way to achieve this is to make it free software
+which everyone can redistribute and change under these terms.
+
+ To do so, attach the following notices to the program. It is safest to
+attach them to the start of each source file to most effectively convey the
+exclusion of warranty; and each file should have at least the "copyright" line
+and a pointer to where the full notice is found.
+
+ <one line to give the program's name and a brief idea of what it does.>
+ Copyright (C) 19yy <name of author>
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+
+
+Also add information on how to contact you by electronic and paper mail.
+
+If the program is interactive, make it output a short notice like this when it
+starts in an interactive mode:
+
+ Gnomovision version 69, Copyright (C) 19yy name of author
+ Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
+ This is free software, and you are welcome to redistribute it
+ under certain conditions; type `show c' for details.
+
+The hypothetical commands `show w' and `show c' should show the appropriate
+parts of the General Public License. Of course, the commands you use may be
+called something other than `show w' and `show c'; they could even be
+mouse-clicks or menu items--whatever suits your program.
+
+You should also get your employer (if you work as a programmer) or your
+school, if any, to sign a "copyright disclaimer" for the program, if
+necessary. Here is a sample; alter the names:
+
+ Yoyodyne, Inc., hereby disclaims all copyright interest in the program
+ `Gnomovision' (which makes passes at compilers) written by James Hacker.
+
+ <signature of Ty Coon>, 1 April 1989
+ Ty Coon, President of Vice
+
+This General Public License does not permit incorporating your program into
+proprietary programs. If your program is a subroutine library, you may
+consider it more useful to permit linking proprietary applications with the
+library. If this is what you want to do, use the GNU Library General Public
+License instead of this License.
Added: trunk/haver-gtk/MANIFEST.SKIP
===================================================================
--- trunk/haver-gtk/MANIFEST.SKIP 2004-05-27 03:45:57 UTC (rev 169)
+++ trunk/haver-gtk/MANIFEST.SKIP 2004-05-27 04:47:45 UTC (rev 170)
@@ -0,0 +1,11 @@
+\.old$
+\.bak
+store
+blib
+_build
+^Build$
+^\.#
+\.svn
+\.tar\.gz$
+^data
+^conf
Copied: trunk/haver-gtk/bin/haver-gtk.pl (from rev 169,
trunk/haver-gtk/haver-gtk.pl)
Deleted: trunk/haver-gtk/haver-gtk.pl
===================================================================
--- trunk/haver-gtk/haver-gtk.pl 2004-05-27 03:45:57 UTC (rev 169)
+++ trunk/haver-gtk/haver-gtk.pl 2004-05-27 04:47:45 UTC (rev 170)
@@ -1,631 +0,0 @@
-#!/usr/bin/perl -w
-# vim: set ft=perl ts=4 sw=4:
-# cmod.pl - Conspiracy game engine for Haver
-# Rules: http://norinel.aftran.com/stuff/usingcmod.html
-#
-# Copyright (C) 2004 Bryan Donlan, Dylan William Hardison.
-#
-# This module is free software; you can redistribute it and/or modify
-# it under the terms of the GNU General Public License as published by
-# the Free Software Foundation; either version 2 of the License, or
-# (at your option) any later version.
-#
-# This module is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-# GNU General Public License for more details.
-#
-# You should have received a copy of the GNU General Public License
-# along with this module; if not, write to the Free Software
-# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
-
-package main;
-
-use strict;
-use warnings;
-use constant {
- TRUE => 1,
- FALSE => 0,
-};
-
-# For data needed by page handlers as well as main code
-our %globals;
-
-sub POE::Kernel::ASSERT_DEFAULT {1}
-
-use Gtk;
-use Gtk::Keysyms;
-use POE qw(Component::Client::Haver);
-
-use Haver::OS;
-use Haver::Config;
-# XXX: Implement config files
-use Data::Dumper;
-use Carp;
-
-our $PACKAGE = __PACKAGE__;
-our $VERSION = 0.00;
-
-my %gui;
-# Connection window fields
-my @fields = qw{Address UID Password};
-my @required_fields = qw{Address UID};
-my @saved_fields = qw{Address UID};
-
-sub _call {
- return POE::Kernel->call(POE::Kernel->get_active_session(), @_);
-}
-
-my %pages;
-my @pages;
-
-sub get_page ($) {
- my $id = $_[0];
- if(ref($id)) {
- return $id;
- } elsif($id =~ /^[0-9]+$/) {
- return $pages[$id];
- } else {
- return $pages{$id};
- }
-}
-
-sub set_page ($) {
- my $hash = get_page $_[0];
- $gui{notebook}->set_page($hash->{pagenum});
-}
-
-sub add_page ($) {
- my ($hash) = @_;
- my $name = $hash->{name};
- if(exists $pages{$name}) {
- croak "Page already exists: $name with ", Dumper $pages{$name};
- }
- $hash->{string} = $name;
- $hash->{pagenum} = @pages;
- push @pages, $hash;
- $pages{$name} = $hash;
- $gui{notebook}->append_page($hash->{frame}, $hash->{label});
- $hash->{frame}->show;
- set_page $hash;
- return $hash;
-}
-
-sub create_page ($@) {
- my ($type, @args) = @_;
- require "Haver/Client/Gtk/Page/$type.pm";
- my $page = "Haver::Client::Gtk::Page::$type"->new(@args);
- return $page;
-}
-
-sub new_page ($@) {
- my ($type, @args) = @_;
- return add_page create_page($type, @args);
-}
-
-sub get_current_page () {
- my $page = $gui{notebook}->get_current_page();
- return get_page $page;
-}
-
-sub renumber_pages () {
- for(0..$#pages) {
- $pages[$_]->{pagenum} = $_;
- }
-}
-
-sub del_page ($) {
- my $id = $_[0];
- my $pagestruct = get_page $id;
- if(!defined $pagestruct) {
- carp "Warning: page $id not found";
- return;
- }
- $gui{notebook}->remove_page($pagestruct->{pagenum});
- delete $pages{$pagestruct->{string}};
- splice @pages, $pagestruct->{pagenum}, 1;
- renumber_pages();
-}
-
-sub get_query_page ($) {
- my $page = get_page "=$_[0]";
- if(!$page) {
- $page = new_page 'Query', $_[0];
- $page->print_page("Starting query with $_[0]");
- }
- return $page;
-}
-
-sub print_current (@) {
- return get_current_page()->print_page(@_);
-}
-
-my ($user, $confdir, $config);
-
-eval {
- $user = Haver::OS->current_user();
- $confdir = Haver::OS->config_find(
- scope => 'user',
- name => 'haver-gtk',
- type => 'dir',
- );
-
- $globals{config} = $config = Haver::Config->new(
- file => "$confdir/config",
- default => {
- UID => $ENV{USER} || '',
- Address => 'hardison.net:7070',
- },
- );
-};
-
-if ($@) {
- my $e = $@;
- set_locale Gtk;
- init Gtk;
- my $win = new Gtk::Window("toplevel");
- $win->set_title("haver-gtk");
- my $vbox = new Gtk::Vbox(FALSE, 0);
- my $lbl = new Gtk::Label("Error loading configuration file:\n\n$e");
- my $btn = new Gtk::Button("Quit");
- $vbox->pack_start($lbl, TRUE, TRUE, 0);
- $vbox->pack_start($btn, FALSE, FALSE, 0);
- $lbl->show;
- $btn->show;
- $win->add($vbox);
- $vbox->show;
- $win->show;
-
- $win->signal_connect("delete_event", sub { exit 1; });
- $btn->signal_connect("clicked", sub { exit 1; });
-
- main Gtk;
- exit 1;
-}
-
-POE::Session->create(
- package_states => [$PACKAGE => [qw{
- _start
- input
- entry_key_pressed
- connect_win
- do_connect
- quit
- haver_connected
- haver_connect_fail
- haver_disconnected
- haver_raw_in
- haver_raw_out
- haver_login_request
- haver_login
- haver_login_fail
- haver_msg
- haver_pmsg
- haver_joined
- haver_parted
- haver_join
- haver_part
- haver_quit
- haver_users
- cmd_join
- cmd_j
- cmd_users
- cmd_part
- cmd_quit
- cmd_msg
- cmd_act
- cmd_me
- cmd_query
- cmd_close
- }]]);
-
-POE::Kernel->run();
-
-$config->save;
-
-sub _start {
- my ( $kernel, $session, $heap ) = @_[ KERNEL, SESSION, HEAP ];
- POE::Component::Client::Haver->new("haver", version =>
"haver-gtk/$VERSION");
- $kernel->post("haver", "register", "all");
-
- # Create the main window
- $gui{main_window} = Gtk::Window->new("toplevel");
- $gui{main_window}->set_title("Haver-gtk $VERSION");
- $gui{main_window}->set_position("center");
- $kernel->signal_ui_destroy($gui{main_window});
-
- if(defined $config->{window_x} && defined $config->{window_x}
- && defined $config->{window_w} && defined $config->{window_h}) {
- # XXX: Sanity checks
-# $gui{main_window}->move_resize(
-# $config->{window_x},
- # $config->{window_y},
- # $config->{window_w},
- # $config->{window_h},
- #);
- $gui{main_window}->set_uposition($config->{window_x},
$config->{window_y});
- $gui{main_window}->set_usize($config->{window_w},
$config->{window_h});
- }
-
- $gui{main_window}->signal_connect("configure-event",
- sub {
- my ($win, $param) = @_;
- $config->{window_x} = $param->{x};
- $config->{window_y} = $param->{y};
- $config->{window_w} = $param->{width};
- $config->{window_h} = $param->{height};
- }
- );
-
- my $vbox = Gtk::VBox->new(0,0);
-
- my $notebook = $gui{notebook} = Gtk::Notebook->new();
- $notebook->set_tab_pos("bottom");
-
- $vbox->pack_start($notebook, 1, 1, 0);
- $notebook->show;
-
- my $entrybox = $gui{entrybox} = Gtk::HBox->new(FALSE, 0);
- $vbox->pack_start($entrybox, 0, 1, 0);
- $entrybox->show;
-
- my $entry = $gui{entry} = Gtk::Entry->new();
- $entry->signal_connect("key-press-event",
$session->postback("entry_key_pressed"));
- $entrybox->pack_start($entry, 1, 1, 0);
- $entry->show;
-
- my $send = $gui{sendbtn} = Gtk::Button->new("Send");
- $send->signal_connect("clicked", $session->postback("input"));
- $entrybox->pack_start($send, 0, 1, 0);
- $send->show;
-
- $gui{main_window}->add($vbox);
- $vbox->show;
-
- $gui{main_window}->show;
-
- new_page("Text", "Server");
- new_page("Text", "!rawlog");
- set_page 0;
-
- $kernel->yield('connect_win');
-}
-
-sub input {
- my ($kernel, $heap) = @_[KERNEL,HEAP];
- my $text = $gui{entry}->get_text;
- $gui{entry}->set_text('');
- if($text =~ m|^/(\w+)\s*(.*)$|) {
- _call("cmd_$1", $2);
- # XXX: Error on nonexistent command
- return;
- }
- if(get_current_page()->can('send_msg')) {
- get_current_page()->send_msg(q{"}, $text);
- }
-}
-
-sub entry_key_pressed {
- my $kernel = $_[KERNEL];
- my $event = $_[ARG1]->[1];
- if($event->{keyval} == $Gtk::Keysyms{Return}) {
- $kernel->yield('input');
- }
- # TODO: history
-}
-
-sub connect_win {
- my ($heap, $session) = @_[HEAP,SESSION];
- if(defined $gui{connect_win} || $heap->{exiting}) {
- return;
- }
- my %cw;
- $gui{connect_win} = \%cw;
-
- $cw{window} = Gtk::Window->new("toplevel");
- $cw{window}->set_modal(TRUE);
- $cw{window}->set_title("Connect to Haver server");
- $cw{window}->set_position("mouse");
-
- my $table = Gtk::Table->new(scalar(@fields) + 1, 2, FALSE);
- my $opts = [qw{fill shrink expand}];
-
- for my $i (0..$#fields) {
- my $label = Gtk::Label->new($fields[$i]);
- my $text = $cw{"field_$fields[$i]"} = Gtk::Entry->new();
-
- $table->attach($label, 0, 1, $i, $i + 1, $opts, $opts, 0, 0);
- $table->attach($text, 1, 2, $i, $i + 1, $opts, $opts, 0, 0);
-
- $label->show;
- $text->show;
- }
-
- $cw{"field_Password"}->set_visibility(FALSE);
-
- my $cbtn = $cw{connect_btn} = Gtk::Button->new("Connect");
- $cbtn->signal_connect("clicked", $session->postback("do_connect"));
- $table->attach($cbtn, 0, 1, scalar(@fields), scalar(@fields) + 1,
- $opts, $opts, 0, 0);
- $cbtn->show;
-
- my $qbtn = $cw{quit_btn} = Gtk::Button->new("Quit");
- $qbtn->signal_connect("clicked", $session->postback("quit"));
- $table->attach($qbtn, 1, 2, scalar(@fields), scalar(@fields) + 1,
- $opts, $opts, 0, 0);
- $qbtn->show;
-
- for(@saved_fields) {
- my $value = $config->{$_};
- if($value) {
- $cw{"field_$_"}->set_text($value);
- }
- }
-
- $cw{window}->add($table);
- $table->show;
- $cw{window}->show;
-}
-
-sub do_connect {
- my ($kernel, $heap) = @_[KERNEL,HEAP];
- my $info = {};
- if(!$gui{connect_win}) {
- carp "Eep! do_connect without connect_win";
- return;
- }
- for(@fields) {
- $info->{$_} = $gui{connect_win}->{"field_$_"}->get_text();
- }
- for(@required_fields) {
- return if (!defined $info->{$_} || $info->{$_} =~ /^\s*$/);
- }
- for(@saved_fields) {
- $config->{$_} = $info->{$_};
- }
- $info->{Address} =~ /^([^:]+)(?::(\d+))?$/ or return;
- $kernel->post("haver", "connect",
- Host => $1,
- Port => $2 || 7070,
- UID => $info->{UID},
- Password => $info->{Password},
- );
- get_page(0)->print_page("Connecting to $info->{Address}...");
- $gui{connect_win}{window}->destroy;
- delete $gui{connect_win};
- %globals = %$info;
-}
-
-sub quit {
- my ($kernel,$heap) = @_[KERNEL,HEAP];
- $gui{main_window}->destroy;
- $gui{connect_win}{window}->destroy if $gui{connect_win};
- $heap->{exiting} = 1;
- $kernel->post("haver", "destroy");
-}
-
-sub cmd_quit { goto &quit; }
-
-sub haver_connected {
- get_page(0)->print_page("Connected, logging in.");
-}
-
-sub haver_connect_fail {
- my $kernel = $_[KERNEL];
- my ($args, $scope) = @_[ARG0,ARG1];
- my ($enum, $estr) = @$args;
-
- get_page(0)->print_page("Connection error: $estr");
- $kernel->yield('connect_win');
-}
-
-sub haver_login_fail {
- my ($kernel, $args) = @_[KERNEL,ARG0];
- my $elong = $args->[2];
-
- get_page(0)->print_page("Login failure: $elong");
- $kernel->post('haver', 'disconnect');
-}
-
-sub haver_disconnected {
- my ($kernel, $heap) = @_[KERNEL,HEAP];
- get_page(0)->print_page("Disconnected");
- for(keys %pages) {
- next unless ($_ =~ /^\#/);
- del_page $_;
- }
- $heap->{clist} = {};
- $kernel->yield('connect_win');
-}
-sub haver_raw_in {
- my @data = @{$_[ARG0]};
- get_page('!rawlog')->print_page("S: " . join "\t", @data);
-}
-sub haver_raw_out {
- my @data = @{$_[ARG0]};
- get_page('!rawlog')->print_page("C: " . join "\t", @data);
-}
-sub haver_login_request {
- my $kernel = $_[KERNEL];
- get_page(0)->print_page("Login failed.");
- $kernel->post('haver', 'disconnect');
-}
-sub haver_login {
- get_page(0)->print_page("Logged in.");
- $_[HEAP]->{ready} = 1;
-}
-sub haver_msg {
- my ($kernel, $heap, $args, $chan) = @_[KERNEL,HEAP,ARG0,ARG1];
- my ($type, $from, $text) = (@$args)[0,1,2];
- my @lines = split "\n", $text;
- if($type eq q{"}) {
- get_page("#$chan")->print_page(map { "$from: $_" } @lines);
- } elsif ($type eq q{:}) {
- get_page("#$chan")->print_page(map { "* $from $_" } @lines);
- }
-}
-
-sub haver_pmsg {
- my ($kernel, $heap, $args) = @_[KERNEL,HEAP,ARG0];
- my ($type, $from, $text) = @$args;
- my @lines = split "\n", $text;
- if($type eq q{"}) {
- get_query_page($from)->print_page(map { "$from: $_" } @lines);
- } elsif ($type eq q{:}) {
- get_query_page($from)->print_page(map { "* $from $_" } @lines);
- }
-}
-
-sub haver_joined {
- my ($kernel, $heap, $channel) = @_[KERNEL,HEAP,ARG1];
- unless(exists $heap->{clist}->{$channel}) {
- get_page(0)->print_page("Joined $channel but didn't want to!");
- $kernel->post('haver', 'part', $channel);
- return;
- }
- return if(defined $heap->{clist}->{$channel});
- $heap->{clist}->{$channel} = new_page("Channel", "$channel");
- get_page("#$channel")->print_page("Joined $channel.");
- $kernel->post('haver', 'users', $channel);
-}
-
-sub cmd_join {
- my ($kernel, $heap, $chan) = @_[KERNEL,HEAP,ARG0];
- if(exists $heap->{clist}->{$chan}) {
- set_page "#$chan" if get_page "#$chan";
- return;
- }
- $kernel->post("haver", "join", $chan);
- $heap->{clist}->{$chan} = undef;
-}
-
-sub haver_join {
- my ($kernel, $heap, $args, $channel) = @_[KERNEL,HEAP,ARG0,ARG1];
- my $uid = $args->[0];
-
- my $page = get_page("#$channel");
- return unless $page;
- $page->add_ulist($uid);
- $page->print_page("$uid has joined $channel.");
-}
-
-sub haver_part {
- my ($kernel, $heap, $args, $channel) = @_[KERNEL,HEAP,ARG0,ARG1];
- my $uid = $args->[0];
-
- my $page = get_page("#$channel");
- return unless $page;
- $page->del_ulist($uid);
- $page->print_page("$uid has left $channel.");
-}
-
-sub haver_quit {
- my ($kernel, $heap, $args) = @_[KERNEL,HEAP,ARG0];
- my ($uid, $why) = @$args;
-
- for(keys %pages) {
- next unless $_ =~ /^\#/;
- my $page = $pages{$_};
- my $present = $page->del_ulist($uid);
- $page->print_page("$uid has quit: $why") if($present);
- }
-}
-
-sub cmd_j { goto &cmd_join }
-
-sub cmd_users {
- my ($kernel, $heap, $args) = @_[KERNEL,HEAP,ARG0];
- my $chan;
- if($args =~ /^(\w+)/) {
- $chan = $1;
- } else {
- $chan = get_current_page()->{string};
- unless($chan =~ s/^\#//) {
- print_current "That command can only be used in a
channel window.";
- return;
- }
- }
- $kernel->post('haver', 'users', $chan);
-}
-
-sub haver_users {
- my ($kernel, $heap, $args, $chan) = @_[KERNEL,HEAP,ARG0,ARG1];
- my @users = @$args;
- get_page("#$chan")->set_ulist(@users);
- get_page("#$chan")->print_page("Users for channel $chan:", join(" - ",
@users)); # XXX: Split into multiple lines
-}
-
-sub haver_parted {
- my ($kernel, $heap, $chan) = @_[KERNEL,HEAP,ARG1];
- my $page = delete $heap->{clist}->{$chan};
- return unless defined $page;
- del_page $page;
-}
-
-sub cmd_part {
- my ($kernel, $heap, $chan) = @_[KERNEL,HEAP,ARG0];
- unless($chan =~ s/^\#?(\w+)$/$1/) {
- if($chan eq '') {
- $chan = get_current_page()->{string};
- unless($chan =~ s/^\#//) {
- print_current "This is not a channel tab";
- return;
- }
- } else {
- print_current "Syntax: /part [channel]";
- }
- }
- if(!defined $heap->{clist}->{$chan}) {
- delete $heap->{clist}->{$chan};
- return;
- }
- $kernel->post('haver', 'part', $chan);
-}
-
-sub cmd_msg {
- my ($kernel, $heap, $args) = @_[KERNEL,HEAP,ARG0];
- unless($args =~ /^\s*(\S+)\s*(.+)$/) {
- print_current "Syntax: /msg UID text";
- return;
- }
- get_query_page($1)->send_msg(q{"}, $2);
-}
-
-sub cmd_act {
- my ($kernel, $heap, $args) = @_[KERNEL,HEAP,ARG0];
- unless($args =~ /^\s*(\S+)\s*(.+)$/) {
- print_current "Syntax: /msg UID text";
- return;
- }
- get_query_page($1)->send_msg(q{:}, $2);
-}
-
-sub cmd_me {
- my ($kernel, $heap, $args) = @_[KERNEL,HEAP,ARG0];
- return unless(get_current_page()->can('send_msg'));
- get_current_page()->send_msg(q{:}, $args);
-}
-
-sub cmd_query {
- my ($kernel, $heap, $args) = @_[KERNEL,HEAP,ARG0];
- set_page get_query_page($args);
-}
-
-sub cmd_close {
- my ($kernel, $heap, $args) = @_[KERNEL,HEAP,ARG0];
- my $page = get_current_page();
- unless($args =~ /^\s*$/) {
- $page = get_page($args);
- if(!$page) {
- print_current "No such page $args";
- return;
- }
- }
- if($page->can("close")) {
- if($page->close()) {
- del_page $page;
- }
- } else {
- print_current "Can't close that kind of page, sorry :(";
- }
-}