[C++] Gamma regulator

Bash, C, C++, Java, PHP, Ruby, GTK, Qt i wiele innych - wszystko tutaj.
Awatar użytkownika
Skotar
Piegowaty Guziec
Piegowaty Guziec
Posty: 12
Rejestracja: 07 sie 2010, 16:54
Płeć: Mężczyzna
Wersja Ubuntu: 10.04
Środowisko graficzne: GNOME
Architektura: x86_64
Kontakt:

[C++] Gamma regulator

Post autor: Skotar »

Cześć!
Gamma regulator służy do zmiany gammy, poprzez wykorzystanie skrótów klawiszowych (program xbindkeys).

Programy tego typu cieszą się ogromną popularnością na Windowsie i po migracji na Linuksa - brakowało mi takiego programu. Początkowo tworzyłem go dla użytku własnego, ale pomyślałem, że może spotkać się z jakimś zainteresowaniem wśród Linuksowej społeczności. Jest to mój pierwszy program w C++. Proszę o wyrozumiałość na temat zastosowanych w nim rozwiązań :P.

Wydałem wersję finalną 1.0

Więcej informacji: http://k1d.webd.pl/portfolio/gamma.html
Deb: http://k1d.webd.pl/portfolio/Pliki/gamm ... eb.tar.bz2
Źródła: http://k1d.webd.pl/portfolio/Pliki/gamm ... .0.tar.bz2
Awatar użytkownika
beluosus
Zakręcona Traszka
Zakręcona Traszka
Posty: 695
Rejestracja: 01 paź 2006, 15:32
Płeć: Mężczyzna
Wersja Ubuntu: inny OS
Środowisko graficzne: Xfce
Architektura: x86
Kontakt:

Odp: [C++] Gamma regulator 0.80

Post autor: beluosus »

Strasznie łopatologiczny ten Twój program. Kilka uwag co mi się rzuciło w oczy po szybkim przeskrolowaniu (niestety nie kompilowałem).
Dołączasz <string.h> dla języka C, a nigdzie nie używasz jego funkcji, zapewne chodzi Ci o c++owy <string>.
Moim zdaniem nie powinieneś mieszać w konfiguracji xbindkeys, a tym bardziej zmieniać jej uprawnienia (po co mod 777?).
Od "if zmg" w dół to jakaś porażka, milion ifów i do tego goto... tego się używa chyba tylko w basicu i assemblerze. Na pewno nie w C++.
Popraw ify, usuń goto, zrób global hotkey dla Xliba i wtedy może być.
Poza tym sprawę można załatwić prostym skryptem (i samemu skonfigurować xbindkeys):

Kod: Zaznacz cały

#!/bin/bash

gamma=$(<~/.gamma) || gamma="1,0"

if [[ "${1}" == "+" || "${1}" == "-" ]]
then
    newGamma=$(echo "${gamma} ${1} 0.2" | tr ',' '.' | bc)
    newGamma=$(echo ${newGamma} | tr '.' ',')
    echo ${newGamma} > ~/.gamma
    nvidia-settings -a gamma=${newGamma}
elif [[ "${1}" == "reset" ]]
then
    newGamma="1,0"
    echo ${newGamma} > ~/.gamma
    nvidia-settings -a gamma=${newGamma}
else
    echo "Aby:"
    echo "  zwiekszyc gamme: ./gamma +"
    echo " zmniejszyc gamme: ./gamma -"
    echo " zresetowac gamme: ./gamma reset"
fi
(napisane w 2 minuty więc mogą kryć się jakieś chochliki, dobranoc)
Kurs Linuksa: for i in $(ls /bin); do man $i; done
__________________
http://beluosus.pl/
Awatar użytkownika
Skotar
Piegowaty Guziec
Piegowaty Guziec
Posty: 12
Rejestracja: 07 sie 2010, 16:54
Płeć: Mężczyzna
Wersja Ubuntu: 10.04
Środowisko graficzne: GNOME
Architektura: x86_64
Kontakt:

Odp: [C++] Gamma regulator 0.80

Post autor: Skotar »

Dziękuję za odpowiedź.
Wpadłem na pomysł jak wyrzucić polecenie goto.

Kod: Zaznacz cały

			if (kierunkowa == "3,0")
			{
				kierunkowa_w = "2,9";
							}
			if (kierunkowa == "2,9")
			{
				kierunkowa_w = "2,8";
			}
			if (kierunkowa == "2,8")
			{
				kierunkowa_w = "2,7";
			}

...

			zapis(kierunkowa_w);
			kierunkowa = kierunkowa_w;	
Gdyby zmienne były zapisywane w postaci x,x, a nie x.x to tą sprawę załatwił bym.
Awatar użytkownika
Skotar
Piegowaty Guziec
Piegowaty Guziec
Posty: 12
Rejestracja: 07 sie 2010, 16:54
Płeć: Mężczyzna
Wersja Ubuntu: 10.04
Środowisko graficzne: GNOME
Architektura: x86_64
Kontakt:

Odp: [C++] Gamma regulator 0.80

Post autor: Skotar »

używanie instrukcja goto zdradza, że się jest złym programistą. To dlatego, że program używający instrukcji goto jest dla programisty nieczytelny, a dla kompilatora trudny do eleganckiej kompilacji
Cytując Pana Jerzego Grębosza.

Zaktualizowałem program do wersji 0.81
- pozbyłem się instrukcji goto i usprawniłem troszkę kod. Myślę, że jest czytelniejszy.
- wyodrębniłem plik konfiguracyjny "skonfiguruj". Teraz plik ten tworzy wszystkie pliki z ustawieniami, bez zabawy z chmodami.

Download: http://k1d.webd.pl/portfolio/Pliki/gamm ... 81.tar.bz2
Do wglądu
Gamma.cpp: http://k1d.webd.pl/portfolio/Pliki/gamma.cpp
Skonfiguruj: http://k1d.webd.pl/portfolio/Pliki/skonfiguruj

Więcej informacji: http://k1d.webd.pl/portfolio/gamma.html
Awatar użytkownika
ethanak
Wygnańcy
Posty: 3054
Rejestracja: 04 gru 2007, 13:19
Płeć: Mężczyzna
Wersja Ubuntu: 12.04
Środowisko graficzne: GNOME
Architektura: x86
Lokalizacja: Bielsko-Biała
Kontakt:

Odp: [C++] Gamma regulator 0.80

Post autor: ethanak »

Skotar pisze:Cytując Pana Jerzego Grębosza.
To zmień źródło cytatów bo to bzdura. Nieumiejętność używania goto nie upoważnia jeszcze do twierdzenia że jest <rot13>puhw</rot13> warte. A napisanie iluśtam podręczników dla głąbów nie upoważnia jeszcze do bycia guru (jeśli ktoś pamięta pana Jana B. to wie o co chodzi).

Zastanów się... gdyby było, czy zostałoby w C++ (czy innych Cpodobnych językach)?

Dam Ci przykład:

Język programowania Icon (który nie ma goto, ale umozliwia wyjście z zagnieżdżonych pętli):

Kod: Zaznacz cały

every a:=1 to 10 do
every b:=a to 20 do {
  # ileśtam instrukcji
  if jakaśfunkcja(a,b) then break break;
  #ileśtam innych instrukcji
}
cośtamdalej
Napiszesz to w C? Bez goto?
Bo dla mnie naturalne jest:

Kod: Zaznacz cały

for (a=1;a<=10;a++)
for (b=a;b<=20;b++) {
//ileśtam instrukcji
if (jakaśfunkcja(a,b)) goto loop_exit;
//ileśtam innych instrukcji
}

loop_exit: cośtamdalej
Zrób to bez wprowadzania niepotrzebnych dodatkowych zmiennych.
Кто жопой родился, чижиком не помрёт
Awatar użytkownika
Skotar
Piegowaty Guziec
Piegowaty Guziec
Posty: 12
Rejestracja: 07 sie 2010, 16:54
Płeć: Mężczyzna
Wersja Ubuntu: 10.04
Środowisko graficzne: GNOME
Architektura: x86_64
Kontakt:

Odp: [C++] Gamma regulator

Post autor: Skotar »

No tak, zboczyliśmy z tematu.

Trochę pogrzebałem w google i udało mi się odszukać komendę zmiany gammy dla kart ATI:

Kod: Zaznacz cały

aticonfig --set-dispattrib=lvds,brightness:0 - przedział -100 do 100
Mógłby ktoś to zweryfikować i napisać czy te polecenie działa?
[r4]
Przebojowy Jelonek
Przebojowy Jelonek
Posty: 1048
Rejestracja: 08 maja 2007, 07:40
Wersja Ubuntu: 12.10
Środowisko graficzne: Xfce
Architektura: x86

Odp: [C++] Gamma regulator

Post autor: [r4] »

Gammę można zmienić niezależnie od sterownika, poleceniem

Kod: Zaznacz cały

xgamma
, wystarczy zaaliasować sobie w .bashrc jako gamma i bardzo wygodnie przełączać z terminala w dowolnym momencie.

Bardzo dobrze, że chłopak próbuje, poduczy się i będzie strzelał perełki :)
I believe not drinking is actually the best way to not get a hangover in the first place.
Coincidentally, it's also the best way to not enjoy your life.
Awatar użytkownika
Skotar
Piegowaty Guziec
Piegowaty Guziec
Posty: 12
Rejestracja: 07 sie 2010, 16:54
Płeć: Mężczyzna
Wersja Ubuntu: 10.04
Środowisko graficzne: GNOME
Architektura: x86_64
Kontakt:

Odp: [C++] Gamma regulator

Post autor: Skotar »

Kiedyś zadałem pytanie, czy ktoś zna sposób na zmiany gammy. Nikt takiej wiedzy nie posiadał. Teraz, gdy zacząłem pisać program, znalazły się aż dwa ;).

[r4], ten sposób jest świetny. Przyjrzę się dokładniej i zobaczę, czy w ogóle warto pakować to w program, czy sam konfigurator xbindkeys.

Wyszło na to, że moja praca poszła na marne :( Xgamma jest o wiele lepszym rozwiązaniem i nie wymaga zainstalowanego panelu od karty graficznej.
Awatar użytkownika
Skotar
Piegowaty Guziec
Piegowaty Guziec
Posty: 12
Rejestracja: 07 sie 2010, 16:54
Płeć: Mężczyzna
Wersja Ubuntu: 10.04
Środowisko graficzne: GNOME
Architektura: x86_64
Kontakt:

Odp: [C++] Gamma regulator

Post autor: Skotar »

Dokończyłem program, oznaczyłem go numerem 1.0. Działa bez zarzutu. Stworzyłem również paczkę deb programu.

Więcej informacji: http://k1d.webd.pl/portfolio/gamma.html
Deb: http://k1d.webd.pl/portfolio/Pliki/gamm ... eb.tar.bz2
Źródła: http://k1d.webd.pl/portfolio/Pliki/gamm ... .0.tar.bz2
Awatar użytkownika
kabanek
Zakręcona Traszka
Zakręcona Traszka
Posty: 592
Rejestracja: 23 cze 2009, 20:34
Płeć: Mężczyzna
Wersja Ubuntu: 13.10
Środowisko graficzne: Xfce
Architektura: x86_64
Kontakt:

Odp: [C++] Gamma regulator

Post autor: kabanek »

cześć,
widziałem, że masz tam dużo powtarzającego się kodu. W takich wypadkach wygodnie się używa makra.

np zamiast napisać

Kod: Zaznacz cały

			if (kierunkowa == "2.9")
			{
				kierunkowa_w = "2.8";
			}
			if (kierunkowa == "2.8")
			{
				kierunkowa_w = "2.7";
			}
			if (kierunkowa == "2.7")
			{
				kierunkowa_w = "2.6";
			}
...
możesz napisać makro w stylu:

Kod: Zaznacz cały

#define MAKRO(text1, text2)\
if(kierunkowa == text1) kierunkowa_w = text2;
a następnie używać to tak:

Kod: Zaznacz cały

#define MAKRO(text1, text2)\
if(kierunkowa == text1) kierunkowa_w = text2;
MAKRO("2.9", "2.8")
MAKRO("2.8", "2.7")
MAKRO("2.7", "2.6")
MAKRO("2.6", "2.5")
itd

nieco Ci się kod skróci i będzie może trochę bardziej przejrzysty

@ethanak ja napiszę ;p

Kod: Zaznacz cały

for (a=1;a<=10;a++)
for (b=a;b<=20;b++) {
//ileśtam instrukcji
if (jakaśfunkcja(a,b)) {a=11;break;}
//ileśtam innych instrukcji
}
w programowaniu zawsze jest więcej niż jedno wyjście :-)
Awatar użytkownika
Skotar
Piegowaty Guziec
Piegowaty Guziec
Posty: 12
Rejestracja: 07 sie 2010, 16:54
Płeć: Mężczyzna
Wersja Ubuntu: 10.04
Środowisko graficzne: GNOME
Architektura: x86_64
Kontakt:

Odp: [C++] Gamma regulator

Post autor: Skotar »

@kabanek, ciekawe rozwiązanie. Nie słyszałem o nim, jednak w tym programie nie warto go już wprowadzać, bo myślę, że już nic w nim nie będę zmieniał. Jest na tyle krótki, że nie sprawia mi kłopotów przemieszczanie się po jego kodzie.
kabanek pisze:kto powiedział, że poszło na marne?
ważne jest też doświadczenie w programowaniu, które przy okazji tego programu trochę zdobyłeś
Masz świętą rację :). Napisanie tego krótkiego programu dało mi trochę wiedzy praktycznej. Taki wstęp do królestwa C++ ;). Dowiedziałem się także, jak tworzyć pliki konfiguracyjne, deb oraz obsługiwać edytor C++.
Awatar użytkownika
beluosus
Zakręcona Traszka
Zakręcona Traszka
Posty: 695
Rejestracja: 01 paź 2006, 15:32
Płeć: Mężczyzna
Wersja Ubuntu: inny OS
Środowisko graficzne: Xfce
Architektura: x86
Kontakt:

Odp: [C++] Gamma regulator

Post autor: beluosus »

kabanek pisze:@ethanak ja napiszę ;p

Kod: Zaznacz cały

for (a=1;a<=10;a++)
for (b=a;b<=20;b++) {
//ileśtam instrukcji
if (jakaśfunkcja(a,b)) {a=11;break;}
//ileśtam innych instrukcji
}
W poprzednim poście to opisałem. ;)
kabanek pisze:cześć,
widziałem, że masz tam dużo powtarzającego się kodu. W takich wypadkach wygodnie się używa makra.
A co jeśli chciałbyś np takich wartości od 0 do 100? Będziesz pisał 1000 linijek?

Kod: Zaznacz cały

#include <iostream>
#include <cstdlib>
#include <sstream>

using namespace std;

string ftoa(double d)
{
    ostringstream o;
    if (!(o << d))
        return "";

    return o.str();
}

int main()
{
    string kierunkowa("2.5"); // przykładowo 2.5
    string kierunkowa_w;
    // zmniejsz:
    kierunkowa_w = ftoa(atof(kierunkowa.c_str()) - 0.1);
    cout << kierunkowa_w << endl; // powinno wyświetlić 2.4

    return 0;
}
Kurs Linuksa: for i in $(ls /bin); do man $i; done
__________________
http://beluosus.pl/
Awatar użytkownika
Skotar
Piegowaty Guziec
Piegowaty Guziec
Posty: 12
Rejestracja: 07 sie 2010, 16:54
Płeć: Mężczyzna
Wersja Ubuntu: 10.04
Środowisko graficzne: GNOME
Architektura: x86_64
Kontakt:

Odp: [C++] Gamma regulator

Post autor: Skotar »

Początkowo tworzyłem program z poleceniem nvidia-settings -a gamma=1,0, które zawierało przecinek, więc nie dało się zrobić tak beluosus napisałeś. Później dowiedziałem się o poleceniu xgamma, które już zawierało kropkę. Nie było sensu kombinować z nową funkcją, zamieniłem przecinki na kropki. Myślę, że nikt nie będzie wychodził z gammą powyżej wartości 3, bo ekran jest na tyle rozjaśniony, że i tak nic nie widać.
Awatar użytkownika
beluosus
Zakręcona Traszka
Zakręcona Traszka
Posty: 695
Rejestracja: 01 paź 2006, 15:32
Płeć: Mężczyzna
Wersja Ubuntu: inny OS
Środowisko graficzne: Xfce
Architektura: x86
Kontakt:

Odp: [C++] Gamma regulator

Post autor: beluosus »

Skotar pisze:Początkowo tworzyłem program z poleceniem nvidia-settings -a gamma=1,0, które zawierało przecinek, więc nie dało się zrobić tak beluosus napisałeś.
Nie ma problemu ze zamianą przecinka na kropkę.
Skotar pisze:Później dowiedziałem się o poleceniu xgamma, które już zawierało kropkę.
Więc wystarczyłoby usunąć jedną czy dwie linijki odpowiedzialną za zamianę przecinek/kropka.
Skotar pisze:Nie było sensu kombinować z nową funkcją, zamieniłem przecinki na kropki. Myślę, że nikt nie będzie wychodził z gammą powyżej wartości 3, bo ekran jest na tyle rozjaśniony, że i tak nic nie widać.
Musiałeś dokonać jakieś 100 zamian w kodzie, oczywiście to nie jest problemem dla żadnego edytora ale zawsze można niechcący wprowadzić jakiś błąd przez takie zamiany. W przypadku stosowania się do reguły DRY (don't repeat yourself) zmiana byłaby wymagana tylko w jednym miejscu, kod byłby czytelniejszy i znacznie krótszy. Po prostu myślałem, że chciałeś się czegoś nauczyć, ale widać myliłem się.
Kurs Linuksa: for i in $(ls /bin); do man $i; done
__________________
http://beluosus.pl/
Awatar użytkownika
Skotar
Piegowaty Guziec
Piegowaty Guziec
Posty: 12
Rejestracja: 07 sie 2010, 16:54
Płeć: Mężczyzna
Wersja Ubuntu: 10.04
Środowisko graficzne: GNOME
Architektura: x86_64
Kontakt:

Odp: [C++] Gamma regulator

Post autor: Skotar »

beluosus pisze:Po prostu myślałem, że chciałeś się czegoś nauczyć, ale widać myliłem się.
Ja tylko napisałem, że nie ma sensu zmieniać tego w programie, bo działa jak należy i mam już utworzoną paczkę deb i źródło.
Wszystkie wasze wypowiedzi biorę sobie do serca, łącznie z Twoją ostatnią :).
ODPOWIEDZ

Wróć do „Programowanie”

Kto jest online

Użytkownicy przeglądający to forum: Obecnie na forum nie ma żadnego zarejestrowanego użytkownika i 12 gości