[elektro] Linux - GTK2 ről GTK3-ra

elight elight at gmail.hu
Wed Sep 27 09:54:23 CEST 2017


Sziasztok


Ahogy látom itt akadnak többen Linuxos  érdeklődők!
Bátorkodnék egy kis segítséget kérni a következő
témakörben.

Rasberry PI-3-ason összeraktam
GT3-alatt egy kis mérő programot..
Egy ideje tűrhetően szuperál.
Most ezt szeretném kiegészíteni
egy grafikus adatmegjelenítő funkcióval.


Eddig összeolvastam sok mindent
  de nem igazán állt még bennem össze a kép.
Szeretnék egy olyat elkövetni, hogy
egyetlen megnyitott ablakban lévő képet animálnék.
Ha ez működik, folyamatosan feltölteném
grafikusan az érkező adataimat.

Ezt ki is próbáltam, egy free médialejátszó
forrásából kiválogattam pár utasítást
és ezzel tudok egy vonalsort mozgatni az
ablakon belül. A gondom, hogy mindez
GTK2-ben van megírva.

Maga a program amelyet így összehoztam:

//========================
#include <stdio.h>
#include <stdlib.h>
#include <gtk/gtk.h>

GtkWidget  *window1 ;
GtkWidget  *vbox1 ;

GtkWidget  *frame1 ;
GtkWidget  *vbox2 ;
GtkWidget  *hbox2 ;
GtkWidget  *drawarea1 ;
GdkPixmap *pixmap_drawarea1 = NULL;
GtkWidget  *hscale1 ;
GtkAccelGroup *menuGroup;


int k = 0;

void  InitializeMainSystem ()
{
/* .... put initialize stuff here .... */
}


void  MessageBox (GtkWindow *parentWindow, char *messageValue)
{
     GtkWidget *dialog;
     dialog = gtk_message_dialog_new (parentWindow, GTK_DIALOG_MODAL, 
GTK_MESSAGE_INFO, GTK_BUTTONS_OK, messageValue);
     gtk_window_set_title (GTK_WINDOW (dialog), "Information");
     gtk_dialog_run (GTK_DIALOG (dialog));
     gtk_widget_destroy (dialog);
}


/* Stop the GTK+ main loop function. */
static void destroy_window1 (GtkWidget *window, gpointer data)
{
     gtk_main_quit ();
}

/* Return FALSE to destroy the widget. By returning TRUE, you can cancel 
a delete-event. This can be used to confirm quitting the application. */
static gboolean delete_event_window1 (GtkWidget *window, GdkEvent 
*event,  gpointer data)
{
     return (FALSE);
}




/* On size change: Create a new backing pixmap of the appropriate size */
static gboolean drawarea1_configure_event( GtkWidget *widget, 
GdkEventConfigure *event )
{
     if (pixmap_drawarea1) {
         g_object_unref (pixmap_drawarea1);
     }
     pixmap_drawarea1 = gdk_pixmap_new (widget->window, 
widget->allocation.width, widget->allocation.height, -1);
     gdk_draw_rectangle (pixmap_drawarea1, widget->style->white_gc, 
TRUE, 0, 0, widget->allocation.width, widget->allocation.height);
     return (TRUE);
}

static gboolean drawarea1_timeout (GtkWidget *widget)
{
     static GdkPoint points[1000];    /* test */
     static int flag = 0;
     int i;
     int j;
     int  x1 = widget->allocation.width;
     int  y1 = widget->allocation.height;
     if (pixmap_drawarea1 == NULL){
         return(TRUE);
     }
     if (flag != 0){
         gdk_draw_points(pixmap_drawarea1, widget->style->white_gc, 
points, 1000);
     }

    k = k+1;
    if( k > 4 ) k = 0;

    for ( j = 0; j < 50;  j++ )
    {
       for (i=0; i < 1000; i++) {
           points[i].x = i  % x1;
           // points[i].y = i  % y1;
           points[i].y = j*5+k;
       }

       gdk_draw_points(pixmap_drawarea1, widget->style->white_gc, 
points, 1000);

       for (i=0; i < 1000; i++) {
           points[i].x = i  % x1;
           // points[i].y = i  % y1;
           points[i].y = j*5+k+1;
       }

       gdk_draw_points(pixmap_drawarea1, widget->style->black_gc, 
points, 1000);
    }

     gtk_widget_queue_draw_area (widget, 0, 0, x1, y1);
     flag = 1;
     return (TRUE);
}

/* Redraw the screen from the backing pixmap */
static gboolean drawarea1_expose_event( GtkWidget *widget, 
GdkEventExpose *event )
{
     gdk_draw_drawable (widget->window, 
widget->style->bg_gc[GTK_WIDGET_STATE (widget)], pixmap_drawarea1, 
event->area.x, event->area.y, event->area.x, event->area.y, 
event->area.width, event->area.height);
     return (FALSE);
}

void  InitializeUserInterface ()
{
     menuGroup = gtk_accel_group_new();

     /* initialize main window */
     window1 = gtk_window_new (GTK_WINDOW_TOPLEVEL);
     gtk_window_set_title (GTK_WINDOW (window1), "NATURLAND UHLMANN 
DISPLAY");
     gtk_window_set_default_size (GTK_WINDOW (window1), 1024, 450);
     //  gtk_window_maximize (GTK_WINDOW (window1));
     /* Connect the main window to the destroy and delete-event signals. */
     g_signal_connect (G_OBJECT (window1), "destroy", G_CALLBACK 
(destroy_window1), NULL);
     g_signal_connect (G_OBJECT (window1), "delete_event", G_CALLBACK 
(delete_event_window1), NULL);

     vbox1 = gtk_vbox_new (FALSE, 0);
     gtk_container_add (GTK_CONTAINER (window1), vbox1);

     frame1 = gtk_frame_new ("Random Points");
     gtk_box_pack_start (GTK_BOX (vbox1), frame1, TRUE, TRUE, 2);

     vbox2 = gtk_vbox_new (FALSE, 0);
     gtk_container_add (GTK_CONTAINER (frame1), vbox2);

     hbox2 = gtk_hbox_new (FALSE, 0);
     gtk_box_pack_start (GTK_BOX (vbox2), hbox2, TRUE, TRUE, 5);

     /* Create the drawing area */
     drawarea1 = gtk_drawing_area_new();
     gtk_box_pack_start (GTK_BOX (hbox2), drawarea1, TRUE, TRUE, 2);
     g_signal_connect (G_OBJECT (drawarea1), "expose_event", G_CALLBACK 
(drawarea1_expose_event), (gpointer) window1);
     g_timeout_add    (100,  (GSourceFunc) drawarea1_timeout, (gpointer) 
drawarea1);
     g_signal_connect (G_OBJECT (drawarea1), "configure_event", 
G_CALLBACK (drawarea1_configure_event), (gpointer) window1);


     gtk_window_add_accel_group( GTK_WINDOW(window1), menuGroup);
}



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

     InitializeMainSystem();
     InitializeUserInterface();

     gtk_widget_show_all (window1);
     gtk_main ();
     return (0);
}

//=====================

és a make
//==============
EXES = $(basename $(wildcard *.c))
CC = cc
CFLAGS = -Wall -g `pkg-config --cflags --libs gtk+-2.0`

all:
     $(MAKE) $(EXES)

%: %.c
     $(CC) $(CFLAGS) $@.c -o $@

clean:
     rm -f $(EXES) *.o
//=======================


aját könyvtárában simán
    terminálból fordítható és futtatható. :-)

Eddig az öröm.
Szeretném a programomba is beilleszteni
de a fordító kidobja már azon a soron:

GtkAccelGroup *menuGroup;

meg azok a sorok is sárosak

widget->style->white_gc

Gondolom nincs ilyen elem és hozzá függvény
sem, mert máshogy írták meg a GTK 3-ban.
Szöszmötölök,
  de közben a dolog lassan a körmömre ég.

Találtam a GLADE-ban két új elemet

revelaer   és  drawingarea

jelenleg ezekkel próbálkozom.
Esetleg aki tudja milyen parancsok
  is kellenek még ...  ne tartsa magát vissza..

Tulajdonképpen
azt szeretném hogy jöjjön létre

egy bit-pixel tér az LCD-n
  amit hasonlóképpen  manipulálhatok
és legyen hozzá egy árnyék pixbuffer
amelyt feltöltve az adataimmal
egy kiírás hatására rákerüljön
az élő képre. Mindezt szimplán GTK3 alatt.

Vagy az is lehet infó, ha kiderül, rossz irányból
közelítettem erre a problémára.

Üdv István





















2017-09-26 20:57 keltezéssel, Skandar Graun írta:
> Köszi.
>
> 2017-09-26 16:41 GMT+02:00 Bánhidi István <banhidi.istvan at gmail.com>:
>
>> Köszi
>>
>> Steve
>>
>> 2017. szept. 26. 15:55 ezt írta ("elight" <elight at gmail.hu>):
>>
>>> Sziasztok.
>>>
>>> Akinek esetleg égető szüksége lenne rá, most free:
>>> http://www.bitsdujour.com/software/linux-networking-cookbook
>>> -17-value-free-for-a-limited-time/src=not?bdj-uwid=027d6172
>>> -e870-484f-b08a-67b6ddd53dbb&utm_source=WantEmail&utm_
>>> medium=email&utm_content=linux-networking-cookbook-17-
>>> value-free-for-a-limited-time+Title&utm_campaign=2017-09-26
>>>
>>> Üdv István
>>> -----------------------------------------
>>>           elektro[-flame|-etc]
>>>
>> -----------------------------------------
>>            elektro[-flame|-etc]
> -----------------------------------------
>            elektro[-flame|-etc]



More information about the Elektro mailing list