הכי קל זה להתעסק בQA בלינוקס. המערכת יציבה מידי, כתוצאה מיכך משתעממים ועוברים לגרסה יציבה יותר או בכלל הפצה חדשה. אני מניח שאני לא היחיד שנמצא במעגל זה.

אתמול החלטתי להכיר בעובדה שאני מתכנת ואני יכול לעשות עוד דברים מאשר לדווח באגים שגרמתי לעצמי, והחלטתי לעזור ללינוקס (או יותר נכון גנום) לראות טובה יותר. ולכן המטרה הראשונה שיש לתקוף היא Glade.

Glade הוא ספרייה וגם תוכנה ליצירת ממשקים, ולכן רוב התוכנות מוגבלות למה שהיא יכולה לאפשר. לכן כפרוייקט ראשון אני רוצה להוסיף לה תמיכה ב"חלונות בצורות מיוחדות", שתחתוך את החלון לפי תמונה.

אחד הייתרונות של קוד פתוח הוא שאפשר להיכנס לתוך תוכנה קיימת ולהבין איך מימשו חלקים בתוכה, לכן הורדתי את הקוד של תוכנה שעושה זאת, cairo-clock, ואחרי זמן לא רב הבנתי שזה בעצם חיסרון בגלל כמות הקוד הרבה. חיפוש בגוגל הביא אותי לתוכנית לדוגמה של השעון שאיפשרה להבין אותו טוב יותר. כל מה שצריך כדי לעשות חלון בצורה מסויימת הוא להפוך לשקוף את החלקים ה"מיותרים" ואז למסור לו מידע על המיקומים של אותם חלקים שקופים שיידע להעביר את הקלט של העכבר לחלונות שנמצאים מאחוריו.

בשלב זה התחלתי לשנות את הקוד שיפתח קובץ תמונה ויעצב את החלון על פיה. תהליך זה לקח זמן רב בגלל שמפתחי הGTK כנראה לא ממש מרוצים מהAPI שהם יצרו וכבר נתקלתי בכמה גרסאות של פונקציות מיושנות.

השלבים שעשיתי הם:

– הפיכת החלון לשקוף:

#Get a cairo context
cr = widget.window.cairo_create()

#Make the window transparent
cr.set_source_rgba(1.0, 1.0, 1.0, 0.0) # HERE
cr.set_operator(cairo.OPERATOR_SOURCE)
cr.paint()

טעינת קובץ התמונה:

pix,mask = gtk.gdk.pixmap_create_from_xpm(widget.get_window(), None, './a.xpm')

ציור התמונה בחלון:

img = gtk.Image()
img.set_from_pixmap(pix, mask)
img.show()
widget.add(img)

ו"חתיכת" התמונה:

#Once everything has been drawn, create our XShape mask
win.input_shape_combine_mask(mask, 0, 0)

השלבים הבאים כנראה יהיו:

  • שימוש בSVG והפיכתו לPIXMAP
  • חפירה בספריה של GLADE לראות איך מרחיבים אותו ותומכים בעוד דברים
  • להתמודד עם בעיות מוזרות ורבות ששפת C תציע (זה בטח יהיה השלב הארוך ביותר)
  • חפירה בתוכנה לראות איך משלבים את התכונות החדשות בה.

כל זה ייקח המון זמן, מי שרוצה להצטרף שיהיו תוכנות שיראו טוב בלינוקס, מוזמן לעזור.

הפרוייקט הבא שלי אם אצליח לשרוד את הנוכחי הוא כנראה יהיה פתרון ה"באג" הזה.