ווטסאפ - לינוקס, BSD, קוד פתוח ותוכנה חופשית בעברית. Whatsup - Linux, BSD, open source and free software in Hebrew

 
 
  כניסת חברים · רישום · שכחתי סיסמה  
tux the penguin
תגובה לנושא
צפיה בנושא הבא Printable version התחבר כדי לבדוק הודעות פרטיות צפיה בנושא הקודם
shlomi-lלא בפורום כעת ת.הצטרפות: 04/05/2003 · הודעות: 1399 ·
 

הודעה פורסם: 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 באובונטו האחרון ולהריץ את השורה שבתחילת הקוד.
תגובות, מחשבות?

_________________
________________________________
http://shlomil.blogspot.com/
 
 צפיה בפרופיל המשתמש שלח הודעה פרטית ביקור באתר המפרסם MSN Messenger  
תגובה  עם ציטוט חזרה למעלה
חזרה לתוכן הדיון
קלמנטינה‏אורח · ·
 

הודעה פורסם: 16/11/2011 - 06:18
נושא ההודעה:

גם לי חסר הCTRL+SHIFT, לא הבנתי כלכך איך משתמשים בקוד והאם הוא עובד על כל שדות הטקסט באובונטו.
 
   
תגובה  עם ציטוט חזרה למעלה
חזרה לתוכן הדיון
הצגת הודעות מלפני:     
מעבר אל:  
כל הזמנים הם GMT + 2 שעות
תגובה לנושא
צפיה בנושא הבא Printable version התחבר כדי לבדוק הודעות פרטיות צפיה בנושא הקודם
PNphpBB2 © 2003-2004 

תוכן הדיון

  1. shlomi-l
  2. אורח [קלמנטינה‏]