LINUX.ORG.RU

У меня дома лежит книжка, что-то типа Разработка приложений на GTK с компактом.

anonymous
()
Ответ на: комментарий от anonymous

Подозреваю что книжка по GTK+-1,
(что-то типа программирование переностимых интерфейсов на GTK+ )
интересно было бы по GTK+-2

Serik
()
Ответ на: комментарий от Serik

Да не так уж много изменилось с тех пор. GtkTreeView можно и без книжки освоить, а GObject такой же :)

anonymous
()
Ответ на: комментарий от anonymous

GtkTreeView - с этим виджетом все более менее ясно.

А поменялось в принципе вроде и не много, но к примеру с сигналами, с писаниной своих виджетов - кое что изменилось.

alphex_kaanoken ★★★
()
Ответ на: комментарий от alphex_kaanoken

Привет. Раз уж завели разговор про Gtk+, не покажет ли мне кто-нибудь
приложение на чистом gdk (ну или с imlib), чтоб там прозрачность и
все такое. Только не gkrellm. А то я вот чего написал (поковырявшись
в qiv), но оно с memory fault вылетает в gtk_init_<чего-то там>.

Может кто-нибудь подсобит.

--- cpumeter.h
#ifndef __CPUMETER_H__
#define __CPUMETER_H__

#include <gdk/gdk.h>
#include <gdk/gdkx.h>
#include <gtk/gtkwidget.h>
#include <gdk_imlib.h>

#define TEXT_FONT       "-misc-fixed-medium-r-semicondensed--12-90-100-100-c-60-
iso8859-1"

struct mon_win {
        GdkWindow       *win;
        GdkColor         bgcolor;
        GdkColor         grcolor;
        GdkColor         text_bg;
        GdkFont         *text_font;
        gint             pos_x;
        gint             pos_y;
        gint             heigth;
        gint             width;
};

__BEGIN_DECLS
gboolean color_alloc(const char *, GdkColor *);
gint     setup_win(struct mon_win *);
void     usage(void);
__END_DECLS

#endif  /* __CPUMETER_H__ */
----------------------------------------------------

--- cpumeter.c ---
...
#include <gdk/gdk.h>
#include <gdk/gdkx.h>
#include <gtk/gtkwidget.h>
#include <gdk_imlib.h>

#include "cpumeter.h"
...
/* global variables */
struct mon_win  cpu_mon;
GMainLoop       *main_loop;
GdkColormap     *cmap;

/* command line options */
char    backgrcolor[8] = "#cccccc";
char    graphcolor[8] = "#00ff00";
int     istransp = 1;
int     refresh = 4;
int     use_nice = 1;
int     ngrid = 5;

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

        memset(&cpu_mon, 0, sizeof (cpu_mon));

        while ((ch = getopt(argc, argv, "b:g:G:h:nr:tw:x:y:")) != -1) {
                switch (ch) {
        ....
        }
        argc -= optind;
        argv += optind;

        gdk_init(&argc, &argv);
        gdk_imlib_init();

        if (cpu_mon.heigth == 0)
                cpu_mon.heigth = 64;
        if (cpu_mon.width == 0)
                cpu_mon.width = 64;
        
        main_loop = g_main_new(TRUE);
        cmap = gdk_colormap_get_system();
        cpu_mon.text_font = gdk_font_load(TEXT_FONT);
        cpu_mon.pos_x = 0;
        cpu_mon.pos_y = gdk_screen_height() - cpu_mon.heigth;

        gtk_widget_push_visual(gdk_imlib_get_visual());
        gtk_widget_push_colormap(gdk_imlib_get_colormap());

        color_alloc(backgrcolor, &cpu_mon.bgcolor);
        color_alloc(graphcolor, &cpu_mon.grcolor);

        setup_win(&cpu_mon);
        g_main_run(main_loop);
        return 0;
}
gboolean
color_alloc(const char *name, GdkColor *color)
{
        gboolean result;

        result = gdk_color_parse(name, color);
        if (!result) {
                fprintf(stderr, "qiv: can't parse color '%s'\n", name);
                name = "black";
        }

        result = gdk_colormap_alloc_color(cmap, color, FALSE, TRUE);
        if (!result) {
                fprintf(stderr, "qiv: can't alloc color '%s'\n", name);
                color->pixel = 0;
        }

        return result;
}

gint
setup_win(struct mon_win *m)
{
        GdkWindowAttr attr;

        attr.window_type=GDK_WINDOW_TOPLEVEL;
        attr.wclass=GDK_INPUT_OUTPUT;
        attr.event_mask=GDK_ALL_EVENTS_MASK;
        attr.x = m->pos_x;
        attr.y = m->pos_y;
        attr.width  = m->width;
        attr.height = m->heigth;

        m->win = gdk_window_new(NULL, &attr, GDK_WA_X|GDK_WA_Y);
        gdk_window_set_hints(m->win,m->pos_x, m->pos_y, m->width, m->heigth,
            m->width, m->heigth, GDK_HINT_MIN_SIZE | GDK_HINT_MAX_SIZE);
        gdk_window_resize(m->win, m->width, m->heigth);
        gdk_window_show(m->win);

        return (0);
}
...
------------------------------------

Собираю примерно так (без единого варнинга):
....
LIBS=   `imlib-config --libs-gdk`
CFLAGS+=-Wall -Werror -g
CFLAGS+=`imlib-config --cflags-gdk`
....

В итоге:
% ./cpumeter                                                                   
Memory fault (core dumped) 
% gdb -c cpumeter.core cpumeter                                                
...
#0  0x5ccd2af in gdk_init_check ()
(gdb) where
#0  0x5ccd2af in gdk_init_check ()
#1  0x5ccd4c1 in gdk_init ()
#2  0x1c001079 in main (argc=0, argv=0xcfbf02a0) at cpumeter.c:82
#3  0x1c000dc1 in ___start ()
#4  0x1c000d37 in _start ()
#5  0xcfbf03e8 in ?? ()


Кто что скажет?

signal11
()
Ответ на: комментарий от alphex_kaanoken

> gdk_init(&argc, &argv); - на это обрати свое внимание!

Здесь все нормально. Ошибка была по неосторожности -- не надо делать argv += optind, argc += optind.

signal11
()
Ответ на: комментарий от signal11

> Ошибка была по неосторожности

Это я только что заметил.

signal11
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.