Você está na página 1de 44

Glade / GTK+ Sumrio

GLADE - Um breve tutorial.................................................................................................................3 Crditos............................................................................................................................................3 Apresentando o Glade como uma IDE.................................................................................................3 A rea de trabal o do Glade.............................................................................................................3 1 - !anela "rincipal de Gerenciamento de "ro#eto.......................................................................$ % - "aleta de componentes...........................................................................................................$ 3 - Cai&a de propriedades............................................................................................................' $ ( )rvore de *id+ets................................................................................................................, ' - )rea de -rans.er/ncia............................................................................................................0 1b#etos do G-2...............................................................................................................................0 Lib+lade..............................................................................................................................................11 3un45es bsicas..............................................................................................................................11 3un46o +t78init9:.......................................................................................................................1% 3un46o +t78main9:....................................................................................................................1% 3un46o Glade8init9:..................................................................................................................1% 3un46o Glade8&ml8ne;9:.........................................................................................................1% 3un46o Glade8&ml8si+nal8autoconnect9:.................................................................................13 3un46o Glade8&ml8+et8;id+et9:..............................................................................................13 <ello *orld em lib+lade....................................................................................................................13 Come4ando....................................................................................................................................1$ Criando a inter.ace com Glade......................................................................................................1' Criando a #anela.........................................................................................................................1' Dividindo a !anela pra incluir os ob#etos..................................................................................1' 1s outros ob#etos.......................................................................................................................1, "er.umaria=....................................................................................................................................10 !anela.........................................................................................................................................10 >?tulo........................................................................................................................................10 @ot5es........................................................................................................................................1A Balvando a inter.ace pela primeira veC..........................................................................................1A 1 c?di+o .onte bsico e comentado...............................................................................................1D Compilando....................................................................................................................................%E Dando vida ao pro+rama................................................................................................................%% "rot?tipo dos Fanipuladores Eventos......................................................................................%3 As .un45es manipuladoras........................................................................................................%3 Conclus6o.......................................................................................................................................%' A"EGDICE I - Bimpli.icando as listas encadeadas com a GList.......................................................%, Listas duplamente encadeadas em C..............................................................................................%0 1 tipo GList...................................................................................................................................%0 3un45es -Hpicas para manipular a +list..........................................................................................%A 3un45es de inclus6o..................................................................................................................%A 3un45es de remo46o..................................................................................................................%D 1utras .un45es...........................................................................................................................%D A GList na prtica..........................................................................................................................%D Inclus6o de elementos na lista...................................................................................................31 Iuantos itens na listaJ..........................................................................................................31 Emitindo um aviso em caso de .al a.........................................................................................31 E&ibindo o Kue na lista.........................................................................................................3% 1rdenando a lista.......................................................................................................................33 Invertendo a lista.......................................................................................................................3' >emovendo um elemento da lista.............................................................................................3'

Glade / GTK+

Conclus6o.......................................................................................................................................3A Encerramento......................................................................................................................................3A Farcas re+istradas.........................................................................................................................3A Licen4a de Documenta46o Livre GGU..........................................................................................3D GGU 3ree Documentation License...........................................................................................3D

Glade / GTK+

GLADE - Um breve tutorial


1 1b#etivo desta obra orientar ao novos pro+ramadores Kue usar6o GladeLG-2 como suas .erramentas de trabal o. "ro+ramar em GladeLG-2 muito simples e em KualKuer mKuina com poucos recursos possHvel desenvolver com eles. 1s reKuisitos mHnimos s6o a posse de um computador com Linu&M bibliotecas G-2 e e suas depend/ncias o ambiente de desenvolvimento Glade e al+um editor de te&tosM pre.erencialmente Kue se#a apropriado pra pro+rama46o Kue permitem o destaKue de comandosM eu su+iro o Diasce %M ou o An#utaM mas pra .ins de simpli.ica46o esta obra usar o bom e vel o +edit Kue est na maioria das distros GGULLinu& com o Gnome instalado. Faiores in.orma45es no capitulo de Encerramento. @oa Leitura=

Crditos
Copyright (c) 2004 Welington Rodrigues Braga (www.gtk-br.c b.net). ! dada per"iss#o para copiar$ distribuir e%ou "odi&icar este docu"ento sob os ter"os da 'icen(a de )ocu"enta(#o 'i*re +,-$ .ers#o /./ ou 0ual0uer *ers#o posterior publicada pela 1ree 2o&tware 1oundation3 se" 2e(4es 5n*ariantes$ se" Capa da 1rente$ e se" 6e7tos da 8uarta-Capa . -"a c9pia da licen(a e" est: inclusa na se(#o entitulada ;;'icen(a de )ocu"enta(#o 'i*re +,-;;.

Apresentando o Glade como uma IDE


Glade 9 ttpNLL+lade.+nome.or+: uma .erramenta livre para construir inter.aces para o G-2O 9 ttpNLL;;;.+t7.or+: e Gnome 9 ttpNLL;;;.+nome.or+:. DistribuHdo sob a licen4a GGULG"LM poder ser livremente redistribuHdo e modi.icado. 1 Glade pode produCir c?di+o .onte em C. Fas COOM AdaD'M "Pt on e "erl tambm est disponHvelM atravs de .erramentas e&ternas Kue manipulam o arKuivo QFL +erado por ele. 1 Bite 1.icial pode ser encontrado no endere4oN ttpNLL+lade.+nome.or+ e a Rltima vers6o para do;nload Kue +eralmente lan4ada lo+o ap?s atualiCa45es nas bibliotecas do G-2O. Ele pode ser obtido neste mesmo endere4oM no reposit?rio o.icial ou no CD da sua distribui46o Linu& pre.erida.

A rea de trabalho do Glade


1 Glade n6o possui uma rea de trabal o como no Sisual @asic. Ele mais parecido com o @orland COO 9nem tantoM claro N-: : e dividido em ' #anelasN 1. !anela de Gerenciamento de "ro#etos %. "aleta de Componentes

Glade / GTK+
3. Cai&a de "ropriedades $. )rvore de *id+ets '. )rea de -rans.er/ncia

1 - Janela Principal de Gerenciamento de Projeto


Como o nome diC esta a #anela principal do GladeM pois a partir daKui onde poderemos Criar novoM AbrirM Balvar e Con.i+urar o "ro#eto alm de +erar o c?di+o .onte etc. Este te&to parte da idia Kue as opera45es bsicas 9GovoM AbrirM BalvarM CopiarM >ecortarM Colar: # s6o con ecidas do leitorM uma veC Kue isto i+ual a KualKuer pro+rama convencional com estas .un45es. T importante ressaltar Kue as outras #anelas poder6o ser e&ibidas a partir do menu SE> desta #anela.

- Paleta de componentes
A paleta de componentes onde est6o todos 9ou Kuase todos: os componentes Kue poder6o ser usados no desenvolvimento visual da aplica46o. Desde a #anela principal at os UpoderososV r?tulos e bot5esM passando pelas cai&as combina46o e menusM entre outros.

Glade / GTK+

'

1bserve Kue eu omiti a ima+em da paleta U1bsoletosVM pois como o pr?prio nome # dei&a claro coisas mais Rteis do Kue aKueles ob#etos. E a paleta GnomeM tambm .oi omitida por Kuest6o de comodismoM apenasW uma veC Kue ela s? aparecer se voc/ iniciar um pro#eto de aplica46o para o Gnome.

! - "ai#a de propriedades
DaKui possHvel con.i+urar os ob#etos da sua aplica46o. CorM -aman oM -e&toM posi46o etc. Alm de de.inir tambm os sinais 9eventos: a Kual cada ob#eto responder.

Glade / GTK+

Ga .i+ura apresentada vemos as propriedades principais de um Gt7EntrP 9uma cai&a de entrada de te&to:.

$ % &rvore de 'id(ets
A partir da )rvore de ;id+ets ser possHvel ver a ierarKuia de ob#etos da aplica46o em desenvolvimento. Isso Rtil na ora de selecionar um ;id+et Kue se encontra inacessHvel atravs de um simples cliKue sobre eleM na #anela da sua aplica46o. Este caso muito comum de acontecer Kuando se dese#a selecionar um container 9ou .rame:M ou ainda uma #anelaM por e&emploM para realiCar al+uma opera46o sobre eles.

Glade / GTK+

) - &rea de *rans+er,ncia
1s ob#etos Kue .orem copiadosM recortados e colados est6o aKui. Esta uma rea de trans.er/ncia mRltipla lo+oM poder-se- ter vrios ob#etos armaCenados aKui para depois col-los onde e como Kuiser.

Objetos do GTK
1 ob#etivo desta sess6o n6o apresentar todos os ob#etos do G-2 e nem mesmo apresentar todos os o.erecidos na paleta do GladeM # Kue isso pode ser obtido na documenta46o o.icial do G-2 encontrada em ttpNLLlidn.source.or+e.net Abai&o apresentamos al+uns componentes e um breve comentrio sobre cada um.

Glade / GTK+
Objeto Gt7*indo; !anela Gt7Fenu@ar @arra de Fenus Comentrio IualKuer aplica46o Kue se#a desenvolvida pra rodar em modo +r.icoM se#a em *indo;sM ou Q11 ou KualKuer outro modo +r.ico usa como elemento base uma #anela. Go G-2 n6o poderia dei&ar de ser di.erente.

A barra de menus o meio mais comum de se adicionar uma +rande Kuantidade de .un45es em uma aplica46o. A maioria das aplica45es possuem uma barra de menus com pelo menos um menu. Ao inserirmos uma barra de menus no Glade ela # vir com al+uns menus bsicos 9ArKuivoM EditarM E&ibir e A#uda: e cada um deles com os seus comandos mais comuns. A barra de .erramentas indispensvel em pro+ramas pro.issionais e Kue possuem muitos comandos em menus. AKui n?s colocamos aKueles principais comandos Kue dever6o ser acessados com maior .reKX/ncia pelo usurio. Este um recurso poderoso Kue nos permite arrastar o menu ou a barra de .erramentas para .ora da rea de trabal o da nossa #anela de pro+rama. 1 r?tulo possibilita a e&ibi46o de mensa+ensM e&plica45es e KualKuer in.orma46o Kue dever ser e&ibida dentro do pro+rama e Kue n6o poder ser alterada pelo usurio. Com a cai&a de entrada o usurio poder intera+ir com o nosso pro+rama entrando com dados para manipula46o. "or e&emploM com ele o usurio poder entrar com os valores a serem usados em um clculoM ou um nomeM ou endere4o de email Kue ser cadastrado em uma a+enda etc. Como o nome diCM uma combina46o. Uma combina46o de cai&a de entrada com uma lista. Este componente permite Kue o usurioM tanto di+ite a sua op46oM como possa escol er dentro de uma lista com Htens # pr-de.inidos.

Gt7-ool@ar @arra de 3erramentas Gt7<andle@o& Cabo de Cai&a Gt7Label >?tulo Gt7EntrP Cai&a de Entrada

Gt7Combo Cai&a de combina46o

Gt7-e&tSie;

Este um aper.ei4oamento no ob#eto Gt7EntrP Kue permite a SisualiCa46o de -e&to visualiCa46o de +randes Kuantidades de te&to. EnKuanto o Gt7EntrP permite a inser46o de peKuenas Kuantidades de te&to para entrar com peKuenos dados no pro+rama o Gt7-e&tSie; permite a entrada de te&tos realmente lon+os ele a base de KualKuer editor de te&tos com base no G-2M como o GeditM por e&emplo Gt73i&ed Cai&a de posicionamento livre Esta cai&a um conteiner Kue permite o posicionamento livre dos ob#etos assim como acontece em outras >ADs l no mundo *indo;s. 1s ob#etos s6o posicionados com base nas coordenadas Q e Y da #anela. Isso pouco comum de ser usadoM pois apesar de simpli.icar a coloca46o dos ob#etos ele atrapal a na arruma46o dos mesmos. Este conteiner permite Kue vrios ob#etos .iKue lado a lado sem muito trabal o.

Gt7<@o& Cai&a oriContal

Glade / GTK+
Objeto Gt7S@o& Cai&a vertical Gt7-able Cai&a -abular Comentrio Bimilar ao conteiner anteriormente comentadoM mas desta veC os ob#etos .icam dispostos um abai&o do outroM .ormando assim uma coluna de ;id+ets

Com este conteiner possHvel distribuir ob#etos uni.ormemente em toda a dimens6o da #anela. Ele .acilita bastante a constru46o de telas de cadastroM onde poderHamos ter uma coluna com os r?tulos e a se+unda coluna com as cai&as de te&to correspondentes a cada campo. Este componente permite-nos incluir uma barra de status no rodap das #anelas em nossos pro+ramas. Isso interessante para mostrarmos in.orma45es sobre o Kue est acontecendo no processamento das tare.as. -odo pro+rama pro.issional possui uma barra de status. Com as molduras podemos or+aniCar os ob#etos um uma #anela com muitas op45es. Isso Rtil em telas de con.i+ura46oM onde temos vrias op45es Kue poder6o ser a+rupadasM por e&emplo uma moldura delimitando as op45es de orienta46o de p+inaM uma outra Kue delimite os tipos de papel etc. Este componente uma m6o na roda para se criar cai&as de dilo+oM com ele podemos criar .acilmente uma barra de bot5es de a46o. Este similar ao componente anteriorM mas os bot5es s6o dispostos em colunaM de .orma Kue .ica um abai&o do outro. Geralmente usados para dispor os bot5es U12VM UCancelarV e UA#udaV num dos cantos da sua tela. Assim como as molduras 9Gt73rame: este componente serve apenas para or+aniCar os ob#etos da #anela. Ele simplesmente tra4a uma lin a vertical separando sua #anela em duas partes verticais Bimilar ao ;id+et anteriorM mas este separa oriContalmente. Divide a !anela em duas partes oriContalmente. Ele .unciona como um conteiner redimensionvel di.erentemente do Gt7SBeparator este ob#eto divide e permite Kue estas partes se#am redimensionveis atravs do cabo. Bimilar ao ob#eto anteriorM mas divide em duas partes verticais. "ermite a sele46o de op45es. Beu uso .eito em con#unto com pelo menos dois destes or+aniCados em um mesmo +rupoM onde o usurio poder selecionar uma dentre as vrias op45es disponHveis "ermite a ativa46oLdesativa46o de op45es em um pro+rama. "or e&emplo poderia ser usado para ativar ou desativar um cronZmetro. 3unciona como o U@ot6o de Seri.ica46oV.

Gt7Btatus@ar @arra de Btatus

Gt73rame Foldura

Gt7<@utton@o& Cai&a de bot5es oriContais Gt7S@utton@o& Cai&a de bot5es verticais Gt7SBeparator Beparador Sertical Gt7<Beparator Beparador <oriContal Gt7<"aned Divis?ria <oriContal Gt7S"aned Divis?ria Sertical Gt7>adio@utton @ot6o de Bele46o Gt7-o++le@utton @ot6o de Alterna46o

Glade / GTK+
Objeto Gt7C ec7@utton @ot6o de veri.ica46o Comentrio

1E

Bimilar ao ao U@ot6o de Alterna46oV apresentado anteriormente. Fas +eralmente usado em con#unto com vrios outrosM apesar de n6o poder ser or+aniCado em +rupo. Usa-se por conven46o o @ot6o de veri.ica46oM Kuando o usurio ter vrias op45es a marcarM ao contrrio do @ot6o de Alterna46o Kue costuma-se usar Kuando apenas uma op46o a ser marcada. Este ob#eto inclusive pode assumir uma apar/ncia similar a do ;id+et anterior desativando a propriedade UIndicadorV.

Gt7Ima+e Ima+em Gt7Dra;in+Area )rea de "intura Gt7Bcrolled*indo; !anela de >ola+em Gt7-reeSie; Sis6o de )rvore ou lista Gt7@utton @ot6o Gt71ptionFenu Fenu de 1p45es Gt7Bpin@utton @ot6o Girat?rio Gt7Sie;"ort "orta de SisualiCa46o Gt7Goteboo7 Goteboo7 Gt7Dialo+ Cai&a de dilo+o Gt73ontDialo+ Dilo+o de sele46o de 3ontes

Este ;id+et possibilita a visualiCa46o de ima+ens Com este ;id+et podemos criar aplicativos de desen o. Ao inserirmos um ob#eto destes o Glade automaticamente o colocar dentro de uma #anela de rola+em possibilitando Kue a ima+em rea se#a visualiCada em toda sua dimens6oM caso a#a necessidade. Com este ;id+et podemos UrolarV o conteRdo de um ob#eto muito +rande Kue n6o caiba na #anela. Ele incluso automaticamente pelo Glade Kuando usamos os ob#etos UGt7Dra;in+AreaVM UGt7-e&tSie;VM UGt7-reeSie;V e al+uns outros. Este ;id+et permite o desenvolvimento de aplica45es Kue necessitem uma rvore ierarKuica ou a lista+em detal ada de al+uma coisa. Beu uso pode ser notado em pro+ramas como GautilusM BPnaptic etc. 1 bot6o padr6o. G6o muito o Kue comentar sobre ele. T um dos componentes mais comuns em uma aplica46o 1 Fenu de op45es uma alternativa a Cai&a de combina46oM com a di.eren4a de Kue este n6o permite a edi46o do seu conteRdo pelo usurio. 1 bot6o +irat?rio similar a cai&a de entrada 9EntrP: seu uso e&clusivo para entrada numricaM pois com ele o usurio tanto pode di+itarM Kuanto escol er usando a Usetin asV do bot6o +irat?rio. - a escrever Com o UGoteboo7V podemos colocar muitos ob#etos em uma #anelin aM simplesmente a dividindo em p+inas. Uma cai&a de dilo+o padr6o. Isso .acilita o trabal o de cria46o de cai&as de dilo+oM pois do contrrio terHamos Kue criar uma #anela e personaliCa-la manualmente com os bot5es e r?tulos necessrios. A tradicional cai&a para sele46o de .ontesM muito usada em pro+ramas Kue manipulem te&to.

Glade / GTK+
Objeto Gt7ColorDialo+ Dilo+o de Bele46o de Cores Cai&a para sele46o de arKuivos. Costuma ser usada em pro+ramas Dilo+o de Bele46o de onde se .aC necessrio abrir ou salvar arKuivos. ArKuivos Gt73ileDialo+ Comentrio A cai&a para sele46o de cores

11

Lib(lade
1 Lib+lade uma biblioteca Kue permite a utiliCa46o das inter.aces +eradas pelo GladeM como elas s6oM ou se#aM ao salvar o pro#eto no Glade +erado um arKuivo QFL com as descri45es das #anelas e seus ob#etos. 1 Kue o Lib+lade .aC ler este arKuivo em tempo de e&ecu46o de .orma Kue as #anelas n6o s6o convertidas em G-2 e compiladas com o pro#eto. Uma das +randes vanta+ens disso Kue se .or preciso mudar o laPout da #anelaM n6o ser necessrio recompilar os .ontes novamenteM desde Kue n6o se mude o nome dos ob#etos e nem do arKuivo [.Glade[. A +rande desvanta+em disso Kue de al+uma .orma o seu pro+rama dever saber em tempo de e&ecu46o onde est o arKuivo U.+ladeV com as #anelas. Uma .orma .cil e simples de resolver isso especi.icar no seu c?di+o o camin o completo para o arKuivo de inter.ace e Kue dever ser transportado #unto com o c?di+o. 1 Glade por si s?M como # citado antes permite +erar o c?di+o .onte em al+umas lin+ua+ens. Fas depois Kue esse c?di+o come4ar a ser incrementado ele n6o conse+uir mais +erenciar aKuele c?di+o e a partir dai ser necessrio .aCer Kuase tudo soCin oM ai Kue entra a +rande vanta+em do lib+ladeM se n6o Kuiser reescrever seu pro+rama novamente a cada veC Kue .or preciso mudar al+uma propriedade dos ob#etos da aplica46oM pois como o Glade vai recriar o arKuivo U.+ladeV ele n6o tocar nos seus arKuivos U.cV.

Funes bsicas
"ra Kue voc/ comece a se abituar e a decorar al+uns nomesN As .un45es bsicas do G-2 e do Lib+lade Kue vamos precisar pra come4ar nossos trabal os s6o as se+uintesN gtk<init()3 gtk<"ain()3 glade<init()3 glade<7"l<new()3 glade<7"l<signal<autoconnect()3 glade<7"l<get<widget()3 Estas .un45es s6o primordiais e e&istir6o em praticamente 1EE\ dos pro+ramas baseados em G-2LLib+lade

Glade / GTK+

1%

-un./o gtk_init()
Esta .un46o inicialiCa e disponibiliCa o G-2 para sua aplica46o. Ela deve ser o primeira a ser c amada por sua aplica46o para Kue os ob#etos se#am criados adeKuadamente. E&emploN
gtk<init(=argc $ =arg*)3

Em praticamente KualKuer aplica46o voc/ a usar e&atamente como neste e&emplo. Gote Kue +eralmente os par]metros passados a ela s6o re.er/ncias aos par]metros ar+c e ar+v passados a sua aplica46o.

-un./o gtk_main()
Este ser o URltimoV comando a ser c amado por sua aplica46o no m?dulo principalM pois ele o responsvel por entrar no loop in.inito Kue avalia os eventos Kue est6o ocorrendo. Iuando a sua aplica46o avan4a deste comandoM a inter.ace +r.ica e .inaliCada. Geralmente voc/ ira Kuerer .aCer isso pra encerrar a aplica46o. "ra .inaliCar o seu pro+rama voc/ usar um comando apropriado Kue .aC o G-2 encerrar esse loopM c amado de Ugtk<"ain<0uit()V.

-un./o Glade_init()
Esta .un46o importante para inicialiCar a biblioteca Lib+lade. Fas ela tornou-se obsoleta e seu uso desnecessrio atualmente. Fas se a sua aplica46o der problemas e voc/ notar Kue o Lib+lade n6o .oi inicialiCado ent6o voc/ poder usar este comando lo+o ap?s o gtk<init().

-un./o Glade_xml_new()
Este talveC se#a o comando mais importante pra constru46o de sua aplica46o com o Lib+ladeM pois ele o responsvel por ler a estrutura do arKuivo QFL +erado pelo Glade. Este comando .aC a leitura do arKuivo de descri45es QFL contendo as #anelas da sua aplica46o e as carre+a em um ponteiro do tipo GladeQFL. 1 prot?tipo deste comando eN
+lade>?'@ +lade<7"l<new (const char @ ar0ui*o$ const char @ ob eto<principal$ const char @ do"Anio)3

1ndeN

ArKuivo ^ Gome do arKuivo U.GladeV contendo a sua inter.ace 1b#eto8principal ^ 1b#eto inicial a partir de onde o Glade descer na estrutura Qml pra construir sua #anela. Isso e Rtil Kuando voc/ possui a descri46o de vrias #anelas no mesmo arKuivo e s? precisa montar uma delas. Soc/ poder dei&ar este par]metro como GULL se Kuiser montar tudoM ou ainda se tiver apenas uma #anela no seu arKuivo. DomHnio ^ DomHnio para tradu46o do arKuivo QFL. Geralmente dei&ado como GULL para

Glade / GTK+
usar o de.ault do sistema.

13

1 retorno um novo ob#eto GladeQFL ou GULL se .al ar

-un./o Glade_xml_signal_autoconnect()
-6o importante Kuanto o comando Glade_xml_new temos este comando Kue responsvel pela cone&6o das .un45es a cada sinal 9eventos: ocorridos em sua aplica46o. "rot?tipoN
*oid +lade<7"l<signal<autoconnect (+lade>?' @sel&)3

1ndeN Usel.V e a sua estrutura QFL carre+ada pelo comando anteriormente comentado. Be voc/ der uma lida na documenta46o o.icial do Lib+ladeM ver Kue e&istem outras .un45es similares a essa e Kue permitem .aCer a cone&6o de apenas al+uns sinais em especi.icoM mas os seus usos s6o apenas para al+umas ocasi5es especiais Kue est6o .ora do escopo deste material.

-un./o Glade_xml_get_widget()
Esta .un46oM ser a mais utiliCada em todo o seu pro+rama. "ois com ela Kue voc/ conse+uir associar um ;id+et na sua inter.ace QFL com o respectivo ponteiro em tempo de e&ecu46o. Soc/ a usar pelo menos uma veC para cada ob#eto Kue precisar ler ou alterar suas propriedades. "rot?tipoN
+tkWidget@ +lade<7"l<get<widget (+lade>?' @sel&$ const char @no"e)3

1ndeN

sel. ^ a sua estrutura QFL # carre+ada na mem?ria nome ^ nome do ob#eto Kue voc/ Kuer associar 9este deve ser o nome con.orme esta de.inido no Glade. 1 retorno um ponteiro do tipo Gt7*id+et Kue aponta pra re+i6o de mem?ria onde esta o seu ob#eto.

Com isso # podemos partir para um primeiro pro+ramin a e come4armos a ver do Kue tudo isso possHvel.

0ello 'orld em lib(lade


Como de pra&e em KualKuer aprendiCado de pro+rama46o aKui vai o nosso U<ello *orldV. Este e&emplo at um pouco so.isticado demais para ser c amado assimM # Kue ele n6o vai mostrar apenas uma U#anelicaV escrita U1la mundo=VM mas como ser o primeiro pro#eto Kue .aremos com o G-2LLib+lade ent6o esse nome ser bem-vindo. Gesse pro#etoM alm da #anelaM ele ter r?tulo e bot5es .uncionais para Kue voc/ possa ver como .unciona as li+a45es de ob#etos a sinaisM propriedades etc.

Glade / GTK+

1$

Em resumo todo o bsico pra voc/ come4ar. 1 motivo de usar este e&emplo pelo simples .ato de Kue Kuando eu comecei com esta lin+ua+em tive muito trabal o em pesKuisar e ler vrios te&tos e c?di+os .ontes UperdidosV pela Internet 9viva ao Goo+le=:. -odo e&emplo Kue encontrava era s? mostrando a colocar um Ubot6oCin oVM ou um r?tuloM compilar e pronto= Espero portanto apresenta-lo al+o mais do Kue um simples U<ello *orldV. Uma aplica46o desenvolvida em KualKuer lin+ua+em .eita em Kuatro etapas bsicasN

Desen o da inter.ace ( 1nde montaremos a9s: #anela9s: do nosso aplicativo de acordo com o necessrioM incluindo os componentes mais adeKuados a cada entrada do usurio ou reposta Kue ser apresentada a ele. Codi.ica46o ( 1 trabal o mais di.Hcil e demorado est aKui. Implementar o c?di+o .onte em si sempre um trabal o demorado e cansativoM aKui Kue sur+e DD\ dos problemas em um sistema de in.orma46o. Compila46o ( Geralmente essa etapa se resume a um cliKue ou a di+ita46o de al+umas lin as de comandos no terminal ( Este o processo de Utradu46oV do Kue .oi codi.icado em um lin+ua+em de alto nHvel 9como C LCOO: para uma lin+ua+em Kue o nosso sistema operacional possa entender -este de .uncionamento ( 1s testes devem ser .eitos de .orma bem prtica e realistas de acordo com a necessidade de cada sistema ( Be o seu sistema .aC clculos por e&emploM nada mais ?bvio do Kue testar vrias possibilidades de entradas de nRmeros di.erentesM mas imprescindHvel ver o Kue acontece se por en+ano o usurio entrar com al+uma letra tambm.

1bservem Kue estou me re.erindo as etapas de uma implementa46o de aplica46o em modo +r.ico. AKuelas partes de anlise de sistema Kue todo pro+ramador detestou estudar na .aculdadeM voc/ # deve estar cansado de saber Kue s6o necessriasM de serem .eitasM antes do desen o da inter.ace. 1s se+uintes pro+ramas ser6o usados em cada etapa apresentadasN Etapa 1 usaremos o Glade ( A.inal ele Kue o .oco do nosso trabal o Etapa % usaremos o +edit ( ou outro editor de sua pre.er/ncia ( o motivo da escol a deste editor Kue ele .oi .eito em G-2 9# Kue estamos usando o +nome ( pelo menos eu estou usando ( e por Kue ele .aC destaKue de sinta&e em CLCOO:. Sale aKui .risar tambm a e&ist/ncia do IDE UAn#utaV 9 ttpNLLan#uta.source.or+e.net ( meu pre.erido: Kue completHssimo no Kuesito inte+ra46o de .erramentasM mas como vamos .aCer um pro#eto simplesM encerro aKui os comentrios sobre ele at o momento oportuno. Etapa 3 ( "ra compila46o o Utodo-poderosoV +OO - G6o averia motivos Kue #usti.icassem o uso de outroM # Kue estamos usando o GGULLinu&. Etapa $ ( "ra teste de .uncionamento a tradicional lin a de comando do &term ou outro terminal de sua pre.er/ncia. 1 motivo de usarmos estas .erramentas Kue elas est6o acessHveis em Kuase 1EE\ das instala45es Linu& em des7top. Be a sua estiver .altando al+uma delas voc/ dever providenciar imediatamente.

Comeando
Antes de mais nada recomendvel Kue voc/ ten a o bom costume de criar um diret?rio pra armaCenar os seus pro#etosM a.inal eles ter6o vrios arKuivos e isso vai te a#udar bastante a manter tudo or+aniCado.

Glade / GTK+

1'

A partir da lin a de comando voc/ poder emitir o comando abai&o para iniciar o GladeM ou ainda poder inici-lo a partir do menu principal do seu ambiente de trabal o. Go caso do Gnome ser no menu Aplicaes L menu Desenvolvimento L 1p46o Glade-29ou Construtor de Interfaces Glade:.
welrbraga@wrbfire:~$ Glade-2

Criando a interface com Glade


Com o Glade # aberto voc/ ir criar um novo pro#etoM clicando no menu P !"#T! e escol endo o comando $!%!. Be voc/ tiver instalado o Glade com suporte ao +nome ser Kuestionado Kuanto ao tipo de pro#etoM escol a novo pro#eto G-2.

A nossa inter.ace ser simplesN -eremos uma #anelaM um r?tulo e tr/s bot5es 9um pra mostrar uma mensa+emM outro pra limpar a mensa+em e mais um pra encerrar:. Isso mais do Kue su.iciente pra um <ello *orld=

"riando a janela
CliKue no bot6o U"anelaV da paleta de componentes ( Isso vai e&ibir uma #anela vaCia na sua tela. A #anela o componente principal de uma aplica46o Kue rode em modo +r.icoM pois nela Kue incluiremos os ob#etos Kue o usurio ter acesso para controlar a aplica46o. Ao contrrio de outras lin+ua+ens do mundo *indo;sM como o Delp i e o COO @uilder _;;;.borland.com.br` Em Glade 9e al+umas outras lin+ua+ens: a #anela se apresenta realmente vaCia e se voc/ inserir um ob#eto KualKuer nelaM este ob#eto ocupar toda a rea cliente impedindo a inclus6o de novos ob#etos. "or isso devemos sempre usar .rames 9ou containers: pra dividir a #anela de acordo com o Kue Kueremos.

Dividindo a Janela pra incluir os objetos


"ra Kuem esta abituado com lin+ua+ens estilo @orlandM como Delp iM 2Pli& COO @uilder. Este poder ser um conceito estran o e meio complicado de se entender. Eu mesmo reclamei muito at descobrir os bene.Hcios Kue isso traC. "or e&emploM Kuantas veCes voc/ # teve dor de cabe4a pra colocar ' r?tulos e&atamente um abai&o do outro e e&atamente com o mesmo taman oJ Com o uso de .rames bastaria por um .rame do tipo Ucai&a verticalV e seus r?tulos dentro dele. -udo rpidoM prtico e o Kue mel orN Grtis= Em outras

Glade / GTK+

1,

lin+ua+ens voc/ precisaria selecionar todos eles e usar uma op46o de alin amento 9se e&istir: ou de.inir na mun eca a posi46o de cada um atravs da propriedade Ucanto esKuerdoV delesM mas com um simples descuido com eles poderia diCer Utc au-tc auV arruma46o. Em Glade temos $ tipos de .ramesN

Cai&a <oriContal ( Disp5e ob#etos oriContalmente Cai&a Sertical ( Disp5e ob#etos verticalmente -abela ( Disp5e ob#etos em .orma de tabela "osi45es 3i&as ( "ermite a movimenta46o livre dos ob#etos 9como no Delp i e COO @uilder citados anteriormente:

Go nosso caso usaremos a UCai&a verticalV por permitir o uso de dois ob#etos um abai&o do outro. T claro Kue .uturamente voc/ poder alterar issoM com um pouco de prticaM mas no momento dei&emos assim.

CliKue no bot6o UCai&a %erticalV _Gt7S@o&` e em se+uida cliKue sobre a sua #anela. Ga per+unta Kue ser e&ibida voc/ vai escol er % lin as. Be voc/ lembrar o Kue .oi e&posto anteriormente sobre como ser a nossa aplica46oM ver Kue usaremos um total de Kuatro ob#etos e no entanto estou reservando espa4o para dois= 1 motivo disso Kue ao invs de inserir os tr/s bot5esM um de cada veCM usaremos uma cai&a de bot5es Kue .acilita bastante o nosso trabal o.

1s outros objetos

A+ora cliKue sobre o bot6o U 'tuloV _Gt7Label` na paleta de componentes e cliKue na parte superior do .rame. Com isso voc/ ver um r?tulo escrito Ulabel1V e a parte de bai&o toda vaCia. CliKue a+ora em UCai&a de (otes )ori*ontaisV _Gt7<@utton@o&`

Ga #anela e&ibida n?s con.irmaremos 3 colunas 9ou tr/s bot5es:. Com isso a nossa #anela dever estar como a apresentada abai&o.

Glade / GTK+

10

Be ela estiver com as propor45es di.erentes disso v at a !anela "rincipal do Glade 9aKuela com bot5es de novoM abrir e salvar pro#eto:M cliKue sobre o nome da #anela U;indo;1V e na cai&a de propriedadesM na .ic a U;id+etV altere a propriedade REDIMENSIONVEL para NO.

Perfumaria!
"oderHamos dei&ar a #anela como est para come4armos a pro+ramarM mas se voc/ Kuiser dei&-la com uma cara mais ami+vel ent6o precisaremos alterar al+umas propriedades dos ob#etos. Como as altera45es Kue .aremos aKui s6o meramente UcosmticasV voc/ pode pular essa se46oM se KuiserM e continuar a partir da pr?&ima mas com isso poder estar perdendo a +rande c ance de aprender como dei&ar as suas aplica45es com cara de Uaplica46o de verdadeV. Sale uma dica importante aKuiN Al+uns ob#etos s6o complicados de selecionar. Be tiver di.iculdade pra isso voc/ poder e&ibir a Urvore de ;id+etsV 9a partir do menu Ser: pra .acilitar essa tare.a.

Janela
Samos alterar as se+uintes propriedades da #anela do nosso pro#etoN Ga .ic a *id+et alteraremosN Propriedade -Htulo Descries Novo Valor

-Htulo e&ibido na #anela ( Isso .ara com Kue a nossa <ello *orld #anela apresente este tHtuloM ao invs de U;indo;1VM como e o padr6o. "osi46o onde a #anela ser e&ibida na tela - 1 padr6o Center e Kue ela se#a e&ibida onde .oi dei&ada na ora da ultima compila46o. Com isso .or4aremos a come4ar sempre centraliCada na tela do usurio. Be a #anela poder ser ou n6o redimensionada ( n6o G6o necessidade para ser di.erente de Un6oVM a.inal esta e uma aplica46o peKuena e Kue o usurio n6o precisara de uma )rea t6o +rande.

"osi46o

>edimensionvel

23tulo
Apenas uma propriedade ser alterada aKui.

Glade / GTK+
Propriedade >?tulo Descries De.ine o te&to e&ibido no r?tulo ( Gossa aplica46o come4ara com o rotulo vaCioM ou se#a sem nada escrito. Novo Valor _Apa+ar`

1A

4ot5es
Apenas a propriedade U@ot6o de estoKueV ser alterada nestes ob#etos. Esta propriedade de.ine automaticamente uma .i+ura e um r?tulo para o bot6o de acordo com o padr6o do GnomeM .acilitando bastante a vida do pro+ramador e dei&ando o nosso pro+ramin a com apar/ncia mais pro.issional. Soc/ dever clicar em cada um deles e mudar esta propriedade con.orme abai&oN Objeto @utton1 @utton% @utton3 Novo Valor Aplicar Limpar Bair

Com isso a ornamenta46o da #anela est concluHda. "oderemos a+ora de.inir o Kue ser UvivoV no nosso pro+ramaM ou se#aM de.inir a Kuais eventos o nosso pro+rama dever responder Kuando o usurio intera+ir com ele.

Fas antes disso vamos salvar a nossa inter.aceM e testar como ela se comportar depois de tudo concluHdo.

al!ando a interface "ela "rimeira !e#


"ara salvar a inter.ace a+iremos como em KualKuer pro+ramaN clica-se no bot6o BALSA>M ou ainda o atal o C->LOB ou a partir do menu ">1!E-1 usa-se o comando BALSA> 9A +osto do .re+u/s:. Ao .aCer isso a tela abai&o ser apresentada e a Rnica coisa Kue precisamos alterar o nome do pro#etoM pois ele de.inir automaticamente o diret?rioM nome do pro+rama e arKuivo do pro#etoM n6o precisamos de.inir a lin+ua+em 9aKui c amada de lHn+ua:M pois n6o usaremos o Glade para +erar o c?di+o .onte. Da mesma .orma tambm n6o ira nos interessar as outras .ic as desta #anela.

Glade / GTK+

1D

Ao clicar em 12 o diret?rio ello ser criado e dentro dele teremos dois arKuivosN ello.Glade e ello.+ladep. B? ten a o cuidado de observar em Kue local o Glade esta salvando sua inter.aceM pois voc/ ir pra l via lin a de comandos 9+eralmente .icar em aL"ro#etosLseu8pro#eto.: Como o diret?rio de pro#eto est criado pra salvar todo o pro#etoM n?s entraremos nele e a partir da lin a de comando vamos c amar o Gedit criando um arKuivo c amado main.cpp 9poderia ser KualKuer outro nomeM mas eu +osto desse nomeM por dei&ar mais claro a sua .inalidade e tambm por .acilitar a utiliCa46o de al+uns scripts personaliCados Kue eu criei pra .acilitar certas tare.as. Bimplesmente abra um terminal e di+iteN
welrbraga@wrbfire:~$ cd Projetos/hello welrbraga@wrbfire:~/Projetos/hello$ gedit main.cpp &

Ao abrir o GeditM talveC ele Kueira saber se voc/ dese#a criar um arKuivo com o nome Umain.cppV. Con.irme Kue sim pra continuar. Com o Gedit aberto di+ite o c?di+o .onte do seu pro+rama.

O c$di%o fonte bsico e comentado


Geralmente um c?di+o .onte pra iniciar uma aplica46o lib+ladeLG-2 se parece com o mostrado abai&o. T claro Kue poder e&istir al+umas di.eren4as para al+uns casosM mas no +eral isso .unciona com DE\ das aplica45esM por isso eu costumo mant/-lo num Udiret?rio de modelosV e copio sempre Kue necessrio .aCendo as devidas altera45es.

Glade / GTK+
Binclude Cglade%glade.hD %% Carrega os recursos do +lade Binclude Cgtk%gtk.hD %%Carrega os recursos do +6E %%H Corpo principal do Irogra"a +lade>?' @ 7"l3 %%Cria u" ponteiro para u"a estrutura +lade>?' int "ain(int argc$char @arg*FG) J gtk<init(=argc$=arg*)3 glade<init()3 %%5nicialiKa o +6E %%5nicialiKa o +lade L 5sto geral"ente M opcional

%E

7"l N glade<7"l<new(Ohello.gladeO$Owindow/O$,-'')3 %%'P o ar0ui*o co" a estrutura >?' da sua aplica(#o glade<7"l<signal<autoconnect(7"l)3 %%Conecta todos os sinais aos seus "anipuladores gtk<"ain()3 %% H 'oop de e*entos do +6E return 03 Q

1 c?di+o est todo comentado e como ele praticamente padroniCado b todas as aplica45es n6o muito o Kue se .alar sobre ele. A n6o ser a lin aN
7"l N glade<7"l<new(Ohello.gladeO$Owindow/O$,-'')3

Esta a Rnica onde acontecer6o mudan4as de acordo com a necessidade do pro+rama. 1nde U ello.+ladeV o nome do arKuivo com a inter.ace QFL e U;indo;1V o nome da #anela principal do pro+rama. Sale lembrar Kue o nome do arKuivo U.+ladeV deve ter o camin o completo especi.icadoM pois do contrrio voc/ s? conse+uir rodar a aplica46o a partir do diret?rio onde ela est. Eu particularmente costumo copiar este arKuivo para ULvarLlibLVnome-do-pro+ramaV e especi.icar o camin o completoM pois desta .orma ao criar um pacote U.debV ou U.rpmV pra distribuHlo vou ter +arantia de Kue o pro+rama ir ac ar corretamente onde est a inter.aceM e&istem outras maneiras de se resolver esse problema tambm mas por ora vamos dei&ar assim e usaremos a lin a de comandos para rodar o pro+rama Kuando necessrio. As demais lin as do c?di+o .onte est6o comentadas e voc/ poder voltar a se46o U.un45es bsicasV para obter mais detal es. Ap?s di+itar esse c?di+o 9ou simplesmente copiar e colar: salve-o e voltemos para a lin a de comando. A+ora n?s vamos compilar o nosso pro+rama e veri.icar se ele est .uncionando.

Com"ilando
A compila46o do pro+rama via lin a de comando se resumir em apenas uma lin a como a mostrada abai&oN
g++ -o hello main.cpp `pkg-config --cflags --libs libglade-2.0`

Com isso n? estamos invocando o +OO pra +erar um e&ecutvel c amado elloM a partir do arKuivo .onte Umain.cppV. 1bserve Kue estamos tambm c amando o p7+-con.i+ e passando a sua saHda para o +OO 9atravs do cc - UcrasesV:. De .orma +rosseira e ob#etiva o Kue este comando .aC analisar todas as depend/ncias da lib+lade-%.E e indic-las ao compilador de .orma Kue n?s n6o ten amos Kue di+itar mais nada. B?

Glade / GTK+
a tHtulo de curiosidadeM se voc/ n6o .iCesse isso a sua lin a de comando deveria ser a se+uinteN
g++ -o hello main.cpp -I !sr incl!de g"k-2.0 -I !sr incl!de lib#ml2 -I !sr lib g"k-2.0 incl!de -I !sr incl!de a"k-$.0 -I !sr incl!de pango-$.0 -I !sr incl!de free"%pe2 -I !sr &$$'( incl!de -I !sr incl!de glib-2.0 -I !sr lib glib-2.0 incl!de -)l*--e#por"-d%namic -lglade-2.0 -lg"k-#$$-2.0 -l#ml2 -lp"hread -l+ -lgdk-#$$-2.0 -la"k-$.0 -lgdk,pi#b!f-2.0 -lm -lpango#f"-$.0 -lpango#-$.0 -lpango-$.0 -lgob-ec"-2.0 -lgmod!le-2.0 -ldl -lglib-2.0

%1

1bserve Kue uma di.eren4a respeitosa em usar ou n6o este comando. "ortanto use o primeiro comando no seu terminal e vamos compilar o nosso pro+rama. Cerca de uns cinco a trinta se+undos depois 9dependendo a velocidade do seu eKuipamento: o terminal dever e&ibir a lin a de comando novamente e sem emitir mensa+em al+uma. Be isso ocorreu ent6o a aplica46o .oi compilada com sucesso. Use o comando dls -ld para ver se um arKuivo e&ecutvel no seu diret?rio e tiver vamos rod-lo.
welrbraga@wrbfire:~ .ro-e"os hello$ g++ -o hello main.cpp `pkgconfig --cflags --libs libglade-2.0` welrbraga@wrbfire:~ .ro-e"os hello$ ls -l "o"al /( -rw#r-#r-# $ welrbraga welrbraga $/2/0 200/-$2-$1 $0:02 hello -rw-r--r-$ welrbraga welrbraga /$0$ 200/-$2-$1 $2:/0 hello.Glade -rw-r--r-$ welrbraga welrbraga 22$ 200/-$2-$1 $2:/0 hello.gladep -rw-r--r-$ welrbraga welrbraga 342 200/-$2-$1 $0:02 main.cpp -rw-r--r-$ welrbraga welrbraga 342 200/-$2-$1 $0:0$ main.cpp~ welrbraga@wrbfire:~ .ro-e"os hello$ . hello

Ao rodar o pro+rama a #anela Kue criamos dever aparecer na tela con.orme n?s a pro+ramamos. B? observe Kue ao clicar nos bot5es da #anela ela n6o responder pois n6o de.inimos evento al+um nela. Gote Kue nem mesmo o bot6o .ec ar da barra tHtulo est .uncionando. Be voc/ clicar nele a #anela se .ec arM mas o pro+rama continua rodando 9ve#a Kue a lin a de comando n6o apareceu no terminal:. Use C->LOC para Kuebrar a aplica46o e na pr?&ima etapa vamos corri+ir este problema. Ate aKui meus parabns seu pro+rama com Glade e G-2 # come4ou a dar sinal de vida. Be voc/ ac ou complicado c e+ar ate aKuiM n6o desanimeM a primeira vista parece Kue mesmoM mas com perseveran4a e .or4a de vontade voc/ abituar e lo+o ver Kue n6o t6o complicado assim. Fas acredito Kue se voc/ c e+ou at aKui porKue Kuer aprender e est disposto a ler e escrever muitoM a.inal de contas # deve estar acostumado com esta caracterHstica do CLCOO.

Glade / GTK+
&ando !ida ao "ro%rama
Antes de avan4ar deveremos ter dois conceitos em mente lo+o antes de come4armosN

%%

1. 3un46o manipuladora a .un46o Kue d UvidaV a um evento. T a .un46o onde pro+ramaremos a .inalidade de determinado ob#eto. %. Binal o acontecimento Kue ser interceptado e Kue acionar a nossa .un46o manipuladora. 1 Kue devemos .aCer a+ora voltar ao Glade e de.inir Kuais ser6o os sinais Kue a nossa aplica46o responder e Kual ser a .un46o manipuladora Kue estar associada a eles. Soc/ deve se lembrar Kue ao rodarmos a aplica46o e clicarmos no bot6o .ec ar da barra de tHtulo a #anela se .ec avaM mas a aplica46o continuava rodando. Isso ocorreu porKue a nossa aplica46o entrou em um loop in.inito Ugtk<"ain()V e em momento al+um ouve um comando Kue o .iCesse sair desse loop. "ois bemM selecione a #anela principal 9use a )rvore de *id+etsM se .or necessrio: e na #anela de propriedades v at a .ic a de Binais. Ga lista de sinais voc/ dever clicar no bot6o _...` e selecionar o sinal c amado UdestroPV 91 penRltimo evento ( Este evento ocorre sempre Kue um ob#eto destruHdo: ao con.irmar o Glade vai su+erir um manipulador c amado Uon8;indo;18destroPV. Fas esse nome muito +rande e .eioM vamos apa+ar isso e simplesmente di+itar U.ec arV. CliKue no bot6o UAdicionarV e pronto. Dessa .orma ao invs de criarmos uma .un46o com o nome Uon8;indo;18destroPV simplesmente criaremos com o nome U.ec arV. A+ora ative o sinal Uclic7edV do bot6o UAplicarV. "ara isso cliKue no primeiro deles e repita o mesmo procedimento acimaM mas dessa veC escol endo o sinal Uclic7edV e o manipulador altere para UaplicarV e n6o esKue4a Kue no .inal voc/ deve clicar o bot6o UAdicionarVM pois do contrario ele n6o aceitar as altera45es Kue .oram .eitas. >epita o mesmo procedimento com os outros dois bot5es. Com isso o nosso pro+rama dever responder aos se+uintes sinaisN Widget ;indo;1 button1 UAplicarV button% ULimparV button3 UBairV destroP clic7ed clic7ed clic7ed Sinal Manipulador .ec ar aplicar limpar .ec ar

1bserve Kue o bot6o Ubutton3V responder ao sinal Uclic7edV usando o mesmo manipulador do sinal UdestroPV da nossa #anelaM a.inal de contas a .un46o deles s6o as mesmas e isso vai nos economiCar um manipulador e um pouco de trabal o. Lembre-se Kue o C di.erencia maiRsculas e minRsculasM portanto ten a cuidado ao di+itar. Ap?s salvar as altera45es .eitas no GladeM se rodarmos a aplica46o novamente 9n6o precisa

Glade / GTK+
recompilar ( lembre-se Kue o lib+lade interpreta a estrutura U.+ladeV em run-time: ver Kue ele apresentar as se+uintes mensa+ens no terminalN
welrbraga@wrbfire:~ "!"orial-Glade hello$ 5hello:30/16: libglade-)7'8I8G 99: co!ld :fechar:. 5hello:30/16: libglade-)7'8I8G 99: co!ld :aplicar:. 5hello:30/16: libglade-)7'8I8G 99: co!ld :limpar:. . hello no" find signal handler no" find signal handler no" find signal handler

%3

1bserve Kue o libGlade # est tentando associar os sinais aos repectivos manipuladoresM e isso sem Kue precisssemos recompilar todo o pro#eto. Be n?s # tivssemos pro+ramado estes tr/s eventos a aplica46o estaria .uncionando e n6o precisarHamos .aCer mais nada a n6o ser aplaudir. Como n6o o .iCemos deveremos a+ora pro+ramar as tr/s .un45es. Ent6o voltemos ao +edit e acrescentaremos as se+uintes lin as no nosso pro+ramaN

Prot3tipo dos 6anipuladores Eventos


As lin as abai&o s6o os prot?tipos das nossas .un45es manipuladoras e por isso dever6o estar no come4o do nosso pro+rama lo+o acima da .un46o main9: .
e7tern *oid *oid *oid Q OCO J &echar()3 %%1echar a aplica(#o aplicar()3 %%Rplicar li"par()3 %%'i"par

Sale destacar aKui Kue os prot?tipos est6o dentro da sess6o Ue&tern CV por Kue o G-2 .eito em C e por isso e&i+e Kue os sinais se#am lin7ados como C padr6o. "or estarmos usando o GOOM Kue um compilador pra COOM devemos .or4-lo a usar este tipo de lin7a+em. Be estivssemos usando o GCC e compilando com o C padr6o isso n6o se .aria necessrioM mas perderHamos todo o poder Kue a lin+ua+em COO nos o.erecer .uturamente.

As +un.5es manipuladoras
1 Kue mais d trabal o pra trabal ar com o G-2 o acesso aos ;id+ets da sua aplica46o. Soc/ n6o pode acess-los diretamente e ainda precisa criar os ponteiros Kue re.erencie e&atamente Kuem voc/ esta Kuerendo usar. Fas com o costume voc/ ver Kue isso n6o e nen um bic o de sete cabe4as.

Fun'o Fechar()

Como j comentado antes a funo fechar ser acionada por dois sinais distintos: O sinal destroy emitido pela janela ao clicarmos no boto fechar convencional e pelo sinal clicked emitido pelo boto button3

Glade / GTK+
! "ue ambos os sinais devero responder da mesma forma# poderemos com isso economi$ar a di%itao de c&di%o para uma funo Observe abai'o "ue a pro%ramao de um sinal pra encerrar uma aplicao ()* consiste em usar um simples comando "ue + o %tk,main,"uit-. /oc0 deve se per%untar: 1u poderia usar o %tk,main,"uit l na definio de funo manipuladora do boto 2echar a partir do %lade3 4 resposta + sim e + no55

%$

6im por"ue teoricamente funciona e no por"ue na pratica %eralmente voc0 far al%o mais antes de fechar a sua aplicao# como verificar se o ar"uivo est salvo# ou fechar as cone'7es com sockets# ou simplesmente pedir a confirmao do usurio
*oid &echar() %%1echar a aplica(#o J gtk<"ain<0uit()3 %%Sncerra o loop principal do +6E Q

;!n<=o aplicar56 4 funo aplicar tamb+m + uma funo bem simples e cuja finalidade + simplesmente e'ibir a frase Ol 8undo5 1sta funo ser interceptada pelo sinal clicked do boto button9 e cada ve$ "ue for chamada far as se%uintes tarefas na se":0ncia: 9 ; <eserva um ponteiro do tipo (tk=id%et "ue ser usado para associar os dados do r&tulo usado em nosso pro%rama >sso + importante# pois at+ ento os nossos objetos so meramente ilustrativos# ou seja# no temos um meio direto de acess;los e ser a partir desse ponteiro "ue o acessaremos futuramente 1ste ponteiro poderia ser do tipo (tk?abel -o tipo "ue realmente estamos precisando.# mas isso inverteria al%umas coisas "ue veremos adiante @ ; Asando o funo %lade,'ml,%et,Bid%et faremos a associao do objeto label9 ao ponteiro mensa%em "ue declaramos anteriormente O "ue esta funo fa$ + simplesmente ler a nossa estrutura C8? e associar o objeto desejado ao nosso ponteiro do tipo (tk=id%et Observe "ue ela recebe dois valores: 4 estrutura C8? -Due j fi$emos a leitura lo%o no inEcio da aplicao. e o nome do Bid%et "ue ser associado ao ponteiro Observe ainda "ue o nosso ponteiro no precisa ter o mesmo nome do objeto Fesse caso o ponteiro se chama mensa%em e o objeto associado a ele chama;se label9 3 ; 2inalmente Gefiniremos o te'to do nosso label como sendo Ol 8undo5 atrav+s da funo %tk,label,set,te't-. 1sta funo re"uer como parHmetros um ponteiro para um tipo (tk?abel e o te'to a ser atribuEdo Observe "ue a funo %lade,'ml,%et,Bid%et retorna um ponteiro do tipo (tk=id%et e

Glade / GTK+

%'

a nossa funo %tk,label,set,te't re"uer um ponteiro do tipo (tk?abel para resolver esse problema foi necessrio fa$er um castin% para converter o (tk=id%et mensa%em em um (tk?abel 6em este castin% terEamos um erro em tempo de compilao
*oid aplicar() %%S7ibe a "ensage" de&inida J +tkWidget @ "ensage"3 %% Cria u" ponteiro para o widget "ensage" N glade<7"l<get<widget(7"l$Olabel/O)3 %%Rssocia o widget ao ponteiro gtk<label<set<te7t(+6E<'RBS'("ensage")$OHl: "undoTO)3 %%)e&ine o te7to 0ue ser: e7ibido no widget Q

;!n<=o limpar56

1sta funo dispensa comentrios 6e compararmos com a funo aplicar-. apresentada anteriormente veremos "ue ambas so id0nticas 4 diferena entre elas se d apenas no detalhe "ue a"uela primeira atribui o te'to Ol 8undo5 ao nosso r&tulo# en"uanto "ue esta Iltima atribui um te'to va$io de forma a limpar o nosso r&tulo
*oid li"par() %%'i"pa a "ensage" J +tkWidget @ "ensage"3 "ensage" N glade<7"l<get<widget(7"l$Olabel/O)3 gtk<label<set<te7t(+6E<'RBS'("ensage")$OO)3 Q

Ap?s di+itarmos as tr/s .un45es lo+o abai&o da nossa .un46o main9: poderemos recompilar o nosso pro+rama e ao rod-lo ela dever estar 1EE\ .uncional e n6o retornar nen um erro na saHda do console. "arbens a sua primeira aplica46o # .unciona completamente=

Conclus'o
Esta .oi uma aplica46o bem simples mas Kue demonstra como .unciona o Glade. Ela poderia ser mel oradaM otimiCadaM re.inada etc. Fas para um simples U<ello *orldV creio Kue est de bom taman o. Bu+iro a voc/ como e&ercHcio retirar a redund]ncia das .un45es UaplicarV e UlimparV. E&istem vrias maneiras de se .aCer issoM mas .ica a seu critrio a .orma como procederM a.inal de contas pro+ramar uma Kuest6o de +osto.

Glade / GTK+

%,

APE7DI"E I - Simpli+icando as listas encadeadas com a GList


Iuem # estudou listas encadeadas em CLCOO e n6o resmun+ou do trabal o Kue d usar este poderoso mas complicado recurso da lin+ua+em Kue me atire a primeira pedra. As listas encadeadas s6o recursos e&tramente importantes no desenvolvimento de aplica45es em C e s6o usadas como uma espcie de UvetorV din]micoM onde os elementos s6o li+ados uns aos outros .ormando uma seKXencia. E&istem dois tipos bsicos de lista encadeadaN A lista encadeada simples e a lista duplamente encadeada. A di.eren4a entre ambas Kue a primeira s? pode ser percorrida de .rente pra trsM uma veC Kue cada elemento aponta apenas para o seu elemento se+uinteW enKuanto Kue a lista duplamente encadeada pode ser percorrida em ambos os sentidos uma veC Kue cada elemento possui re.er/ncia ao seu antecessor e ao seu sucessor. Cada um deste tipo de lista pode ser usado para se criar listas circularesM .ilasM pil asM rvores etc. Fas isso est .ora do escopo deste material e caso este#a interessado neste assunto voc/ encontrar um .arto material sobre isso apenas buscando no nosso bom ami+o U+oo+leV 9;;;.+oo+le.com.br: .uturamente talveC eu ven a a abordar esses assuntos em outro arti+oM e at mesmo se voc/M caro leitorM se tiver con ecimento sobre o assunto e Kuiser contribuir estamos a sua disposi46o. 1 desen o abai&o representa um elemento simples de uma lista encadeada

Figura1: lista encadeada simples

Gote Kue cada elemento possui um ponteiro Kue aponta para o elemento se+uinte da estrutura. 1 ob#etivo deste arti+o mostrar como trabal ar com listas duplamente encadeadeadasM por elas terem uma Kuantidade de aplica45es maior # KueM como .oi dito anteriormenteM estas podem ser percorridas em dois sentidos. Fas se por al+um motivo voc/ precisar da lista encadeada simples isso poder ser implementado .acilmente com o tipo UGBListV Kue tambm est na biblioteca Glib. Be voc/ daKueles Kue precisam de um bom motivo pra estudarM ent6o vou l e dar apenas um bom motivo para entender a lista encadeadaN Ao .aCer um pro+rama com o Glade Kue use o ob#eto U+t7comboV a lista de itens Kue s6o e&ibidos neste componente deve ser do tipo UGListV 9Kue uma lista duplamente encadeada=:.

Glade / GTK+

%0

Figura 2: Lista duplamente encadeada

1bserve no desen o da lista duplamente encadeada Kue cada elemento possui um ponteiro para o elemento se+uinteM como na lista simplesM mas possui tambm um outro ponteiro para o elemento anterior.

*istas du"lamente encadeadas em C


Be ainda n6o .icou claro bom notar Kue em uma lista encadeada cada elemento usa ponteiros para re.erenciar os outros elementos e como tudo deve ocorrer na dinamicamente precisamos usar as tradicionais .un45es UmallocV e U.reeV no C AGBI ou ainda as .un45es Une;V e UdeleteV no COO. -ipicamente uma lista encadeada para armaCenar strin+s .icaria como se+ueN
struct s_strings { char *texto; s_strings *proxima; s_strings *anterior; };

1bserve Kue na prtica nada mais temos do Kue uma estrutura simples contendo o dado principal Kue estamos Kuerendo armaCenar 9nesse caso um ponteiro para Uc areV: e duas re.er/ncias ao tipo Us8strin+V Kue apontar6o para a estrutura anterior e para a se+uinte. "ara o leitor Kue tem di.iculdades em trabal ar com um Rnico ponteiro e nunca trabal ou com listasM ima+ine lidar com todos esses ponteiros de uma s? veC= T claro Kue e&ercitando adKuiri-se certa prtica e abilidadeM mas eu con.esso Kue dei +ra4as a Deus Kuando descobri o tipo GList da Glib. "ortanto n6o vou me esticar mais mostrando como usar a lista mostrada acimaM mas sim com a nossa Glib.

O ti"o G*ist
A Glib implementa o tipo GList como sendo uma estrutura de lista duplamente encadeada nos moldes da estrutura # mostrada. 1l ando a documenta46o desta biblioteca 9eu particularmente .a4o isso usando o pro+rama UDev elpV Kue um nave+ador de documenta46o: podemos ver a estrutura Kue e&atamente o mostrado abai&oN

Glade / GTK+
struct GList { gpointer data; GList *next; GList *prev; };

%A

Compare as duas estruturas e ve#a a semel an4a. 1bserve ainda Kue o campo UdataV do tipo UgpointerV.
typedef void *gpointer;

Ga realidade o +pointer um ponteiro do tipo UvoidVM ou se voc/ pre.erir um ponteiro Un6o-tipadoV o Kue si+ni.ica Kue o seu campo UdataV poder assumir KualKuer tipo de dadoM se#a ele um dado simples como um UintV ou at mesmo uma comple&a estrutura de dados. Sale ainda ressaltar Kue em al+uns momentos voc/ ver o tipo U+constpointerV Kue representado como est abai&oN
typedef const void *gconstpointer;

Assim como U+pointerV este um ponteiro para o tipo UvoidVM sendo Kue desta veC ele aponta para um dado constante. Isto +eralmente usado em prot?tipo de .un45es para Kue o dado passado a elas n6o se#a alterado. "ara criarmos uma lista do tipo GList necessrio t6o somente o c?di+o abai&oN
GList *minha_lista = NULL;

1bserve Kue a lista deve ser iniciada como GULL para Kue n6o ten amos problemas .uturos. Assim ela considerada vaCia.

Funes T+"icas "ara mani"ular a %list


Be considerarmos uma lista como um tipo de cadastro 9um cadastro de endere4osM por e&emplo:M as principais a45es Kue s6o .eitas nesse cadastro s6oN inclus6oM remo46oM classi.ica46oM procura e lista+em. Se#a ent6o as .un45es Kue usamos pra isso.

-un.5es de inclus/o
As .un45es a se+uir s6o usadas para inclus6o de dados na +listN
%,list,a""end()

Usada para adicionar um novo elemento no .inal da lista.


GList* g_list_append GList *list! gpointer data";

%,list,"re"end()

Usada para adicionar um novo elemento do inHcio da lista.


Glist* g_list_prepend GList *list! gpointer data";

%,list,insert()

Usada para adicionar um novo elemento em determinada posi46o.


Glist* g_list_insert GList *list! gpointer data! gint position";

Glade / GTK+
%,list,insert,sorted()

%D

Usada para inserir elementos ordenadamente na lista.


Glist* g_list_insert_sorted GList *list! gpointer data! G#ompare$unc func";

1bserve Kue a .un46o +8list8insert8sorted9: precisa receber o endere4o de uma .un46o de compara46oM de.inida pelo pro+ramador previamente e se+uindo al+umas re+ras Kue vamos comentar adiante.

-un.5es de remo./o
As .un45es a se+uir servem para remover elementos da nossa lista.
%,list,remo!e()

Use-a para remover um Rnico elemento da lista. "ara usar esta .un46o basta apenas in.ormar o nome da lista e o conteRdo do elemento a ser removido.
Glist* g_list_remove GList *list! gconstpointer data";

T importante destacar Kue se e&istir dois elementos com o mesmo conteRdoM apenas o primeiro ser removido. Be voc/ dese#ar remover todos os elementos com este mesmo conteRdo use a .un46o U+8list8remove8all9:V Kue possui a mesma sinta&e.
%,list,free()

Esta .un46o usada para liberar a mem?ria alocada pela sua estrutura e deve ser c amada e&plicitamente em seu pro+rama Kuando tiver terminado com o uso da estrutura GList em Kuest6o.
void g_list_free GList *list";

1utras +un.5es
Beria uma perda de tempo .icar escrevendo cada .un46o aKui e e&plicar o Kue # est e&plicado. -odas as .un45es da +lib est6o documentadas e podem ser consultadas diretamente no site o.icial ;;;.+t7.or+ M ou no site LiDG ttpNLLlidn.source.or+e.net Kue possui a documenta46o de praticamente todas as bibliotecas e .erramentas Kue voc/ precisa e at mesmo localmente consultando os seus diret?rios LusrLs areLdocM LusrLdoc e LusrLlocalLdoc 9Use um nave+ador de coumenta46o como o UDev elpV: para .acilitar a sua vida. Be+ue abai&o um breve resumo de mais al+umas .un45es apenas para a+u4ar a sua curiosidade de ler a documenta46o.

%,list,find-. ; ?ocali$a um elemento com o dado especificado %,list,len%th-. ; <etorna o nImero de elementos na sua lista %,list,inde'-. ; <etorna a posio do elemento "ue cont+m o dado especificado %,list,foreach-. ; 1'ecuta uma determinada funo para cada elemento da sua lista %,list,concat-. ; !unta duas listas %,list,sort-. ; Ordena uma lista de acordo com as caracterEsticas da funo de ordenao especificada %,list,reverse-. ; >nverte a lista -o primeiro elemento torna;se o Iltimo# o se%undo torna; se penIltimo etc.

A G*ist na "rtica
C e+a de teoria e vamos ao Kue todos KueremN "or em prtica.

Glade / GTK+
"ra come4ar vamos abrir um terminal e criar uma pasta para armaCenar os arKuivos deste pro+ramin a de teste. Lembrando Kue para criarmos uma pastaM ap?s ter aberto a #anela de terminal basta emitir o comandoN
$ mkdir nome-da-pasta [ !" #$

3E

Eu particularmente +osto de armaCenar estes testes dentro de uma pasta c amada U"ro#etosV ent6o o Kue eu .a4o entrar nesta pasta e depois criar a subpasta para o pro+rama de testeN
$ cd Projetos [ !" #$ $ mkdir testeglist [ !" #$

A+ora s? rodar o seu editor de te&tos pre.erido. Eu aconsel o Kue este editor .a4a a numera46 o de lin asM para .acilitar o trabal o de depura46o Kuando .or necessrio. 9particularmente eu pre.iro o Gedit:.
$ gedit main.cc & [ !" #$

Com isso estamos rodando o +edit pronto para criar o arKuivo principal do nosso teste e dei&ando o terminal livre para nobres tare.asM como rodar o +cc por e&emplo. Samos come4ar di+itando o se+uinte c?di+oN
%* * &este da Glist * para compilar use' * gcc main(c )o testeglist *p+g)config ))cflags ))li,s gli,)-(.* *% %%/nclusao da ,i,lioteca gli, %%isso e importante para usar o tipo GList 0ue 1 o foco do nosso estudo 2include 3gli,(h4 %%#riacao da Lista encadeada GList * 5inhaLista; %%$uncao principal do nosso programa de teste int main char argc! char **argv" { g_print 6&este da Glist7n6"; return .; }

At aKuiM se compilarmos o nosso pro+rama ele n6o dever acusar KualKuer erroM mas se .or e&ecutadoM tambm n6o dever .aCer nada de interessante. "ara n6o termos Kue nos estressar com os mtodos de entrada do C 9aKueles Uscan.V da vida: vamos aproveitar o vetor de param/tros do nosso pro+rama e entrar com os itens da lista via lin a de comandos. "ara isso inclua o c?di+o abai&o a partir da lin a 1$ 9onde est o Ureturn EV:.
gint i = .; %%8ari9vel inteira de uso geral 5inhaLista = NULL; %%: important;ssimo 0ue a GList se<a iniciada com NULL

Se#a Kue n?s somente criamos uma varivel do tipo inteiro Kue ser usada para diversos .ins e o mais importante Kue iniciar a GList com o valor GULL. Lembre-se Kue uma lista encadeada um ponteiro e todos os ponteiros devem ser sempre iniciados para n6o termos dor de cabe4a .uturamente.

Glade / GTK+
Inclus/o de elementos na lista
A+ora inclua o c?di+o se+uinte lo+o acima do Ureturn EWV 9lin a 1,:.
if argc 4 =" { %%8erifica se foi passado algum argumento i = = ; i 3 argc ; i>> " {%%?assa por todos os elementos da lista %%@diciona cada um dos elementos no final da lista 5inhaLista = g_list_append 5inhaLista! gpointer" argvAiB"; } %%for i } %%if argc g_list_free 5inhaLista"; %%Li,era o espaCo alocado pela 65inhaLista6 for

31

AKui a coisa come4ou a .icar interessanteN primeiramente estamos veri.icando se .oi passado al+um par]metro para o nosso pro+rama 9veri.icando o valor de Uar+cV:. Be ouver pelo menos um item 9maior Kue 1M pois o nome do e&ecutvel o primeiro par]metro: ent6o come4amos um loop do primeiro at o Rltimo e adicionamos cada um deles na nossa GList usando a .un46o UappendV Kue inclui um elemento no .inal da lista. 1bserve Kue os nossos items s6o do tipo Uc areVM mas esta .un46o reKuer um ponteiro Un6o-tipadoV 9Uvoid eV ou U+pointerV:M daH o motivo do Ucastin+V Kue .oi .eito. 1utra coisa a .risar a .un46o U+8list8.ree9:V antes de encerrar o pro+rama. Isso vai liberar a mem?ria usada pela nossa GList sem precisarmos nos preocupar de remover itempor item na lista.

8uantos itens 9 na lista:


Be compilarmos o nosso pro+rama e o rodarmos ele n6o dever acusar nen um erroM mas n?s ainda n6o podemos saber o Kue est acontecendo com eleM pois apesar de estarmos inserindo itens na lista n?s n6o temos nen uma in.orma46o a respeito disso. Insira a partir da lin a %1 9Uf LLi. ar+cV: o se+uinte c?di+oN
%%5ostra o total de elementos na glist g_print 6A&otal de elementos' DdB7n6!g_list_length 5inhaLista"";

Com essa lin a lo+o ap?s o la4o U.orV n?s poderemos ver a Kuantidade de elementos Kue .oram inseridos na lista. 1 comando U+8printV o responsvel por e&ibir na tela a mensa+em in.ormando o taman o 9sua sinta&e a mesma do # con ecido Uprint.V do C: e o comando U+8list8len+t V retorna a Kuantidade de elementos na listaM precisando apenas receber a lista como par]metro. A+ora compile o pro+rama e rode. A saHda dever ser al+o como o mostrado abai&oN
$ gcc main.c -o testeglist %pkg-config --cflags --libs glib-&.'% $ ./testeglist (")-*rasil www.gtk.cjb.net "este da (+ist ["otal de elementos: &$

Emitindo um aviso em caso de +al9a


1bserve Kue e&ecutamos o teste+list com dois ar+umentos e ambos .oram adicionados b lista. E&perimente rodar o pro+rama sem ar+umentos e voc/ ver Kue n6o teremos nen uma mensa+em in.ormando o Kue est acontencendo n6o uma boa pratica de pro+rama46o dei&ar o usurio sem in.orma46o portanto vamos substituir a lin a %3 9U f LLi. ar+cV: pelo c?di+o a se+uirN

Glade / GTK+
} else g_Earning 6Nenhum item foi passado para lista( @ lista esta vaFia6";

3%

Be o pro+rama .or compilado e e&ecutado a+oraM sem par]metros teremos a se+uinte saHdaN
$ gcc main.c -o testeglist %pkg-config --cflags --libs glib-&.'% $ ./testeglist "este da (+ist ,, -process:./0'1: 23#!4!( ,,: !enh5m item foi passado para lista. 3 lista esta 6a7ia

Se#a Kue usamos o U+8;arnin+9:V ao invs da U+8printV para apresentar a mensa+em de aviso. Isso asse+ura Kue esta mensa+em se#a passada para o console de erros 9LdevLstderr ou outro Kue se#a de.inido:. T interessante n?s .aCermos isso nos nossos pro+ramas para Kue p?ssamos .iltrar as mensa+ens de erro Kuando necessrio. Be voc/ se interessou por este recurso ve#a o manual da +lib e procure a respeito das .un45es 9U+8print9:VM U+8messa+e9:VM U+8;arnin+VM U+8critical9:V e U+8error9:V:.

E#ibindo o ;ue 9 na lista


At aKui nosso pro+rama # armaCena elementos na lista e in.orma Kuanto .oram armaCenadosM mas ainda n6o sabemos Kuais .oram armaCenados. G6o e&iste uma .un46o Kue apresente todo o conteRdo da listaM mas para resolver esse problema e mostrar o conteRdo da nossa lista usaremos a .un46o U+8list8.oreac 9:V Kue e&ecuta uma .un46o criada pelo usurio para cada elemento da lista. Fas antes Kue isso se#a possHvel precisamos de.inir o prot?tipo desta .un46o de e&ibi46o Kue dever se parecer com o prot?tipo abai&oN
void *G$unc" gpointer data! gpointer user_data";

1ndeN

-J(2unc. ; + o nome da funo# data ; + o elemento "ue ser passado pela funo %,list,foreach-. -no nosso caso ser um %charJ. user,data ; pode ser um vetor de parHmetros e'tras para confi%urar a sua funo
gpointer item! gpointer meusdados"; %%5ostra o item da lista

Come4aremos inserindo o prot?tipo a se+uir antes da .un46o UmainV 9lin a 11:N


void mostra

e o corpo da .un46o listado abai&o no .inal do arKuivoM ap?s o UfV Kue .ec a a nossa .un46o UmainV 9lin a %A:N
void mostra gpointer item! gpointer meusdados"{ %%5ostra o item da lista gchar *texto = gchar *" item; %%Gxecuta o 0ue foi prometido ;)" g_print 6 * Ds7n6!texto"; }

A primeira lin a Rtil desta .un46o apenas cria uma varivel onde o te&to de cada elemento da nossa lista .icar armaCenado e atribui a ela o item atual # convertido para U+c ar eV. Em se+uida ele mostra esse te&to usando a .un46o U+8print9:V. G6o preciso diCer Kue apesar de termos criado a .un46o ela ainda n6o c amada em ponto al+um do nosso pro+ramaM portanto antes de compilarmos o nosso pro+ramin a n?s vamos at a lin a %$ do nosso pro+rama 9entre o g print!"#$%tal&&&'( e o ) else g *arning!(: e acrescentaremos a se+uinte lin aN

Glade / GTK+
g_list_foreach 5inhaLista!mostra!66";

33

Como # dito antes a .un46o U+8list8.oreac V e&ecuta uma determinada .un46o para cada elemento contido na lista. G?s a usamos para e&ecutar a .un46o UmostraV Kue aviamos criado e pronto. 1bserve Kue no .inal .oi passado UV para o par]metro UmeusdadosV Kue pra esse caso n6o tem utilidade al+umaM mas deve ser passadoM n?s veremos um e&emplo prtico de uso deste par]metro mais adiante Kuando vermos a remo46o de elementos. 3inalmente compile e rode o pro+rama.
$ gcc main.c -o testeglist %pkg-config --cflags --libs glib-&.'% $ ./testeglist 3na 8ose 9aria "eresa "este da (+ist ["otal de elementos: .$ , 3na , 8ose , 9aria , "eresa

1rdenando a lista
"ara ordenar a lista n?s usamos a .un46o U+8list8sort9:V ou a U.un46o +8list8sort8;it 8data9:V. Ambas precisam de uma .un46o au&iliar Kue determina o critrio de ordena46o. A di.eren4a Kue e&iste entre elas Kue a se+unda aceita par]metros adicionais Kue ser6o enviados para a sua .un46o de ordena46o. Se#a abai&o os seus prot?tiposN
GList* g_list_sort (GList *list, GCompareFunc compare_func);

e
GList* g_list_sort_with_data (GList *list, GCompareDataFunc compare_func, gpointer user_data);

Ambas retornam um ponteiro para o inHcio da lista # ordenada e seus par]metros s6oN

list K 4 lista a ser ordenada compare,func K 4 funo "ue define o crit+rio de ordenao user,data K Gados "ue sero passados a funo compare,func -s& na funo %,list,sort,Bith,data.

1 prot?tipo da .un46o Ucompare8.uncV para a a .un46o U+8list8sortV o Kue se+ueN


gint (*GcompareFunc) (gconstpointer a, gconstpointer b);

E para a .un46o U+8list8sort8;it 8dataV N


gint (*GcompareDataFunc) (gconstpointer a, gconstpointer b, gpointer user_data);

Ambas recebem dois itens Kue ser6o comparados 9enviados pelas .un45es U+8list8sortV e U+8list8sort8;it 8dataV: e a Rltima recebe ainda al+um ar+umento Kue se#a necessrio passar para sua .un46o. Ao criar estas .un45es voc/ deve considerar Kue os valores de retorno devem se+uir a re+raN
/alor ne%ativo se a L b M N se a O b M valor positivo se a P b

E&.N

Glade / GTK+
Considere uma lista contendo os itensN F > @ F Ao comparar UFV com U>V deve ser retornado valor positivo 9':M pois UFV menor Kue U>V Ao comparar UFV com U@V deve ser retornado valor ne+ativo 9-11:M pois UFV maior Kue U@V Ao comparar UFV com UFV deve ser retornado valor E 9Cero: M pois UFV i+ual a UFV

3$

"ra Kuem ainda n6o entendeu o porKue dissoM considere a tabela ABCII onde cada caracter corresponde a um nRmero de E a %''. UFV vale 00M U>V vale A% e U@V vale ,,. 1 Kue o computador .aC subtrair os valores ABC do primeiro com o se+undo e retornar a di.eren4a. Soc/ pode ver essa tabela com o pro+ramin a abai&oN
2include 3gli,(h4 int main " { int i; for i = HH ; i 3 =-I ; i>>" g_print 6DHd = ADcB7n6!i!i"; return .; }

1 Kue este pro+ramin a .ar listar toda a tabela a partir do c?di+o 33 9U=V: at o c?di+o 1%, 9UaV:. "ra compil-lo voc/ usar uma lin a similar a Kue estamos usando para compilar e rodar o nosso teste da +listN
$ gcc ascii.c -o ascii `pkg-config --cflags --libs glib-2.0` $ ./ascii

G?s usaremos a .un46o U+8list8sort9:V e para isso vamos de.inir o prot?tipo da nossa .un46o de compara46o lo+o abai&o do prot?tipo da .un46o Umostra9:V 9lin a 1%:N
gint compara gconstpointer a!gconstpointer ,";

e o corpo da .un46o ser di+itado l no .inal do arKuivoM ap?s a .un46o mostra 9lin a 3A:.
gint compara gconstpointer a!gconstpointer ," { %%#ompara duas strings return g_ascii_strncasecmp const gchar *" a ! const gchar *" , ! J" ; }

1bserve Kue o prot?tipo da .un46o corresponde ao da .un46o UGcompare3uncV e a compara46o .eita na realidade pela .un46o U+8ascii8strncasecmp9:V Kue usada para comparar strin+s. Esta .un46o a substituta da .un46o U+8strncase9:V Kue tornou-se obsoleta e por isso n6o deve ser usada em novos c?di+os. Consultando no manualM por estas .un45es vemos Kue elas recebem dois ponteiros para Uconst c areV e o nRmero de caracteres Kue ser6o usados para compara46oM no nosso caso ser6o apenas os ' primeiros. A+ora Kue # temos a .un46o de.inida s? precisamos c am-la #unto com o U+8list8sort9:V para Kue ten amos a nossa lista ordenada. Samos incluir o c?di+o abai&o lo+o acima do U+8list8.or8eac 9:V Kue usamos anteriormente para e&ibir o conteRdo da lista 9lin a %':.
5inhaLista = g_list_sort 5inhaLista!compara"; %%Krdena a lista g_print 67nLista Krdenada7n6";

Glade / GTK+
Com isso estamos ordenando a lista e em se+uida e&ibindo-na na tela. A+ora compile e rode o pro+rama para ver o resultado.
$ gcc main.c -o testeglist %pkg-config --cflags --libs glib-&.'% $ ./testeglist +in5: (!; (P+ <ebian (lib )ernel "este da (+ist ["otal de elementos: /$ +ista =rdenada , <ebian , (lib , (!; , (P+ , )ernel , +in5:

3'

1bserve Kue a lista .oi corretamente ordenada e mesmo tendo indicado Kue a ordena46o ocorre at o 'g caracter de cada elemento mesmo os itens com menor taman o .oram ordenados certos. Baiba ainda Kue se tivesse al+um elemento com taman o maior ele seria ordenado normalmente tambm. Sale ainda uma nota a respeito da .un46o U+8list8insert8sortedV Kue pode se aproveitar da nossa .un46o UcomparaV para inserir os itens # ordenados na nossa lista. Assim poderiamos reduCir a Kuantidade de comandos no nosso pro+rama substituindo o UappendV se+uido do UsortV por apenas o Uinsert8sortedV. Be Kuiser e&perimentar 9eu recomendo .aCer issoM para .i&ar: ent6o comente a lin a %1 9U+8list8appendV: e insira abai&o dela a lin a a se+uirM depois comente a lin a do comando U+8list8sortV 9lin a %,:
5inhaLista = g_list_insert_sorted 5inhaLista! gpointer" argvAiB! compara"; %%/nsere ordenando

Com isso todo elemento Kue .or inserido b lista entrar na posi46o adeKuada.

Invertendo a lista
"ara invertermos a lista e&iste uma maneira bem simples Kue usando a .un46o U+8list8reverse9:V como mostrado abai&o.
5inhaLista = g_list_reverse 5inhaLista"; %%/nverte a lista

Inclua isso ap?s a .un46o de ordena46o 9lin a %,: e ve#a o resultado. Fais simples Kue isso pedir demais= T claro Kue pra esse caso n6o averia essa necessidadeM pois se Kueremos apenas classi.icar em ordem descendente 9de h para A: poderiamos incluir um sinal de menos U-V no comando UreturnV da .un46o UcomparaV como abai&oN
return )g_ascii_strncasecmp const gchar *" a ! const gchar *" , ! J" ;

A .un46o U+8list8reverseV dedicada aos casos onde voc/ precisa inverter o conteRdo da lista independente da ordem de classi.ica46o. "or e&emplo a lista+em vinda de um arKuivo com ist?rico de endere4os num nave+ador ;ebM onde voc/ dese#a e&ibir do Rltimo 9acessado recentemente: para o primeiro 9mais anti+o:.

2emovendo um elemento da lista


"ara remover elementos da lista podemos usar as .un45es U+8list8remove9:V ou U+8list8remove8all 9:V. A di.eren4a entre elas Kue avendo dois ou mais elementos com o mesmo conteRdo a primeira

Glade / GTK+
.un46o remover apenas o primeiro elemento da lista e a se+unda .un46o remover todos. "or e&emploM supon a uma lista contendoN iA @ C D E 3 A @ C D E A @ C Df

3,

Be usarmos a .un46o U+8list8removeV para remover o elemento UAV a lista passar a serN i@ C D E 3 A @ C D E A @ C DfM enKuanto Kue se usarmos a U+8list8remove8allV a lista passar a serN i@ C D E 3 @ C D E @ C Df. 1 prot?tipo das .un45es o Kue se+ue abai&oN
Glist* g_list_remove GList *list! gconstpointer data";

e
GList* g_list_remove_all GList *list! gconstpointer data";

Ambas precisam receber a lista a ser alterada e o conteRdo do elemento a ser removido. Se#a um e&emplo simples abai&oN
5inhaLista = g_list_remove 5inhaLista! gconstpointer"argvA=B";

Geste e&emplo estamos removendo o ultimo elemento inserido na lista. Fas vale destacar aKui um problema Kue encontramos com .reKuencia. Insira esta lin a lo+o abai&o do Uf LL.or iV 9lin a %$: Compile e rode o pro+rama. 1bserve Kue o ultimo elemento inserido 9ULinu&V: .oi removido. CertoJ=
$ gcc main.c -o testeglist %pkg-config --cflags --libs glib-&.'% $ ./testeglist +in5: (!; (P+ <ebian (lib )ernel "este da (+ist ["otal de elementos: 0$ +ista =rdenada , <ebian , (lib , (!; , (P+ , )ernel

A+ora substitua a varivel Uar+v_1`V pelo pr?prio valorM ou se#a ULinu&V como abai&oN
5inhaLista = g_list_remove 5inhaLista! gconstpointer"LLinuxL";

Compile e rode. Se#a Kue a lista .icou intactaM ou se#a o U+8list8removeV por al+um motivo Kue parece ine&plicvel n6o removeu o elemento. "or Kue isso aconteceuJ= Bimples= Be voc/ ol ar como n?s inserimos os valores na listaM ver Kue o seu elemento UdataV n6o contm as strin+s em siM mas apenas um ponteiro indicando onde est o Uar+v_`V correspondente. Lo+oM n6o adianta indicar o te&toM mas sim o endere4o. Uma .orma de resolver esse problema usar o .oreac para percorrer a lista e em cada elemento ele pe+a o item e compara o valor dese#ado. Apesar de estran o essa .orma a mais comum de se usarM pois voc/ +eralmente usar uma estrutura como por e&emplo uma UstructV com vrios dadosM ao invs de uma simples strin+. Se#amos a solu46oN Acrescente esse prot?tipo #unto dos demaisN
void remover gpointer item!gpointer valor"; %%Memove item

Go .inal do arKuivo inclua o corpo da .un46oN

Glade / GTK+
void remover gpointer item!gpointer valor" { %%Memove item if compara item!valor" == ." 5inhaLista = g_list_remove 5inhaLista!item"; }

30

A+ora se#a .eliC= Inclua uma c amada para o .oreac no lu+ar daKuele +8list8remove Kue n6o .uncionou 9lin a %':.
g_list_foreach 5inhaLista!remover!6Linux6";

Se#a Kue n?s aproveitamos a .un46o UcomparaV Kue # aviamos criado. Isso nos +arante Kue se mudarmos o tipo de dado principal da nossa lista a remo46o estar atualiCada tambm. 1 seu .uncionamento depende do U.oreac V Kue c ama a nossa .un46o UremoveV passando a ela o campo UdataV do elemento atual e o valor Kue Kueremos e&cluir. Ao .aCer isso a .un46o compara se ambos s6o identicos 9retorna E se .orem i+uais:. Be realmente .or o mesmo ent6o o item removido. Soc/ poder e&perimentar a+ora Kue independente de passar uma constante como U2ernelVM ULinu&V etc. ou uma varivel como Uar+v_1`V o item ser localiCado e removido. Esta constru46o s? tem um problemaN Como o U.oreac V e&ecutado em todos os elementosM independentemente se voc/ usar a .un46o UremoveV ou a .un46o Uremove8allV todos os elementos com aKuele te&to ser6o removidos. "ara resolver esse problemaM se isso .or inconveniente para a sua aplica46o possHvel .aCermos um loop manualmente com um la4o ; ile e ap?s encontramos o item a ser removido Kuebramos esse la4o com o Ubrea7V do UCLCOOV. Compile e rode o pro+rama passando o primeiro ar+umento repetido vrias veCesN
$ gcc main.c -o testeglist %pkg-config --cflags --libs glib-&.'% $ ./testeglist +in5: (!; (P+ <ebian (lib )ernel +in5: +in5: "este da (list ["otal de elementos: 0$ +ista =rdenada , <ebian , (lib , (!; , (P+ , )ernel

1bserve Kue o ar+umento ULinu&V Kue .oi passado tr/s veCes .oi completamente e&tinto da lista. Se#a a solu46o para este problema. G?s vamos criar uma .un46o se+uindo o Kue .oi e&planado acima. 1 prot?tipo abai&o mostra Kue a nossa .un46o bem similar ao U+8list8removeV da GlibM mudando apenas o valor Kue na .un46o ori+inal um UconstpointerV e esta nossa .un46o eu usei o tipo mais adeKuado ao pro+rama em Kuest6o Kue um Uconst +c areVM alm do retorno Kue o normal era ponteiro para a nova lista e nessa .un46o personaliCada ela retorna UvoidV. Soc/ poder incluH-lo #unto aos demais prot?tipos de .un45es Kue # temos.
void g_list_remove_em GList *lista ! const gchar *valor"; %%Memove um item

1 corpo da .un46o este e pode ser incluso no .inal do nosso arKuivoN


void g_list_remove_em GList *lista ! const gchar *valor"{ %%Memove um item lista = g_list_first lista"; do if compara lista)4data!valor" == ." { lista = g_list_remove lista!lista)4data"; ,rea+; } Ehile lista = g_list_next lista""; }

E a .orma de c amada esta e voc/ poder incluH-lo no lu+ar daKuele .oreac Kue usamos para

Glade / GTK+
remover elementosM voc/ poder e&perimentar substituir o Uar+v_1`V por um elemento constante KualKuer e ver o resultadoN
g_list_remove_em 5inhaLista!LLinuxL";

3A

Se#am Kue n6o uma .un46o comple&a. Ga c amada n?s passamos a lista e o te&to a ser removido. A primeira coisa Kue a .un46o .aC +arantir Kue estamo no inHcio da lista 9.un46o U+8list8.irstV: e .aCer um loop enKuanto um pr?&imo elemento 9.un46o U+8list8ne&tV:. Durante a itera46o deste la4o n?s veri.icamos se o componente UdataV da nossa lista o mesmo do valor passado. Be .or n?s o removemos com o U+8list8removeV e Kuebramos 9brea7: o la4o de .orma a +arantir Kue mesmo e&istindo outro elemento com esse mesmo te&to ele n6o ser removido. Compilando e rodando o pro+rama temos o se+uinte resultadoN
$ gcc main.c -o testeglist %pkg-config --cflags --libs glib-&.'% $ ./testeglist +in5: (!; (P+ <ebian (lib )ernel +in5: +in5: "este da (list ["otal de elementos: >$ +ista =rdenada , <ebian , (lib , (!; , (P+ , )ernel , +in5: , +in5:

1bserve a+ora Kue mesmo tendo passado o par]metro ULinu&V tr/s veCes apenas o primeiro .oi removido.

Conclus'o
Como voc/s puderam ver trabal ar com listas encadeadas pode ser um processo bem comple&o usando-se apenas os recursos de ponteiros do CLCOOM mas por outro lado pode ser bem prtico usando o tipo GList da Glib e as .un45es # criada especi.icamente para isso. D/ uma ol ada na se46o de e&emplos de uso dos *id+ets Kue assim poder6o ver mais al+uns e&emplos prticos de uso da GList com os *id+ets do G-2O.

Encerramento
1ste documento est em constante atuali$ao portanto + sempre bom "ue o leitor esteja atento as novas altera7es e inclus7es "ue sur%iro Qara facilitar a identificao de uma verso mais anti%a para outra mais recente ser usada a notao: nome-do-arquivo-ano-mes-dia.tipo 1' : tutorial%lade;@NNRNR9R pdf

-arcas re%istradas
*indo;s marca re+istrada da Ficroso.t Corp 9 ttpNLL;;;.microso.t.com:M @orlandM Delp iM 2Pli& e COO@uilder s6o marcas re+istradas da @orlandLInpriseM GGU marca re+istrada da GGU 9 ttpNLL;;;.+nu.or+:. Linu& marca re+istra de Linus -orvald 9 ttpNLL;;;.linu&.or+: outras

Glade / GTK+
marcas citadas pertencem aos seus respectivos donos.

3D

*icena de &ocumenta'o *i!re G./


GotaN Uma tradu46oM n6o o.icialM desta licen4a para o Uportu+u/s @rasilV pode ser lida em ttpNLL;;;.ead.unicamp.brLminicursoLb;Lte&toL.dl.pt. tml

G7U -ree Documentation License


Sersion 1.%M Govember %EE%
Copyright (C) 2000$200/$2002 1ree 2o&tware 1oundation$ 5nc. UV 6e"ple Ilace$ 2uite WW0$ Boston$ ?R 02///-/W0X -2R S*eryone is per"itted to copy and distribute *erbati" copies o& this license docu"ent$ but changing it is not allowed.

+, P #A-(.# - e purpose o. t is License is to ma7e a manualM te&tboo7M or ot er .unctional and use.ul document [.ree[ in t e sense o. .reedomN to assure everPone t e e..ective .reedom to copP and redistribute itM ;it or ;it out modi.Pin+ itM eit er commerciallP or noncommerciallP. BecondarilPM t is License preserves .or t e aut or and publis er a ;aP to +et credit .or t eir ;or7M ; ile not bein+ considered responsible .or modi.ications made bP ot ers. - is License is a 7ind o. [copPle.t[M ; ic means t at derivative ;or7s o. t e document must t emselves be .ree in t e same sense. It complements t e GGU General "ublic LicenseM ; ic is a copPle.t license desi+ned .or .ree so.t;are. *e ave desi+ned t is License in order to use it .or manuals .or .ree so.t;areM because .ree so.t;are needs .ree documentationN a .ree pro+ram s ould come ;it manuals providin+ t e same .reedoms t at t e so.t;are does. @ut t is License is not limited to so.t;are manualsW it can be used .or anP te&tual ;or7M re+ardless o. sub#ect matter or ; et er it is publis ed as a printed boo7. *e recommend t is License principallP .or ;or7s ; ose purpose is instruction or re.erence. /, APP.ICA(I.IT0 A$D D#1I$ITI!$2 - is License applies to anP manual or ot er ;or7M in anP mediumM t at contains a notice placed bP t e copPri+ t older saPin+ it can be distributed under t e terms o. t is License. Buc a notice +rants a ;orld-;ideM roPaltP-.ree licenseM unlimited in durationM to use t at ;or7 under t e conditions stated erein. - e [Document[M belo;M re.ers to anP suc manual or ;or7. AnP member o. t e public is a licenseeM and is addressed as [Pou[. You accept t e license i. Pou copPM modi.P or distribute t e ;or7 in a ;aP reKuirin+ permission under copPri+ t la;. A [Fodi.ied Sersion[ o. t e Document means anP ;or7 containin+ t e Document or a portion o. itM eit er copied verbatimM or ;it modi.ications andLor translated into anot er lan+ua+e. A [BecondarP Bection[ is a named appendi& or a .ront-matter section o. t e Document t at deals e&clusivelP ;it t e relations ip o. t e publis ers or aut ors o. t e Document to t e Documentds overall sub#ect 9or to related matters: and contains not in+ t at could .all directlP ;it in t at overall sub#ect. 9- usM i. t e Document is in part a te&tboo7 o. mat ematicsM a BecondarP Bection maP not e&plain anP mat ematics.: - e relations ip could be a matter o. istorical connection ;it t e sub#ect or ;it related mattersM or o. le+alM commercialM p ilosop icalM et ical or political position re+ardin+ t em. - e [Invariant Bections[ are certain BecondarP Bections ; ose titles are desi+natedM as bein+ t ose o. Invariant BectionsM in t e notice t at saPs t at t e Document is released under t is License. I. a section does not .it t e above de.inition o. BecondarP t en it is not allo;ed to be desi+nated as

Glade / GTK+
Invariant. - e Document maP contain Cero Invariant Bections. I. t e Document does not identi.P anP Invariant Bections t en t ere are none.

$E

- e [Cover -e&ts[ are certain s ort passa+es o. te&t t at are listedM as 3ront-Cover -e&ts or @ac7Cover -e&tsM in t e notice t at saPs t at t e Document is released under t is License. A 3ront-Cover -e&t maP be at most ' ;ordsM and a @ac7-Cover -e&t maP be at most %' ;ords. A [-ransparent[ copP o. t e Document means a mac ine-readable copPM represented in a .ormat ; ose speci.ication is available to t e +eneral publicM t at is suitable .or revisin+ t e document strai+ t.or;ardlP ;it +eneric te&t editors or 9.or ima+es composed o. pi&els: +eneric paint pro+rams or 9.or dra;in+s: some ;idelP available dra;in+ editorM and t at is suitable .or input to te&t .ormatters or .or automatic translation to a varietP o. .ormats suitable .or input to te&t .ormatters. A copP made in an ot er;ise -ransparent .ile .ormat ; ose mar7upM or absence o. mar7upM as been arran+ed to t ;art or discoura+e subseKuent modi.ication bP readers is not -ransparent. An ima+e .ormat is not -ransparent i. used .or anP substantial amount o. te&t. A copP t at is not [-ransparent[ is called [1paKue[. E&amples o. suitable .ormats .or -ransparent copies include plain ABCII ;it out mar7upM -e&in.o input .ormatM La-eQ input .ormatM BGFL or QFL usin+ a publiclP available D-DM and standardcon.ormin+ simple <-FLM "ostBcript or "D3 desi+ned .or uman modi.ication. E&amples o. transparent ima+e .ormats include "GGM QC3 and !"G. 1paKue .ormats include proprietarP .ormats t at can be read and edited onlP bP proprietarP ;ord processorsM BGFL or QFL .or ; ic t e D-D andLor processin+ tools are not +enerallP availableM and t e mac ine-+enerated <-FLM "ostBcript or "D3 produced bP some ;ord processors .or output purposes onlP. - e [-itle "a+e[ meansM .or a printed boo7M t e title pa+e itsel.M plus suc .ollo;in+ pa+es as are needed to oldM le+iblPM t e material t is License reKuires to appear in t e title pa+e. 3or ;or7s in .ormats ; ic do not ave anP title pa+e as suc M [-itle "a+e[ means t e te&t near t e most prominent appearance o. t e ;or7ds titleM precedin+ t e be+innin+ o. t e bodP o. t e te&t. A section [Entitled QYh[ means a named subunit o. t e Document ; ose title eit er is preciselP QYh or contains QYh in parent eses .ollo;in+ te&t t at translates QYh in anot er lan+ua+e. 9<ere QYh stands .or a speci.ic section name mentioned belo;M suc as [Ac7no;led+ements[M [Dedications[M [Endorsements[M or [<istorP[.: -o ["reserve t e -itle[ o. suc a section ; en Pou modi.P t e Document means t at it remains a section [Entitled QYh[ accordin+ to t is de.inition. - e Document maP include *arrantP Disclaimers ne&t to t e notice ; ic states t at t is License applies to t e Document. - ese *arrantP Disclaimers are considered to be included bP re.erence in t is LicenseM but onlP as re+ards disclaimin+ ;arrantiesN anP ot er implication t at t ese *arrantP Disclaimers maP ave is void and as no e..ect on t e meanin+ o. t is License. 2, %# (ATI- C!P0I$G You maP copP and distribute t e Document in anP mediumM eit er commerciallP or noncommerciallPM provided t at t is LicenseM t e copPri+ t noticesM and t e license notice saPin+ t is License applies to t e Document are reproduced in all copiesM and t at Pou add no ot er conditions ; atsoever to t ose o. t is License. You maP not use tec nical measures to obstruct or control t e readin+ or .urt er copPin+ o. t e copies Pou ma7e or distribute. <o;everM Pou maP accept compensation in e&c an+e .or copies. I. Pou distribute a lar+e enou+ number o. copies Pou must also .ollo; t e conditions in section 3. You maP also lend copiesM under t e same conditions stated aboveM and Pou maP publiclP displaP copies. 3, C!P0I$G I$ 45A$TIT0 I. Pou publis printed copies 9or copies in media t at commonlP ave printed covers: o. t e DocumentM numberin+ more t an 1EEM and t e Documentds license notice reKuires Cover -e&tsM Pou

Glade / GTK+

$1

must enclose t e copies in covers t at carrPM clearlP and le+iblPM all t ese Cover -e&tsN 3ront-Cover -e&ts on t e .ront coverM and @ac7-Cover -e&ts on t e bac7 cover. @ot covers must also clearlP and le+iblP identi.P Pou as t e publis er o. t ese copies. - e .ront cover must present t e .ull title ;it all ;ords o. t e title eKuallP prominent and visible. You maP add ot er material on t e covers in addition. CopPin+ ;it c an+es limited to t e coversM as lon+ as t eP preserve t e title o. t e Document and satis.P t ese conditionsM can be treated as verbatim copPin+ in ot er respects. I. t e reKuired te&ts .or eit er cover are too voluminous to .it le+iblPM Pou s ould put t e .irst ones listed 9as manP as .it reasonablP: on t e actual coverM and continue t e rest onto ad#acent pa+es. I. Pou publis or distribute 1paKue copies o. t e Document numberin+ more t an 1EEM Pou must eit er include a mac ine-readable -ransparent copP alon+ ;it eac 1paKue copPM or state in or ;it eac 1paKue copP a computer-net;or7 location .rom ; ic t e +eneral net;or7-usin+ public as access to do;nload usin+ public-standard net;or7 protocols a complete -ransparent copP o. t e DocumentM .ree o. added material. I. Pou use t e latter optionM Pou must ta7e reasonablP prudent stepsM ; en Pou be+in distribution o. 1paKue copies in KuantitPM to ensure t at t is -ransparent copP ;ill remain t us accessible at t e stated location until at least one Pear a.ter t e last time Pou distribute an 1paKue copP 9directlP or t rou+ Pour a+ents or retailers: o. t at edition to t e public. It is reKuestedM but not reKuiredM t at Pou contact t e aut ors o. t e Document ;ell be.ore redistributin+ anP lar+e number o. copiesM to +ive t em a c ance to provide Pou ;it an updated version o. t e Document. 6, -!DI1ICATI!$2 You maP copP and distribute a Fodi.ied Sersion o. t e Document under t e conditions o. sections % and 3 aboveM provided t at Pou release t e Fodi.ied Sersion under preciselP t is LicenseM ;it t e Fodi.ied Sersion .illin+ t e role o. t e DocumentM t us licensin+ distribution and modi.ication o. t e Fodi.ied Sersion to ; oever possesses a copP o. it. In additionM Pou must do t ese t in+s in t e Fodi.ied SersionN

A, Use in t e -itle "a+e 9and on t e coversM i. anP: a title distinct .rom t at o. t e DocumentM and .rom t ose o. previous versions 9; ic s ouldM i. t ere ;ere anPM be listed in t e <istorP section o. t e Document:. You maP use t e same title as a previous version i. t e ori+inal publis er o. t at version +ives permission. (, List on t e -itle "a+eM as aut orsM one or more persons or entities responsible .or aut ors ip o. t e modi.ications in t e Fodi.ied SersionM to+et er ;it at least .ive o. t e principal aut ors o. t e Document 9all o. its principal aut orsM i. it as .e;er t an .ive:M unless t eP release Pou .rom t is reKuirement. C, Btate on t e -itle pa+e t e name o. t e publis er o. t e Fodi.ied SersionM as t e publis er. D, "reserve all t e copPri+ t notices o. t e Document. #, Add an appropriate copPri+ t notice .or Pour modi.ications ad#acent to t e ot er copPri+ t notices. 1, IncludeM immediatelP a.ter t e copPri+ t noticesM a license notice +ivin+ t e public permission to use t e Fodi.ied Sersion under t e terms o. t is LicenseM in t e .orm s o;n in t e Addendum belo;. G, "reserve in t at license notice t e .ull lists o. Invariant Bections and reKuired Cover -e&ts +iven in t e Documentds license notice. ), Include an unaltered copP o. t is License. I, "reserve t e section Entitled [<istorP[M "reserve its -itleM and add to it an item statin+ at least t e titleM PearM ne; aut orsM and publis er o. t e Fodi.ied Sersion as +iven on t e -itle "a+e. I. t ere is no section Entitled [<istorP[ in t e DocumentM create one statin+ t e titleM PearM aut orsM and publis er o. t e Document as +iven on its -itle "a+eM t en add an item describin+ t e Fodi.ied Sersion as stated in t e previous sentence.

Glade / GTK+

$%

", "reserve t e net;or7 locationM i. anPM +iven in t e Document .or public access to a -ransparent copP o. t e DocumentM and li7e;ise t e net;or7 locations +iven in t e Document .or previous versions it ;as based on. - ese maP be placed in t e [<istorP[ section. You maP omit a net;or7 location .or a ;or7 t at ;as publis ed at least .our Pears be.ore t e Document itsel.M or i. t e ori+inal publis er o. t e version it re.ers to +ives permission. K, 3or anP section Entitled [Ac7no;led+ements[ or [Dedications[M "reserve t e -itle o. t e sectionM and preserve in t e section all t e substance and tone o. eac o. t e contributor ac7no;led+ements andLor dedications +iven t erein. ., "reserve all t e Invariant Bections o. t e DocumentM unaltered in t eir te&t and in t eir titles. Bection numbers or t e eKuivalent are not considered part o. t e section titles. -, Delete anP section Entitled [Endorsements[. Buc a section maP not be included in t e Fodi.ied Sersion. $, Do not retitle anP e&istin+ section to be Entitled [Endorsements[ or to con.lict in title ;it anP Invariant Bection. !, "reserve anP *arrantP Disclaimers.

I. t e Fodi.ied Sersion includes ne; .ront-matter sections or appendices t at Kuali.P as BecondarP Bections and contain no material copied .rom t e DocumentM Pou maP at Pour option desi+nate some or all o. t ese sections as invariant. -o do t isM add t eir titles to t e list o. Invariant Bections in t e Fodi.ied Sersionds license notice. - ese titles must be distinct .rom anP ot er section titles. You maP add a section Entitled [Endorsements[M provided it contains not in+ but endorsements o. Pour Fodi.ied Sersion bP various parties--.or e&ampleM statements o. peer revie; or t at t e te&t as been approved bP an or+aniCation as t e aut oritative de.inition o. a standard. You maP add a passa+e o. up to .ive ;ords as a 3ront-Cover -e&tM and a passa+e o. up to %' ;ords as a @ac7-Cover -e&tM to t e end o. t e list o. Cover -e&ts in t e Fodi.ied Sersion. 1nlP one passa+e o. 3ront-Cover -e&t and one o. @ac7-Cover -e&t maP be added bP 9or t rou+ arran+ements made bP: anP one entitP. I. t e Document alreadP includes a cover te&t .or t e same coverM previouslP added bP Pou or bP arran+ement made bP t e same entitP Pou are actin+ on be al. o.M Pou maP not add anot erW but Pou maP replace t e old oneM on e&plicit permission .rom t e previous publis er t at added t e old one. - e aut or9s: and publis er9s: o. t e Document do not bP t is License +ive permission to use t eir names .or publicitP .or or to assert or implP endorsement o. anP Fodi.ied Sersion. 7, C!-(I$I$G D!C5-#$T2 You maP combine t e Document ;it ot er documents released under t is LicenseM under t e terms de.ined in section $ above .or modi.ied versionsM provided t at Pou include in t e combination all o. t e Invariant Bections o. all o. t e ori+inal documentsM unmodi.iedM and list t em all as Invariant Bections o. Pour combined ;or7 in its license noticeM and t at Pou preserve all t eir *arrantP Disclaimers. - e combined ;or7 need onlP contain one copP o. t is LicenseM and multiple identical Invariant Bections maP be replaced ;it a sin+le copP. I. t ere are multiple Invariant Bections ;it t e same name but di..erent contentsM ma7e t e title o. eac suc section uniKue bP addin+ at t e end o. itM in parent esesM t e name o. t e ori+inal aut or or publis er o. t at section i. 7no;nM or else a uniKue number. Fa7e t e same ad#ustment to t e section titles in t e list o. Invariant Bections in t e license notice o. t e combined ;or7. In t e combinationM Pou must combine anP sections Entitled [<istorP[ in t e various ori+inal documentsM .ormin+ one section Entitled [<istorP[W li7e;ise combine anP sections Entitled [Ac7no;led+ements[M and anP sections Entitled [Dedications[. You must delete all sections Entitled [Endorsements.[

Glade / GTK+
8, C!..#CTI!$2 !1 D!C5-#$T2 You maP ma7e a collection consistin+ o. t e Document and ot er documents released under t is LicenseM and replace t e individual copies o. t is License in t e various documents ;it a sin+le copP t at is included in t e collectionM provided t at Pou .ollo; t e rules o. t is License .or verbatim copPin+ o. eac o. t e documents in all ot er respects.

$3

You maP e&tract a sin+le document .rom suc a collectionM and distribute it individuallP under t is LicenseM provided Pou insert a copP o. t is License into t e e&tracted documentM and .ollo; t is License in all ot er respects re+ardin+ verbatim copPin+ o. t at document. 9, AGG #GATI!$ :IT) I$D#P#$D#$T :! K2 A compilation o. t e Document or its derivatives ;it ot er separate and independent documents or ;or7sM in or on a volume o. a stora+e or distribution mediumM is called an [a++re+ate[ i. t e copPri+ t resultin+ .rom t e compilation is not used to limit t e le+al ri+ ts o. t e compilationds users bePond ; at t e individual ;or7s permit. * en t e Document is included in an a++re+ateM t is License does not applP to t e ot er ;or7s in t e a++re+ate ; ic are not t emselves derivative ;or7s o. t e Document. I. t e Cover -e&t reKuirement o. section 3 is applicable to t ese copies o. t e DocumentM t en i. t e Document is less t an one al. o. t e entire a++re+ateM t e Documentds Cover -e&ts maP be placed on covers t at brac7et t e Document ;it in t e a++re+ateM or t e electronic eKuivalent o. covers i. t e Document is in electronic .orm. 1t er;ise t eP must appear on printed covers t at brac7et t e ; ole a++re+ate. ;, T A$2.ATI!$ -ranslation is considered a 7ind o. modi.icationM so Pou maP distribute translations o. t e Document under t e terms o. section $. >eplacin+ Invariant Bections ;it translations reKuires special permission .rom t eir copPri+ t oldersM but Pou maP include translations o. some or all Invariant Bections in addition to t e ori+inal versions o. t ese Invariant Bections. You maP include a translation o. t is LicenseM and all t e license notices in t e DocumentM and anP *arrantP DisclaimersM provided t at Pou also include t e ori+inal En+lis version o. t is License and t e ori+inal versions o. t ose notices and disclaimers. In case o. a disa+reement bet;een t e translation and t e ori+inal version o. t is License or a notice or disclaimerM t e ori+inal version ;ill prevail. I. a section in t e Document is Entitled [Ac7no;led+ements[M [Dedications[M or [<istorP[M t e reKuirement 9section $: to "reserve its -itle 9section 1: ;ill tPpicallP reKuire c an+in+ t e actual title. <, T# -I$ATI!$ You maP not copPM modi.PM sublicenseM or distribute t e Document e&cept as e&presslP provided .or under t is License. AnP ot er attempt to copPM modi.PM sublicense or distribute t e Document is voidM and ;ill automaticallP terminate Pour ri+ ts under t is License. <o;everM parties ; o ave received copiesM or ri+ tsM .rom Pou under t is License ;ill not ave t eir licenses terminated so lon+ as suc parties remain in .ull compliance. /+, 15T5 # #%I2I!$2 !1 T)I2 .IC#$2# - e 3ree Bo.t;are 3oundation maP publis ne;M revised versions o. t e GGU 3ree Documentation License .rom time to time. Buc ne; versions ;ill be similar in spirit to t e present versionM but maP di..er in detail to address ne; problems or concerns. Bee ttpNLL;;;.+nu.or+LcopPle.tL. Eac version o. t e License is +iven a distin+uis in+ version number. I. t e Document speci.ies t at a particular numbered version o. t is License [or anP later version[ applies to itM Pou ave t e option o. .ollo;in+ t e terms and conditions eit er o. t at speci.ied version or o. anP later version t at as been publis ed 9not as a dra.t: bP t e 3ree Bo.t;are 3oundation. I. t e Document does not speci.P a

Glade / GTK+
version number o. t is LicenseM Pou maP c oose anP version ever publis ed 9not as a dra.t: bP t e 3ree Bo.t;are 3oundation.

$$

Você também pode gostar