LINUX.ORG.RU

kdialog --progressbar в КДЕ6, qdbus и генту (калька).

 , ,


0

2

При последнем обновлении из системы выкинули qdbus, как теперь передавать состояние кдиалогу на прогрессбар? Поспрашивал ИИ, погуглил - пусто. Какие теперь особенности работы, кто в курсе?

p.s.

В пень кдиаг, самое время уходить от инструментов КДЕ. Напишу свое. Всем спасибо.

★★★★★

Последнее исправление: LightDiver (всего исправлений: 1)

Точно выбросили?

Например в Fedora теперь утилита с постфиксом версии Qt идёт: qdbus-qt6 (пакет qt6-qttools).

Поищи и установи похожий по названию пакет.

Ja-Ja-Hey-Ho ★★★★★
()
Последнее исправление: Ja-Ja-Hey-Ho (всего исправлений: 1)
Ответ на: комментарий от Ja-Ja-Hey-Ho
calculate diver # eix qtdbus
[I] dev-qt/qtdbus
     Доступные версии:      (5) 5.15.17(5/5.15)^t{tbz2}
       {debug test}
     Установленные версии:  5.15.17(5/5.15)^t{tbz2}(03:37:03 14.06.2025)(-debug -test)
     Домашняя страница:     https://www.qt.io/ https://invent.kde.org/qt/qt/qtbase https://community.kde.org/Qt5PatchCollection
     Описание:              Qt5 module for inter-process communication over the D-Bus protocol

calculate diver # 

Точно. Осталась только пятая ветка.

LightDiver ★★★★★
() автор топика
Последнее исправление: LightDiver (всего исправлений: 1)
Ответ на: комментарий от dataman

Крайне нестабильное.. Я пока решил переписать на раст софтину. После чего оказалось, что роскомнадзор забанаил сайт с креэтсами.. Пока качаю вручную через впн уже 26й и тихонько мате..медитирую.

Что за трэш то попер, жесть. Может на си перебраться обратно. Там нет сотен модулей для простейшей программы.

LightDiver ★★★★★
() автор топика
Ответ на: комментарий от Ja-Ja-Hey-Ho

У kdialog создаётся «interface null»

method call time=1751896361.185449 sender=:1.95 -> destination=org.kde.kdialog-11961 serial=5 path=/ProgressDialog; interface=(null); member=Set
   string ""
   string "value"
   variant       string "1"
А способов указать через dbus-send «interface null» я не нашёл, да и похоже он это вообще не умеет делать.

Dr64h ★★★★
()
Ответ на: комментарий от u-235

Все уже. Написал на си. Остается только пару моментов исправить

#include <SDL2/SDL.h>
#include <SDL2/SDL_mixer.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <fcntl.h>
#include <sys/stat.h>
#include <string.h>
#include <errno.h>

#define WINDOW_WIDTH  300
#define WINDOW_HEIGHT 100
#define TIMER_SECONDS 490
#define MUSIC_FILE    "/home/diver/Загрузки/Музыка/12/coffee.mp3"
#define LOCK_FILE     "/tmp/coffee_timer.lock"

SDL_Window* window = NULL;
SDL_Renderer* renderer = NULL;
Mix_Music* music = NULL;

void init() {
    if (SDL_Init(SDL_INIT_VIDEO | SDL_INIT_AUDIO) < 0) {
        fprintf(stderr, "Не удалось инициализировать SDL: %s\n", SDL_GetError());
        exit(1);
    }

    if (Mix_OpenAudio(44100, MIX_DEFAULT_FORMAT, 2, 2048) < 0) {
        fprintf(stderr, "Не удалось инициализировать SDL_mixer: %s\n", Mix_GetError());
        SDL_Quit();
        exit(1);
    }

    window = SDL_CreateWindow("Кофе", SDL_WINDOWPOS_UNDEFINED, SDL_WINDOWPOS_UNDEFINED, WINDOW_WIDTH, WINDOW_HEIGHT, SDL_WINDOW_SHOWN);
    if (!window) {
        fprintf(stderr, "Не удалось создать окно: %s\n", SDL_GetError());
        Mix_CloseAudio();
        SDL_Quit();
        exit(1);
    }

    renderer = SDL_CreateRenderer(window, -1, SDL_RENDERER_ACCELERATED);
    if (!renderer) {
        fprintf(stderr, "Не удалось создать рендерер: %s\n", SDL_GetError());
        SDL_DestroyWindow(window);
        Mix_CloseAudio();
        SDL_Quit();
        exit(1);
    }

    music = Mix_LoadMUS(MUSIC_FILE);
    if (!music) {
        fprintf(stderr, "Не удалось загрузить музыку: %s\n", Mix_GetError());
        SDL_DestroyRenderer(renderer);
        SDL_DestroyWindow(window);
        Mix_CloseAudio();
        SDL_Quit();
        exit(1);
    }
}

void render_progress_bar(float progress) {
    SDL_SetRenderDrawColor(renderer, 0, 0, 0, 255);
    SDL_RenderClear(renderer);

    SDL_SetRenderDrawColor(renderer, 0, 255, 0, 255);
    SDL_Rect bar = {10, 40, (int)(progress * (WINDOW_WIDTH - 20)), 20};
    SDL_RenderFillRect(renderer, &bar);

    SDL_RenderPresent(renderer);
}

void cleanup() {
    if (music) Mix_FreeMusic(music);
    if (renderer) SDL_DestroyRenderer(renderer);
    if (window) SDL_DestroyWindow(window);
    Mix_CloseAudio();
    SDL_Quit();
    unlink(LOCK_FILE); // Удаляем временный файл
}

int check_lock_file() {
    FILE *fp = fopen(LOCK_FILE, "r+");
    if (fp == NULL) {
        if (errno == ENOENT) {
            // Файл не существует, создаем новый
            fp = fopen(LOCK_FILE, "w");
            if (fp == NULL) {
                perror("Не удалось создать временный файл");
                return 1;
            }
            fprintf(fp, "working");
            fclose(fp);
            return 0; // Продолжаем работу
        } else {
            // Другие ошибки при открытии файла
            perror("Не удалось открыть временный файл");
            return 1;
        }
    }

    // Файл существует - проверяем содержимое
    char status[10];
    if (fgets(status, sizeof(status), fp) != NULL) {
        // Удаляем символ новой строки если есть
        size_t len = strlen(status);
        if (len > 0 && status[len-1] == '\n') {
            status[len-1] = '\0';
        }

        if (strcmp(status, "working") == 0) {
            // Нашли работающий экземпляр - отправляем команду на выход
            fclose(fp);
            FILE *fpw = fopen(LOCK_FILE, "w");
            if (fpw) {
                fprintf(fpw, "exit");
                fclose(fpw);
            }
            printf("Программа уже запущена. Завершение текущего экземпляра.\n");
            return 1;
        } else if (strcmp(status, "exit") == 0) {
            // Файл уже содержит команду выхода
            fclose(fp);
            printf("Программа уже завершена. Завершение текущего экземпляра.\n");
            return 1;
        }
    }

    // Неизвестное содержимое файла - перезаписываем
    fseek(fp, 0, SEEK_SET);
    if (ftruncate(fileno(fp), 0) != 0) {
        perror("Ошибка при усечении файла");
    }
    fprintf(fp, "working");
    fclose(fp);
    return 0; // Продолжаем работу
}

void check_for_exit() {
    FILE *fp = fopen(LOCK_FILE, "r");
    if (!fp) {
        return;
    }

    char status[10];
    if (fgets(status, sizeof(status), fp) != NULL) {
        // Удаляем символ новой строки если есть
        size_t len = strlen(status);
        if (len > 0 && status[len-1] == '\n') {
            status[len-1] = '\0';
        }

        if (strcmp(status, "exit") == 0) {
            fclose(fp);
            printf("Получен сигнал на завершение.\n");
            cleanup();
            exit(0);
        }
    }

    fclose(fp);
}

int main(int argc, char* argv[]) {
    if (check_lock_file()) {
        return 1; // Программа уже запущена или завершена
    }

    atexit(cleanup);
    init();

    int timer = 0;
    float progress = 0.0f;
    int running = 1;
    SDL_Event event;

    while (running && timer < TIMER_SECONDS) {
        while (SDL_PollEvent(&event)) {
            if (event.type == SDL_QUIT) {
                running = 0;
            }
        }

        check_for_exit(); // Проверяем команду завершения

        progress = (float)timer / TIMER_SECONDS;
        render_progress_bar(progress);

        SDL_Delay(1000);
        timer++;
    }

    if (running) {
        Mix_PlayMusic(music, 1);
        while (Mix_PlayingMusic()) {
            SDL_Delay(100);
        }
    }

    return 0;
}

Не могу понять. Если запускать программу кликом - все работает, а если через sxhkd - запускаются новые экземпляры.. Хмм…

LightDiver ★★★★★
() автор топика
Ответ на: комментарий от u-235

Я сам еще ходил в библиотеки и брал там книги. И даже возвращал обратно. Я тоже привычный…

Надо было питон брать и не выпендриваться. Сделал бы минут за 10 все. Но уже дело принипа - надо на си доделать. Хм.. Чего ж ему надо то, собаке некрещеной? В чем разница запусков?

LightDiver ★★★★★
() автор топика
Ответ на: комментарий от u-235

Хм.. Ладно, зря я гнал на си. Си классная штука, когда ты в каменном веке и доступных инструментов минимум. Подключил нужное, вжух - готово.

А раст конечно классный, высокотехнологичный, но чуть что и превратился в тыкву. Это печально.

LightDiver ★★★★★
() автор топика
Последнее исправление: LightDiver (всего исправлений: 1)
Ответ на: комментарий от u-235

Я искренне надеюсь, что никогда больше не придется. Это же деградация.

Оно хорошо именно когда тебе недоступны нормальныые технологии не более.

По хорошему, надо не маяться дурью и переходить на питон. Много проблем бы решило. Но какой же он жрущий…

LightDiver ★★★★★
() автор топика
Последнее исправление: LightDiver (всего исправлений: 1)
Ответ на: комментарий от u-235

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

В любом случае развитие и усложнение технологии это хорошо, а вот откат к старому это вынужденное: «работать можно? Можно. Но зачем?»

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

Оно хорошо именно когда тебе недоступны нормальныые технологии не более.

Нормальные технологии позволяют спокойно работать без сети. А деградация это прибиться гвоздями к одному сервису и рассчитывать, что он будет доступен всегда и везде. Раст и сам по себе отстойный, но crates это абсолютное зло.

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

А где ты сейчас собрался вообще работать без сети? Это практически то же самое, что «нормально работать без электричества».

А еще чуть позже никто не будет работать без ИИ. Это прогресс, он проникает в нашу жизнь, в социум и остается неотъемлемой его частью.

Отключаем сеть, отключаем электричество и 99% населения парализовано. Это катаклизм, нештатная ситуация. Работать нужно с нормой, а не с экстримом.

LightDiver ★★★★★
() автор топика
Ответ на: комментарий от u-235

https://github.com/Vladgobelen/NScoffee

Дорисовал я тут эту хреновину и понял вот что: на питон надо переходить. Чего я от него шарахаюсь то? Ну жирный, да, но какая уже нахрен разница? На нем бы я все это сделал за 5 минут и красивее. Ну серьезно. И с модулями беды не было бы и вообще ни с чем.

А все эти си, расты и прочее - уникальные случаи для своих узких ниш.

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

Как видишь, глобальная сеть рассыпается. Электричество не надо притягивать за уши, без него компьютер вообще не работает. А вот перебои в работе сети это норма, и софт должен учитывать эту реальность.

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

Не откатываться надо, а распределять сервисы. Чтобы если отвалились одни, оставались другие.

Прогресс не победить. Он лучше просто потому что лучше. Пытаясь его отрицать, ты сам себя ставишь на более низкую ступень эволюции.

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

Не откатываться надо, а распределять сервисы.

Но вот смузихлёбы делают ровно наоборот: пристегиваются к централизованным сервисам и пищат от удовольствия. А потом бац, и всем вашим кодом управляет Пентагон. Ну если ты в Америке живешь, то может и нормально. А вообще не очень.

bread
()