שורה-חדשה (newLine) - פלאגין ל-Gaim

מאת אוהד לוצקי
 

הבעיה - ניצול תכונות הכיווניות של GTK

‏GTK מכיל, בגירסאותיו החדשות, תמיכה מובנית מצויינת בכיווניות (ימין/שמאל). הכיווניות של כל פסקה נקבעת ע"י האות האלפבתית הראשונה בה. האלגוריתם פועל היטב, וממקם את הנקודות וסימני הפיסוק כמו שצריך. (בניגוד ליישור פשוט)

בברירת מחדל, Gaim - תוכנת מסרים מיידיים מוכרת - ממקמת את שם המשתמש בתחילת כל הודעה שהוא שולח. מאחר ושמות משתמש ברשתות המסרים נוטים להיות באנגלית, לא נדיר לראות את המצב הבא:

הפתרון המתבקש, אם כן - לשבור את השורה בין שם המשתמש להודעה.

כתיבה וקומפילציה של פלאגין ל-Gaim

מומלץ להתקין את החבילות doxygen ו-graphviz, ולהוריד את קוד המקור של gaim. נפרוש אותו בצורה הרגילה, ונריץ את הפקודות הבאות:

$ tar -jxf gaim-src-1.3.1.tar.bz2
$ cd gaim-src-1.3.1/
$ ./configure
$ make docs

השורה האחרונה תיצור באמצעות doxygen ו-graphviz את תוכן התיקייה doc/html, שתכיל דוקומנטציה מלאה על ה-API של Gaim. שלב זה אינו הכרחי, כמובן.

התיקייה plugins מכילה דוגמאות ל-plugins, כולל את אלו שמופצים בברירת מחדל עם gaim, וגם קובץ Makefile שמשמש לקומפילציה של plugins. כדי לקמפל את הפלאגין newline, יש למקמו בתיקייה זו ואז להריץ את הפקודה הבאה:

$ make newline.so

לאחר מכן ניתן למקם את הפלאגין המקומפל בתיקיית המשתמש ‎~/.gaim/plugins‏ או בתיקיית המערכת ‎/usr/lib/gaim לשימוש כל המשתמשים.

newline - מעבר מלא ומפורט על קוד המקור

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

/*
 * newline plugin for gaim
 * version 0.2
 *
 * ... (GPL notice) ...
 *
 */

#include "internal.h"
#include "conversation.h"
#include "plugin.h"
#include "version.h"

הפונקציה הבאה עושה את כל המלאכה. היא מקבלת את ההודעה (מלל ההודעה עצמו, ללא שם המשתמש או עיצוב), ומוסיפה בהתחלתה את סימן ה-HTML שמוסיף שורה, <br>. שימו לב שהפונקציה יוצרת עותק חדש של ההודעה ומשחררת את הישן - זאת ע"פ דרישה שמצויינת ב-API.

static gboolean add_msg_newline(GaimAccount *account, GaimConversation *conv,
                                char **message)
{
	char * newmsg = NULL;
	newmsg = g_strdup_printf("<br>%s", *message);
	free(*message);
	*message = newmsg;

	return FALSE;
}

הפונקציה הבאה נקראת בעת טעינת הפלאגין. היא משתמשת ב-API של Gaim כדי להפעיל את פונקציית שבירת-השורה שלנו בשתי הזדמנויות: כשמציגים הודעה שאנחנו שלחנו, וכשמציגים הודעה שקיבלנו. האירועים displaying-im-msg ו-receiving-im-msg מופעלים בשלב העיבוד המוקדם של ההודעה, לפני שהיא מעוצבת לתצוגה על המסך.

static gboolean plugin_load(GaimPlugin *plugin)
{
	void *conv_handle = gaim_conversations_get_handle();

	gaim_signal_connect(conv_handle, "displaying-im-msg", plugin,
                            GAIM_CALLBACK(add_msg_newline), NULL);
	gaim_signal_connect(conv_handle, "receiving-im-msg", plugin,
                            GAIM_CALLBACK(add_msg_newline), NULL);

	return TRUE;
}

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

static gboolean plugin_unload(GaimPlugin *plugin)
{
	void *conv_handle = gaim_conversations_get_handle();

	gaim_signal_disconnect(conv_handle, "displaying-chat-msg", plugin,
                               GAIM_CALLBACK(add_msg_newline));
	gaim_signal_disconnect(conv_handle, "receiving-chat-msg", plugin,
                               GAIM_CALLBACK(add_msg_newline));

	return TRUE;
}

הבלוק הבא מכיל אינפורמציה נחוצה על הפלאגין.

static GaimPluginInfo info =
{
	GAIM_PLUGIN_MAGIC,
	GAIM_MAJOR_VERSION,
	GAIM_MINOR_VERSION,
	GAIM_PLUGIN_STANDARD,                             /**< type           */
        NULL,                                             /**< ui_requirement */
	0,                                                /**< flags          */
	NULL,                                             /**< dependencies   */
	GAIM_PRIORITY_DEFAULT,                            /**< priority       */

	NULL,                                             /**< id             */
	N_("Newline"),                                    /**< name           */
	"0.2",                                            /**< version        */
	                                                  /**  summary        */
	N_("Adds a newline before messages."),
	                                                  /**  description    */
	N_("Adds a newline before messages, for better bidi compatibility."),
	"Ohad Lutzky <ohad_l@yahoo.com>",                 /**< author         */
	"http://lutzky.homelinux.net/~tactless",          /**< homepage       */

	plugin_load,                                      /**< load           */
	plugin_unload,                                    /**< unload         */
	NULL,                                             /**< destroy        */

	NULL,                                             /**< ui_info        */
	NULL,                                             /**< extra_info     */
	NULL,
	NULL
};

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

static void
init_plugin(GaimPlugin *plugin)
{
}

ולאחר מאקרו קסום של Gaim, סיימנו את כתיבת הפלאגין.

GAIM_INIT_PLUGIN(simple, init_plugin, info)

הערות

Creative Commons License All content on this website (including text, photographs, audio files, and any other original works), unless otherwise noted, is licensed under a Creative Commons License.