# Capítulo 2. Introdução

O GTK (GIMP Toolkit, Kit de Ferramentas do GIMP) é uma biblioteca para criar interfaces gráficas de usuário . É licenciado pela licença LGPL, e portanto você pode desenvolver com o GTK software aberto, livre ou mesmo comercial e não-livre, sem ter de gastar nada com licenças ou royalties.
Ele é chamado de kit de ferramentas do GIMP porque foi originalmente escrito para o desenvolvimento do GNU Image Manipulation Program (GIMP), mas atualmente é usado em um grande número de projetos de software, incluindo o projeto GNU Network Object Model Environment (GNOME). O GTK é construído sobre o GDK (GIMP Drawing Kit, Kit de Desenho do GIMP), que é basicamente um intermediário das funções de baixo nível para acesso das funções de gerenciamento de janelas (a Xlib, no caso do sistema de janelas X), e sobre a gdk-pixbuf, uma biblioteca para manipulação de imagens no lado do cliente.
O GTK é essencialmente uma interface de programação de aplicativos (API) orientada a objetos. Embora completamente escrita em C, é implementada usando a idéia de classes e funções callback (ponteiros para funções).
Também há um terceiro componente, chamado GLib, que contém algumas funções substitutas para algumas chamadas padrão, assim como algumas funções adicionais para lidar com listas ligadas (linked lists), etc. As funções substitutas são usadas para aumentar a portabilidade do GTK, já que algumas das funções nele implementadas ― como g_strerror ― não estão disponíveis ou não são padrão em alguns sistemas Unix. Há também algumas que contêm melhorias em relação às correspondentes na libc ― como g_malloc, que tem suporte melhorado a depuração.
Na versão 2.0, a GLib absorveu o sistema de tipos que forma a base da hierarquia de classes do GTK, o sistema de sinais usado por todo o GTK, uma API de threads que abstrai as diferentes APIs nativas de threads das várias plataformas, e um método de carregar módulos.
Como último componente, o GTK usa a biblioteca Pango para saída de texto internacionalizado.
Este tutorial descreve a interface C do GTK. Há "bindings" do GTK para muitas outras linguagens de programação ― incluindo C++, Guile, Perl, Python, TOM, Ada95, Objective C, Free Pascal, Eiffel, Java e C#. Se você pretende usar bindings do GTK para outras linguagens, leia primeiro a documentação do binding. Em alguns casos, essa documentação descreve algumas convenções importantes (de que você deveria saber primeiro); depois você pode voltar a este tutorial. Há também algumas APIs multiplataforma (como wxWidgets e V) que usam o GTK como uma de suas plataformas; novamente, consulte sua documentação primeiro.
Se você está desenvolvendo seu aplicativo GTK em C++, há algumas notas a mais a se fazer. Existe um binding para o GTK chamado GTK-- (gtkmm), que proporciona uma interface ao GTK num estilo mais próximo do C++; é provavelmente o que você deve procurar. Se você não gosta desse método por qualquer razão, há duas maneiras de usar o GTK: 1) ao comunicar-se com o GTK, usar apenas a parte do C++ que é comum a ele e ao C, usando a interface C descrita neste tutorial; 2) usar o GTK e o C++ juntos, declarando todos os callbacks como funções estáticas em classes C++, e, novamente, fazer chamadas ao GTK usando a interface C. Se você escolher este segundo método, você pode incluir como valor de dado dos callbacks um ponteiro para o objeto a ser manipulado (o ponteiro "this"). A escolha entre essas opções é apenas questão de preferência: nos três casos, você estará usando C++ e GTK. Nenhum desses métodos requer o uso de um pré-processador especializado, então você sempre poderá usar C++ padrão como GTK.
Este tutorial é uma tentativa de documentar o máximo possível do GTK, mas não é de maneira alguma completo. Ele assume um bom entendimento da linguagem C e de como criar programas em C. Seria de grande benefício para o leitor ter experiência de programação com X, mas não deve ser necessário. Se você está aprendendo GTK como primeira biblioteca de widgets, por favor comente sobre o que você achou deste tutorial e sobre as dificuldades que você teve. Há também bindings para C++, Objective C, Ada, Guile e outras linguagens, mas eles não serão seguidos aqui.
Este documento é um "trabalho em progresso". Por favor procure por atualizações em http://www.gtk.org/ (original em inglês) ou http://pt.wikibooks.org/wiki/GTK+ (tradução para o português).
Gostaríamos muito de ouvir quaisquer problemas que você tenha tido ao aprender GTK deste documento, e apreciaria sugestões de como ele pode ser melhorado. Por favor veja a seção "Contribuindo" para mais informações.