LINUX.ORG.RU

Сообщения CynicRus

 

Проверка соединения.

Добрый день уважаемым форумчанам! Есть под оффтопиком функия в Api InternetGetConnectedState, которая позволяет чекнуть - есть ли инет на тачке. Собственно вопрос к знающим - как такое же проверить по Линуксом? Пинг отваливается, ибо нужен рут. Каждый раз закачивать страничку и смотреть что пришло - тоже кажется так себе вариантом. Быть может есть вариант более...изящный? Ах, да. Без QT.

 , ,

CynicRus ()

Эмуляция снятия телефонной трубки

Добрый день уважаемым форумчанам. Есть задача: при звонке на определенный номер, сымитировать поднятие трубки стационарного телефона, удержать на себе вызов в течении n количества секунд и сбросить вызов. Собственно вопрос, заключается в том какими средствами можно решить вышеуказанную задачу?

Первое, что пришло на ум - использовать для этих целей модем и богатый арсенал AT команд. Поскольку старые добрые ATA - ATH1 - ATH0 снимают трубку, но только для хэндшейка - пока я потерпел закономерный фэйл.

В настоящее время имеется: телефонная линия до модема с 4 значным номером, модемы Tainet t-336cx и U.S. Robotics 56k. Первый - выдаёт RING при звонке на него, но в виде ответа гудков не прерывает, но начинает хэндшейк. Второй - при звонке на него при выставленном автоответе выдаёт запоздалый RING, и тоже никак не вышло поднять трубку и сбросить вызов. Общение между компьютером и модемами происходит через RS232.

 

CynicRus ()

Golang c-shared библиотека

Добрый день уважаемым форумчанам. Продолжаю потихоньку ковыряться с Golang, и захотелось странного. Есть некий программный продукт, который умеет плагины. Плагины можно писать на FPC,C,C++. С последнего релиза Golang научился в библиотеки с нормальным экспортом. Вполне себе дергаются функции из собранной в Go библиотеке из Lazarus и т.д. Так вот, программный продукт требует на вход следующее:

static char* exports[] =
{
    (char*)"Add",(char*)"procedure Add(a, b :integer; var result : integer);"
};

extern "C" void __declspec(dllexport) Add (int a, int b , int & res)
{
     res = a + b;    

}

extern "C" int __declspec(dllexport) GetPluginABIVersion()
{
    return 2;
}

extern "C" int __declspec(dllexport) GetFunctionCount()
{
    return NumExports;
}

extern "C" int __declspec(dllexport) GetFunctionInfo(int index, void* &address, char* &def)
{
    if (index < NumExports)
    {
        #if defined _WIN32 || defined _WIN64
        address = (void*)GetProcAddress(dllinst, exports[index * 2]);
        #else
        address = dlsym(RTLD_DEFAULT, exports[index * 2]);
        #endif
        strcpy(def, exports[index * 2 + 1]);
        return index;
    }
    return -1;
}

Прога загружая плагин, получает из GetFunctionCount количество функций плагина. Затем вызывает n раз GetFunctionCount, из которой получает указатель на функцию, которую надо пробросить из дебрей библиотеки и текстовое определение оной. Мне хочется странного, написать плагин подобного рода на Go. Описательная часть экспортируется, всё замечательно. Текстовая часть тоже пробрасывается и из проги получается. А вот указатель на функцию в библиотеке - никак. Тоесть нет, указатель на функцию то я получить могу, только его нельзя использовать из вне. Сейчас попытка выглядит так:

import "C"
import "fmt"
import "unsafe"
import "reflect"
import "runtime"

func GetFunc(outFuncPtr interface{}, name string) error {
	codePtr, err := FindFuncWithName(name)
	if err != nil {
		return err
	}
	CreateFuncForCodePtr(outFuncPtr, codePtr)
	return nil
}

type Func struct {
	codePtr uintptr
}

func CreateFuncForCodePtr(outFuncPtr interface{}, codePtr uintptr) {
	outFuncVal := reflect.ValueOf(outFuncPtr).Elem()
	newFuncVal := reflect.MakeFunc(outFuncVal.Type(), nil)
	funcValuePtr := reflect.ValueOf(newFuncVal).FieldByName("ptr").Pointer()
	funcPtr := (*Func)(unsafe.Pointer(funcValuePtr))
	funcPtr.codePtr = codePtr
	outFuncVal.Set(newFuncVal)
}

func FindFuncWithName(name string) (uintptr, error) {
	for moduleData := &Firstmoduledata; moduleData != nil; moduleData = moduleData.next {
		for _, ftab := range moduleData.ftab {
			f := (*runtime.Func)(unsafe.Pointer(&moduleData.pclntable[ftab.funcoff]))
			if f.Name() == name {
				return f.Entry(), nil
			}
		}
	}
	return 0, fmt.Errorf("Invalid function name: %s", name)
}

var Firstmoduledata Moduledata

type Moduledata struct {
	pclntable    []byte
	ftab         []Functab
	filetab      []uint32
	findfunctab  uintptr
	minpc, maxpc uintptr

	text, etext           uintptr
	noptrdata, enoptrdata uintptr
	data, edata           uintptr
	bss, ebss             uintptr
	noptrbss, enoptrbss   uintptr
	end, gcdata, gcbss    uintptr

	
	typelinks []interface{}

	modulename string
	
	modulehashes []interface{}

	gcdatamask, gcbssmask Bitvector

	next *Moduledata
}

type Functab struct {
	entry   uintptr
	funcoff uintptr
}

type Bitvector struct {
	n        int32 // # of bits
	bytedata *uint8
}

func GetStrFromDLL(str *C.char) *C.char {
	return C.CString(fmt.Sprintf("From DLL: %s!\n", C.GoString(str)))
}


func GetIntFromDLL() int32 {
	return 42
}


//export GetPluginABIVersion
func GetPluginABIVersion () int32 {
	return 2
}
//export GetFunctionCount
func GetFunctionCount () int32 {
    return 2
}
//export GetFunctionInfo
func GetFunctionInfo(x int32,  ProcAddr *uintptr,  ProcDef **C.char) int32{
	var s string
	
	switch x {
	case 0: {
	 s = "function GetStrFromDLL(P: Pchar):Pchar;"
	 *ProcDef = C.CString(fmt.Sprintf("%s", s))
	 //var GetStrFromDLLFunc func(*C.char) *C.char
	// GetFunc(&GetStrFromDLLFunc, "libGoPlugin.GetStrFromDLL")
	 *ProcAddr = reflect.ValueOf(GetStrFromDLL).Pointer()
	 
	}
	case 1: {
	s = "function GetIntFromDLL():integer;"
	 *ProcDef = C.CString(fmt.Sprintf("%s", s))
	 //var GetIntFromDLLFunc func() int32
	// GetFunc(&GetIntFromDLLFunc, "libGoPlugin.GetIntFromDLL")
	 *ProcAddr = reflect.ValueOf(GetIntFromDLL).Pointer()
	 
	}
	}
	return x;
}



func main() {
	// Need a main function to make CGO compile package as C shared library
}

Собственно вопрос заключается в том, можно ли пробросить указатель на Go функцию из библиотеки и использовать её в приложении на другом языке? Или же это не возможно средствами Go?

PS: ProcDef Приложение получает, а указатель роняет его и всё.

 

CynicRus ()

Golang запись слайса в файл

Приветствую уважаемых форумчан. Ковыряю Go потихоньку, и столкнулся со следующей проблемой. Есть слайс содержащий около 300 к строк. Надо его сохранить в файл. Делаю это следующим образом:

func buildData(filename string, data []string) {
	buf := &bytes.Buffer{}
	gob.NewEncoder(buf).Encode(data[0:])
	bs := buf.Bytes()
	err := ioutil.WriteFile(filename, bs, 0644)
	if err != nil {
		panic(err.Error())
	}
}
Отрабатывает быстро, всё сохраняет..Но, перед первой строкой добавляет кучу мусорных символов. Собственно вопрос в том, как просто и быстро сохранить строки слайса в файл, без мусора? Спасибо.

 

CynicRus ()

Конвертация кода с Python в С++ или С

Приветствую уважаемых гуру. Не может ли мне кто нибудь помочь с конвертированием кода на Python в С++?

class ISO7811_2(codecs.Codec):
    TRACK1_CHARS = ' !"#$%&\'()*+`,./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_'
    TRACK23_CHARS = '0123456789:;<=>?'

    @classmethod
    def _reverse_bits(cls, value, nbits):
        return sum(
            1 << (nbits - 1 - i)
            for i in xrange(nbits)
            if (value >> i) & 1
        )

    @classmethod
    def _with_parity(cls, value, nbits):
        if sum(1 for i in xrange(nbits) if (value >> i) & 1) % 2 != 0:
            return value
        return value | (1 << (nbits - 1))

    @classmethod
    def _iso_encode_data(cls, data, mapping, nbits):
        def make_data():
            lrc = 0
            for v in map(mapping.index, data):
                lrc ^= v
                yield chr(cls._with_parity(v, nbits))
            yield chr(cls._with_parity(lrc, nbits))
        enc = ''.join(make_data())
        return enc, len(enc)

    @classmethod
    def _iso_decode_data(cls, data, mapping, nbits):
        dec = ''.join(
            mapping[cls._reverse_bits(ord(c) >> 1, nbits - 1)]
            for c in data
        )
        return dec, len(dec)

    @classmethod
    def encode_track1(cls, data):
        return cls._iso_encode_data(data, cls.TRACK1_CHARS, 7)

    @classmethod
    def encode_track23(cls, data):
        return cls._iso_encode_data(data, cls.TRACK23_CHARS, 5)

    @classmethod
    def decode_track1(cls, data):
        return cls._iso_decode_data(data, cls.TRACK1_CHARS, 7)

    @classmethod
    def decode_track23(cls, data):
        return cls._iso_decode_data(data, cls.TRACK23_CHARS, 5)

    @classmethod
    def codec_search(cls, name):
        return {
            'iso7811-2-track1': (cls.encode_track1, cls.decode_track1, None, None),
            'iso7811-2-track2': (cls.encode_track23, cls.decode_track23, None, None),
            'iso7811-2-track3': (cls.encode_track23, cls.decode_track23, None, None),
        }.get(name, None)
codecs.register(ISO7811_2.codec_search)

Из-за того, что с Python ранее не работал, заглядывая каждый раз в мануал по питону, конвертация алгоритма - взрывает мозг и идёт крайне медленно. Если кто-то готов помочь - благодарю, если кто-то готов за денюжку - то готов и за денюжку в разумных пределах.

 , ,

CynicRus ()

[C] GTK и деревья.

Всем привет. Господа - значится решил я поковыряться с файлом виндового реестра. Соответственно - в качестве инструмента визуализации процесса ковыряния реестра выбрал GTK. Есть в этом самом GTK - GTKTreeModel, так вот - во всех описаниях и примерах - при создании модели - необходимо описать её структуру. Но как быть в случае, если от корневого узла дерева - может быть множество поддеревьев, а у каждого узла поддерева - ещё n-чилдов и т.д.?

CynicRus ()

нет декларации result в этой области видимости.[C++]

Всем доброго дня. Господа, подскажите - где я туплю. Есть функция:

int CCafe::get_stations_count(int status)
 {
     sqlite3 *conn;
          sqlite3_stmt *res;
          int error = 0;
          ostringstream cmd;
          int rec_count = 0;
          const char *tail;
          if(bdpath=="")
          {
            cout << "clean path to database";
          }
          error = sqlite3_open(bdpath, &conn);
          if (error)
          {
              cout << "can not open database";
              exit(0);
          }
          cmd << "select * from stations where status="<<status;
          error = sqlite3_prepare_v2(conn,cmd.str().c_str() , 1000, &res, &tail);
              if (error != SQLITE_OK)
              {
                  cout << "error int get station count\n";
              }
              while (sqlite3_step(res) == SQLITE_ROW)
                  {
                      rec_count++;
                  }
         sqlite3_finalize(res);
         sqlite3_close(conn);
         result=rec_count;

 }
получаю на строке с result - ошибка: нет декларации «result» в этой области видимости. Как так оО?

CynicRus ()

C++ + SQLite3

Доброго времени суток господа. Возникла проблемvка, допустим объявляю класс в class.h

class Class1 {
public:
    Class1();
    ~Class1();
 void cbase_init(sqlite3 * db);


};
class.cpp:
#include <class.h>
#include <sqlite3.h>

void Class1::cbase_init(sqlite3 * db){
    sqlite3_stmt *stmt = NULL;
      bool ONE = false;
      bool TWO = false;
      bool THREE = false;
      bool FOUR = false;


      sqlite3_prepare(db,
                      "select name from"
                      "  (select * from sqlite_master union all"
                      "   select * from sqlite_temp_master)"
                      "where type='table' order by name;", -1, &stmt, NULL);

      while (sqlite3_step(stmt) == SQLITE_ROW)
        {
          if (!strcasecmp((char *) sqlite3_column_text(stmt, 0),
                                       "one"))
            ONE = true;
          else if (!strcasecmp((char *) sqlite3_column_text(stmt, 0),
                                       "two))
            TWO = true;
          else if (!strcasecmp((char *) sqlite3_column_text(stmt, 0),
                                       "three"))
            THREE = true;
          else if (!strcasecmp((char *) sqlite3_column_text(stmt, 0),
                                       "four"))
            FOUR = true;
        }

      sqlite3_finalize(stmt);
}

и при сборке, получаю
class.cpp:(.text+0x3d): undefined reference to `sqlite3_prepare'
class.cpp:(.text+0x58): undefined reference to `sqlite3_column_text'
class.cpp:(.text+0xf8): undefined reference to `sqlite3_column_text'
, при том, что если объявить как static void cbase_init - все замечательно собирается. В чем мой косяк??

CynicRus ()

И вновь потоки[C]

И ещё раз здравствуйте, значится победив прошлую проблему с помощью XLockDisplay, XUnlockDisplay. Таймер бодренько отрабатывает, окошко бодренько прорисовывается. Но где-то я косякнул, и - работают только потоки.

int make_socket (uint16_t port){
	int sock;
	struct sockaddr_in name;
	sock = socket (AF_INET, SOCK_STREAM, 0);
	if (sock < 0){
		perror ("socket");
		exit (EXIT_FAILURE);
	}
	name.sin_family = AF_INET;
	name.sin_port = htons (port);
	name.sin_addr.s_addr = htonl (INADDR_ANY);
	if (bind (sock, (struct sockaddr *) &name, sizeof (name)) < 0)
		{
			perror ("bind");
			exit (EXIT_FAILURE);
		}
	return sock;
}

int parseCommand(char *cmd){
  Display *dsp;
  Window wnd;
  char *param, *value;
  param = strtok(cmd, "/");
  value = strtok(NULL, "/");
 if (strcmp(param, "cmd")==0)
  {
      if (strcmp(value, "start")==0)// cmd/start/
      {
          printf("%s\n", value);
         unlockDisplay(&dsp,&wnd);
	// Добавляем время
	//       timer_add_time("0.01");
      }
      else if (strcmp(value, "exit")==0) // cmd/exit/
           {
            //printf("%s\n", value);
            if(blockDisplay(&dsp,&wnd) < 0){
				fprintf(stderr,"Cannot open Display\n");
				exit(-1);
			}
           }
      else if (strcmp(value, "block")==0) // cmd/block/
           {
            printf("%s\n", value);
            if(blockDisplay(&dsp,&wnd) < 0){
				fprintf(stderr,"Cannot open Display\n");
				exit(-1);
			}
           }
 }
  else if (strcmp(param, "settime")==0) // settime/60/ (settime/количество минут)
        {
           //printf("%s\n", value);
           unlockDisplay(&dsp,&wnd);
        //   window_init();
	// Добавляем время
	      timer_add_time(value);
	
        }
return 0;
	//return(0);
}

int read_from_client (int filedes){
	char buffer[MAXMSG];
	int nbytes;
	nbytes = read (filedes, buffer, MAXMSG);
	if (nbytes < 0){
		perror ("read");
		exit (EXIT_FAILURE);
	}
	else if (nbytes == 0)
		return -1;
	else{
		buffer[nbytes-1] = '\0';
		parseCommand(buffer);
		return 0;
	}
}

int main()
{	
extern int make_socket (uint16_t port);
	int sock;
	fd_set active_fd_set, read_fd_set;
	int i;
	struct sockaddr_in clientname;
	size_t size;
	uint16_t PORT;
	pthread_t tthread,wthread;
	pthread_t sthread;
	 sigset_t sigmask;
	int tterror,wterror,arg,arg1;
	int sign;
	if ( sign = pthread_create(&sthread,NULL,checkSignal,NULL)!= 0){
		printf("TThread creation failed: %d\n", sign);
	}
	if( wterror = pthread_create(&wthread,NULL,initWindow,(void*)arg1)) {
                        printf("TThread creation failed: %d\n", wterror);
					}
	pthread_sigmask(SIG_BLOCK,&sigmask,0); 
	if( tterror = pthread_create(&tthread,NULL,initTimer,(void*)arg)) {
                        printf("TThread creation failed: %d\n", tterror);
					}
//	pthread_sigmask(SIG_BLOCK,&sigmask,0); 	
	
					
	//pthread_join (thread, NULL); 
	struct ccafe_params parms;
    printf ("Initializing parameters to default values...\n");
    init_parameters (&parms);
    printf ("Reading config file...\n");
    parse_config (&parms);
    printf ("Final values:\n");
    printf ("port: %s, MSG: %s\n", parms.port,parms.MMSG);
    MAXMSG = atoi(parms.MMSG);
    PORT = atoi(parms.port);
    sock = make_socket(PORT);
   // printf ("sock: %s",(char*)sock);
	if (listen (sock, 1) < 0){
		perror ("listen");
		exit (EXIT_FAILURE);
	}
	FD_ZERO (&active_fd_set);
	FD_SET (sock, &active_fd_set);
	while (1){
		read_fd_set = active_fd_set;
		if (select (FD_SETSIZE, &read_fd_set, NULL, NULL, NULL) < 0){
			perror ("select");
			exit (EXIT_FAILURE);
		}
		for (i = 0; i < FD_SETSIZE; ++i)
			if (FD_ISSET (i, &read_fd_set)){
				if (i == sock){
					int new;
					size = sizeof (clientname);
					new = accept (sock,(struct sockaddr *) &clientname,&size);
					if (new < 0){
						perror ("accept");
						exit (EXIT_FAILURE);
					}
				//	fprintf (stderr,"Server: connect from host %s, port %hd.\n",inet_ntoa (clientname.sin_addr),ntohs (clientname.sin_port));
					FD_SET (new, &active_fd_set);
				}
				else{

					if (read_from_client (i) < 0){
						close (i);
						FD_CLR (i, &active_fd_set);
					}
				}
			}
	}
	for(;;)  {}
	//pthread_join (sthread, NULL); 
  return 0;
}
Сокет - создается, слушается. Но - ничего не принимает, второе приложение - с ним соединяется - и все. Не ответа, ни привета. В чем может быть затык?

CynicRus ()

[C] Вопрос по выполнению в потоке.

Доброго времени суток, господа. Собственно - вопрос в следующем. Имеются 2 подпрограммы, одна - рисует окно, вторая - таймер с этим окном взаимодействует. Подпрограмма таймера - имеет метод add_time_str - который позволяет назначить таймеру, некоторое время. Вызов подпрограмм выглядит следующим образом:

window_init();//создание окна
timer_init();//инициализация таймера
add_time_str("20");//установка времени
window_loop();// Обработка событий окна
window_destroy();
В связи с тем, что window_loop - цикл, и пока он не отработает программа не продолжит свою работу, я хочу поместить эти вызовы в отдельный поток. Собственно вопрос: как поместить эти вызовы в pthread правильно, и главное - как потом вызвать add_time_str из потока? Заранее благодарю за помощь.

PS: пока все мои попытки проделать данную операцию ведут к Interrupted system call и состоят из попыток адаптировать писание Рочкинда к своей ситуации.

CynicRus ()

[C] Хидеры и Undefined reference.

Доброго времени господа, столкнулся со следующей проблемой. Значится - пишу header:

#ifndef PARSER_H_INCLUDED
#define PARSER_H_INCLUDED

#define MLEN 128
#define CFG_FILE "ccafe"

struct ccafe_params
{
    char port[MLEN];
    char MMSG[MLEN];
}
ccafe_params;

void init_parameters (struct ccafe_params *parms);

char* trim (char *s);

void parse_config (struct ccafe_params *parms);



#endif // PARSER_H_INCLUDED
к нему соответственно - файл .c
#include <stdio.h>
#include <string.h>
#include <ctype.h>

#include <parser.h>

void init_parameters (struct ccafe_params *parms)
{
    strncpy (parms->item, "port", MLEN);
    strncpy (parms->item, "MMSG", MLEN);
}

char * trim (char * s)
{
    char *s1 = s, *s2 = &s[strlen (s) - 1];
    while ( (isspace (*s2)) && (s2 >= s1) )
    s2--;
  *(s2+1) = '\0';
     while ( (isspace (*s1)) && (s1 < s2) )
    s1++;
    strcpy (s, s1);
    return s;

}

void parse_config (struct ccafe_params *parms)
{
     char *s, buff[256];
  FILE *fp = fopen (CFG_FILE, "r");
  if (fp == NULL)
  {
    return;
  }
  while ((s = fgets (buff, sizeof buff, fp)) != NULL)
  {
    if (buff[0] == '\n' || buff[0] == '#')
      continue;
    char name[MLEN], value[MLEN];
    s = strtok (buff, "=");
    if (s==NULL)
      continue;
    else
      strncpy (name, s, MLEN);
    s = strtok (NULL, "=");
    if (s==NULL)
      continue;
    else
      strncpy (value, s, MLEN);
    trim (value);
    if (strcmp(name, "port")==0)
      strncpy (parms->port, value, MLEN);
    else if (strcmp(name, "MMSG")==0)
      strncpy (parms->MMSG, value, MLEN);
   // else if (strcmp(name, "size")==0)
   //   strncpy (parms->size, value, MAXLEN);
    else
      printf ("WARNING: %s/%s: Unknown name/value pair!\n",
        name, value);
  }
  fclose (fp);

}

В main.c - подключаю parser.h, и пытаюсь выполнить следующий код

struct ccafe_params parms;
    printf ("Initializing parameters to default values...\n");
    init_parameters (&parms);
    printf ("Reading config file...\n");
    parse_config (&parms);
    printf ("Final values:\n");
    printf ("  port: %s, MSG: %s\n", parms.port,parms.MMSG);
- и тут же ловлю undefined reference init_parameters и parse_config. Вопрос - как исправить, и главное - в чем ошибка?

CynicRus ()

[C] Strtok и разбор строки

Доброго времени суток господа, помогите разобраться с разбором строки. Не пойму, что не так: значится, есть приложение - которое через сокет шлет строку вида

 byte[] data = Encoding.UTF8.GetBytes("cmd/start"); 
, я её значится ловлю и начинаю разбирать при помощи strtok
 int parseCommand(char *cmd){
  char *param, *value;
  param = strtok(cmd, "/");
  value = strtok(NULL, "/");
  printf("param = %s, value = %s\n", param, value);
return 0;
} 

Код выше - прекрасно отрабатывает, показывает param = cmd, value = start , однако - если,в место printf, выставить условие в духе

if (strcmp(param,"cmd")) {..здесь то что нужно выполнить по условию..}
оно не срабатывает никак. Ну вот как-будто нет его, этого условия. Или же - param - таки не cmd ниразу. Как так?

CynicRus ()

[C] Список PID из WM

Добрый вечер господа. Необходимо получить список PID приложений из pager, то-есть тех - что запущены в пространстве WM,и имеют окна, если так можно выразиться. Направьте на нужные страницы документации, ибо самостоятельное гугление - результатов не дает. Видимо - как-то не так реквестирую запрос у гугла-(

CynicRus ()

Xlib и _NET_WM_STATE [C]

День добрый, господа. Возникла проблеммка, при программировании под чистый xlib. Значится по мере выполнения задачи возникла потребность - спрятать приложение из pager и так называемой панели задач, а так же постоянно держать форму поверх остальных окон. Долгое гугление и вдумчивое курение документации - навели меня на написание следующих строк:

//убираемся из панели задач и pager
    Atom a = XInternAtom(display, "_NET_WM_STATE", True);
    if (a != None) {
	Atom prop = XInternAtom(display, "_NET_WM_STATE_SKIP_TASKBAR", True);
	XChangeProperty(display, window, a, XA_ATOM, 32, PropModeAppend, (unsigned char *) &prop, 1);
    }
    a = XInternAtom(display, "_NET_WM_STATE", True);
    if (a != None) {
	Atom prop = XInternAtom(display, "_NET_WM_STATE_SKIP_PAGER", True);
	XChangeProperty(display, window, a, XA_ATOM, 32, PropModeAppend, (unsigned char *) &prop, 1);
    }
    //типа stay on top.
    a = XInternAtom(display, "_NET_WM_STATE", True);
    if (a != None) {
    Atom prop = XInternAtom(display, "_NET_WM_STATE_ABOVE", True);
    XChangeProperty(display, window, a, XA_ATOM, 32, PropModeAppend, (unsigned char *) &prop, 1);
    }
Все бы хорошо, однако - по непонятной причине - второй блок if - отрабатывает вообще рандомно, а третий - такое ощущение, что не отрабатывает вовсе. Тоесть - форма по только ей понятной причине: пропадает из панели задач, абсолютно случайно при н-м запуске пропадает из pager, а состояние поверх всех окон - пропадает при любом изменении фокуса. В браузер ткнулся, и все - форма уже не видна. Может быть - у кого нибудь уже есть опыт реализации подобной задачи, и он подскажет, что я таки делаю не так, и главное - как надо?

CynicRus ()

RSS подписка на новые темы