2016-07-16 5 views
2

처음 포스터; 스택 오버플로 천사의 오랜 시간 추종자.판고 스팬 텍스트의 새로운 상징적 인 색

Pango가 제어하는 ​​스팬 텍스트의 색상에 문제가 있습니다.

긴 버전 :
내가 GTK, (습지가 쓴) XML와 C++ 코드를 내장이있는 오래된 UI 프로그램을 통해 업데이트하고 그래픽을 핸들링 RC 스타일 시트. 색이 지정된 마크 업 텍스트 중 일부는 XML에 하드 코딩되어 있습니다. 일부는 동적으로 C++ 코드로 설정됩니다. 문제는 프로그램이 이전 시스템에서 실행될 때 스팬 텍스트로 '녹색'으로 참조되는 색상이 # 00FF00으로 표시된다는 것입니다. 우리의 최신 시스템에서는 '녹색'이 # 008000으로 표시됩니다. 라벨 위젯 코드를 인쇄 예 :

gtk_label_set_markup((GtkLabel *) TitleBarLabel, "<span color='green'>Orbital Cannon Positioning</span>"); 

나는 Pango가이 범위 텍스트 마크 업의 제어에 있음을 확신한다. 녹색의 차이점은 X11과 W3C 색상 목록 (https://en.wikipedia.org/wiki/X11_color_names#Clashes_between_web_and_X11_colors)의 차이점입니다. 우리의 오래된 시스템은 X11을 사용하고 있고 새로운 시스템은 W3C를 사용하고있는 것으로 보입니다.


난 그냥 '#의 00FF00'와 '녹색'의 모든 인스턴스를 대체 할 수 있지만, 우리가 미래의 색상을 변경하고자한다면, 우리는 다시 모든 것을 통과해야 할 것이다. 차라리 코드에 구운 대신 스타일 시트를 통해 색상을 변경할 수 있어야합니다.

C++ 코드 : 나는 gtk_widget_modify_text()를 실행시에 GdkColor를 생성하고 설정 파일에서 값을 gdk_color_parse하고 사용할 수 있습니다

GtkWidget * TitleBarLabel; 
    TitleBarLabel = GTK_WIDGET (get_builder_object (builder, "TitleBarLabel")); 
    gtk_label_set_markup((GtkLabel *) TitleBarLabel, "<span color='#00FF00'>Death Ray Power Status</span>"); 

레이블 위젯에 색상을 적용합니다 . 그러나 XML의 모든 하드 코딩 된 텍스트에 대해서는 작동하지 않습니다. 또한, 우리는 텍스트의 비트가 같은 줄 안에서 다르게 색칠 된 레이블을 가지고 있습니다.

C++ 코드 :

GdkColor pass_color; 
    gdk_color_parse("#00FF00", &pass_color); 

    gtk_widget_modify_text(TitleBarLabel, GTK_STATE_NORMAL, &pass_color); 

내가 각 색상에 대한 내 RC 파일에 스타일을하고 런타임에 해당 색상을 사용 모든 단일 레이블을 연결할 수 있습니다. 그러나 우리는 모든 마크 업 색소를 제거하고 전에는 신경 쓰지 않았던 위젯을 잡아내는 많은 코드를 추가하고 새로운 스팬 텍스트로 인쇄하는 대신 위젯의 이름을 설정하는 코드를 추가해야했습니다. 스타일 시트에서 색상을 바꿀 수 있기를 원하는 결과를 얻지 만 엄청난 작업이며 색상 속성 사용에 익숙한 베테랑 엔지니어에게는 직관적이지 않습니다.

RC 파일 :

style "pass_color" 
    { 
     fg[NORMAL] = #00FF00 
    } 
    widget "*TitleBarLabel_Pass" style "pass_color" 

C++ 코드 :

gtk_widget_set_name(TitleBarLabel, "TitleBarLabel_Pass"); 

짧은 버전 : 이상적으로
, 나는 런에서 새 색상을 만들 수 있도록하고 싶습니다 그러한 파벌의 스팬 텍스트와 연결할 수있는 시간 :

,363,210
<span color='MyNewColor'>Weather Manipulation Settings</span> 

또는 어쩌면 같은 특정 속성을 적용 새 태그 생성 :

<span><MyNewColor>Shark Tank pH Balance</MyNewColor></span> 

을하지만 그 가능성이 의심한다.

나는 pango_attr_type_register(), pango_attr_foreground_new() 및 친구들과 놀기를 시도했지만, 내가 생각한 것조차도 할 수 있다면 어떻게 특성이 작동하는지 알 수 없었다. 많은 연구 끝에 '속성'은 단일 텍스트 문자열에 대한 일회성 설정처럼 보입니다. 그리고 내가 원했던 것처럼 스팬 텍스트에 맞춰 호출 할 수있는 새로운 가치는 아닙니다.

Pango를 모두 재건하지 않고도 원격으로 가능합니까?
설치와 같은 스타일 시트를 얻을 수있는 다른 해결 방법이 있습니까?
이 시점에서, 나는 제안에 열려 있습니다.

버전 사양 :보기
컴퓨터 녹색 # 00FF00
OS로 리눅스 슬랙웨어 13.37 및
GTK 아래 : 2.24.4
Pango가 : 1.28.4 녹색으로 # 008000
을 보여주는

컴퓨터 OS : 리눅스 슬랙웨어 14.1
GTK : 2.24.20
Pango가 : 1.34.1 당신이 경우

답변

0

GTK 3.x를 사용할 수 있기 때문에 CSS를 사용하는 것이 훨씬 쉬운 방법이라고 제안 할 것입니다. 심지어 어색하지만 동일한 라벨의 여러 지역에 대해 여러 CSS 스타일을 사용하는 방법조차 있습니다. GTK 2에서

, 당신이 언급 한 바와 같이, 당신은 당신의 RC 파일에 자신의 name 속성에 위젯을 참조 할 수 있습니다 :

widget "shark-tank-ph-label" style "green-text" 
style "green-text" { 
    text[NORMAL] = #008000 
} 

나는 그것은 당신이하는 데 사용하는지 아닌 경우에도이 방법을 가지고 추천 할 것입니다. 한 번 리팩터링하여 레이블에서 하드 코드 된 색상을 제거하면 다음 번에 이와 같이 변경해야 할 때 훨씬 쉽게 작업 할 수 있으며 GTK 3.x에서 작동하는 방식에 가까운 코드를 만들 수 있습니다. 미래에.

관련 문제