Ir para o conteúdo
  • Revista PROGRAMAR: Já está disponível a edição #60 da revista programar. Faz já o download aqui!

Dr_Lion

queria fazer (UN)lock a uma janela em gtk

Mensagens Recomendadas

Dr_Lion

Boas tardes, tenho o seguinte código em linguagem C que usa o CAIRO para desenhar figuras geométricas e o GTK para criar uma janela onde são desenhadas as figuras.

    Percebo de C, no entanto, a programação em GTK tal como CAIRO é novo para mim, comecei a brincar com isto á 2 dias. O código, é uma mistura de alguns tuturiais que retirei da internet e alterei á minha maneira, no entanto quando a janela é criada, o programa fica pendurado á espera que feche a janela para continuar.

    O que eu pretendia era que a janela fosse actualizada, ou redesenhada, mas o programa continuasse a sua excução.

O código de criação das janelas encontra-se todo na funcão main, e será aí que é necessário fazer a alteração.

Alguém pode dar uma ajuda?


#include <stdio.h>
#include <cairo.h>
#include <gtk/gtk.h>

#define M_PI 3.1415

static gboolean on_expose_event(GtkWidget *widget, GdkEventExpose *event, gpointer data)
{
double xc1 = 300.0;
double yc1 = 225.0;
double xc2 = 200.0;
double yc2 = 400.0;
double xc3 = 400.0;
double yc3 = 400.0;
double radius1 = 100.0;
double radius2 = 100.0;
double radius3 = 100.0;
double angle1 = 0.0  * (M_PI/180.0);  /* angles are specified */
double angle2 = 360.0 * (M_PI/180.0);  /* in radians           */

cairo_surface_t *surface = cairo_image_surface_create (CAIRO_FORMAT_ARGB32, 500, 500);
//cairo_t *cr = cairo_create (surface);

  cairo_t *cr;
  cr = gdk_cairo_create(widget->window);

//circ 1 s linhas
cairo_set_line_width (cr, 10.0);
cairo_arc (cr, xc1, yc1, radius1, angle1, angle2);
cairo_stroke (cr);

//circ 2 s linhas
cairo_arc (cr, xc2, yc2, radius2, angle1, angle2);
cairo_stroke (cr);

//circ 3 s linhas
cairo_arc (cr, xc3, yc3, radius3, angle1, angle2);
cairo_stroke (cr);
/*
// draw helping lines 
cairo_set_source_rgba (cr, 1, 0.2, 0.2, 0.6);
cairo_set_line_width (cr, 6.0);

//centro da circunf
cairo_arc (cr, xc1, yc1, 10.0, 0, 2*M_PI);
cairo_fill (cr);

//linhas
cairo_arc (cr, xc1, yc1, radius1, angle1, angle1);
cairo_line_to (cr, xc1, yc1);
cairo_arc (cr, xc1, yc1, radius1, angle2, angle2);
cairo_line_to (cr, xc1, yc1);
cairo_stroke (cr);
* */

  return FALSE;
}


int main (int argc, char *argv[])
{

  printf("\n inicio do programa..\n");

  GtkWidget *window;

  gtk_init(&argc, &argv);
  
  window = gtk_window_new(GTK_WINDOW_TOPLEVEL);

  gtk_widget_add_events (window, GDK_BUTTON_PRESS_MASK);

  g_signal_connect(window, "expose-event",
      G_CALLBACK(on_expose_event), NULL);
  g_signal_connect(window, "destroy",
      G_CALLBACK(gtk_main_quit), NULL);

  gtk_window_set_position(GTK_WINDOW(window), GTK_WIN_POS_CENTER);
  gtk_window_set_title(GTK_WINDOW(window), "lines");
  gtk_window_set_default_size(GTK_WINDOW(window), 600, 600); 
  gtk_widget_set_app_paintable(window, TRUE);

  gtk_widget_show_all(window);

  gtk_main();
  
  printf("Retornou ao prog.\n A sair..\n");

  return 0;
}

Agradeço desde já a todos.

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
Dr_Lion

Pois, tendo em conta que aí está a desenhar apenas uma vez, para desenhar várias tenho o meter dentro de um ciclo, e não tem que ser obrigatoriamente um while, pode ser um for. 

A minha questão não é essa, mas sim, que trecho de código por dentro do ciclo, para juntando um simples

printf("\teste");

o programa desenhe a janela e esteja constantemente a escrever na consola o printf e a actulizar a imagem da janela. Como disse em cima este código é uma mistura de vários pelo que o código base a janela ficava á espera de uns cliques do rato, pelo que pode ser necessário alterar alguma função de modo a esta não ficar bloqueada á espera.

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites

Crie uma conta ou ligue-se para comentar

Só membros podem comentar

Criar nova conta

Registe para ter uma conta na nossa comunidade. É fácil!

Registar nova conta

Entra

Já tem conta? Inicie sessão aqui.

Entrar Agora

×

Aviso Sobre Cookies

Ao usar este site você aceita os nossos Termos de Uso e Política de Privacidade. Este site usa cookies para disponibilizar funcionalidades personalizadas. Para mais informações visite esta página.