Jump to content

queria fazer (UN)lock a uma janela em gtk


Dr_Lion
 Share

Recommended Posts

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.

Link to comment
Share on other sites

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.

Link to comment
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
 Share

×
×
  • Create New...

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.