חלונות נתקעים אחרי שדרוג גירסת אובונטו+GLADE

כרמית ש1

New member
חלונות נתקעים אחרי שדרוג גירסת אובונטו+GLADE

שלום,
אני מפתחת אפליקציה על מכשיר בסביבת אובונטו 10.4. עושה שימוש ב - GLADE 3.6.7
אנו מתחילים לעבוד עם מכשיר חדש עליו מותקן אובונטו 12.4.
התקנתי את ה GLADE. הותקנה אוטומטית גירסה 3.8.0.
באפליקציה שלי יש שימוש בחלונות רבים אשר מוגדר להם ב WINDOW TYPE: TOP LEVEL.
כעת במכשיר החדש החלונות לא מתפקדים טוב, ופתיחת חלון מעל חלון "תוקעת" את האפליקציה.
בנסיונות שביצעתי ראיתי כי שינוי ה WINDOW TYPE מ TOP LEVEL ל POPUP כן מעביר מחלון לחלון מבלי להתקע.
הגדרת החלונות כ POPUP עדיין לא תקינה, כי כשפותחים עוד חלון שמוגדר כך (מתוך חלון שגם מוגדר popup) - הוא עדיין לא נפתח.
שאלותיי:
1) קראתי שחלונות אמורים להיות מוגדרים TOP LEVEL. למה זה פתאום לא עובד? מה המשמעות של הגדרתם כ POPUP?
2) איך ייתכן ששדרוג מערכת/תוכנה למתקדמת יותר פוגע במה שקיים מגירסה נמוכה יותר?
3) האם מישהו מבין למה זה קורה? ומה ניתן לעשות בכדי שיחזור לעבוד תקין?
תודה רבה!
 

BravoMan

Active member
השאלה שלך מתאימה יותר לפורום תכנות, אם כי אני לא יודע

כמה אנשים בישראל באמת עובדים עם GTK.
&nbsp
חשוב להבין שהבעיה אינה GLADE. הוא רק כלי עיצוב שבסוף מפיק XML שהקוד טוען.
אחד ההבדלים בין גרסאות המערכת הוא שגם ספריית GTK עודכנה וייתכן שהיה שינוי בהתנהגות, או ייתכן שיש בעיה במקום אחר בקוד.
&nbsp
בלי לראות את הקוד כמעת בלטי אפשרי לעלות על הבעיה, אבל אחד הדברים שאת יכולה לעשות זה לנסות לחפש ב-release notes של GTK אם מוזכר משהו כזה.
&nbsp
קחי בחשבון, שייתכן שזו אפילו לא בעיה של GTK, אלא של threading או משהו אחר. ייתכן שזה באג שכבר היה, אך לא נחשף עקב נסיבות אחרות. כאמור, מהמעט מידע שמסרת, קשה מאוד עד בלטי אפשרי לדעת.
 

כרמית ש1

New member
האם יש אפשרות להתקין את ה GLADE הישן יותר?

באופן אוטומטי הוא מתקין את הגירסה החדשה... איך ניתן להתקין את הגירסה הישנה יותר?
תודה!
 

BravoMan

Active member
אפשר להתקין גרסה ישנה, אבל זה לא ישנה שום דבר!

שוב - את חייבת להבין: Glade הוא בסה"כ כלי נוח שכל מה שהוא עושה זה לייצר קובץ XML.
הוא לא קשור בשום צורה ישירה לקוד של היישום שלך, וזה לא משנה איזו גרסה שלו תתקיני.

מה שצריך זה לא להחליף GLADE.
מה שצריך זה לדבג את הקוד ולראות מה בדיוק ואיפה נתקע.

ואם בכל זאת חפצה נפשך ב-GLADE ישן, אפשר למצוא את החבילה כאן:
https://launchpad.net/ubuntu/karmic/i386/glade/3.6.7-1ubuntu1
 

כרמית ש1

New member
גירסת GTK עודכנה

גירסת ה -GTK אכן עודכנה מ - 2.20.1 ל- 2.24.10.
ניסיתי לבדוק את השינויים בין הגירסאות, אבל לא נתקלתי במשהו רלוונטי עבור המקרה שאצלי.
האם יש אפשרות לנסות ולהחזיר את הגירסה ל 2.20.1? איך ניתן לעשות זאת?
תודה רבה!
 

BravoMan

Active member
יש אפשרות, היא לא פשוטה, ובכל מקרה זה לא הכיוון.

אם הקוד שלך לא שורד שינוי מינורי של גרסת GTK, סימן שהקוד דפוק. סליחה שאני כ"כ בוטה, אבל אין דרך נחמדה לומר זאת.
אי אפשר לדעת למה בלי לראות אותו.
&nbsp
אולי השתמשו בפיצ'ר לא מתועד. אולי יש באג שלא נתגלה עד עכשיו בגלל צירוף של באג אחר שתוקן.
להתחיל לשנמך ספריית ליבה כמו GTK בגלל יישום לקוח דפוק זו לא שיטת עבודה.
&nbsp
מה תעשו עם עדכוני אבטחה? מה אם יישומים אחרים של הלקוח?
בכל אופן, תצטרכי פשוט לאתר את כל החבילות של GTK והתלויות (לא בטוח כמה כאלה יש), למצוא גרסאות ישנות שלהם, כנראה באותו מקום בו מצאתי לך Glade ישן, ולהחליף את החבילות.
&nbsp
להערכתי, כבר יותר פשוט להתקין גרסה ישנה יותר של המערכת הפעלה על המכשיר המדובר...
 

כרמית ש1

New member
צירוף הקוד לדוגמה

מצרפת קוד והסבר:
עשיתי דוגמה קטנה לנסות להמחיש את הבעיה שקיימת אצלי...
ישנו GLADE ובו 2 מסכים מוגדרים.
על window1 כפתור אחד שאמור להציג את window2.
על window2 שני כפתורים. האחד אמור לחזור ל window1 והשני לצאת לגמרי. מציינת שהמסכים אמורים להפתח אחד מעל השני (ולא לבצע hide בכל פעם למסך הראשון).

הבעייה: על אובונטו 10.04 + GTK גירסה 2.20.1 עובד תקין.
על אובונקו 12.04 + GTK גירסה 2.24.10 עובד לא תקין. נשאר תקוע ב window1 ולא עובר ל window2.

הקוד:
#include <gtk/gtk.h>
#include <glade/glade.h>

static void close_window2();
static void start_window2();
static void closeApp();

static GladeXML *main_window;
static GtkWidget *Window1;
static GtkWidget *Window2;
static GtkWidget *btn1;
static GtkWidget *btn2, *btnExit;
static GtkWidget *fix1, *fix2;

int main(int argc, char *argv[])
{
gtk_init(&argc, &argv);
main_window = glade_xml_new ("myGlade.glade", NULL, NULL);
/* main window - window1 */
Window1 = glade_xml_get_widget (main_window, "Window1");
fix1 = glade_xml_get_widget (main_window, "fix1");
btn1 = glade_xml_get_widget (main_window, "btn1");
gtk_button_set_label(GTK_BUTTON(btn1), "BUTTON1");
g_signal_connect_swapped (G_OBJECT (btn1), "clicked", G_CALLBACK (start_window2), NULL);

/* second window - window2 */
Window2 = glade_xml_get_widget (main_window, "Window2");
fix2 = glade_xml_get_widget (main_window, "fix2");
btn2 = glade_xml_get_widget (main_window, "btn2");
btnExit = glade_xml_get_widget (main_window, "btnExit");
gtk_button_set_label(GTK_BUTTON(btn2),"BUTTON2");
gtk_button_set_label(GTK_BUTTON(btnExit), "EXIT");
g_signal_connect_swapped (G_OBJECT (btn2), "clicked", G_CALLBACK (close_window2), NULL);
g_signal_connect_swapped (G_OBJECT (btnExit), "clicked", G_CALLBACK (closeApp), NULL);

gtk_widget_show_all(Window1);
gtk_widget_hide_all(Window2);
gtk_main();
return 0;
}

static void start_window2()
{
gtk_widget_show_all(Window2);
}

static void close_window2()
{
gtk_widget_hide_all(Window2);
}

static void closeApp()
{
gtk_main_quit();
}

אשמח לתובנות...

תודה רבה!
 

BravoMan

Active member
תוכלי בבקשה לצרף את קובץ

myGlade.glade שהדוגמה משתמש בו?
פשוט שני את הסיומת ל-txt כדי שתפוז לא יתלונן.
 

כרמית ש1

New member
הקובץ GLADE

תודה רבה!!
צרפתי את הקובץ (סיומת TXT).

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

BravoMan

Active member
בדקתי את הקוד לדוגמה שהבאת

ואני לא מצליח לשחזר את התקלה שאתה מדברת עליה.
אפילו הקמתי מכונה ווירטואלית עם Ubuntu 12.4 32 bit ובניתי את הקוד עליה.
&nbsp
אכן מופיעים 2 חלונות, ואין שום בעיה להחליף בניהם בלחיצת כפתור פעמים רבות או לצאת מהתוכנה.
&nbsp
צריך לשים לב רק, שהחלונות מופיעים אחד מעל השני (כי ככה הגדרת אותם) ובגלל ששניהם באותו גודל, זה נראה כאילו רק הכפתורים מתחלפים.
בנוסף, כל עוד החלון השני קיים, החלון הראשון תמיד יהיה מתחתיו. ניתן להזיז חלונות ב-Ubuntu גם ללא מסגרת ע"י החזקת מקש Alt לחוץ וגרירה מכל מקום בחלון.
&nbsp
האם אצלך הקוד הספציפי שפרסמת יוצר את הבעיה שתיארת?
מה הם הפרמטרים איתם את מקמפלת את הקוד?
האם את מריצה את התוכנה עם פרמטרים כלשהם?
האם המערכת אצלך היא בגרסת 32 או 64 bit? את יכולה להדביק פה את הפלט של uname -a?
 

כרמית ש1

New member
תשובות...

אצלי הקוד הספציפי שנתתי יוצר את הבעייה שתיארתי.
המערכת אצלי עכשיו בגירסת 64 ביט (על אובונטו 10.04 32 ביט זה עבד. עכשיו יש לי אובונטו 12.04 64 ביט).
uname -a נותן:
Linux morpheos 3.13.0-55-generic #94~precisel -Ubuntu SMP Thu Jun 18 09:53:13 UTC 2015 x86_64 x86_64 x86_64 GNU/Linux
פקודות הקומפילציה שאני מבצעת:
1)
gcc -Wall -c screen.c `pkg-config --cflags --libs libglade-2.0 gtk+2-2.0
gthread-2.0
2)
gcc -lrt screen.o `pkg-config --cflags --libs libglade-2.0` -o screen

כפי שכבר ציינתי ישנן 2 דרכים ש"פותרות" את הבעייה. אולי זה ייתן רמז כלשהו לבעיה...
1) במידה ואני משנה בהגדרות ב- glade אפילו פיקסל אחד (במקום 800X600 רושמת 799X600) - הכל עובד תקין. (רזולוציית המכשיר 800X600).
2) במידה ואני משנה בהגדרות ב- glade בשדה Type hint במקום Normal בוחרת Dialog - הכל עובד תקין.

יש לך איזו הערכה למה השינויים האלה "מתקנים" את התוכנית?
תודה רבה על כל העזרה!!!!
 

BravoMan

Active member
מעניין:

כששיניתי את הרזולוציה במכונה הווירטואלית ל-800x600 התחילה תופעה שהיא כנראה הבאג שלך:
התוכנה אומנם לא נתקעת, אבל החלון השני מופיע תמיד מתחת לחלון הראשון.
גם מעבר עם Alt+Tab לא מצליח להביא את החלון השני קדימה, רק אם עוברים ליישום אחר ואז בוחרים ידנית את החלון השני אפשר להגיע אליו.

אני חושב שהבעיה כאן היא לא ב-GTK, אלא במנהל חלונות (window manager) שהשתנה בין שתי גרסאות מערכת הפעלה.
ב-Ubuntu 10.4 עוד השתמשו בשולחן עבודה Gnome בעוד שב-12.04 כבר עברו ל-Unitiy.

אני אל בטוח איך לפתור את זה, אבל אני מציע לך לחקור ולקרוא קצת על פונקציות ששולטות בסדר חלונות ב-GTK.
אני חושב שזה נקרא z-order.
להערכתי, כל מה שאת צריכה כדי לפתור את הבעיה, זה להכריח את החלון השני לעלות קדימה.

בכל מקרה, אף פעם אל תפחדי מ-workarounds בתוכנה.
אומנם היה נחמד אם לא היו בעיות בספריות מערכת, אבל לפעמים זה קורה, והחלפת ספריות כאלה אינה אופציה.

עולם התיכנות אינו עולם מושלם - רחוק מכך!
 

כרמית ש1

New member
נכון...

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

בכל מקרה, המון המון תודה על העזרה!!!!
בהחלט עזרת המון!
 
למעלה