100% found this document useful (12 votes)
139 views

PDF Open Source Messaging Application Development Building and Extending Gaim 1st Edition Sean Egan download

Messaging

Uploaded by

thoretabbst1
Copyright
© © All Rights Reserved
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as PDF, TXT or read online on Scribd
100% found this document useful (12 votes)
139 views

PDF Open Source Messaging Application Development Building and Extending Gaim 1st Edition Sean Egan download

Messaging

Uploaded by

thoretabbst1
Copyright
© © All Rights Reserved
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as PDF, TXT or read online on Scribd
You are on page 1/ 60

Download the full version of the ebook at ebookname.

com

Open Source Messaging Application Development


Building and Extending Gaim 1st Edition Sean Egan

https://ebookname.com/product/open-source-messaging-
application-development-building-and-extending-gaim-1st-
edition-sean-egan/

OR CLICK BUTTON

DOWNLOAD EBOOK

Download more ebook instantly today at https://ebookname.com


Instant digital products (PDF, ePub, MOBI) available
Download now and explore formats that suit you...

CodeIgniter for Rapid PHP Application Development Improve


your PHP coding productivity with the free compact open
source MVC CodeIgniter framework 1st Edition David Upton
https://ebookname.com/product/codeigniter-for-rapid-php-application-
development-improve-your-php-coding-productivity-with-the-free-
compact-open-source-mvc-codeigniter-framework-1st-edition-david-upton/
ebookname.com

Pentaho Kettle Solutions Building Open Source ETL


Solutions with Pentaho Data Integration 1st Edition Matt
Casters
https://ebookname.com/product/pentaho-kettle-solutions-building-open-
source-etl-solutions-with-pentaho-data-integration-1st-edition-matt-
casters/
ebookname.com

Enterprise Integration Patterns Designing Building and


Deploying Messaging Solutions 1st Edition Hohpe

https://ebookname.com/product/enterprise-integration-patterns-
designing-building-and-deploying-messaging-solutions-1st-edition-
hohpe/
ebookname.com

Climate Change Science and Policy 1st Edition Stephen H.


Schneider

https://ebookname.com/product/climate-change-science-and-policy-1st-
edition-stephen-h-schneider/

ebookname.com
Comparative Social Policy Theory and Research Introducing
Social Policy 1st Edition Patricia Kennett

https://ebookname.com/product/comparative-social-policy-theory-and-
research-introducing-social-policy-1st-edition-patricia-kennett/

ebookname.com

Unequal Britain Pat Thane

https://ebookname.com/product/unequal-britain-pat-thane/

ebookname.com

Case Studies in Emergency Medicine 1st Edition Rebecca


Jeanmonod Md

https://ebookname.com/product/case-studies-in-emergency-medicine-1st-
edition-rebecca-jeanmonod-md/

ebookname.com

Master traders strategies for superior returns from today


s top traders 1st Edition Fari Hamzei

https://ebookname.com/product/master-traders-strategies-for-superior-
returns-from-today-s-top-traders-1st-edition-fari-hamzei/

ebookname.com

TERRALOG Turtles of the World Vol 1 Africa Europe and


Western Asia SECOND REVISED EXPANDED EDITION 2011 English
and German Edition Holger Vetter
https://ebookname.com/product/terralog-turtles-of-the-world-
vol-1-africa-europe-and-western-asia-second-revised-expanded-
edition-2011-english-and-german-edition-holger-vetter/
ebookname.com
Explaining social behavior more nuts and bolts for the
social sciences Elster

https://ebookname.com/product/explaining-social-behavior-more-nuts-
and-bolts-for-the-social-sciences-elster/

ebookname.com
Egan_467-3Front.fm Page i Monday, June 27, 2005 11:00 AM

Open Source Messaging


Application Development:
Building and Extending Gaim
SEAN EGAN
Egan_467-3Front.fm Page ii Monday, June 27, 2005 11:00 AM

Open Source Messaging Application Development: Building and Extending Gaim


Copyright © 2005 by Sean Egan
All rights reserved. No part of this work may be reproduced or transmitted in any form or by any means,
electronic or mechanical, including photocopying, recording, or by any information storage or retrieval
system, without the prior written permission of the copyright owner and the publisher.
ISBN (pbk): 1-59059-467-3
Printed and bound in the United States of America 9 8 7 6 5 4 3 2 1
Trademarked names may appear in this book. Rather than use a trademark symbol with every occurrence
of a trademarked name, we use the names only in an editorial fashion and to the benefit of the trademark
owner, with no intention of infringement of the trademark.
Lead Editor: Jason Gilmore
Technical Reviewer: Nathan Walp
Editorial Board: Steve Anglin, Dan Appleman, Ewan Buckingham, Gary Cornell, Tony Davis, Jason Gilmore,
Jonathan Hassell, Chris Mills, Dominic Shakeshaft, Jim Sumser
Associate Publisher: Grace Wong
Project Manager: Beth Christmas
Copy Edit Manager: Nicole LeClerc
Copy Editor: Candace English
Production Manager: Kari Brooks-Copony
Production Editor: Kelly Winquist
Compositor: Susan Glinert and Wordstop Technologies Pvt. Ltd., Chennai
Proofreader: Linda Seifert
Indexer: Broccoli Information Services
Artist: Kinetic Publishing Services, LLC
Cover Designer: Kurt Krames
Manufacturing Manager: Tom Debolski
Distributed to the book trade in the United States by Springer-Verlag New York, Inc., 233 Spring Street, 6th
Floor, New York, NY 10013, and outside the United States by Springer-Verlag GmbH & Co. KG,
Tiergartenstr. 17, 69112 Heidelberg, Germany.
In the United States: phone 1-800-SPRINGER, fax 201-348-4505, e-mail orders@springer-ny.com, or visit
http://www.springer-ny.com. Outside the United States: fax +49 6221 345229, e-mail orders@spriger.de,
or visit http://springer.de.
For information on translations, please contact Apress directly at 2560 Ninth Street, Suite 219, Berkeley, CA
94710. Phone 510-549-5930, fax 510-549-5939, e-mail info@apress.com, or visit http://www.apress.com.
The information in this book is distributed on an “as is” basis, without warranty. Although every
precaution has been taken in the preparation of this work, neither the author(s) nor Apress shall have any
liability to any person or entity with respect to any loss or damage caused or alleged to be caused directly
or indirectly by the information contained in this work.
The source code for this book is available to readers at http://www.apress.com in the Downloads section.
Egan_467-3Front.fm Page iii Monday, June 27, 2005 11:00 AM

For Dad
Egan_467-3Front.fm Page iv Monday, June 27, 2005 11:00 AM
Egan_467-3Front.fm Page v Monday, June 27, 2005 11:00 AM

Contents at a Glance

About the Author . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . xv


About the Technical Reviewer . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . xvii
Acknowledgments . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . xix
Introduction . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . xxi

CHAPTER 1 Getting Started . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1


CHAPTER 2 The Open Source Development Process . . . . . . . . . . . . . . . . . . . . . . 23
CHAPTER 3 Development Tools . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 37
CHAPTER 4 Programming Gaim . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 85
CHAPTER 5 GTK+ Basics . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 113
CHAPTER 6 Advanced GTK+ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 197
CHAPTER 7 Sockets . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 237
CHAPTER 8 Protocol Plug-Ins . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 267
CHAPTER 9 Internationalization . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 299
CHAPTER 10 Portability . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 319

INDEX . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 337

v
Egan_467-3Front.fm Page vi Monday, June 27, 2005 11:00 AM
Egan_467-3Front.fm Page vii Monday, June 27, 2005 11:00 AM

Contents

About the Author . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . xv


About the Technical Reviewer . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . xvii
Acknowledgments . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . xix
Introduction . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . xxi

■CHAPTER 1 Getting Started .............................................1

History of IM . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1
History of Gaim . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2
Setting Up Your Build Environment . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3
Cygwin . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3
MinGW . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9
Library Dependencies. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10
Getting Gaim . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12
Configuring Gaim . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13
Compiling Gaim . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 14
Using Gaim . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 15
Adding a New Account . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 15
Accounts . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 16
Buddy List . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 17
Preferences . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 18
Conversations . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 19
Tools . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 20
Summary . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 21

■CHAPTER 2 The Open Source Development Process . . . . . . . . . . . . . . . . . . 23


Open Source versus Free Software . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 23
Why the Open Source Development Process Works . . . . . . . . . . . . . . . . . 24
Organization . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 24
Motivations of Open Source Developers . . . . . . . . . . . . . . . . . . . . . . 27
How the Open Source Development Process Works . . . . . . . . . . . . . . . . . 29
Meritocracy . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 29
Cathedral and the Bazaar . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 30
vii
Egan_467-3Front.fm Page viii Monday, June 27, 2005 11:00 AM

viii ■C O N T E N T S

Contributing to Open Source Development . . . . . . . . . . . . . . . . . . . . . . . . . 31


Getting Started . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 31
Climbing the Ranks . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 33
Managing Your Own Open Source Project . . . . . . . . . . . . . . . . . . . . . . . . . 34
Becoming a Maintainer . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 34
Management Techniques . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 35
Summary . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 36

■CHAPTER 3 Development Tools . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 37


Editors . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 37
Emacs . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 38
vi . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 42
IDEs . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 45
GCC . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 48
How a Program Is Built. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 49
Invoking GCC . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 49
make . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 51
Makefile Rules. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 51
Implicit Rules . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 52
Variables . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 52
Multiple Directories . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 53
Autotools . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 55
Automake. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 56
Autoconf . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 57
Other Required Files . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 59
autogen.sh. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 60
Using the Build Environment . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 61
GDB . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 61
Running Your Application Within GDB . . . . . . . . . . . . . . . . . . . . . . . . 61
Analyzing Core Dumps with GDB . . . . . . . . . . . . . . . . . . . . . . . . . . . . 62
Debugging Segfaults . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 62
CVS . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 64
Versioning . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 65
Branches . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 65
Using CVS . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 65
ViewCVS . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 73
SourceForge.net . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 79
Submitting a Tracker Item . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 79
Managing Tracker Items . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 83
Summary . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 84
Egan_467-3Front.fm Page ix Monday, June 27, 2005 11:00 AM

■C O N T E N T S ix

■CHAPTER 4 Programming Gaim . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 85


Compiling Your First Plug-In: helloworld.c . . . . . . . . . . . . . . . . . . . . . . 85
Anatomy of a Gaim Plug-in . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 87
GAIM_INIT_PLUGIN . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 87
GaimPluginInfo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 89
plugin_load() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 92
#include Statements. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 94
Object-Oriented Programming . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 94
Abstraction . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 95
Inheritance . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 95
Polymorphism . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 96
Object-Oriented C . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 96
Objects . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 96
Inheritance . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 99
Accessor and Mutator Functions. . . . . . . . . . . . . . . . . . . . . . . . . . . . 100
Data Structures . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 101
Linked Lists . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 101
Hash Tables . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 103
Trees . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 105
The Gaim API . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 106
Core/UI Split. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 106
GaimAccount (account.h) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 108
GaimConnection (connection.h) . . . . . . . . . . . . . . . . . . . . . . 108
GaimConversation (conversation.h) . . . . . . . . . . . . . . . . . 109
GaimBuddyList (blist.h) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 110
Summary . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 112

■CHAPTER 5 GTK+ Basics . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 113


Overview of GTK+ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 113
History . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 113
Architecture . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 115
Language Bindings . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 117
Anatomy of a GTK+ Application . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 117
The gtk_init() Function . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 118
The Main Loop . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 119
User Interface Principles . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 120
Elegance . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 120
GNOME HIG . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 120
Egan_467-3Front.fm Page x Monday, June 27, 2005 11:00 AM

x ■C O N T E N T S

Creating Dialogs in GTK+ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 122


Widget Packing . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 122
Container Widgets . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 122
Event Listeners . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 136
Signals . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 136
Callbacks . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 136
A Sample GTK+ Application . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 137
Gaim Signals . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 138
GTK+ Widgets . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 139
GtkLabel . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 139
GtkImage . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 140
GtkProgressBar . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 141
GtkEntry . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 143
GtkSpinButton . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 146
GtkButton . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 147
GtkToggleButton . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 150
GtkCheckButton . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 151
GtkRadioButton . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 152
GtkTextView . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 153
GtkTreeView . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 158
GtkComboBox . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 163
GtkToolbar. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 164
GtkMenu . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 167
GtkDialog . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 169
GtkFileChooserDialog . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 171
A Gaim Plug-in Example . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 172
Gaim Plug-in Boilerplate . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 173
The Data Structures . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 174
Using Gaim Signals . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 175
Scanning Messages . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 175
Hooking into Account Actions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 178
Creating the GUI . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 180
The Entire Plug-In . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 187
Potential Enhancements . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 195
Summary . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 195
Egan_467-3Front.fm Page xi Monday, June 27, 2005 11:00 AM

■C O N T E N T S xi

■CHAPTER 6 Advanced GTK+ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 197

A Sample Plug-In . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 197


GObject . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 199
Object-Oriented Features of GObject . . . . . . . . . . . . . . . . . . . . . . . . 199
Using GObject . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 202
Creating a Composite Widget . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 217
GdkPixbuf . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 219
Working with Image Files . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 219
GdkPixbufLoader . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 220
Animations . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 221
Pango . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 222
PangoLayout . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 222
PangoAttribute . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 223
GDK . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 224
The X Window System . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 224
GdkDrawable . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 226
Drawing Functions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 227
Overriding GtkWidget . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 232
Data Fields of GtkWidget . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 232
Overriding Functions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 233
Receiving Events . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 234
Summary . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 235

■CHAPTER 7 Sockets . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 237


Networking . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 237
The OSI Seven-Layer Model . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 238
Domain Name Service . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 242
Sockets . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 242
Connecting to a Server . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 242
Accepting Connections from Clients . . . . . . . . . . . . . . . . . . . . . . . . . 248
Reading and Writing Data to a Socket . . . . . . . . . . . . . . . . . . . . . . . 252
Non-blocking I/O . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 253
select() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 253
fd_set . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 254
timeval . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 254
Non-Blocking Sockets with select() . . . . . . . . . . . . . . . . . . . . . . 255
Integrating into GLib’s Main Loop . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 255
GIOChannel. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 256
g_io_add_watch() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 256
Egan_467-3Front.fm Page xii Monday, June 27, 2005 11:00 AM

xii ■C O N T E N T S

A Sample Gaim Plug-in . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 257


The Boilerplate . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 257
plugin_load() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 258
incoming_cb() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 259
create_response() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 260
The Final Plug-In . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 261
Possible Extensions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 264
Summary . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 265

■CHAPTER 8 Protocol Plug-Ins . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 267


Protocol Design . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 267
Packet Framing . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 267
Packet Headers . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 269
Packet Data . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 271
Protocol Implementation in C . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 275
Binary Protocols . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 275
Text Protocols . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 277
Learning Protocols . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 280
Reverse Engineering. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 280
Legal Ramifications of Reverse Engineering . . . . . . . . . . . . . . . . . . 281
Packet Sniffing . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 283
Reverse Engineering Techniques . . . . . . . . . . . . . . . . . . . . . . . . . . . 286
Interfacing with Gaim . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 288
server.c . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 288
GaimPluginProtocolInfo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 289
Command Functions. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 294
Program Flow of a prpl . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 297
Summary . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 297

■CHAPTER 9 Internationalization . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 299

Internationalization Defined . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 300


Text Encoding . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 301
ASCII . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 302
Foreign Encodings . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 302
iconv . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 303
Knowing What Encodings to Use . . . . . . . . . . . . . . . . . . . . . . . . . . . 305
Unicode . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 306
Code Points . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 306
Encodings . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 307
UTF-8 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 307
Egan_467-3Front.fm Page xiii Monday, June 27, 2005 11:00 AM

■C O N T E N T S xiii

Translations with gettext . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 308


An Overview of gettext . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 309
Setting Up gettext . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 310
Coding with gettext. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 312
Translating with gettext . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 314
Using Translations . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 316
gettext Summarized . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 316
Summary . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 317

■CHAPTER 10 Portability. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 319


The C Programming Language . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 319
History . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 320
K&R, ANSI, and C99 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 321
libc . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 323
Tips on Writing Portable C Code . . . . . . . . . . . . . . . . . . . . . . . . . . . . 324
POSIX . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 325
Porting to Windows with MinGW . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 326
Cygwin . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 327
Windows Compatibility Libraries . . . . . . . . . . . . . . . . . . . . . . . . . . . . 327
GLib . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 327
Portable Macros . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 328
Utility Functions. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 329
Memory Allocation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 330
File Management . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 331
Plug-Ins . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 331
GDK . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 333
X11 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 333
Win32 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 334
WIMP . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 335
Summary . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 335

■INDEX . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 337
Egan_467-3Front.fm Page xiv Monday, June 27, 2005 11:00 AM
Egan_467-3Front.fm Page xv Monday, June 27, 2005 11:00 AM

About the Author

■SEAN EGAN maintains the Gaim project, http://gaim.sourceforge.net. He is


a major contributor to the project, managing a team of 10 core developers,
and reviewing and incorporating patches from over 200 contributors. A
Long Island, NY native, Sean has a bachelor’s degree in computer science
from Binghamton Universtiy.
Sean has been involved in Gaim development for five years and learned
most of what he knows about software development from his experience
with the project.

xv
Egan_467-3Front.fm Page xvi Monday, June 27, 2005 11:00 AM
Egan_467-3Front.fm Page xvii Monday, June 27, 2005 11:00 AM

About the Technical Reviewer

■NATHAN WALP is a software engineer at Recognition Research, Inc. in Blacksburg, VA. He has
more than five years experience writing software, and has been working on Gaim since 2001; he
is responsible for Jabber support, among many other things.

xvii
Egan_467-3Front.fm Page xviii Monday, June 27, 2005 11:00 AM
Egan_467-3Front.fm Page xix Monday, June 27, 2005 11:00 AM

Acknowledgments

I ’d like to thank my friends and family for their support while I was writing this book, especially
my parents Doug and Lynn, and my sister Erin.
I’d like to thank everyone at Apress for their support and patience with me, especially
those I worked with directly: Beth Christmas, Jason Gilmore, Candace English, Julie Miller,
and Kelly Winquist.
Mostly, I’d like to thank everyone who’s contributed to Gaim, making this book possible;
especially Nathan Walp (who is also the technical reviewer for this book), Mark Spencer,
Jim Duchek, Rob Flynn, Syd Logan, Eric Warmenhoven, Adam Fritzler, Benjamin Miller,
Decklin Foster, Mark Doliner, Luke Schierer, Ethan Blanton, Etan Reisner, Tim Ringenbach,
Daniel Atallah, Robert McQueen, Christian Hammond, Herman Bloggs, Stu Tomlinson,
Gary Kramlich, Ka-Hing Cheung, Kevin Stange, and Felipe Contreras.

xix
Egan_467-3Front.fm Page xx Monday, June 27, 2005 11:00 AM
Egan_467-3Front.fm Page xxi Monday, June 27, 2005 11:00 AM

Introduction

I discovered Gaim in the AOL Instant Messenger (AIM) user profile of a friend about five years
ago. I didn’t know a lot about Linux then. I knew that it was a free implementation of UNIX with
publicly available source code, but my previous experiences with UNIX comprised staring at a
shell prompt, trying to type cryptic commands into a “DOS-like” console. Likewise, I assumed
that Linux was primitive compared to the high-tech, state-of-the-art Windows 98 I was using
that day when I read my friend’s profile.
“Visit the Gaim Web page,” it invited me. I followed the link and found my preconceptions
were wrong. On what I had seen as a platform solely for Web servers and corporate mainframes,
I could perform such everyday tasks as chatting with my friends. I expected nothing but text
commands, but I found Web browsers, e-mail clients, and games—all with windows to scroll
and buttons to click. Linux no longer looked like DOS; it was an actively developed desktop
operating system. Wanting to contribute to that development process, I quickly downloaded
the Gaim source code and started coding.
At the time, though, I had just started learning how to use my operating system and didn’t
know any C (the language Gaim is written in). This didn’t stop me; I quickly taught myself all the
skills necessary to write this hugely popular desktop application, using Gaim as an example.
Today, I’m the lead developer of the Gaim project, and I work closely with a group of developers
to maintain and enhance the most popular open source instant messaging application on the
planet.

About Gaim
Gaim is a modular instant messaging client that supports a wide variety of IM protocols,
including AIM, ICQ, MSN, Yahoo!, and Jabber. Although it was originally written for Linux, it
now runs on most popular operating systems, including Windows and Mac OS X. Although
exact user statistics are impossible to obtain, its users number in the hundreds of thousands, if
not over a million. It’s so popular because, in addition to functionality available in other clients,
it offers many unique features and is infinitely extensible through a powerful plug-in API. Most
importantly in the context of this book is that Gaim is free and open source software.

xxi
Egan_467-3Front.fm Page xxii Monday, June 27, 2005 11:00 AM

xxii ■I N T R O D U C T I O N

Figure 1. A screenshot of the Gaim application

“Free software” and “open source software” are terms that differ slightly in semantics but
describe essentially the same thing. When downloading Gaim, you are offered the source code.
Having unfettered access to the source code is quite valuable for understanding how Gaim
works, and is necessary should you wish to make any modifications. The only major provision
is that you grant this same right to modify your changes. This way, Gaim benefits from
hundreds of talented developers around the world, offering their contributions back to the
community. Because Gaim is built entirely with open source tools, involving yourself in its
development is easy, and it makes an excellent example to learn from.

About This Book


This book will help you to learn the same important programming skills I learned using Gaim
as an example. I’ll explore the various techniques and technologies used by Gaim, and after
reading this book you will be able to use what you’ve learned to create your own networked,
cross-platform desktop application.
This book introduces GTK+, the library used to create Gaim’s graphical user interface. You
will understand the principles behind it, and will know enough of its API to make changes to
Gaim’s GUI and to develop interfaces for your own applications.
Egan_467-3Front.fm Page xxiii Monday, June 27, 2005 11:00 AM

■I N T R O D U C T I O N xxiii

This book will also introduce network programming. You will learn what sockets are and
how to use them to make your applications communicate over the Internet. I’ll also introduce
you to a concept known as reverse engineering, showing you how to capture and interpret
network traffic so that your application can speak otherwise-closed, proprietary protocols.
I’ll examine different ways to make sure that your applications are accessible to everyone,
regardless of what kind of computer they’re running on (portability) and what languages your
users speak (internationalization). I’ll also discuss some of the important differences between
platforms, and you will learn about how computers store text. We will look at the gettext
system, which allows your application to be translated to other languages.
Throughout, I’ll examine useful coding techniques implemented within Gaim to make
programming in C and managing a large project easier. A per-chapter breakdown of the mate-
rial covered in this book follows.

Chapter 1: Getting Started


In Chapter 1, you’ll install a build environment containing all the software and libraries you’ll
need to build Gaim and other desktop programs. I’ll also introduce you to using Gaim, sharing
some little known, undocumented features.

Chapter 2: The Open Source Development Process


As an open source application, Gaim is developed with processes unfamiliar to many people.
However, the open source development process is very powerful and is gaining in popularity.
This chapter will explain how the process works and how you can become part of it.

Chapter 3: Development Tools


Chapter 3 will introduce you to the development tools used in the development of Gaim and
other open source (and proprietary) software. I will explain how to use editors, the GCC
compiler, make, GNU Autotools, CVS, and SourceForge.net so that you will be able to
contribute to Gaim as well as start your own projects from scratch.

Chapter 4: Programming Gaim


In this chapter, I will discuss the powerful programming techniques used throughout Gaim’s
source code. I will discuss object-oriented programming and how it is implemented in C by
Gaim and the GTK+ library. I will discuss important data structures used by Gaim, and finally I
will cover the Gaim plug-in API, allowing you to write plug-ins to extend Gaim’s features.

Chapter 5: GTK+ Basics


This chapter will introduce GTK+, the library used to create Gaim’s graphical user interface.
You will learn how to create your own dialogs with commonly used widgets; how to attach
callback functions, called when the user interacts with your program; and how to manipulate
existing interfaces. I will walk you through the development of a plug-in and explain each
decision made in creating the plug-in as I make it.
Egan_467-3Front.fm Page xxiv Monday, June 27, 2005 11:00 AM

xxiv ■I N T R O D U C T I O N

Chapter 6: Advanced GTK+


Now that you’re equipped with a basic of understanding of GTK+, I will explore its internal
workings more thoroughly. You will learn how to create your own GUI objects, or widgets, by
following a sample plug-in that radically changes Gaim’s File Transfer dialog with three such
custom objects.

Chapter 7: Sockets
In Chapter 7, I’ll introduce sockets, the programmatic interface to the Internet. You will learn
some basic principles of networking, and how to communicate over a network. I will explain
how to hook your networking code to GTK+’s GLib library to integrate it into GTK+’s main loop
and ensure cross-platform compatibility.

Chapter 8: Protocol Plug-Ins


After learning how to communicate over the Internet, you will learn about various protocols,
including IM protocols. You will learn how to intercept and interpret Internet traffic used by IM
clients—a process called reverse engineering. I will then teach you how to add a new protocol
to Gaim as a protocol plug-in. I will review how Gaim and the plug-in communicate events
between each other.

Chapter 9: Internationalization
In this chapter, you will learn how to write programs that speakers of any language can use. I
will review the gettext system for providing translation of your program at runtime. I will
explain the concept of text encodings, why they are significant, and how to write code that
understands them.

Chapter 10: Portability


Chapter 10 will address portability; that is, making your program run on as many systems as
possible, regardless of hardware or operating system. I will discuss major differences you need
to concern yourself with and how to use the portability functions of GTK+.

Prerequisites
I mentioned that when I started working on Gaim I was a complete amateur who didn’t even
know the language it’s programmed in. As such, I don’t expect you to be very experienced
either. You’ll learn as we go.
However, I won’t be introducing basic concepts of C, the language used to build Gaim.
Therefore,you should possess at least a rudimentary understanding of the language, and have
a basic knowledge of underlying principles of computer programming. Although I learned C by
example, there are other books that will do a better job of teaching you This book will focus on
higher-level aspects of the development process. However, you can most likely get by with
knowing C++, Java, or another language with a C-like syntax, as I will elaborate on more-
difficult or obscure techniques.
Random documents with unrelated
content Scribd suggests to you:
pergamino le había de volver á ver entre sus
mesnadas desnudo el acero en la diestra,
encarnizados los ojos de cólera contra su real sobrino
ó firmando tan frescamente alianza con el moro
enemigo de España ó desnaturalizándose de su
patria como un forajido? He aquí un caso en que la
vida y carácter de un escritor no solamente no
concuerdan y aclaran sus escritos, sino que los
contradicen de todo en todo. Este guerrero, este
vengativo, este hombre de violentísimas pasiones y
desgarrado proceder, escribe con la gravedad de
Séneca y la candidez de un niño inocente.

Las obras de don Juan Manuel son: 1. Tractado que


fizo don Juan Manuel sobre las armas... (publicado).
2. Libro de los Castigos et Consejos ó Infinido
(publicado). 3. Libro de los Estados ó del Infante ó
de las Leyes (publicado). 4. Libro del Caballero et del
Escudero (publicado). 5. Libro de la Caballería
(inédito). 6. Crónica Abreviada (inédito). 7. Crónica
complida (inédito). 8. Libro de los Engennos
(inédito). 9. Libro de la Caza (publicado). 10. Libro
de las Cantigas ó Cantares (inédito). 11. Reglas
cómo se debe trovar (inédito). 12. Libro de los
Sabios (inédito). 13. Libro del Conde ó Libro de
Patronio ó Libro de los Enxiemplos ó El Conde
Lucanor (publicado). 14. Tractado en que se prueba
por razon que Santa Maria está en cuerpo et alma en
Paraiso (publicado). Su mismo autor preparó el texto
de sus obras antes de 1335 y lo depositó en el
monasterio de dominicos de Peñafiel, pero el tal
texto desapareció. No poseemos el Libro de la
Caballería, hecho hacia 1320-1322 á imitación del
Libre del orde de Cauayleria, de Raimundo Lulio; ni
el Libro de los Engennos ó de máquinas bélicas; ni
las Reglas cómo se debe trovar; ni el Libro de los
Cantares, escritos los tres antes de 1329; ni el Libro
de los Sabios, que poco más ó menos fué compuesto
por el mismo tiempo. El de los Cantares lo tuvo
Argote de Molina (1549?-1597) y quiso imprimirlo
después de editar el del Conde Lucanor, donde hay
cuartetas de cuatro, ocho, once, doce y catorce
sílabas y redondillas octosilábicas. La Crónica
Abreviada (entre 1320 y 1324) lo es de la General,
de su tío Alfonso X. Perdióse la Crónica complida y
acaso está resumida en el Chronicon domini Johannis
Emmanuelis. El Libro de la Caza se compuso hacia
1325-1326, y en el c. 8 se habla de dos halcones
llamados Lançarote y Galván, lo que muestra que ya
se conocían las novelas del ciclo bretón. El Libro del
Caballero et del Escudero es imitación libre del Libro
del orde de Cauayleria de Raimundo Lulio. La
primera parte del Libro de los Estados está fechada
en 22 de mayo de 1330 y es obra didáctica alegórica
en 150 capítulos. El Libro de los castigos ó Infinido
(no acabado) es una colección de consejos á su hijo
don Fernando, hecha hacia 1334; en el c. 26 escribe
para el monje Juan Alfonso Las maneras de amor,
sobre la amistad. De la misma época es el Libro de
las armas, de los blasones y privilegios de su linaje.

El Libro de los enxiemplos del Conde Lucanor et de


Patronio, en cuatro partes, la más importante es la
primera, en 51 capítulos; la última lleva la fecha de
12 de junio de 1335. Debió de escribirse entre 1328
y 1335, antes del Decamerón, de Boccaccio, que se
compuso entre 1348 y 1353. Ambas obras
remedaron las Mil y una noches, haciendo don Juan
Manuel en su libro de califa con nombre de Conde
Lucanor y Patronio de Scheherazada. Son todos
ejemplos ó apólogos con su moraleja al fin, en
versos que resumen la prosa del capítulo. Es la mejor
obra de don Juan Manuel, y en ella se muestra buen
cuentista y narrador, conciso y á la vez pintoresco, en
hacer resaltar pormenores, hábil en planear y
desenvolver con gracia el caso, realista en aplicarlo á
las costumbres y gente de su tiempo y muy moral y
severo en fondo y forma.
233. Advertencia al Libro de Patronio: "Et los libros que él ha fecho
fasta aquí son éstos: la Coronica abreviada, el Libro de los Sabios, el
Libro de la Caballería, el Libro del Infante, el Libro del Caballero et
del Escudero, el Libro del Conde, el Libro de la Caza, el Libro de los
Engennos, el Libro de los Cantares. Et estos libros están en el
monasterio de los fraires predicadores que él fizo en Peñafiel".
Equivocando las últimas palabras, Pascual Gayangos hizo un Libro de
los fraires predicadores, de un capítulo del Libro de los Estados.
Argote de Molina dividió en dos el Libro del Caballero et del
Escudero. El mismo Gayangos hizo otro libro titulado De las maneras
del Amor, del final del Libro de los Castigos et Consejos; pero no es
más que su final, como allí dice el mismo autor: "et asi lo porné en
este libro". En el prólogo que puso don Juan Manuel á sus obras:
"Todos los libros que yo fasta aqui he fecho son doce: el primero
tracta de la razon por qué fueron dadas al infante don Manuel, mio
padre, estas armas, que son alas et leones, et por qué yo et mio fijo
legitimo heredero et los herederos del mi linaje podemos facer
caballeros, non lo seyendo nos, et de la fabla que fizo conmigo el rey
don Sancho en Madrid ante su muerte (Tractado que fiso don Juan
Manuel sobre las armas que fueron dadas á su padre el infante don
Manuel, et por qué él et sus descendientes pudiesen facer caballeros
non lo siendo, et de cómo pasó la fabla que con el rey don Sancho
ovo ante que finase)[21]. Et el otro de Castigos et Consejos, que dó
á mi fijo don Fernando, et son todas cosas que yo probé. El otro
libro es de los Estados. Et el otro es el Libro del Caballero et del
Escudero. Et el otro Libro de la Caballeria, et el otro de la Cronica
Abreviada, et el otro de la Cronica Complida. El otro el Libro de los
Engennos, et el otro el Libro de la Caza, et el otro el de las Reglas
como se debe trovar". Aunque antes dijo que eran doce sus libros,
no hizo relación más que de once, y aquí olvida dos de los allí
apuntados.

De esto resulta que son trece los libros que él nombra; el catorce de
la lista lo publicó Gayangos, y Amador de los Ríos le da el título de
"Libro sobre la Fe, intitulado ó Fray Remon de Masquefa, que tal vez
sea el omitido por el copiante al transferir el prólogo general de
todas las obras" (Hist. crít. de la Liter. Esp., 1863, t. IV, pág. 234).
Argote de Molina publicó el Conde Lucanor en Sevilla, 1575, del cual
se han hecho otras ediciones: Madrid, 1642; Stuttgart, 1840;
Barcelona, 1853. Pero la mejor es la de Knust, Leipzig, 1900, sacada
del mejor códice (Bibl. Nac., 6.376, antes S-34); la de Krapf, Vigo,
1902, reproduce el códice del Conde de Puñonrostro, hoy de la
Academia Española, sin las adiciones de los otros, aunque sólo tiene
la primera parte. Los códices son, además de los dos citados, otro de
la Nacional (4.236, antes M-100), el de Gayangos, hoy en la Nacional
(1.190), y el de la Academia de la Historia (Est. 27, gr. 3, E-78).
Gayangos dió á luz los números 4, 1, 2, 3, 13, 14. José Gutiérrez de
la Vega publicó el Libro de la Caza, Bibl. Venatoria, Madrid, 1879.

234. Leyendo á don Juan Manuel echamos menos lo


que después hallamos en la prosa artística del
Renacimiento, ese buscar de palabras, frases y
metáforas, que condensen más ceñidamente el
pensamiento, hagan resaltar un toque, varíen el
estilo, ya con mayor atropello, ya con espacioso
sosiego, pinten las cosas, distingan colores y
sentimientos. Los primeros renacentistas del siglo xv,
como Santillana y el de Villena, buscan por otro
camino la novedad y la redondez de las lenguas
clásicas por medio del hipérbaton, desaforado las
más veces, por el uso de latinismos que desvirtúan el
lenguaje. En don Juan Manuel no hay la menor
huella ni de lo uno ni de lo otro. Escribe con una
sencillez de niño que ignora los secretos del arte, no
ha caído todavía en la cuenta de que pueda
escribirse de otra manera. Estamos en la niñez de la
prosa castellana. Véase, por ejemplo, cómo en el
Libro de la Caza menudea la conjunción et, cómo
corta cada frase de por sí, sin cuidarse de
engarzarlas en un todo más armónico. En esto le
ganó su abuelo Alfonso X, el cual gasta un ropaje
más rozagante para envolver sus reales leyes, un
estilo como imperial y cesáreo, y en la Crónica mayor
particularidad en los pormenores y en toques de
color, que ofrecen escenas tan menudas y sentidas
como las de Mio Cid. Don Juan Manuel desconoce la
manera de dar color y amplitud á su decir, deja
correr la pluma con una sencillez paradisíaca. Acaso
se acomode más esta cualidad á los asuntos que
trata, al apólogo y á los consejos que da un tan
elevado magnate á su hijo y á sus súbditos. Porque
esa sencillez y no buscada naturalidad nada tienen
de bajo y de arrastrado; antes una señoril elevación
y una dignidad ahidalgada mantienen siempre en su
punto la llaneza del estilo.
Crónica de Don Jaime el Conquistador.
(Siglo XIV, Códice de Poblet, Biblioteca de San Juan).
No alardea don Juan Manuel, que bien pudiera, de
erudiciones empalagosas, como los autores
renacentistas. Su erudición está en los consejos,
sentencias y cuentos, á la manera oriental
eslabonados, que parecen se traen de la mano unos
á otros, sin extremar el enchufado, como en las Mil y
una noches acontece. En el lenguaje no faltan voces
propias y particulares, mayormente en el Libro de la
Caza, aunque no sea tan rico como el del Arcipreste
de Hita, que por allegarse más al pueblo y ser tan
soberano poeta y juglar de castiza cepa, gana en
riqueza de vocabulario á todos los autores de la Edad
Media. Tampoco tiene su gracejo, su alegría, y
menos su ironía socarrona el príncipe don Juan
Manuel, el cual nunca desciende de su gravedad
principesca ni se mezcla con la gente villana de
plazas y encrucijadas.
235. El infante Juan Manuel, Obras, ed. P. de Gayangos, Bibl. de
Aut. Esp., t. LI; Libro de las tres razones, ed. A. Benavides, en
Memorias de don Fernando IV de Castilla, Madrid, 1860, t. I, págs.
352-362; Libro de los Estados, ó del Infante, ed. A. Benavides,
Memorias de don Fernando IV de Castilla, Madrid, 1860, t. I, págs.
444-599; El Conde Lucanor, ed. H. Knust [y A. Birch-Hirschfeld],
Leipzig, 1900; El Conde Lucanor, ed. E. Krapf, Vigo, 1898; El Conde
Lucanor, ed. E. Krapf, Vigo, 1902; Libro de la Caza, ed. J. Gutiérrez
de la Vega, en Biblioteca venatoria, Madrid, 1877, t. III; Libro de la
Caza, ed. G. Baist, Halle, 1880; El Libro del Cauallero y del Escudero,
ed. S. Gräfenberg, en Romanische Forschungen, Erlangen, 1893, t.
VII, págs. 427-550; La Cronica complida, ed. G. Baist, en
Romanische Forschungen, Erlangen, 1893, t. VII, págs. 551-556.
Consúltense: G. Baist, Alter und Textüberlieferung der Schriften don
Juan Manuels, Halle, 1880; R. Menéndez Pidal [recensión de las
obras publicadas por los señores Gräfenberg y Baist, en Romanische
Forschungen, t. VII], en Revista Crítica, etc., Madrid, 1896, t. I,
págs. 111-115; Sra. de Menéndez Pidal, en Romania (1900), t. XXIX,
págs. 600-602; F. Dönne, Syntaktische Bemerkung zu don Juan
Manuels Schriften, Jena, 1891; F. Hanssen, Notas á la versificación
de Juan Manuel, en Anales de la Universidad de Chile (1901), t. CIX,
págs. 539-563; A. Giménez Soler, Un autógrafo de don Juan Manuel,
en Revue hispanique (1906), t. XIV, págs. 606-607; A. Giménez
Soler, Don Juan Manuel (en publicación).

236. Fray Guido de Terrena († 1342), natural de Perpiñán, general de


los carmelitas desde 1318, escribió Super octo libros physicorum
Aristotelis. In libros de anima. In XII libros metaphysicae.
Quodlibetorum liber I. Quaestionum liber I. Super IV libros
Sententiarum. De perfectione vitae. Concordia Evangeliorum.
Expositio in tria cantica. De haeresibus. Correctio Decretorum. De
vita et moribus Christi, etc.

Fray Juan de Claravó, catalán, carmelita y obispo de Cerdeña desde


1327, escribió Commentariorum in libros Sententiarum libri IV.
Lecturae. Sermones.

Álvaro Pelagio (Peláez, Páez ó Payo), franciscano y escotista, obispo


de Silves, escribió en 1330 De planctu Ecclesiae. Apologia pro
Ioanne XXII adversus Guillelmum Ockam. Speculum Regum.
Collyrium fidei contra hacreses. Summa Theologiae.

Hasta 1336 vivió el M. Alfonso converso de Valladolid, antes Rabbi


Abner, que trasladó de hebreo en romance, por mandado de la
infanta doña Blanca, señora del monasterio de las Huelgas, de
Burgos, el Libro de las batallas de Dios, que había escrito primero en
hebreo (núm. 217).
237. Año 1343. El Libro de buen Amor, del
Arcipreste de Hita, acabado de escribir el año 1343,
es el libro más valiente que se ha escrito en lengua
castellana. Nuestra literatura ofrece tres cimas, que
se yerguen hasta las estrellas y sobresalen entre las
obras más excelsas del ingenio humano. El Quijote
en el género novelesco, La Celestina en el dramático,
El Libro de Buen Amor en el satírico, en el lírico, en
el dramático, en todos los géneros, porque todos los
confunde la reventazón creadora de un poeta
solitario, que alza su voz poderosa en el silencio de
una sociedad medio guerrera y medio bárbara. Pero
en reciura de músculos, en volubilidad de meneos,
en fuerza de rugiente vida, en desenfadada
sinceridad y abertura de pecho, el Arcipreste de Hita
se adelanta á todos los artistas del mundo. Este
hombre es el gigantazo aquel, llamado Polifemo, que
nos pintó Homero, metido á escritor. Los sillares con
que levanta su obra son vivos peñascos, arrancados
de la cumbre de las montañas y hacinados sin
argamasa ni trabazones convencionales, de las que
no pueden prescindir los más celebrados artistas.

"¡Qué lástima—dice benditamente Martínez de la


Rosa—que un hombre de tanto ingenio naciese en
un siglo tan rudo!". ¡Acaso—digo yo—naciendo en el
que nacisteis hubiera sido de vuestra atildada
escuela! Porque ¿quién sabe si vuestro ingenio
académico, puesto en el siglo xiv, hubiera volado tan
sin pihuelas como el del Arcipreste?

Su boca dice todo lo que encierra su pecho, y el


pecho de este poeta primitivo es grande como el
universo. ¡Una verdad tan sin tapujos que tumba de
espaldas al más arrojado! ¡Un realismo tan cimarrón,
que ciega y acobarda al más atrevido! Tan grande,
tan colosal es el Arcipreste de Hita, que
sobrepujando á toda previsión y escapándose de
toda medida, se les ha ido de vuelo á los críticos más
avizores y de más firme mirar. El Greco se queda
corto en pintura, para lo que en literatura es Juan
Ruiz[22]. Su obra, repito, es el libro más valiente que
se halla en esta literatura castellana de escritores
valientes y desmesurados sobre toda otra literatura.

La obra del Arcipreste es toda suya, personal,


originalísima. ¿Que glosó una comedieta latina, que
engarzó en su libro fábulas orientales, de todos
conocidas entonces, que tomó de la literatura
francesa algún fabliau y el tema del combate entre
don Carnal y doña Cuaresma? Ésos son materiales
en bruto, que el poeta labró, pulió, vivificó con
aliento nuevo y no soñado por los autores que tales
materiales le ofrecieron.
Levántase el Arcipreste entre dos épocas literarias
sin pertenecer á ninguna de las dos, aunque con
dejos de la que le precedió: la de los apólogos
sentenciosos y últimos vagidos del mester de
clerezia, que fué lo que hasta entonces se había
escrito, y el renacimiento de torpe y retorcido decir
de don Enrique de Villena y del Marqués de
Santillana, que vino á poco, seguido de la lírica
postiza y desleída de los cortesanos de don Juan el
II.

¡Increíble parece que, resonando todavía y retiñendo


en lo hondo de los corazones aquel metal de voz de
un tan verdadero vate como Juan Ruiz, tuvieran valor
de chirriar, no uno, ni una docena de afeminados
boquirrubios, sino toda aquella cáfila y enjambre de
ahembrados poetillas, cuyas ñoñeces nos conservó
Baena en su Cancionero, cerrando la procesión de
tan almibarados donceles el por luengos años de
más estruendo y más enrevesado y menos delicado y
natural poeta que conozco, el famosísimo Juan de
Mena!

Pasados los tiempos heroicos de la épica castellana


con sus gestas, de las cuales nos ha quedado el más
acabado modelo en el cantar de Mio Cid, nació, en
los comienzos del siglo xiii, un género de poesía, ni
épica ni lírica, que los mismos poetas llamaban
mester de clerezia. Clérigos eran, efectivamente, por
la mayor parte, porque apenas si la cultura y las
letras alcanzaban más que á los clérigos. Fruto de la
erudición latino-eclesiástica, por medio de la cual les
llegaba por una cierta manera mitológica algo de la
antigua historia y de sus héroes, eran aquellos
poemas para leídos por monjes y estudiantes de las
nacientes universidades; sus voces no llegaban á las
mesnadas de guerreros, á las cortes de los reyes ni á
las fiestas y regocijos populares. Así era de prosaico
y didáctico el tono de aquellas leyendas devotas y
poemas de Berceo, del Alixandre, del Libro de
Apolonio y otros, á vueltas de cierta candidez y color
primitivos, que si no enardece y levanta los
pensamientos, agrada, y, sobre todo, contentaba á
sus poco leídos lectores y más á sus autores, los
cuales despreciaban la verdadera poesía del pueblo,
que llamaban mester de juglaria.

Pero la cultura arábiga, fomentada por Alfonso el


Sabio, trajo á España el saber grave, diluido en
apólogos y sentencias, y de él se alimentó la prosa
castellana, llevada á la legislación, á la historia y á la
ciencia por el sabio Rey. Á poco, la corriente lírica
gallega se derramó por toda la Península,
escribiéndose nuestra lírica erudita en aquella dulce
lengua, y desaparece el pesado alejandrino,
sustituyéndole la riqueza métrica de aquellos
cantares cantables y ligeros de la musa, ya erudita,
ya popular, venida de Galicia. La sociedad medieval
se transformaba á la par de caballeresca en
burguesa, y el empuje realista del popular pensar y
sentir no pudo menos de llegar á la literatura. Estos
cambios se verificaron en el siglo xiv, en que vivió el
Arcipreste de Hita. El añejo mester de clerezia se
coloreó no poco con estas novedades, y á él
pertenecen en el siglo xiv el rabí don San Tob de
Carrión y el canciller Pero López de Ayala. No menos
pertenece á él nuestro Arcipreste, por la intención
moralizadora de su libro y por la doctrina y fábulas
orientales de que lo entreveró; pero no menos, antes
mucho más, ha de tenerse por poeta popular del
mester de juglaria, como él mismo francamente lo
proclama, sin desdeñarse por ello (c. 1633):

Señores, hevos servido con poca sabidoria:


por vos dar solás á todos, fablévos en juglería.

Con estas palabras, y mucho más con su libro, sus


cantares y "cantigas de dança e troteras, para judios
e moros e para entendederas, para ciegos y
escolares, para gente andariega" (c. 1513, 1514),
alzó bandera revolucionaria en el campo de la
literatura erudita, injertándole la savia popular, la
única que suele y puede engrandecerla. Él fué quien
enterró el mester de clerezia, desgarrándose de la
tradición latino-eclesiástica; él quien rompió todos los
moldes de erudiciones trasnochadas, de ritmos
apesadumbrados y de entorpecidos andares; él quien
supo aprovechar como nadie en sus apólogos la
manera pintoresca y sentenciosa de la literatura
oriental, harto mejor que en sus prosas don Juan
Manuel, su contemporáneo; él quien dió vida á la
sátira moral, harto mejor que el Canciller y el Rabí; él
quien llevó á la literatura castellana las cantigas, las
villanescas y las serranillas gallegas; él quien zanjó
para siempre el realismo de nuestra literatura; él, en
una palabra, quien dió vida de un golpe y en un solo
libro á la lírica, á la dramática, á la autobiografía
picaresca, y, sobre todo, á la sátira en todos sus
matices.
El Arcipreste de Hita no puede ser encasillado, como
no pueden serlo los pocos altísimos ingenios que se
levantan sobre la muchedumbre de los poetas y
escritores comunes, por sobresalientes que algunos
de ellos sean. Fuélo, sin duda, el infante don Juan
Manuel, el único cuya voz puede oirse mientras canta
el de Hita; pero entre uno y otro hay un abismo.
Porque nuestro Arcipreste, no sólo es el primer poeta
de su siglo, sino de toda la Edad Media española, y
fuera de España tan sólo el Dante puede con él
emparejar.

¿Quién fué este hombre tan extraordinario? Fuera de


lo que nos pueda decir su Libro de Buen Amor, no
sabemos ni una palabra; y este libro es tan
naturalmente artístico y tan irónico y socarrón y en
castellano tan viejo y poco conocido escrito, que él y
su autor siguen siendo hasta hoy una verdadera
quisicosa, un enigma, aun para las personas más
doctas. Para Menéndez Pelayo fué el Arcipreste "un
clérigo libertino y tabernario"; para Puymaigre, "un
librepensador, un enemigo de la Iglesia"; para José
Amador de los Ríos, por el contrario, fué "un severo
moralista y clérigo ejemplar, que, si es cierto que
cuenta de sí propio mil picardías, lo hace para
ofrecerse como víctima expiatoria de los pecados de
su tiempo, acumulándolos sobre su inocente cabeza"
(Menéndez y Pelayo, Antología, III, página lxii). Si con
tan encontradas opiniones se juzga del hombre, de
esperar es que con las mismas se juzgue de su obra,
que no ha faltado quien la llamase nada menos que
Libro de alcahuetería.

Bien es verdad que todos convienen en tenerle por


extraordinario poeta. Pero ¿puede ser poeta tan
extraordinario un hombre que va contra el sentir de
toda la sociedad cristiana en que vive, como lo
supone Puymaigre? Los grandes poetas que
conocemos sobresalieron entre sus contemporáneos;
pero fueron la voz de toda la sociedad en que vivían,
y eso les hizo ser grandes. ¿Puede ser extraordinario
poeta un poeta "clérigo, libertino y tabernario; un
escolar nocherniego, gran frecuentador de tabernas;
un clérigo de vida inhonesta y anticanónica", como
dice de él Menéndez y Pelayo? Yo concederé que
entre tales hombres pueda darse un poeta; jamás un
extraordinario poeta. Los más encumbrados
pensamientos y los sentimientos más delicados no
andan por las tabernas y lupanares. Si alguien puede
creer lo contrario, respeto su opinión; pero me
guardo la mía en todo contraria. Si otros creen que
un desalmado sin conciencia y sin religión, en un
siglo religioso, sobre todo, puede ser poeta excelso,
de los de gran talla, de los pocos que se levanten á
lo más alto, como yo tengo fué el Arcipreste,
tampoco me ofenderé; pero seguiré creyendo que
esos altísimos ingenios jamás se dieron sin una
honda creencia religiosa en el corazón, fuente la más
pura y abundante de la sublime poesía. Pero todo
esto es opinar. Lo que en limpio de todo ello se saca
es que el valer del Arcipreste y de su libro sigue en
balanzas, que el Libro de Buen Amor es todavía un
enigma aun para los más doctos y discretos.

Del libro, bien estudiado, se sacan las pocas noticias


siguientes, tocantes al extraño personaje de su
autor: Llamóse Juan Ruiz (c. 19 y 575). Nació en
Alcalá de Henares (c. 326, 1510, 1457). Fué
Arcipreste de Hita, villa en la provincia de
Guadalajara. Cargo era éste de importancia, como
entonces todos los eclesiásticos, y el primero de la
villa, puesto que el Arcipreste es cabeza de todos los
demás clérigos. Era ya muerto, probablemente, á no
ser que hubiera dejado el arciprestazgo, el año 1351,
pues en escritura que cita Antonio Sánchez era
Arcipreste allí y aquel año un tal Pedro Fernández;
todavía parece más probable que hubiese muerto
para el año 1348, como deduzco por cierta conjetura
de la copla 326. Acabó de componer su libro el año
1343 (c. 1634), siendo ya viejo (c. 1692) y estando
preso en Toledo por mandado del Arzobispo de
aquella ciudad, don Gil de Albornoz (c. 1671, 1709).
Compuso, por consiguiente, el libro en los últimos
años de su vida, preso y lleno de angustias,
agraviado é injustamente puesto en prisión, "por
causas meramente curiales", dice Menéndez y
Pelayo, muy probablemente por falsas delaciones
sobre que hablaba contra el Arzobispo, llevadas de
parte de los clérigos de Talavera, fuertemente
enojados por la sangrienta sátira que contra ellos
escribió (c. 1690).

Fué persona leída y entendida en Sagrada Escritura,


Derecho civil y canónico, en la erudición latino-
eclesiástica de su siglo y en los libros de don Juan
Manuel y demás obras que hasta entonces se habían
escrito en lengua vulgar.

La biblioteca del Arcipreste debió de ser harto


menguada. Por su libro se saca que conocía la Biblia,
varias obras canónicas y jurídicas, que menciona en
la copla 1152; las Decretales (c. 1148); el Decreto
(introducción); el Especulo (c. 1152); el Libro de las
tafurerias (c. 556); el Conde Lucanor, del cual sacó
el asunto de algunas fábulas; el poema de Alixandre,
al cual imita (c. 1266); algún Isopete, del que sacó el
de otros apólogos[23]; el Pamphilus, que glosó; los
Aforismos de Caton (introducción y c. 44, 568). Á
Aristóteles cita en la copla 71; á Tolomeo, en la 124,
y á Hipócrates, en la 303; pero, sin duda, de
segunda mano.

No tenía ningún clásico latino, ni menos griego, pues


aunque cita á Ovidio (429, 446, 612, 891), para él y
sus contemporáneos Ovidio Nason era
principalmente el Pamphilus medieval, obra de un
monje imitador del verdadero Ovidio. Tampoco trae
nada su libro de la Disciplina clericalis, del judío
converso español Pedro Alfonso, ni del Libro de los
engaños ó Sendebar, mandado verter al castellano
por el infante don Fadrique, obras ambas que
pudiera muy bien haber aprovechado por la
comunidad de asuntos y que acaso leyó, pero que es
extraño no hayan dejado la menor huella en el Libro
de Buen Amor. De la poesía francesa debió conocer
algo, aunque no tanto como creyó Puymaigre, pues
el cuento de Pitas Pajas probablemente fué español
de origen, si no fué invento del mismo Arcipreste
(473), y las serranillas tenían su abolengo más en
Galicia que en Francia. No habiendo conocido el
Roman de la Rose, derramado por toda Europa y de
asunto tan parecido al de su libro, ¿qué otra obra
francesa iba á conocer?

Pero este maravilloso poeta, si no tenía libros,


tampoco los necesitaba. Fué un vidente de la
naturaleza, de las almas, de la sociedad en que vivía;
un verdadero vate, que estaba por cima de los libros
y calaba adonde los libros no alcanzan.

Que fué personaje de cuenta y de gran confianza


para el gran estadista, no menor conocedor de
hombres y severo y enterizo Arzobispo de Toledo,
gran privado del emperador Alfonso XI y del Papa
(mis notas á las coplas 1690, 1516), don Gil de
Albornoz[24], se ve claramente por la grave comisión
que le encargó de llevar sus letras al clero de
Talavera, con amplios poderes (c. 1690) para retraer
á aquellos clérigos de la suelta vida que llevaban y
hacerles apartar de sus mancebas, á ellos y á los
seglares de aquella población. Puesto que don Gil fué
Arzobispo de Toledo desde el año 1337 hasta el
1350, en que se puso al servicio del Papa en Aviñón,
esta comisión fué después del año 1337, algunos
años más tarde, sin duda, y el Arcipreste era ya
hombre entrado en años, pues él se llama viejo (c.
1692) y de conocido valer, prudencia y severas
costumbres. Este hecho incontrastable y cierto de
toda certeza es el que ha de tenerse bien en cuenta
al juzgar de su persona y de su obra, la cual vino á
escribir por las causas y acontecimientos que de todo
esto se desprenden y son como siguen.

No debió ser grande la enmienda de los clérigos de


Talavera, cuando, á pocos años, escribió el Arcipreste
la famosa sátira, que añadió más tarde al final de su
libro. Poco después se vió puesto en prisión por
causas desconocidas, y lo más probable por las
dichas delaciones de aquellos señores (c. 1709).
Entonces fué cuando, tomando aquella sátira clerical
como boceto de otra mayor, compuso el Libro de
Buen Amor, cuyo intento es claramente satirizar á los
clérigos de vida airada, que, como aquellos de
Talavera, tanto abundaban por España (c. 505). El
personaje principal de todo el libro es un arcipreste,
como cabeza de clérigos perdidos y más perdido que
todos ellos.

Para dar vida dramática á la sátira, habla en primera


persona el de Hita, poniéndose así en el lugar del
dicho arcipreste abstracto, que personifica toda la
perdida clerigalla. De este modo, en forma
autobiográfica, va describiendo cuanto á aquellos
clérigos solía acontecerles, que se resume en la
lucha en su alma y en sus obras entre el espíritu
cristiano del amor de Dios ó buen amor, como el
Arcipreste le llama, y el espíritu carnal y mundano,
que él intitula locura ó loco amor. Llevado de la
naturaleza carnal, que el protagonista atribuye al
sino, conforme á las doctrinas astrológicas de
entonces, busca una tras otra mujeres para sus
amoríos, valiéndose de tercerones y de terceronas
viejas. La fe cristiana le vuelve una y otra vez á Dios
y al buen camino mediante los desengaños, de que
la gracia se vale, según la católica teología. Pero
suele quedar vencedor el loco amor, porque tal
sucede á los hombres de carne y hueso, y el
Arcipreste no se espanta de pintar los hechos y la
verdad como ella se es.

La idea capital del libro está, por consiguiente, en


que pinta al hombre mundano, sobre todo cristiano y
clérigo, el cual conoce el mal que hace y se
arrepiente; pero que vuelve á caer en los lazos del
loco amor, que acaba señoreándole. La unidad de
plan no puede ser más clara ni el intento de satirizar
á los locos clérigos, naturalmente para
aprovechamiento de ellos y de los demás. Pero así
como el ingenio poderoso de Cervantes convirtió en
sátira de toda la sociedad de su tiempo y aun de
toda la humanidad la que pretendió hacer de los
libros de caballería, de la misma manera el ingenio
del Arcipreste, tan grande acaso como el de
Cervantes y, si menos clásico y en todo mesurado,
más primitivo sin duda y montaraz, convirtió la sátira
de los clérigos en la sátira de la sociedad del siglo xiv
y de la humanidad de todos los tiempos. El Libro de
Buen Amor es, como dice Menéndez y Pelayo, la
Comedia Humana del siglo xiv y la epopeya cómica
de la Edad Media.
Un arcipreste erudito, canonista, grave y macizo, ya
entrado en años y que sin embargo emprende y lleva
á feliz cima semejante obra, hubo de ser de un
temple capaz de hacer cara á todos los enemigos
que, heridos en lo más vivo, y poderosos por su
estado clerical y asegurados en la costumbre, que
viene á ser nueva naturaleza y nueva ley y derecho,
se le echasen encima ó solapadamente jurasen su
perdición y se la tramasen por todas vías. Tal
sucedió, y no podía menos de suceder; pero la
grandeza de corazón de aquel hombre queda, por lo
mismo, fuera de todo debate.

Hay otro género de enemigos todavía peores, el de


los mojigatos y escrupulosos, el de los hipócritas,
que se espantan y se llevan las manos á la cabeza al
leer la realidad de lo que cada día sucede, cuando
hay quien sepa pintarla tal cual es, sin medias tintas
que la ensombrezcan y suavicen, y que acaso no se
espanten de los hechos vistos y tocados, y quién
sabe si por ellos mismos cometidos. Este linaje de
gentes siguen siendo hoy mismo enemigos del
Arcipreste de Hita, aunque parezcan tan anchos de
manga como Puymaigre. Mas el alma del Arcipreste
era de tan finos aceros y de tan levantados vuelos,
que se sobrepuso á todos esos espantadizos y
asombradizos grajos. Su pincel se tiñó en los hechos
más sangrientos de la realidad y llevó al lienzo el
más fiero realismo, chorreando sangre y verdad á
puñados.

Pero no es lienzo ni pintura este libro; es piedra


berroqueña, grabada á martillazo limpio por un
cíclope. La literatura griega es de alfeñique ante esta
obra de un verdadero primitivo del arte: sólo Esquilo
puede aparearse con él en la fuerza, y sólo asentado
entre los primitivos artistas egipcios se halla como en
su casa y en compañía de quien le entienda, ó
codeándose con un Ezequiel y un Isaías, almas de la
misma cantera que la de este hombre
verdaderamente varonil y artista colosal.

No es que quisiera ofrecerse como víctima expiatoria


de los pecados de su tiempo, como devotamente dijo
Amador de los Ríos; es que no era hombre para
entender que alguien se espantase de que se
atribuyese á sí el papel de clérigo tabernario y
libertino.

Todos hemos conocido en nuestra España curas de


tan sanas costumbres como de desenfadado buen
humor, que están por cima de hablillas y
chismografías de barrio y les gusta terciar con todos
y chocarrear á sus tiempos y aun tocar la guitarra y
cantar flamenco, si á mano viene. De esta madera
fué el Arcipreste. Sabía de cantares y tonadas, de
cristianos, moros y judíos, que entonces vivían harto
mejor hermanados de lo que se figuran los
cuáqueros y cátaros que quieren ahora monopolizar
la fe católica, tan grande de suyo, que no cabe ni
asoma siquiera en pechos tan pequeños y
apilongados. Para todos hacía coplas y tañía
instrumentos, á lo menos entendía de ellos. Sabía de
tonadillas y cantares arábigos. Conocía á
entendederas ó ensalmaderas y curanderas, á
estudiantes nocherniegos y á ciegos cantadores y les
hacía á todos coplas. Calaba las tramoyas de las
viejas celestinas, llamadas entonces trotaconventos,
grandes cuentas al cuello, enlabiadoras de dueñas,
terceronas de clérigos. Todo ello lo tenía muy sabido
el Arcipreste y lo pintó tal como lo sabía y no le pasó
por pensamiento desdeñarse ni correrse ni menos
asombrarse de escribirlo. Porque era un hombre, y
los asombradizos de entonces y de ahora no sé lo
que serán, pero hombres están lejos de serlo.

Sólo él, grave y regocijado á la par, podía escribir


aquel carnaval de abigarrado colorido, en que van
pasando todo linaje de gentes con sus locuras y
solapadas intenciones, y él les va arrancando sin
compasión la careta. Allí, como dice Dozy, los
caballeros que vienen presto al tomar de la paga,
tarde al partirse á la frontera, jugadores de dados
falsos; los jueces poco escrupulosos y los abogados
intrigantes y cohechadores; los criados que se
distinguen por catorce cualidades, pobres pecadores
que guardan muy bien el ayuno cuando no tienen
qué llevarse á la boca; las nobles damas vestidas de
oro y seda; las delicadas monjas de palabrillas
pintadas y sabrosas golosinas, las judías y moras, las
villanas de la sierra, chatas y lujuriosas como cabras,
de anchas caderas y macizas espaldas.

"La fantasía ingeniosa, la viveza de los


pensamientos, la exactitud con que pinta las
costumbres y los caracteres, la encantadora
movilidad de su ingenio, el interés que acierta á
comunicar al desarrollo de su obra, la verdad del
colorido, la gracia con que cuenta los apólogos y,
sobre todo, la incomparable y profunda ironía, que ni
á sí mismo perdona, dice el famoso crítico alemán
Clarus (Guillermo Volk), le elevan, no solamente
sobre otros poetas españoles que le siguieron, sino
sobre la mayor parte de los poetas de la Edad Media
en toda Europa".

Menéndez y Pelayo señala como cualidades


principales del Arcipreste: "La primera, el intenso
poder de visión de las realidades materiales: en el
Arcipreste todo habla á los ojos: todo se traduce en
sensaciones; su lengua, tan remota ya de la nuestra,
posee, sin embargo, la virtud mágica de hacernos
espectadores de todas las escenas que describe".

"Es la segunda de sus dotes una especie de ironía


superior y transcendental, que es como el elemento
subjetivo del poema, y que unido al elemento
objetivo de la representación, da al total de la obra el
sello especialísimo, el carácter general á un tiempo y
personal, que la distingue entre todas las
producciones de la Edad Media. La obra del
Arcipreste refleja la vida entera, aunque bajo sus
aspectos menos serios y nobles; pero en medio de la
nimia fidelidad del detalle, que en cada página hace
recordar las bambochadas y los bodegones
flamencos, pasa un viento de poesía entre risueña y
acre, que lo transforma todo y le da un valor estético
superior al del nuevo realismo, haciéndonos entrever
una categoría superior, cual es el mundo de lo
cómico fantástico. En este género de
representaciones brilla principalmente el Arcipreste, y
es lírico á su modo, con opulencia y pompa de color,
con arranque triunfal y petulante verso, sin dejar de
ser fidelísimo intérprete y notador de la realidad".
(Antol., III, CX).

Pero no admito "la tercera y muy visible dote, la


abundancia despilfarrada y algo viciosa de su estilo,
formado principalmente á imitación del Ovidio, de
cuyas buenas y malas condiciones participa en alto
grado, puesto que la riqueza degenera en
prodigalidad, y la idea se anega en un mar de
palabras...". Ni se formó en Ovidio, ni leyó siquiera
un solo verso suyo, ni se le parece en nada más que
en ser Ovidio elegantísimo y social poeta, y el
Arcipreste poeta insociable y primitivo, de lo más
primitivo, bronco y estupendamente salvaje que
resolló y echó á este mundo la diosa Madre de la
poesía universal, de la cual fueron hijas helénicas las
elegantes Musas clásicas que conocemos.

En cambio, añado yo que el Arcipreste no fué poeta


de una sola cuerda, como la mayoría de los poetas lo
fueron. Á lo aristofanesco de alguna serranilla y de la
contienda entre don Carnal y doña Cuaresma, junta
el candor de égloga, más natural que el de Teócrito,
en otras serranillas; á la vena satírica quevedesca del
poder del dinero y de las costumbres de los clérigos
talaveranos, caballeros y monjas, la delicada y suave
unción de los gozos de la Virgen, en el tono con que
los ha cantado siempre el pueblo; á lo dramático y
hondamente psicológico de la paráfrasis del
Pamphilus, lo sublimemente trágico de la elegía á la
Muerte; á lo tristísimamente endechado en las
Cantigas á María, lo triunfalmente pindárico del
epinicio cantado á Cristo como venciendo á la muerte
misma, reina del universo; á lo sentencioso de los

You might also like