|
|
|
|
פורסם: 15/11/2011 - 00:14
נושא ההודעה: קביעת כיווניות טקסט בגנום,או "איפה ה ctrl+shift שלי?
|
בהינתן המצב הנוכחי והעובדה שאין ברירה אלא לנסות למצוא פשרה בין הצורך של אנשים לקבוע כיווניות בקלות לבין הרצון של אנשי גנום שהכל יעבוד עם תוי בקרת כיוון של יוניקוד, כתבתי את קטע הקוד הבא שמתאר איך אולי זה יכול לעבוד:
קוד: |
//valac --pkg gtk+-3.0 dir_demo.vala
using Gtk;
const string RLM = "\xE2\x80\x8F";
const string LRM = "\xE2\x80\x8E";
int main (string[] args) {
//boring stuff
Gtk.init (ref args);
var window = new Window ();
window.title = "Set Text Direction Demo";
window.border_width = 10;
window.window_position = WindowPosition.CENTER;
window.set_default_size (350, 270);
window.destroy.connect (Gtk.main_quit);
var entry = new Entry();
var tv = new TextView();
tv.editable = true;
tv.cursor_visible = true;
var scroll = new ScrolledWindow (null, null);
scroll.set_policy (PolicyType.AUTOMATIC, PolicyType.AUTOMATIC);
scroll.add (tv);
//dealing with entry:
// 1. Remove leading LRM if exists
// 2. Add RLM but only if it's really needed
// The idea is to keep relying on GNOME's auto detection and make
// it possible to override using a simple keyboard shortcut while
// minimizing the use of invisible marks.
var entry_set_right_button = new Button.with_label ("right ctrl+shift");
entry_set_right_button.clicked.connect (() => {
if(entry.text.has_prefix(LRM) )
entry.buffer.delete_text(0, 1);
if(Pango.find_base_dir(entry.text, entry.text.length) != Pango.Direction.RTL)
entry.buffer.insert_text(0,RLM.data[0:1]);
});
var entry_set_left_button = new Button.with_label ("left ctrl+shift");
entry_set_left_button.clicked.connect (() => {
if(entry.text.has_prefix(RLM))
entry.buffer.delete_text(0, 1);
if(Pango.find_base_dir(entry.text, entry.text.length) != Pango.Direction.LTR)
entry.buffer.insert_text(0,LRM.data[0:1]);
});
//Handling a GtkTextView:
// 1. get selection/cursor lines
// 2. for each line add RLM/LRM only if needed while removing opposite marks
var tv_set_right_button = new Button.with_label("right ctrl+shift in TextView");
tv_set_right_button.clicked.connect ( ()=> {
var ins = tv.buffer.get_insert();
var sel = tv.buffer.get_selection_bound();
TextIter iter;
tv.buffer.get_iter_at_mark(out iter, ins);
int start_line = iter.get_line();
tv.buffer.get_iter_at_mark(out iter, sel);
int end_line = iter.get_line();
if(start_line > end_line)
{
int tmp = start_line;
start_line = end_line;
end_line = tmp;
}
for(int line=start_line; line<=end_line; line++)
{
TextIter line_start_iter;
TextIter line_end_iter;
tv.buffer.get_iter_at_line(out line_start_iter, line);
line_end_iter = line_start_iter;
line_end_iter.forward_to_line_end();
string line_str = line_start_iter.get_text(line_end_iter);
if(line_str.has_prefix(LRM))
{
TextIter dir_char_iter = line_start_iter;
dir_char_iter.forward_char();
tv.buffer.delete(line_start_iter, dir_char_iter);
tv.buffer.get_iter_at_line(out line_start_iter, line);
line_str = line_str.substring(3);
}
if(Pango.find_base_dir(line_str, line_str.length) != Pango.Direction.RTL)
tv.buffer.insert(line_start_iter, RLM, RLM.length);
}
});
var tv_set_left_button = new Button.with_label("left ctrl+shift in TextView");
tv_set_left_button.clicked.connect ( ()=> {
var ins = tv.buffer.get_insert();
var sel = tv.buffer.get_selection_bound();
TextIter iter;
tv.buffer.get_iter_at_mark(out iter, ins);
int start_line = iter.get_line();
tv.buffer.get_iter_at_mark(out iter, sel);
int end_line = iter.get_line();
if(start_line > end_line)
{
int tmp = start_line;
start_line = end_line;
end_line = tmp;
}
for(int line=start_line; line<=end_line; line++)
{
TextIter line_start_iter;
TextIter line_end_iter;
tv.buffer.get_iter_at_line(out line_start_iter, line);
line_end_iter = line_start_iter;
line_end_iter.forward_to_line_end();
string line_str = line_start_iter.get_text(line_end_iter);
if(line_str.has_prefix(RLM))
{
TextIter dir_char_iter = line_start_iter;
dir_char_iter.forward_char();
tv.buffer.delete(line_start_iter, dir_char_iter);
tv.buffer.get_iter_at_line(out line_start_iter, line);
line_str = line_str.substring(3);
}
if(Pango.find_base_dir(line_str, line_str.length) != Pango.Direction.LTR)
tv.buffer.insert(line_start_iter, LRM, LRM.length);
}
});
// more boring stuff
var vbox = new Box (Orientation.VERTICAL, 5);
var hbox1 = new Box (Orientation.HORIZONTAL, 5);
hbox1.homogeneous = true;
hbox1.add (entry_set_right_button);
hbox1.add (entry);
hbox1.add (entry_set_left_button);
vbox.add(hbox1);
vbox.pack_start(scroll, true, true, 0);
vbox.add(tv_set_right_button);
vbox.add(tv_set_left_button);
window.add (vbox);
window.show_all ();
Gtk.main ();
return 0;
}
|
כדי לקמפל צריך להתקין את valac ואת libgtk-3-dev באובונטו האחרון ולהריץ את השורה שבתחילת הקוד.
תגובות, מחשבות?
|
|
חזרה לתוכן הדיון |
פורסם: 16/11/2011 - 06:18
נושא ההודעה:
|
גם לי חסר הCTRL+SHIFT, לא הבנתי כלכך איך משתמשים בקוד והאם הוא עובד על כל שדות הטקסט באובונטו.
|
|
חזרה לתוכן הדיון |
|
|
|
|