LINUX.ORG.RU

Обновление pixmap


0

0

Привет всем! Такая проблема - я ложу в GTK List pixmap таким кодом

pixmap = gdk_pixmap_colormap_create_from_xpm( mainlist->window, gtk_widget_get_colormap ( mainlist ),&mask, NULL, bg_file ); gdk_window_set_back_pixmap ( mainlist->window, pixmap, FALSE ); g_object_unref ( pixmap );

Потом добавляю в лист элементы(лейбелы) и добавленные элементы закрывают собой рисунок-бекграунд - если окно передвинуть или потерять фокус-обновить фокус - рисунок за этим лейбелами обновляется - как обновить можно избавиться от такого єффекта, то есть не трогая окно чтоб рисунок сам обновлялся???

anonymous

Перехватить какой-то(непомню) сигнал и в обработчике приводить окно в чувство

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

глянь на мой исходник может чёто найдёш??

перерезал демку pixbuf-demo.c

/* Authors: Vitaly Chernookiy*/

#define WFONT_SIZE 16

char mnemo_filename[1024]; void mnemo_filename_init(char*mnemo); void mnemo_filename_init(char*mnemo){snprintf (mnemo_filename,sizeof(mnemo_filename),WMNEMO_DIR"/%s.png",mnemo);}

int wfont_size=WFONT_SIZE; void wmnemo_set_font(PangoLayout*pl,int font_size); //============================================================================== ================================================================================ ========== #define FRAME_DELAY 1000

/* Background image */ static GdkPixbuf *background; static int back_width, back_height; /* Widgets */ static GtkWidget *da; /* Шаренная память*/ static shm_ptr_t*shm_ptr; /* сенсоры принадлежащие текущей мнемосхеме*/ static GArray*wmgroup; static gboolean debug=FALSE;

/* Backing pixmap for drawing area */ static GdkPixmap *pixmap = NULL; static GdkPixmap *pm_bg = NULL; static GdkGC *text_gc; static guchar *pixels; static int rowstride ;

//============================================================================== ================================================================================ ========== /* Redraw the screen from the backing pixmap */

static gint expose_cb( GtkWidget *widget, GdkEventExpose *event ) { gdk_draw_drawable (widget->window, widget->style->fg_gc[GTK_WIDGET_STATE (widget)], pixmap, event->area.x, event->area.y, event->area.x, event->area.y, event->area.width, event->area.height); return FALSE; }

//============================================================================== ================================================================================ ========== PangoContext*pc; PangoLayout *pl; PangoFontDescription* pfd; static int frame_num=0; //============================================================================== ================================================================================ ========== static guint timeout_id; static GdkColor text_color;

/* Timeout handler to regenerate the frame */ static gint timeout (gpointer data) { } //============================================================================== ================================================================================ ==========

int main (int argc, char **argv) { openlog(argv[0],LOG_PID|LOG_PERROR,LOG_LOCAL7);

gtk_init (&argc, &argv); //--Парсинг опций командной строки------------------------------- int c; while ((c = getopt(argc, argv, "hF:m:df:")) != -1) { switch (c) { case 'F': config_file_name = optarg; break; case 'f': watcher_fqdn = optarg; break; case 'h': Help(); return EXIT_SUCCESS; case 'm': mnemo=optarg; break; case 'd': debug=TRUE;break; case '?': default : UseHelp(); return EXIT_FAILURE; } } if(!mnemo){syslog(LOG_ERR,"You must specify a name of mnemo in command line. Exit");exit(EXIT_FAILURE);} mnemo_filename_init(mnemo); syslog(LOG_INFO,"Try to open image '%s' for mnemo = %s :",mnemo_filename,mnemo);

if(file_exists(mnemo_filename)){syslog(LOG_INFO,"OK");} else{syslog(LOG_ERR,"File %s is not accessible. Exit.",mnemo_filename);exit(EXIT_FAILURE);} //--открытие шареной памяти------------------------------- shm_ptr=watcher_shm_ptr_open(watcher_fqdn); if(!shm_ptr){syslog(LOG_ERR,"can't open shared memory %s for read. Exit",watcher_fqdn);return EXIT_FAILURE;} syslog(LOG_INFO,"registered sensors: %u", shm_ptr->ptr->item_count); //--загрузка адресов и параметров сенсоров принадлежащих текущей мнемосхеме---------------------------------------------------------- load_wmgroups_item_from_file(watcher_fqdn,WMNEMO_FILENAME); wmgroup=get_wmgroup_items_by_mnemo_name(mnemo); free_wmgroups_item(&wmgroups_item_array);

//------Загрузка фона для мнемосхемы--------------------------- if (!load_mnemo_pixbuf()) {syslog (LOG_ERR,"Could not load %s : File is not accessible. Exit.",mnemo_filename); exit(EXIT_FAILURE);} syslog(LOG_INFO, "File %s loaded success",mnemo_filename);

GtkWidget *window = gtk_window_new (GTK_WINDOW_TOPLEVEL);

gtk_widget_set_size_request (window, back_width, back_height); gtk_window_set_resizable (GTK_WINDOW (window), FALSE); g_signal_connect (window, "destroy", G_CALLBACK (destroy_cb), NULL);

da = gtk_drawing_area_new ();

gtk_container_add (GTK_CONTAINER (window), da); /*Настройка PangoLayout*/ pc = gtk_widget_get_pango_context (da); pl = pango_layout_new (pc); pfd= pango_font_description_new ();

for(c=0;(unsigned)c<wmgroup->len;c++) { wmgroups_item_t*wmgroups_item=&g_array_index(wmgroup,wmgroups_item_t,c); wmgroups_item->shm_index=sensor_index_in_shm(shm_ptr,wmgroups_item); wmgroups_item->pl = pango_layout_new (pc); wmnemo_set_font(wmgroups_item->pl,wmgroups_item->font_size); wmgroup_item_set_color(wmgroups_item); }

g_signal_connect (G_OBJECT (da), "expose_event", G_CALLBACK (expose_cb), NULL); g_signal_connect (G_OBJECT (da), "configure_event", G_CALLBACK (configure_event), NULL);

guint wgrt; guint wgrtd=FRAME_DELAY; gint errorno=set_cfg_filename(WCONFIG_FILENAME); gchar*errmsg=set_cfg_filename_error(errorno); if(errorno) syslog(LOG_ERR, errmsg); g_free(errmsg);

g_assert(try_cfg_value_as_int("watcher_mnemo_refresh_timeout", &wgrt, &wgrtd)); g_assert(try_cfg_value_as_int("watcher_mnemo_fontsize", &wfont_size, &wfont_size)); wmnemo_set_font(pl,-1);

gtk_widget_show_all (window);

timeout_id = g_timeout_add (wgrt, timeout, NULL);

gtk_main (); // выход из проги watcher_shm_ptr_close(&shm_ptr); for(c=0;(unsigned)c<wmgroup->len;c++)g_object_unref(G_OBJECT(g_array_inde x(wmgroup,wmgroups_item_t,c).pl)); free_wmgroups_item(&wmgroup);

return 0; } //============================================================================== ============================================================ void wmnemo_set_font(PangoLayout*pl,int font_size) { pango_font_description_set_size (pfd,(font_size>0?font_size:wfont_size)*PANGO_SCALE); pango_layout_set_font_description (pl,pfd); }

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