aboutsummaryrefslogtreecommitdiff
path: root/deskutils/fusenshi
diff options
context:
space:
mode:
authorDaichi GOTO <daichi@FreeBSD.org>2004-11-22 12:23:21 +0000
committerDaichi GOTO <daichi@FreeBSD.org>2004-11-22 12:23:21 +0000
commit3a77fd9d734b68fa1acebf237ee30cd9d1d5484e (patch)
tree8172dcd0c9add75d87247c7e74def51fcad8dd59 /deskutils/fusenshi
parentde71f8240c3c4c5d533f7154cf288d50d4fb90b8 (diff)
downloadports-3a77fd9d734b68fa1acebf237ee30cd9d1d5484e.tar.gz
ports-3a77fd9d734b68fa1acebf237ee30cd9d1d5484e.zip
Add patch file for bugfix and.
Submitted by: Masanori OZAWA (ozawa@ongs.co.jp)
Notes
Notes: svn path=/head/; revision=122135
Diffstat (limited to 'deskutils/fusenshi')
-rw-r--r--deskutils/fusenshi/Makefile2
-rw-r--r--deskutils/fusenshi/files/patch-aa2852
2 files changed, 2853 insertions, 1 deletions
diff --git a/deskutils/fusenshi/Makefile b/deskutils/fusenshi/Makefile
index 85ee15ec30ea..776ffc92bd97 100644
--- a/deskutils/fusenshi/Makefile
+++ b/deskutils/fusenshi/Makefile
@@ -7,7 +7,7 @@
PORTNAME= fusenshi
PORTVERSION= 0.7.0
-PORTREVISION= 1
+PORTREVISION= 2
CATEGORIES= deskutils
MASTER_SITES= http://www.ongs.co.jp/projects/fusenshi/
DISTNAME= ${PORTNAME}-${PORTVERSION}
diff --git a/deskutils/fusenshi/files/patch-aa b/deskutils/fusenshi/files/patch-aa
new file mode 100644
index 000000000000..43012defe165
--- /dev/null
+++ b/deskutils/fusenshi/files/patch-aa
@@ -0,0 +1,2852 @@
+diff -urN po/ja.po po/ja.po
+--- po/ja.po Thu Apr 1 17:51:53 2004
++++ po/ja.po Fri Nov 5 17:38:51 2004
+@@ -7,7 +7,7 @@
+ msgstr ""
+ "Project-Id-Version: 0.7\n"
+ "Report-Msgid-Bugs-To: \n"
+-"POT-Creation-Date: 2004-03-31 17:41+0900\n"
++"POT-Creation-Date: 2004-11-05 17:38+0900\n"
+ "PO-Revision-Date: 2004-03-07 15:34+JST\n"
+ "Last-Translator: Masanori OZAWA <ozawa@ongs.co.jp>\n"
+ "Language-Team: japanese <info@ongs.co.jp>\n"
+@@ -15,176 +15,197 @@
+ "Content-Type: text/plain; charset=EUC-JP\n"
+ "Content-Transfer-Encoding: 8bit\n"
+
+-#: ../src/fio/fioservice.cpp:472
++#: ../src/fio/fioservice.cpp:444
+ msgid "Can't create print file."
+ msgstr "印刷用の一時ファイルが構築できません。"
+
+-#: ../src/fio/fioservice.cpp:476
++#: ../src/fio/fioservice.cpp:448
+ msgid "Can't write print file."
+ msgstr "印刷用の一時ファイルに書き込めません。"
+
+-#: ../src/wnd/fusenshieditdialog.cpp:49
++#: ../src/wnd/fusenshieditdialog.cpp:52
+ msgid "Fusenshi - Edit"
+ msgstr "付箋紙 - 編集"
+
+-#: ../src/wnd/fusenshieditdialog.cpp:70
++#: ../src/wnd/fusenshieditdialog.cpp:73
+ msgid "Text"
+ msgstr "テキスト"
+
+-#: ../src/wnd/fusenshieditdialog.cpp:72 ../src/wnd/fusenshimainwnd.cpp:120
++#: ../src/wnd/fusenshieditdialog.cpp:75 ../src/wnd/fusenshimainwnd.cpp:165
+ msgid "Property"
+ msgstr "プロパティ"
+
+-#: ../src/wnd/fusenshieditdialog.cpp:87 ../src/wnd/fusenshieditdialog.cpp:264
+-#: ../src/wnd/propertydialog.cpp:154 ../src/wnd/propertydialog.cpp:356
++#: ../src/wnd/fusenshieditdialog.cpp:90 ../src/wnd/fusenshieditdialog.cpp:258
++#: ../src/wnd/propertydialog.cpp:151 ../src/wnd/propertydialog.cpp:370
+ msgid "Background Color:"
+ msgstr "背景色:"
+
+-#: ../src/wnd/fusenshieditdialog.cpp:92 ../src/wnd/fusenshieditdialog.cpp:292
+-#: ../src/wnd/propertydialog.cpp:159 ../src/wnd/propertydialog.cpp:384
++#: ../src/wnd/fusenshieditdialog.cpp:95 ../src/wnd/fusenshieditdialog.cpp:282
++#: ../src/wnd/propertydialog.cpp:156 ../src/wnd/propertydialog.cpp:394
+ msgid "Foreground Color:"
+ msgstr "前景色:"
+
+-#: ../src/wnd/fusenshieditdialog.cpp:97 ../src/wnd/fusenshieditdialog.cpp:320
+-#: ../src/wnd/propertydialog.cpp:164 ../src/wnd/propertydialog.cpp:412
++#: ../src/wnd/fusenshieditdialog.cpp:100 ../src/wnd/fusenshieditdialog.cpp:306
++#: ../src/wnd/propertydialog.cpp:161 ../src/wnd/propertydialog.cpp:418
+ msgid "Font:"
+ msgstr "フォント:"
+
+-#: ../src/wnd/fusenshieditdialog.cpp:102 ../src/wnd/fusenshieditdialog.cpp:106
+-#: ../src/wnd/fusenshieditdialog.cpp:110 ../src/wnd/propertydialog.cpp:179
+-#: ../src/wnd/propertydialog.cpp:183 ../src/wnd/propertydialog.cpp:187
++#: ../src/wnd/fusenshieditdialog.cpp:105 ../src/wnd/fusenshieditdialog.cpp:109
++#: ../src/wnd/fusenshieditdialog.cpp:113 ../src/wnd/propertydialog.cpp:176
++#: ../src/wnd/propertydialog.cpp:180 ../src/wnd/propertydialog.cpp:184
+ msgid "Select..."
+ msgstr "選択..."
+
+-#: ../src/wnd/fusenshieditdialog.cpp:234 ../src/wnd/propertydialog.cpp:315
++#: ../src/wnd/fusenshieditdialog.cpp:228 ../src/wnd/propertydialog.cpp:328
+ msgid "Can't parse background color."
+ msgstr "背景色を取得できません。"
+
+-#: ../src/wnd/fusenshieditdialog.cpp:241 ../src/wnd/propertydialog.cpp:322
++#: ../src/wnd/fusenshieditdialog.cpp:235 ../src/wnd/propertydialog.cpp:335
+ msgid "Can't parse foreground color."
+ msgstr "前景色を取得できません。"
+
+-#: ../src/wnd/fusenshimainwnd.cpp:49
++#: ../src/wnd/fusenshimainwnd.cpp:54
+ msgid "Fusenshi Main Window"
+ msgstr "付箋紙 メインウィンドウ"
+
+-#: ../src/wnd/fusenshimainwnd.cpp:121
++#: ../src/wnd/fusenshimainwnd.cpp:164
++msgid "Raise windows"
++msgstr "最前面に表示"
++
++#: ../src/wnd/fusenshimainwnd.cpp:166
+ msgid "Quit"
+ msgstr "閉じる"
+
+-#: ../src/wnd/fusenshiwnd.cpp:71
++#: ../src/wnd/fusenshiwnd.cpp:74
+ msgid "Fusenshi"
+ msgstr "付箋紙"
+
+-#: ../src/wnd/fusenshiwnd.cpp:303
++#: ../src/wnd/fusenshiwnd.cpp:318
+ msgid "May I delete this note?"
+ msgstr "付箋紙を削除してよろしいですか?"
+
+-#: ../src/wnd/fusenshiwnd.cpp:392
++#: ../src/wnd/fusenshiwnd.cpp:407
+ msgid "Transmission of the sticky note went wrong.\n"
+ msgstr "付箋紙の送信に失敗しました。\n"
+
+-#: ../src/wnd/fusenshiwnd.cpp:407
++#: ../src/wnd/fusenshiwnd.cpp:422
+ msgid "Fusenshi - Print"
+ msgstr "付箋紙 - 印刷"
+
+-#: ../src/wnd/fusenshiwnd.cpp:410 ../src/wnd/propertydialog.cpp:169
++#: ../src/wnd/fusenshiwnd.cpp:425 ../src/wnd/propertydialog.cpp:166
+ msgid "Print command:"
+ msgstr "印刷コマンド:"
+
+-#: ../src/wnd/fusenshiwnd.cpp:411 ../src/wnd/propertydialog.cpp:174
++#: ../src/wnd/fusenshiwnd.cpp:426 ../src/wnd/propertydialog.cpp:171
+ msgid " %1: Exchange to print file."
+ msgstr " %1: 印刷ファイル名へ変換します。"
+
+-#: ../src/wnd/fusenshiwnd.cpp:440
++#: ../src/wnd/fusenshiwnd.cpp:455
+ msgid "Edit"
+ msgstr "編集"
+
+-#: ../src/wnd/fusenshiwnd.cpp:441
++#: ../src/wnd/fusenshiwnd.cpp:456
+ msgid "Send"
+ msgstr "送信"
+
+-#: ../src/wnd/fusenshiwnd.cpp:442
++#: ../src/wnd/fusenshiwnd.cpp:457
+ msgid "Print"
+ msgstr "印刷"
+
+-#: ../src/wnd/fusenshiwnd.cpp:443
++#: ../src/wnd/fusenshiwnd.cpp:458
+ msgid "Maximize"
+ msgstr "最大化"
+
+-#: ../src/wnd/fusenshiwnd.cpp:444
++#: ../src/wnd/fusenshiwnd.cpp:459
+ msgid "Minimize"
+ msgstr "最小化"
+
+-#: ../src/wnd/fusenshiwnd.cpp:445
++#: ../src/wnd/fusenshiwnd.cpp:460
+ msgid "Delete"
+ msgstr "削除"
+
+-#: ../src/wnd/propertydialog.cpp:48
++#: ../src/wnd/fusenshiwnd.cpp:478
++msgid "Unmaximize"
++msgstr "最大化解除"
++
++#: ../src/wnd/fusenshiwnd.cpp:481
++msgid "Unminimize"
++msgstr "最小化解除"
++
++#: ../src/wnd/propertydialog.cpp:51
+ msgid "Fusenshi - Property"
+ msgstr "付箋紙 - プロパティ"
+
+-#: ../src/wnd/propertydialog.cpp:127
++#: ../src/wnd/propertydialog.cpp:124
+ msgid "Base"
+ msgstr "基本"
+
+-#: ../src/wnd/propertydialog.cpp:149
++#: ../src/wnd/propertydialog.cpp:146
+ msgid "Nickname:"
+-msgstr "ニックネーム"
++msgstr "ニックネーム:"
+
+-#: ../src/wnd/propertydialog.cpp:208
++#: ../src/wnd/propertydialog.cpp:205
+ msgid "Network"
+ msgstr "ネットワーク"
+
+-#: ../src/wnd/propertydialog.cpp:216
++#: ../src/wnd/propertydialog.cpp:213
+ msgid "Broadcast Address"
+ msgstr "ブロードキャストアドレス"
+
+-#: ../src/wnd/propertydialog.cpp:221
++#: ../src/wnd/propertydialog.cpp:218
+ msgid "Enable networking."
+ msgstr "ネットワーク機能を有効にします。"
+
+-#: ../src/wnd/propertydialog.cpp:224
++#: ../src/wnd/propertydialog.cpp:221
+ msgid "Broadcast address list:"
+ msgstr "ブロードキャストアドレスの一覧:"
+
+-#: ../src/wnd/propertydialog.cpp:238
++#: ../src/wnd/propertydialog.cpp:235
+ msgid "Add"
+ msgstr "追加"
+
+-#: ../src/wnd/propertydialog.cpp:242
++#: ../src/wnd/propertydialog.cpp:239
+ msgid "Remove"
+ msgstr "削除"
+
+-#: ../src/wnd/propertydialog.cpp:436
++#: ../src/wnd/propertydialog.cpp:258
++msgid "Window"
++msgstr "ウィンドウ"
++
++#: ../src/wnd/propertydialog.cpp:262
++msgid "Show on all desktops"
++msgstr "常にデスクトップに貼り付け"
++
++#: ../src/wnd/propertydialog.cpp:442
+ msgid "'' is not broadcast address."
+ msgstr "'' はブロードキャストアドレスではありません。"
+
+-#: ../src/wnd/senddialog.cpp:44
++#: ../src/wnd/senddialog.cpp:47
+ msgid "Fusenshi - Send"
+ msgstr "付箋紙 - 送信"
+
+-#: ../src/wnd/senddialog.cpp:56
++#: ../src/wnd/senddialog.cpp:59
+ msgid "UserName"
+ msgstr "ユーザ名"
+
+-#: ../src/wnd/senddialog.cpp:57
++#: ../src/wnd/senddialog.cpp:60
+ msgid "HostName"
+ msgstr "ホスト名"
+
+-#: ../src/wnd/senddialog.cpp:58
++#: ../src/wnd/senddialog.cpp:61
+ msgid "IPAddress"
+ msgstr "IPアドレス"
+
+-#: ../src/wnd/senddialog.cpp:64
++#: ../src/wnd/senddialog.cpp:67
+ msgid "Send To:"
+ msgstr "送信先:"
+
+-#: ../src/wnd/senddialog.cpp:89
++#: ../src/wnd/senddialog.cpp:92
+ msgid "Update"
+ msgstr "更新"
+
+-#: ../src/wnd/wndservice.cpp:520
++#: ../src/wnd/wndservice.cpp:538
++#, c-format
+ msgid ""
+ "I recieved note from follow:\n"
+ "Username: %s\n"
+diff -urN src/Makefile src/Makefile
+--- src/Makefile Thu Apr 1 17:52:08 2004
++++ src/Makefile Mon Nov 22 15:06:02 2004
+@@ -1,9 +1,9 @@
+-# $Id: Makefile,v 1.1 2004/04/01 08:52:08 daichi Exp $
++# $Id: Makefile,v 1.2 2004/11/04 17:39:52 ozawa Exp $
+ #
+ # Copyright 2003- ONGS Inc. All rights reserved.
+ #
+ # author: Masanori OZAWA (ozawa@ongs.co.jp)
+-# version: $Revision: 1.1 $
++# version: $Revision: 1.2 $
+ #
+ # Redistribution and use in source and binary forms, with or without
+ # modification, are permitted provided that the following conditions
+@@ -47,6 +47,8 @@
+
+ .ifndef DEBUG
+ CPPOPT += -O2
++.else
++CPPOPT += -g
+ .endif
+
+ .ifndef WITHOUT_NLS
+diff -urN src/fio/fioservice.cpp src/fio/fioservice.cpp
+--- src/fio/fioservice.cpp Thu Apr 1 17:52:24 2004
++++ src/fio/fioservice.cpp Fri Nov 5 17:08:30 2004
+@@ -1,10 +1,10 @@
+ /*
+- * $Id: fioservice.cpp,v 1.1 2004/04/01 08:52:24 daichi Exp $
++ * $Id: fioservice.cpp,v 1.3 2004/11/05 08:08:30 ozawa Exp $
+ *
+ * Copyright 2003- ONGS Inc. All rights reserved.
+ *
+ * author: Masanori OZAWA (ozawa@ongs.co.jp)
+- * version: $Revision: 1.1 $
++ * version: $Revision: 1.3 $
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+@@ -49,11 +49,6 @@
+ FioService* FioService::m_pInstance = NULL;
+
+ /**
+- * 付箋紙の設定
+- */
+-PropertyData FioService::m_cProperty;
+-
+-/**
+ * コンストラクタ
+ */
+ FioService::FioService(int inFD, int outFD)
+@@ -294,48 +289,18 @@
+ }
+
+ /**
+- * 付箋紙の設定を取得します。
+- *
+- * @return 付箋紙の設定
++ * プロパティの変更をウィンドウプロセスへ通知します。
+ */
+-PropertyData FioService::getProperty()
++void FioService::noticeProperty()
+ {
+- static bool bLoad = false;
+-
+- if (!bLoad) {
+- try {
+- FioService::m_cProperty = PropertyData::loadProperty();
+- }
+- catch (...) {
+- fprintf(stderr, "%s: Can't load property file.", APP_NAME);
+- }
+-
+- bLoad = true;
+- }
+-
+- return FioService::m_cProperty;
+-}
+-
+-/**
+- * 付箋紙の設定を設定し、直ちに保管します。
+- *
+- * @param property 付箋紙の設定
+- */
+-void FioService::setProperty(const PropertyData& property)
+-{
+- if (!PropertyData::saveProperty(property)) {
+- fprintf(stderr, "%s: Can't save property file.", APP_NAME);
++ // 設定の変更を通知する
++ GString* pStrData = PropertyData::toSerializedString(PropertyData::get());
++
++ if (pStrData) {
++ m_pCommand->addCommand(PROPERTY_CHANGED, 0, pStrData);
+ }
+ else {
+- // 変更を保持
+- FioService::m_cProperty = property;
+-
+- // 設定の変更を反映
+- FioService::updateProperty();
+-
+- // 設定の変更を通知する
+- FioService *pInstance = FioService::getInstance();
+- pInstance->m_pCommand->addCommand(PROPERTY_CHANGED, 0, NULL);
++ throw "Out of Memory Error!";
+ }
+ }
+
+@@ -344,7 +309,7 @@
+ */
+ void FioService::updateProperty()
+ {
+- PropertyData property = FioService::getProperty();
++ const PropertyData& property = PropertyData::get();
+
+ #ifndef WITHOUT_NETWORK
+ // ネットワークの有効/無効の調整
+@@ -375,14 +340,15 @@
+ FileManager& fm = FileManager::getInstance();
+
+ const char* pFileName = NULL;
+- GString* lpStrData = NULL;
++ GString* pString = NULL;
++ PropertyData property;
+
+ switch (lpCommand->nCommandID) {
+ case SAVE_FUSENSHI:
+ pFileName = fm.getFileName(lpCommand->nFileID);
+- lpStrData = (GString*)lpCommand->pData;
+- if (pFileName && lpStrData) {
+- FusenshiSaver::saveFusenshiData(pFileName, lpStrData);
++ pString = (GString*)lpCommand->pData;
++ if (pFileName && pString) {
++ FusenshiSaver::saveFusenshiData(pFileName, pString);
+ }
+ break;
+ case CREATE_NEW_FUSENSHI:
+@@ -396,13 +362,16 @@
+ fm.removeFile(lpCommand->nFileID);
+ break;
+ case PRINT_FUSENSHI:
+- lpStrData = (GString*)lpCommand->pData;
+- if (lpStrData) {
+- printFusenshi(lpCommand->nFileID, lpStrData->str);
++ pString = (GString*)lpCommand->pData;
++ if (pString) {
++ printFusenshi(lpCommand->nFileID, pString->str);
+ }
+ break;
+ case PROPERTY_CHANGED:
+- FioService::m_cProperty = PropertyData::loadProperty();
++ pString = (GString*)lpCommand->pData;
++ property = PropertyData::buildObject(pString);
++ // 保存と更新
++ PropertyData::set(property, true);
+ FioService::updateProperty();
+ break;
+ case EXIT_APP:
+@@ -422,7 +391,7 @@
+ FusenshiServer* FioService::getServer()
+ {
+ #ifndef WITHOUT_NETWORK
+- PropertyData property = FioService::getProperty();
++ const PropertyData& property = PropertyData::get();
+
+ if (property.isEnableNetwork()) {
+ return FusenshiServer::getInstance();
+diff -urN src/fio/fioservice.h src/fio/fioservice.h
+--- src/fio/fioservice.h Thu Apr 1 17:52:24 2004
++++ src/fio/fioservice.h Fri Nov 5 17:08:30 2004
+@@ -1,10 +1,10 @@
+ /*
+- * $Id: fioservice.h,v 1.1 2004/04/01 08:52:24 daichi Exp $
++ * $Id: fioservice.h,v 1.3 2004/11/05 08:08:30 ozawa Exp $
+ *
+ * Copyright 2003- ONGS Inc. All rights reserved.
+ *
+ * author: Masanori OZAWA (ozawa@ongs.co.jp)
+- * version: $Revision: 1.1 $
++ * version: $Revision: 1.3 $
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+@@ -89,20 +89,6 @@
+ */
+ static FioService* getInstance(int inFD, int outFD);
+
+- /**
+- * 付箋紙の設定を取得します。
+- *
+- * @return 付箋紙の設定
+- */
+- static PropertyData getProperty();
+-
+- /**
+- * 付箋紙の設定を設定し、直ちに保管します。
+- *
+- * @param property 付箋紙の設定
+- */
+- static void setProperty(const PropertyData& property);
+-
+ public:
+ /**
+ * デストラクタ
+@@ -138,11 +124,15 @@
+ */
+ void printFusenshi(guint nFileID, const char* pCommand);
+
+-private:
++ /**
++ * プロパティの変更をウィンドウプロセスへ通知します。
++ */
++ void noticeProperty();
++
+ /**
+ * プロパティの変更後に必要な処理を実行します。
+ */
+- static void updateProperty();
++ void updateProperty();
+
+ private:
+ /**
+@@ -150,11 +140,7 @@
+ */
+ static FioService* m_pInstance;
+
+- /**
+- * 付箋紙の設定
+- */
+- static PropertyData m_cProperty;
+-
++private:
+ /**
+ * 入力側パイプ
+ */
+diff -urN src/fio/fusenshidata.cpp src/fio/fusenshidata.cpp
+--- src/fio/fusenshidata.cpp Thu Apr 1 17:52:24 2004
++++ src/fio/fusenshidata.cpp Fri Nov 5 17:08:30 2004
+@@ -1,10 +1,10 @@
+ /*
+- * $Id: fusenshidata.cpp,v 1.1 2004/04/01 08:52:24 daichi Exp $
++ * $Id: fusenshidata.cpp,v 1.3 2004/11/05 08:08:30 ozawa Exp $
+ *
+ * Copyright 2003- ONGS Inc. All rights reserved.
+ *
+ * author: Masanori OZAWA (ozawa@ongs.co.jp)
+- * version: $Revision: 1.1 $
++ * version: $Revision: 1.3 $
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+@@ -47,8 +47,8 @@
+ {
+ const int sx = gdk_screen_width();
+ const int sy = gdk_screen_height();
+- PropertyData property = FioService::getProperty();
+-
++ const PropertyData& property = PropertyData::get();
++
+ // メンバ変数の初期化
+ m_nMajorVersion = FUSENSHIDATA_MAJOR_VERSION;
+ m_nMinorVersion = FUSENSHIDATA_MINOR_VERSION;
+@@ -69,6 +69,14 @@
+ }
+
+ /**
++ * コピーコンストラクタ
++ */
++FusenshiData::FusenshiData(const FusenshiData& data)
++{
++ this->operator=(data);
++}
++
++/**
+ * デストラクタ
+ */
+ FusenshiData::~FusenshiData()
+@@ -367,11 +375,11 @@
+ /**
+ * 付箋紙データオブジェクトをシリアライズします。
+ *
+- * @param pData 付箋紙データオブジェクト
++ * @param data 付箋紙データオブジェクト
+ * @return シリアライズ後のバイト列。
+ * 不要になった段階で破棄する必要があります。
+ */
+-GString* FusenshiData::toSerializedString(const FusenshiData* pData)
++GString* FusenshiData::toSerializedString(const FusenshiData& data)
+ {
+ GString *result = g_string_sized_new(1024);
+ Glib::ustring szBuffer;
+@@ -382,45 +390,45 @@
+
+ // バージョン
+ g_string_append_printf(result, TYPE_VERSION ": %d.%d.%d\r\n",
+- pData->getMajorVersion(),
+- pData->getMinorVersion(),
+- pData->getMicroVersion());
++ data.getMajorVersion(),
++ data.getMinorVersion(),
++ data.getMicroVersion());
+
+ // 背景色
+- toString(pData->getBackground(), szBuffer);
++ color2string(data.getBackground(), szBuffer);
+ g_string_append_printf
+ (result, TYPE_BG_COLOR ": %s\r\n", szBuffer.c_str());
+
+ // 前景色
+- toString(pData->getForeground(), szBuffer);
++ color2string(data.getForeground(), szBuffer);
+ g_string_append_printf
+ (result, TYPE_FG_COLOR ": %s\r\n", szBuffer.c_str());
+
+ // フォント
+ g_string_append_printf(result, TYPE_FONTNAME ": %s\r\n",
+- pData->getFontName().c_str());
++ data.getFontName().c_str());
+
+ // ウィンドウポジション
+ g_string_append_printf(result, TYPE_X_POS ": %d\r\n",
+- pData->getXPos());
++ data.getXPos());
+ g_string_append_printf(result, TYPE_Y_POS ": %d\r\n",
+- pData->getYPos());
++ data.getYPos());
+
+ // ウィンドウサイズ
+ g_string_append_printf(result, TYPE_WIDTH ": %d\r\n",
+- pData->getWidth());
++ data.getWidth());
+ g_string_append_printf(result, TYPE_HEIGHT ": %d\r\n",
+- pData->getHeight());
++ data.getHeight());
+
+ // ウィンドウスタイル
+ g_string_append_printf(result, TYPE_STYLE ": %d\r\n",
+- pData->getStyle());
++ data.getStyle());
+
+ // ヘッダの終端行
+ g_string_append(result, "\r\n");
+
+ // 本文
+- g_string_append(result, pData->getText().c_str());
++ g_string_append(result, data.getText().c_str());
+
+ return result;
+ }
+@@ -602,7 +610,7 @@
+ */
+ void FusenshiData::parseColorAndSet(GdkColor *pColor, const char *pValue)
+ {
+- parseColor(pColor, pValue);
++ string2color(pColor, pValue);
+ }
+
+ /**
+diff -urN src/fio/fusenshisaver.cpp src/fio/fusenshisaver.cpp
+--- src/fio/fusenshisaver.cpp Thu Apr 1 17:52:24 2004
++++ src/fio/fusenshisaver.cpp Fri Nov 5 17:08:30 2004
+@@ -1,10 +1,10 @@
+ /*
+- * $Id: fusenshisaver.cpp,v 1.1 2004/04/01 08:52:24 daichi Exp $
++ * $Id: fusenshisaver.cpp,v 1.2 2004/11/05 08:08:30 ozawa Exp $
+ *
+ * Copyright 2003- ONGS Inc. All rights reserved.
+ *
+ * author: Masanori OZAWA (ozawa@ongs.co.jp)
+- * version: $Revision: 1.1 $
++ * version: $Revision: 1.2 $
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+@@ -65,7 +65,7 @@
+ void FusenshiSaver::saveFusenshiData
+ (const char* pFileName, const FusenshiData* pData)
+ {
+- GString* lpStrData = FusenshiData::toSerializedString(pData);
++ GString* lpStrData = FusenshiData::toSerializedString(*pData);
+
+ if (lpStrData) {
+ saveFusenshiData(pFileName, lpStrData);
+diff -urN src/fio/propertydata.cpp src/fio/propertydata.cpp
+--- src/fio/propertydata.cpp Thu Apr 1 17:52:24 2004
++++ src/fio/propertydata.cpp Fri Nov 5 17:08:30 2004
+@@ -1,10 +1,10 @@
+ /*
+- * $Id: propertydata.cpp,v 1.1 2004/04/01 08:52:24 daichi Exp $
++ * $Id: propertydata.cpp,v 1.4 2004/11/05 08:08:30 ozawa Exp $
+ *
+ * Copyright 2003- ONGS Inc. All rights reserved.
+ *
+ * author: Masanori OZAWA (ozawa@ongs.co.jp)
+- * version: $Revision: 1.1 $
++ * version: $Revision: 1.4 $
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+@@ -46,6 +46,11 @@
+ #define ROOT_NODE (APP_NAME "-config")
+
+ /**
++ * プロパティ
++ */
++PropertyData PropertyData::m_cProperty;
++
++/**
+ * コンストラクタ
+ */
+ PropertyData::PropertyData()
+@@ -69,6 +74,16 @@
+
+ m_bEnableNetwork = true;
+ m_cBroadcastList.push_back(IP2STR(INADDR_BROADCAST));
++
++ m_bStickWindow = false;
++}
++
++/**
++ * コピーコンストラクタ
++ */
++PropertyData::PropertyData(const PropertyData& data)
++{
++ this->operator=(data);
+ }
+
+ /**
+@@ -171,6 +186,16 @@
+ }
+
+ /**
++ * ウィンドウを張り付け状態にするか調べます。
++ *
++ * @return 張り付け状態にする場合は true を戻します。
++ */
++bool PropertyData::isStickWindow() const
++{
++ return m_bStickWindow;
++}
++
++/**
+ * ブロードキャストアドレスの一覧を設定します。
+ *
+ * @param broadcastList ブロードキャストアドレスの一覧
+@@ -252,6 +277,16 @@
+ }
+
+ /**
++ * ウィンドウを張り付け状態にするか設定します。
++ *
++ * @return 張り付け状態にする場合は true を指定します。
++ */
++void PropertyData::setStickWindow(bool bPaste)
++{
++ m_bStickWindow = bPaste;
++}
++
++/**
+ * 印刷用のコマンドを取得します。
+ *
+ * @return 印刷用のコマンドを戻します。
+@@ -284,6 +319,9 @@
+
+ // ブロードキャストアドレス
+ setBroadcastList(data.getBroadcastList());
++
++ // ウィンドウの張り付けフラグ
++ setStickWindow(data.isStickWindow());
+
+ return (*this);
+ }
+@@ -336,6 +374,9 @@
+
+ result &= (iter1 == iter1end && iter2 == iter2end);
+
++ // ウィンドウの張り付けフラグ
++ result &= (isStickWindow() == data.isStickWindow());
++
+ return result;
+ }
+
+@@ -348,6 +389,41 @@
+ }
+
+ /**
++ * プロパティを取得します。
++ *
++ * @return プロパティ
++ */
++const PropertyData& PropertyData::get()
++{
++ static bool bLoad = false;
++
++ if (!bLoad) {
++ PropertyData::m_cProperty = PropertyData::loadProperty();
++
++ bLoad = true;
++ }
++
++ return PropertyData::m_cProperty;
++}
++
++/**
++ * プロパティを設定/保存します。
++ *
++ * @param property 新しいプロパティ
++ * @param save ファイルに保存する場合は true を指定します。
++ */
++void PropertyData::set(const PropertyData& property, bool save)
++{
++ PropertyData::m_cProperty = property;
++
++ if (save) {
++ if (!PropertyData::saveProperty(property)) {
++ fprintf(stderr, "%s: Can't save property file.", APP_NAME);
++ }
++ }
++}
++
++/**
+ * 付箋紙のプロパティを読み込みます。
+ *
+ * @return ロードした付箋紙のプロパティを戻します。
+@@ -369,12 +445,109 @@
+ }
+
+ // 解析
++ if (!PropertyData::loadFromXML(doc, property)) {
++ PropertyData tmp;
++ property = tmp; // 初期化
++ }
++
++ xmlFreeDoc(doc);
++
++ return property;
++}
++
++/**
++ * 付箋紙のプロパティを保存します。
++ *
++ * @param property 付箋紙プロパティ
++ * @return 保存に成功した場合は true を戻します。
++ */
++bool PropertyData::saveProperty(const PropertyData& property)
++{
++ // 付箋紙ファイル名の構築
++ Glib::ustring szPropFile = getAppDir(APP_NAME);
++ szPropFile += "/";
++ szPropFile += PROPERTY_FILENAME;
++
++ // 保存用のディレクトリを構築
++ createFusenshiDir();
++
++ // XMLへ変換
++ xmlDocPtr doc = PropertyData::toXML(property);
++
++ // 保存
++ bool result = (doc ? XMLSaver::save(szPropFile, doc) : false);
++
++ if (doc) xmlFreeDoc(doc);
++
++ return result;
++}
++
++/**
++ * シリアライズ化されたプロパティからプロパティオブジェクトを
++ * 構築します。
++ *
++ * @param pBytes シリアライズ後のバイト列
++ * @return プロパティオブジェクト。
++ * 不要になった段階で破棄する必要があります。
++ */
++PropertyData PropertyData::buildObject(const GString* pBytes)
++{
++ PropertyData property;
++
++ // 読み込み
++ xmlDocPtr doc = XMLLoader::load(pBytes);
++
++ if (!doc) {
++ throw "Can't load property data.";
++ }
++
++ // 解析
++ if (!PropertyData::loadFromXML(doc, property)) {
++ PropertyData tmp;
++ property = tmp; // 初期化
++ }
++
++ xmlFreeDoc(doc);
++
++ return property;
++}
++
++/**
++ * プロパティオブジェクトをシリアライズします。
++ *
++ * @param pData プロパティオブジェクト
++ * @return シリアライズ後のバイト列。
++ * 不要になった段階で破棄する必要があります。
++ */
++GString* PropertyData::toSerializedString(const PropertyData& property)
++{
++ // XMLへ変換
++ xmlDocPtr doc = PropertyData::toXML(property);
++
++ // 保存
++ GString* pBuffer = (doc ? XMLSaver::toString(doc) : NULL);
++
++ if (doc) xmlFreeDoc(doc);
++
++ return pBuffer;
++}
++
++/**
++ * 付箋紙のプロパティをXMLから読み込みます。
++ *
++ * @param document XML
++ * @param property プロパティの保存先オブジェクト
++ * @return ロードに成功した場合はtrueを戻します。
++ */
++bool PropertyData::loadFromXML(const xmlDocPtr document, PropertyData& property)
++{
++ // 解析
+ const char *key = NULL;
+- xmlNodePtr node = xmlDocGetRootElement(doc);
++ xmlNodePtr node = xmlDocGetRootElement(document);
+
+ if (xmlStrcmp(node->name, (const xmlChar *)ROOT_NODE)) {
+- xmlFreeDoc(doc);
+- throw "Property file is broken.";
++ // XMLが壊れています。
++ return false;
+ }
+
+ node = node->xmlChildrenNode;
+@@ -382,15 +555,15 @@
+ property.clearBroadcastList();
+
+ while (node) {
+- key = (char*)xmlNodeListGetString(doc, node->xmlChildrenNode, 1);
++ key = (char*)xmlNodeListGetString(document, node->xmlChildrenNode, 1);
+ if (!xmlStrcmp(node->name, (const xmlChar *)PTYPE_NICKNAME)) {
+ property.setNickName(key);
+ }
+ else if (!xmlStrcmp(node->name, (const xmlChar *)PTYPE_BG_COLOR)) {
+- parseColor(&property.m_cBackground, key);
++ string2color(&property.m_cBackground, key);
+ }
+ else if (!xmlStrcmp(node->name, (const xmlChar *)PTYPE_FG_COLOR)) {
+- parseColor(&property.m_cForeground, key);
++ string2color(&property.m_cForeground, key);
+ }
+ else if (!xmlStrcmp(node->name, (const xmlChar *)PTYPE_FONTNAME)) {
+ property.setFontName(key);
+@@ -405,49 +578,43 @@
+ else if (!xmlStrcmp(node->name, (const xmlChar *)PTYPE_BROADCAST_ADDR)) {
+ property.addBroadcastAddr(key);
+ }
++ else if (!xmlStrcmp(node->name, (const xmlChar *)PTYPE_STICK_WND)) {
++ property.setStickWindow
++ (strcasecmp(key, "true") == 0 || strcmp(key, "1") == 0);
++ }
+ xmlFree((xmlChar*)key);
+
+ node = node->next;
+ }
+-
+- xmlFreeDoc(doc);
+-
+- return property;
++
++ return true;
+ }
+
+ /**
+- * 付箋紙のプロパティを保存します。
++ * 付箋紙のプロパティをXMLに変換します。
+ *
+ * @param property 付箋紙プロパティ
+- * @return 保存に成功した場合は true を戻します。
++ * @return 変換後のXML
+ */
+-bool PropertyData::saveProperty(const PropertyData& property)
++xmlDocPtr PropertyData::toXML(const PropertyData& property)
+ {
+- // 付箋紙ファイル名の構築
+- Glib::ustring szPropFile = getAppDir(APP_NAME);
+- szPropFile += "/";
+- szPropFile += PROPERTY_FILENAME;
+-
+- // 保存用のディレクトリを構築
+- createFusenshiDir();
+-
+ // XMLドキュメントの構築
+ xmlDocPtr doc = xmlNewDoc((xmlChar*)"1.0");
+
+- Glib::ustring szBuffer;
++ Glib::ustring buf;
+
+ doc->children = xmlNewDocNode(doc, NULL, (xmlChar*)ROOT_NODE, NULL);
+
+ xmlNewChild(doc->children, NULL, (xmlChar*)PTYPE_NICKNAME,
+ (xmlChar*)property.getNickName().c_str());
+
+- toString(property.getBackground(), szBuffer);
++ color2string(property.getBackground(), buf);
+ xmlNewChild(doc->children, NULL, (xmlChar*)PTYPE_BG_COLOR,
+- (xmlChar*)szBuffer.c_str());
++ (xmlChar*)buf.c_str());
+
+- toString(property.getForeground(), szBuffer);
++ color2string(property.getForeground(), buf);
+ xmlNewChild(doc->children, NULL, (xmlChar*)PTYPE_FG_COLOR,
+- (xmlChar*)szBuffer.c_str());
++ (xmlChar*)buf.c_str());
+
+ xmlNewChild(doc->children, NULL, (xmlChar*)PTYPE_FONTNAME,
+ (xmlChar*)property.getFontName().c_str());
+@@ -458,6 +625,9 @@
+ xmlNewChild(doc->children, NULL, (xmlChar*)PTYPE_ENABLE_NETWORK,
+ (xmlChar*)(property.isEnableNetwork() ? "true" : "false"));
+
++ xmlNewChild(doc->children, NULL, (xmlChar*)PTYPE_STICK_WND,
++ (xmlChar*)(property.isStickWindow() ? "true" : "false"));
++
+ BroadcastList& list = (BroadcastList&)property.getBroadcastList();
+ BroadcastList::iterator iter = list.begin();
+ BroadcastList::iterator iterend = list.end();
+@@ -466,10 +636,6 @@
+ xmlNewChild(doc->children, NULL, (xmlChar*)PTYPE_BROADCAST_ADDR,
+ (xmlChar*)(*iter).c_str());
+ }
+-
+- bool result = XMLSaver::save(szPropFile, doc);
+-
+- xmlFreeDoc(doc);
+-
+- return result;
++
++ return doc;
+ }
+diff -urN src/fio/xmlloader.cpp src/fio/xmlloader.cpp
+--- src/fio/xmlloader.cpp Thu Apr 1 17:52:24 2004
++++ src/fio/xmlloader.cpp Fri Nov 5 17:08:30 2004
+@@ -1,10 +1,10 @@
+ /*
+- * $Id: xmlloader.cpp,v 1.1 2004/04/01 08:52:24 daichi Exp $
++ * $Id: xmlloader.cpp,v 1.2 2004/11/05 08:08:30 ozawa Exp $
+ *
+ * Copyright 2003- ONGS Inc. All rights reserved.
+ *
+ * author: Masanori OZAWA (ozawa@ongs.co.jp)
+- * version: $Revision: 1.1 $
++ * version: $Revision: 1.2 $
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+@@ -58,4 +58,17 @@
+ xmlDocPtr XMLLoader::load(Glib::ustring szFile)
+ {
+ return xmlParseFile(szFile.c_str());
++}
++
++/**
++ * XMLをメモリから読み込みます。
++ *
++ * @param buffer メモリ(XML文字列)
++ * @return XMLドキュメント
++ */
++xmlDocPtr XMLLoader::load(const GString* buffer)
++{
++ if (!buffer) return NULL;
++
++ return xmlParseMemory(buffer->str, buffer->len);
+ }
+diff -urN src/fio/xmlloader.h src/fio/xmlloader.h
+--- src/fio/xmlloader.h Thu Apr 1 17:52:24 2004
++++ src/fio/xmlloader.h Fri Nov 5 17:08:30 2004
+@@ -1,10 +1,10 @@
+ /*
+- * $Id: xmlloader.h,v 1.1 2004/04/01 08:52:24 daichi Exp $
++ * $Id: xmlloader.h,v 1.2 2004/11/05 08:08:30 ozawa Exp $
+ *
+ * Copyright 2003- ONGS Inc. All rights reserved.
+ *
+ * author: Masanori OZAWA (ozawa@ongs.co.jp)
+- * version: $Revision: 1.1 $
++ * version: $Revision: 1.2 $
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+@@ -55,12 +55,20 @@
+
+ public:
+ /**
+- * XMLファイルを読み込みます。
++ * XMLをファイルから読み込みます。
+ *
+ * @param szFile ファイル名
+ * @return XMLドキュメント
+ */
+ static xmlDocPtr load(Glib::ustring szFile);
++
++ /**
++ * XMLをメモリから読み込みます。
++ *
++ * @param buffer メモリ(XML文字列)
++ * @return XMLドキュメント
++ */
++ static xmlDocPtr load(const GString* buffer);
+ };
+
+ #endif
+diff -urN src/fio/xmlsaver.cpp src/fio/xmlsaver.cpp
+--- src/fio/xmlsaver.cpp Thu Apr 1 17:52:24 2004
++++ src/fio/xmlsaver.cpp Fri Nov 5 17:08:30 2004
+@@ -1,10 +1,10 @@
+ /*
+- * $Id: xmlsaver.cpp,v 1.1 2004/04/01 08:52:24 daichi Exp $
++ * $Id: xmlsaver.cpp,v 1.2 2004/11/05 08:08:30 ozawa Exp $
+ *
+ * Copyright 2003- ONGS Inc. All rights reserved.
+ *
+ * author: Masanori OZAWA (ozawa@ongs.co.jp)
+- * version: $Revision: 1.1 $
++ * version: $Revision: 1.2 $
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+@@ -50,7 +50,7 @@
+ }
+
+ /**
+- * XMLファイルを読み込みます。
++ * XMLをファイルに保存します。
+ *
+ * @param szFile ファイル名
+ * @param document XMLドキュメント
+@@ -61,4 +61,31 @@
+ int status = xmlSaveFile(szFile.c_str(), document);
+
+ return (-1 != status);
++}
++
++/**
++ * XMLを文字列に変換します。
++ *
++ * @param document XMLドキュメント
++ * @return 変換後の文字列。変換に失敗した場合はNULLを戻す。
++ * 不要になった段階で破棄する必要があります。
++ */
++GString* XMLSaver::toString(const xmlDocPtr document)
++{
++ GString *result = g_string_sized_new(1024);
++
++ if (!result) {
++ throw "Out of Memory Error!";
++ }
++
++ int size = 0;
++ xmlChar* pMem = NULL;
++
++ xmlDocDumpMemory(document, &pMem, &size);
++
++ g_string_append(result, (const char*)pMem);
++
++ xmlFree(pMem);
++
++ return result;
+ }
+diff -urN src/fio/xmlsaver.h src/fio/xmlsaver.h
+--- src/fio/xmlsaver.h Thu Apr 1 17:52:24 2004
++++ src/fio/xmlsaver.h Fri Nov 5 17:08:30 2004
+@@ -1,10 +1,10 @@
+ /*
+- * $Id: xmlsaver.h,v 1.1 2004/04/01 08:52:24 daichi Exp $
++ * $Id: xmlsaver.h,v 1.2 2004/11/05 08:08:30 ozawa Exp $
+ *
+ * Copyright 2003- ONGS Inc. All rights reserved.
+ *
+ * author: Masanori OZAWA (ozawa@ongs.co.jp)
+- * version: $Revision: 1.1 $
++ * version: $Revision: 1.2 $
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+@@ -55,13 +55,22 @@
+
+ public:
+ /**
+- * XMLファイルを読み込みます。
++ * XMLをファイルに保存します。
+ *
+ * @param szFile ファイル名
+ * @param document XMLドキュメント
+ * @return 正常に保存した場合は true を戻す。
+ */
+ static bool save(Glib::ustring szFile, const xmlDocPtr document);
++
++ /**
++ * XMLを文字列に変換します。
++ *
++ * @param document XMLドキュメント
++ * @return 変換後の文字列。変換に失敗した場合はNULLを戻す。
++ * 不要になった段階で破棄する必要があります。
++ */
++ static GString* toString(const xmlDocPtr document);
+ };
+
+ #endif
+diff -urN src/include/fusenshidata.h src/include/fusenshidata.h
+--- src/include/fusenshidata.h Thu Apr 1 17:52:40 2004
++++ src/include/fusenshidata.h Fri Nov 5 17:08:30 2004
+@@ -1,10 +1,10 @@
+ /*
+- * $Id: fusenshidata.h,v 1.1 2004/04/01 08:52:40 daichi Exp $
++ * $Id: fusenshidata.h,v 1.2 2004/11/05 08:08:30 ozawa Exp $
+ *
+ * Copyright 2003- ONGS Inc. All rights reserved.
+ *
+ * author: Masanori OZAWA (ozawa@ongs.co.jp)
+- * version: $Revision: 1.1 $
++ * version: $Revision: 1.2 $
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+@@ -39,6 +39,8 @@
+ #include "glib.h"
+ #include "gdk/gdk.h"
+
++#include "propertydata.h"
++
+ #define FUSENSHIDATA_MAJOR_VERSION 0
+ #define FUSENSHIDATA_MINOR_VERSION 7
+ #define FUSENSHIDATA_MICRO_VERSION 0
+@@ -59,10 +61,17 @@
+ public:
+ /**
+ * コンストラクタ
++ *
++ * @param property 付箋紙のプロパティ
+ */
+ FusenshiData();
+
+ /**
++ * コピーコンストラクタ
++ */
++ FusenshiData(const FusenshiData& data);
++
++ /**
+ * デストラクタ
+ */
+ virtual ~FusenshiData();
+@@ -249,11 +258,11 @@
+ /**
+ * 付箋紙データオブジェクトをシリアライズします。
+ *
+- * @param pData 付箋紙データオブジェクト
++ * @param data 付箋紙データオブジェクト
+ * @return シリアライズ後のバイト列。
+ * 不要になった段階で破棄する必要があります。
+ */
+- static GString* toSerializedString(const FusenshiData* pData);
++ static GString* toSerializedString(const FusenshiData& data);
+
+ protected:
+ /**
+diff -urN src/include/propertydata.h src/include/propertydata.h
+--- src/include/propertydata.h Thu Apr 1 17:52:40 2004
++++ src/include/propertydata.h Fri Nov 5 17:08:30 2004
+@@ -1,10 +1,10 @@
+ /*
+- * $Id: propertydata.h,v 1.1 2004/04/01 08:52:40 daichi Exp $
++ * $Id: propertydata.h,v 1.3 2004/11/05 08:08:30 ozawa Exp $
+ *
+ * Copyright 2003- ONGS Inc. All rights reserved.
+ *
+ * author: Masanori OZAWA (ozawa@ongs.co.jp)
+- * version: $Revision: 1.1 $
++ * version: $Revision: 1.3 $
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+@@ -36,7 +36,9 @@
+ #ifndef ___PROPERTYDATA_H
+ #define ___PROPERTYDATA_H
+
+-#include <gtkmm.h>
++#include "gtkmm.h"
++#include "libxml/parser.h"
++#include "libxml/tree.h"
+
+ #define PTYPE_NICKNAME "Nickname"
+ #define PTYPE_BG_COLOR "Background-Color"
+@@ -45,6 +47,7 @@
+ #define PTYPE_PRINT_COMMAND "PrintCommand"
+ #define PTYPE_ENABLE_NETWORK "EnableNetwork"
+ #define PTYPE_BROADCAST_ADDR "BroadcastAddr"
++#define PTYPE_STICK_WND "StickWnd"
+
+ typedef std::list<Glib::ustring> BroadcastList;
+
+@@ -56,10 +59,16 @@
+ PropertyData();
+
+ /**
++ * コピーコンストラクタ
++ */
++ PropertyData(const PropertyData& data);
++
++ /**
+ * デストラクタ
+ */
+ virtual ~PropertyData();
+
++public:
+ /**
+ * ブロードキャストアドレスを追加します。
+ *
+@@ -124,6 +133,13 @@
+ * @return ネットワーク機能が有効な場合は true を戻します。
+ */
+ bool isEnableNetwork() const;
++
++ /**
++ * ウィンドウを張り付け状態にするか調べます。
++ *
++ * @return 張り付け状態にする場合は true を戻します。
++ */
++ bool isStickWindow() const;
+
+ /**
+ * ブロードキャストアドレスの一覧を設定します。
+@@ -174,6 +190,13 @@
+ */
+ void setPrintCommand(const Glib::ustring szPrintCommand);
+
++ /**
++ * ウィンドウを張り付け状態にするか設定します。
++ *
++ * @return 張り付け状態にする場合は true を指定します。
++ */
++ void setStickWindow(bool bPaste);
++
+ public:
+ /**
+ * 複写
+@@ -192,6 +215,42 @@
+
+ public:
+ /**
++ * プロパティを取得します。
++ *
++ * @return プロパティ
++ */
++ static const PropertyData& get();
++
++ /**
++ * プロパティを設定/保存します。
++ *
++ * @param property 新しいプロパティ
++ * @param save ファイルに保存する場合は true を指定します。
++ */
++ static void set(const PropertyData& property, bool save = false);
++
++public:
++ /**
++ * シリアライズ化されたプロパティからプロパティオブジェクトを
++ * 構築します。
++ *
++ * @param pBytes シリアライズ後のバイト列
++ * @return プロパティオブジェクト。
++ * 不要になった段階で破棄する必要があります。
++ */
++ static PropertyData buildObject(const GString* pBytes);
++
++ /**
++ * プロパティオブジェクトをシリアライズします。
++ *
++ * @param pData プロパティオブジェクト
++ * @return シリアライズ後のバイト列。
++ * 不要になった段階で破棄する必要があります。
++ */
++ static GString* toSerializedString(const PropertyData& property);
++
++private:
++ /**
+ * 付箋紙のプロパティを読み込みます。
+ *
+ * @return ロードした付箋紙のプロパティを戻します。
+@@ -208,6 +267,30 @@
+
+ private:
+ /**
++ * 付箋紙のプロパティをXMLから読み込みます。
++ *
++ * @param document XML
++ * @param property プロパティの保存先オブジェクト
++ * @return ロードに成功した場合はtrueを戻します。
++ */
++ static bool loadFromXML(const xmlDocPtr document, PropertyData& property);
++
++ /**
++ * 付箋紙のプロパティをXMLに変換します。
++ *
++ * @param property 付箋紙プロパティ
++ * @return 変換後のXML。不要になった時点で解放する必要があります。
++ */
++ static xmlDocPtr toXML(const PropertyData& property);
++
++private:
++ /**
++ * ロード済みのプロパティ
++ */
++ static PropertyData m_cProperty;
++
++private:
++ /**
+ * ニックネーム
+ */
+ Glib::ustring m_szNickName;
+@@ -237,6 +320,11 @@
+ * ブロードキャストアドレスの一覧
+ */
+ BroadcastList m_cBroadcastList;
++
++ /**
++ * ウィンドウの貼り付けフラグ
++ */
++ bool m_bStickWindow;
+ };
+
+ #endif
+diff -urN src/main.cpp src/main.cpp
+--- src/main.cpp Thu Apr 1 17:52:08 2004
++++ src/main.cpp Fri Nov 5 17:08:30 2004
+@@ -1,10 +1,10 @@
+ /*
+- * $Id: main.cpp,v 1.1 2004/04/01 08:52:08 daichi Exp $
++ * $Id: main.cpp,v 1.2 2004/11/05 08:08:30 ozawa Exp $
+ *
+ * Copyright 2003- ONGS Inc. All rights reserved.
+ *
+ * author: Masanori OZAWA (ozawa@ongs.co.jp)
+- * version: $Revision: 1.1 $
++ * version: $Revision: 1.2 $
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+@@ -47,8 +47,8 @@
+ /**
+ * メイン処理
+ *
+- * @author $Author: daichi $
+- * @version $Revision: 1.1 $
++ * @author $Author: ozawa $
++ * @version $Revision: 1.2 $
+ */
+ int main(int argc, char *argv[])
+ {
+@@ -114,7 +114,7 @@
+ bool bError = false;
+
+ try {
+- PropertyData::loadProperty();
++ PropertyData::get();
+ }
+ catch (...) {
+ bError = true;
+@@ -123,7 +123,7 @@
+ // プロパティファイルの構築
+ if (bError) {
+ PropertyData property;
+- PropertyData::saveProperty(property);
++ PropertyData::set(property, true);
+ }
+ }
+
+diff -urN src/misc/commandcontrol.cpp src/misc/commandcontrol.cpp
+--- src/misc/commandcontrol.cpp Thu Apr 1 17:52:58 2004
++++ src/misc/commandcontrol.cpp Fri Nov 5 17:08:30 2004
+@@ -1,10 +1,10 @@
+ /*
+- * $Id: commandcontrol.cpp,v 1.1 2004/04/01 08:52:58 daichi Exp $
++ * $Id: commandcontrol.cpp,v 1.2 2004/11/05 08:08:30 ozawa Exp $
+ *
+ * Copyright 2003- ONGS Inc. All rights reserved.
+ *
+ * author: Masanori OZAWA (ozawa@ongs.co.jp)
+- * version: $Revision: 1.1 $
++ * version: $Revision: 1.2 $
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+@@ -113,12 +113,12 @@
+ case SAVE_FUSENSHI:
+ case VERIFY_RECEIVE_DATA:
+ case PRINT_FUSENSHI:
++ case PROPERTY_CHANGED:
+ g_string_free((GString*)lpCommand->pData, TRUE);
+ break;
+ case CREATE_NEW_FUSENSHI:
+ case DELETE_FUSENSHI:
+ case EXIT_APP:
+- case PROPERTY_CHANGED:
+ default:
+ break;
+ }
+@@ -211,6 +211,7 @@
+ case SAVE_FUSENSHI:
+ case VERIFY_RECEIVE_DATA:
+ case PRINT_FUSENSHI:
++ case PROPERTY_CHANGED:
+ if (!pData) {
+ bError = TRUE;
+ break;
+@@ -224,7 +225,6 @@
+ case CREATE_NEW_FUSENSHI:
+ case DELETE_FUSENSHI:
+ case EXIT_APP:
+- case PROPERTY_CHANGED:
+ default:
+ result->pData = NULL;
+ break;
+@@ -269,6 +269,7 @@
+ case SAVE_FUSENSHI:
+ case VERIFY_RECEIVE_DATA:
+ case PRINT_FUSENSHI:
++ case PROPERTY_CHANGED:
+ lpString = (GString*)lpCommand->pData;
+ nDataLen = lpString->len;
+ pData = lpString->str;
+@@ -276,7 +277,6 @@
+ case CREATE_NEW_FUSENSHI:
+ case DELETE_FUSENSHI:
+ case EXIT_APP:
+- case PROPERTY_CHANGED:
+ default:
+ break;
+ }
+diff -urN src/misc/misc.h src/misc/misc.h
+--- src/misc/misc.h Thu Apr 1 17:52:58 2004
++++ src/misc/misc.h Fri Nov 5 02:39:52 2004
+@@ -1,10 +1,10 @@
+ /*
+- * $Id: misc.h,v 1.1 2004/04/01 08:52:58 daichi Exp $
++ * $Id: misc.h,v 1.2 2004/11/04 17:39:52 ozawa Exp $
+ *
+ * Copyright 2003- ONGS Inc. All rights reserved.
+ *
+ * author: Masanori OZAWA (ozawa@ongs.co.jp)
+- * version: $Revision: 1.1 $
++ * version: $Revision: 1.2 $
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+@@ -113,7 +113,7 @@
+ * @param pValue 色情報を保持する文字列
+ * @return 設定に成功した場合は true を戻す。
+ */
+-extern bool parseColor(GdkColor *pColor, const char *pValue);
++extern bool string2color(GdkColor *pColor, const char *pValue);
+
+ /**
+ * 色を表現する文字列を取得します。
+@@ -121,6 +121,6 @@
+ * @param pColor GdkColor構造体
+ * @param szBuffer 色文字列を格納するバッファ
+ */
+-extern void toString(const GdkColor *pColor, Glib::ustring& szBuffer);
++extern void color2string(const GdkColor *pColor, Glib::ustring& szBuffer);
+
+ #endif
+diff -urN src/misc/resourceloader.cpp src/misc/resourceloader.cpp
+--- src/misc/resourceloader.cpp Thu Apr 1 17:52:58 2004
++++ src/misc/resourceloader.cpp Fri Nov 5 02:39:52 2004
+@@ -1,10 +1,10 @@
+ /*
+- * $Id: resourceloader.cpp,v 1.1 2004/04/01 08:52:58 daichi Exp $
++ * $Id: resourceloader.cpp,v 1.2 2004/11/04 17:39:52 ozawa Exp $
+ *
+ * Copyright 2003- ONGS Inc. All rights reserved.
+ *
+ * author: Masanori OZAWA (ozawa@ongs.co.jp)
+- * version: $Revision: 1.1 $
++ * version: $Revision: 1.2 $
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+@@ -48,7 +48,7 @@
+ *
+ * @param pWidget ウィジェット
+ * @param pFileName Pixmapファイル名
+- * @return 構築したGtkPixmap
++ * @return 構築したGtkPixmap。不要になった時点で解放(delete)する必要があります。
+ */
+ Gtk::Image* ResourceLoader::createImage(const char* pFileName)
+ {
+@@ -75,18 +75,16 @@
+ */
+ Glib::RefPtr<Gdk::Pixbuf> ResourceLoader::createPixbuf(const char* pFileName)
+ {
+- std::string path;
+-
+ if (!pFileName || !pFileName[0]) {
+ throw "Argument Exception.";
+ }
+
+- path = findPixmapFile(pFileName);
++ Glib::ustring path = findPixmapFile(pFileName);
+
+ if (0 >= path.length()) {
+ throw "Pixbuf file not found.";
+ }
+-
++
+ return Gdk::Pixbuf::create_from_file(path);
+ }
+
+@@ -96,23 +94,26 @@
+ * @param pFileName Pixmapファイル名
+ * @return 発見したPixmapファイルのパス
+ */
+-const char* ResourceLoader::findPixmapFile(const char* pFileName)
++Glib::ustring ResourceLoader::findPixmapFile(const char* pFileName)
+ {
+ GList *pList = m_pPixmapDirs;
+- gchar *result = NULL;
++ Glib::ustring buf;
+
+ while (pList) {
+- result = g_strdup_printf("%s%s%s", (gchar*)pList->data,
+- G_DIR_SEPARATOR_S, pFileName);
+- if (g_file_test(result, G_FILE_TEST_EXISTS)) {
+- return result;
++ buf = (const char*)pList->data;
++ buf += G_DIR_SEPARATOR_S;
++ buf += pFileName;
++
++ if (g_file_test(buf.c_str(), G_FILE_TEST_EXISTS)) {
++ return buf;
+ }
+- g_free(result);
+
+ pList = pList->next;
+ }
++
++ buf.clear();
+
+- return NULL;
++ return buf;
+ }
+
+ /**
+diff -urN src/misc/resourceloader.h src/misc/resourceloader.h
+--- src/misc/resourceloader.h Thu Apr 1 17:52:58 2004
++++ src/misc/resourceloader.h Fri Nov 5 02:39:52 2004
+@@ -1,10 +1,10 @@
+ /*
+- * $Id: resourceloader.h,v 1.1 2004/04/01 08:52:58 daichi Exp $
++ * $Id: resourceloader.h,v 1.2 2004/11/04 17:39:52 ozawa Exp $
+ *
+ * Copyright 2003- ONGS Inc. All rights reserved.
+ *
+ * author: Masanori OZAWA (ozawa@ongs.co.jp)
+- * version: $Revision: 1.1 $
++ * version: $Revision: 1.2 $
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+@@ -44,7 +44,7 @@
+ * GtkImage を構築します。
+ *
+ * @param pFileName Pixmapファイル名
+- * @return 構築したGtkImage
++ * @return 構築したGtkImage。不要になった時点で解放(delete)する必要があります。
+ */
+ static Gtk::Image* createImage(const char* pFileName);
+
+@@ -71,7 +71,7 @@
+ * @param pFileName Pixmapファイル名
+ * @return 発見したPixmapファイルのパス
+ */
+- static const char* findPixmapFile(const char* pFileName);
++ static Glib::ustring findPixmapFile(const char* pFileName);
+
+ private:
+ /**
+diff -urN src/misc/tools.cpp src/misc/tools.cpp
+--- src/misc/tools.cpp Thu Apr 1 17:52:58 2004
++++ src/misc/tools.cpp Fri Nov 5 02:39:52 2004
+@@ -1,10 +1,10 @@
+ /*
+- * $Id: tools.cpp,v 1.1 2004/04/01 08:52:58 daichi Exp $
++ * $Id: tools.cpp,v 1.2 2004/11/04 17:39:52 ozawa Exp $
+ *
+ * Copyright 2003- ONGS Inc. All rights reserved.
+ *
+ * author: Masanori OZAWA (ozawa@ongs.co.jp)
+- * version: $Revision: 1.1 $
++ * version: $Revision: 1.2 $
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+@@ -286,33 +286,27 @@
+ * @param pValue 色情報を保持する文字列
+ * @return 設定に成功した場合は true を戻す。
+ */
+-bool parseColor(GdkColor *pColor, const char *pValue)
++bool string2color(GdkColor *pColor, const char *pValue)
+ {
+- char *dummy = NULL;
+- long nColor = 0L;
+-
+ if (!pColor || !pValue) {
+ throw "Null Pointer Exception.";
+ }
+-
++
++ bool result = false;
++
++ // gtk標準方式の色を解析
+ if (gdk_color_parse(pValue, pColor)) {
+- return true;
++ result = true;
+ }
+- else {
+- if (6 == strlen(pValue)) {
+- nColor = strtol(pValue, &dummy, 16);
+-
+- if (dummy && '\0' == *dummy) {
+- pColor->red = (nColor & 0xff0000) >> 8;
+- pColor->green = (nColor & 0x00ff00);
+- pColor->blue = (nColor & 0x0000ff) << 8;
+-
+- return true;
+- }
+- }
++ // 従来(0.7.0以前)の方式の色を解析
++ else if (6 == strlen(pValue)) {
++ Glib::ustring buf = pValue;
++ buf.insert(0, "#");
++
++ result = gdk_color_parse(buf.c_str(), pColor);
+ }
+
+- return false;
++ return result;
+ }
+
+ /**
+@@ -321,14 +315,16 @@
+ * @param pColor GdkColor構造体
+ * @param szBuffer 色文字列を格納するバッファ
+ */
+-void toString(const GdkColor *pColor, Glib::ustring& szBuffer)
++void color2string(const GdkColor *pColor, Glib::ustring& szBuffer)
+ {
+- char buf[10] = {0};
++ char buf[32] = {0};
++
++ if (!pColor) {
++ throw "Null Pointer Exception.";
++ }
+
+- snprintf(buf, sizeof(buf) -1, "%02x%02x%02x",
+- (pColor->red & 0xff00) >> 8,
+- (pColor->green & 0xff00) >> 8,
+- (pColor->blue & 0xff00) >> 8);
++ snprintf(buf, sizeof(buf) -1, "#%04X%04X%04X",
++ pColor->red, pColor->green, pColor->blue);
+
+ szBuffer = buf;
+ }
+diff -urN src/net/fusenshiclient.cpp src/net/fusenshiclient.cpp
+--- src/net/fusenshiclient.cpp Thu Apr 1 17:53:12 2004
++++ src/net/fusenshiclient.cpp Thu Nov 18 16:08:43 2004
+@@ -1,10 +1,10 @@
+ /*
+- * $Id: fusenshiclient.cpp,v 1.1 2004/04/01 08:53:12 daichi Exp $
++ * $Id: fusenshiclient.cpp,v 1.4 2004/11/18 07:08:43 ozawa Exp $
+ *
+ * Copyright 2003- ONGS Inc. All rights reserved.
+ *
+ * author: Masanori OZAWA (ozawa@ongs.co.jp)
+- * version: $Revision: 1.1 $
++ * version: $Revision: 1.4 $
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+@@ -173,7 +173,7 @@
+ std::list<Glib::ustring>& ipList = serverList.getIPAddrList();
+ std::list<Glib::ustring>::iterator iter;
+
+- GString* pData = FusenshiData::toSerializedString(&data);
++ GString* pData = FusenshiData::toSerializedString(data);
+
+ for (iter = ipList.begin(); iter != ipList.end(); iter++) {
+ result &= sendFusenshiData((*iter).c_str(), pData, szNickName);
+diff -urN src/net/fusenshiserver.cpp src/net/fusenshiserver.cpp
+--- src/net/fusenshiserver.cpp Thu Apr 1 17:53:12 2004
++++ src/net/fusenshiserver.cpp Wed Nov 17 22:08:41 2004
+@@ -1,10 +1,10 @@
+ /*
+- * $Id: fusenshiserver.cpp,v 1.1 2004/04/01 08:53:12 daichi Exp $
++ * $Id: fusenshiserver.cpp,v 1.2 2004/11/17 13:08:41 ozawa Exp $
+ *
+ * Copyright 2003- ONGS Inc. All rights reserved.
+ *
+ * author: Masanori OZAWA (ozawa@ongs.co.jp)
+- * version: $Revision: 1.1 $
++ * version: $Revision: 1.2 $
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+@@ -228,23 +228,25 @@
+
+ // ユーザ、ホスト情報を受信
+ if (sizeof(length) != recv(nCSock, &length, sizeof(length), 0)) {
++ fprintf(stderr, "%s: Server: bad head block received (1).\n", APP_NAME);
+ return false;
+ }
+
+ length = ntohl(length);
+ if (2 >= length && MAX_EXT_INFO_LENGTH < length) {
++ fprintf(stderr, "%s: Server: bad head block received (2).\n", APP_NAME);
+ return false;
+ }
+
+ buf = (gchar*)g_malloc0(length);
+
+ if (!buf) {
+- fprintf(stderr, "%s: Out of Memory Error!\n", APP_NAME);
++ fprintf(stderr, "%s: Server: Out of Memory Error!\n", APP_NAME);
+ return false;
+ }
+
+- if (length != recv(nCSock, buf, length, 0) ||
+- buf[length] != '\0') {
++ if (length != recv(nCSock, buf, length, 0) || buf[length -1] != '\0') {
++ fprintf(stderr, "%s: Server: bad head block received (3).\n", APP_NAME);
+ g_free(buf);
+ return false;
+ }
+@@ -252,6 +254,7 @@
+ gchar* pTmp = strchr(buf, '|');
+
+ if (!pTmp) {
++ fprintf(stderr, "%s: Server: bad head block received (4).\n", APP_NAME);
+ g_free(buf);
+ return false;
+ }
+diff -urN src/wnd/fusenshieditdialog.cpp src/wnd/fusenshieditdialog.cpp
+--- src/wnd/fusenshieditdialog.cpp Thu Apr 1 17:53:26 2004
++++ src/wnd/fusenshieditdialog.cpp Mon Nov 22 17:20:56 2004
+@@ -1,10 +1,10 @@
+ /*
+- * $Id: fusenshieditdialog.cpp,v 1.1 2004/04/01 08:53:26 daichi Exp $
++ * $Id: fusenshieditdialog.cpp,v 1.2 2004/11/04 17:39:52 ozawa Exp $
+ *
+ * Copyright 2003- ONGS Inc. All rights reserved.
+ *
+ * author: Masanori OZAWA (ozawa@ongs.co.jp)
+- * version: $Revision: 1.1 $
++ * version: $Revision: 1.2 $
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+@@ -134,24 +134,15 @@
+ (SigC::slot(*this, &FusenshiEditDialog::on_fontname_clicked));
+
+ // 既存のデータを設定
+- gchar buf[1024] = {0};
+- const guint bufsize = sizeof(buf) -1;
++ Glib::ustring buf;
+
+- memset(buf, '\0', sizeof(buf));
+-
+ // プロパティの設定
+ Gdk::Color bgColor((GdkColor*)pData->getBackground());
+- snprintf(buf, bufsize, "#%02X%02X%02X",
+- (int)rint(bgColor.get_red_p() * 0xff),
+- (int)rint(bgColor.get_green_p() * 0xff),
+- (int)rint(bgColor.get_blue_p() * 0xff));
++ color2string(bgColor.gobj(), buf);
+ m_cBackground.set_text(buf);
+
+ Gdk::Color fgColor((GdkColor*)pData->getForeground());
+- snprintf(buf, bufsize, "#%02X%02X%02X",
+- (int)rint(fgColor.get_red_p() * 0xff),
+- (int)rint(fgColor.get_green_p() * 0xff),
+- (int)rint(fgColor.get_blue_p() * 0xff));
++ color2string(fgColor.gobj(), buf);
+ m_cForeground.set_text(buf);
+
+ m_cFontName.set_text(pData->getFontName());
+@@ -274,13 +265,9 @@
+
+ if (Gtk::RESPONSE_OK == colordlg.run()) {
+ Gdk::Color newColor = colordlg.get_colorsel()->get_current_color();
+- gchar buf[1024] = {0};
++ Glib::ustring buf;
+
+- memset(buf, '\0', sizeof(buf));
+- snprintf(buf, sizeof(buf) -1, "#%02X%02X%02X",
+- (int)rint(newColor.get_red_p() * 0xff),
+- (int)rint(newColor.get_green_p() * 0xff),
+- (int)rint(newColor.get_blue_p() * 0xff));
++ color2string(newColor.gobj(), buf);
+ m_cBackground.set_text(buf);
+ }
+ }
+@@ -302,13 +289,9 @@
+
+ if (Gtk::RESPONSE_OK == colordlg.run()) {
+ Gdk::Color newColor = colordlg.get_colorsel()->get_current_color();
+- gchar buf[1024] = {0};
++ Glib::ustring buf;
+
+- memset(buf, '\0', sizeof(buf));
+- snprintf(buf, sizeof(buf) -1, "#%02X%02X%02X",
+- (int)rint(newColor.get_red_p() * 0xff),
+- (int)rint(newColor.get_green_p() * 0xff),
+- (int)rint(newColor.get_blue_p() * 0xff));
++ color2string(newColor.gobj(), buf);
+ m_cForeground.set_text(buf);
+ }
+ }
+diff -urN src/wnd/fusenshimainwnd.cpp src/wnd/fusenshimainwnd.cpp
+--- src/wnd/fusenshimainwnd.cpp Thu Apr 1 17:53:26 2004
++++ src/wnd/fusenshimainwnd.cpp Mon Nov 22 17:52:33 2004
+@@ -1,10 +1,10 @@
+ /*
+- * $Id: fusenshimainwnd.cpp,v 1.1 2004/04/01 08:53:26 daichi Exp $
++ * $Id: fusenshimainwnd.cpp,v 1.6 2004/11/17 13:08:41 ozawa Exp $
+ *
+ * Copyright 2003- ONGS Inc. All rights reserved.
+ *
+ * author: Masanori OZAWA (ozawa@ongs.co.jp)
+- * version: $Revision: 1.1 $
++ * version: $Revision: 1.6 $
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+@@ -41,6 +41,11 @@
+ #include "../misc/resourceloader.h"
+
+ /**
++ * 唯一のインスタンス
++ */
++FusenshiMainWnd* FusenshiMainWnd::m_pInstance = NULL;
++
++/**
+ * コンストラクタ
+ */
+ FusenshiMainWnd::FusenshiMainWnd()
+@@ -92,6 +97,45 @@
+ }
+
+ /**
++ * ウィンドウを終了し、インスタンスを破棄します。
++ */
++void FusenshiMainWnd::destroy()
++{
++ if (m_pInstance) {
++ delete m_pInstance;
++ m_pInstance = NULL;
++ }
++}
++
++/**
++ * 必要に応じてインスタンスを作成し、ウィンドウを構築します。
++ */
++FusenshiMainWnd* FusenshiMainWnd::getInstance()
++{
++ if (!m_pInstance) {
++ m_pInstance = new FusenshiMainWnd();
++ }
++
++ return m_pInstance;
++}
++
++/**
++ * プロパティの変更後に必要な処理を実行します。
++ *
++ * @param property 新しいプロパティ
++ */
++void FusenshiMainWnd::updateProperty(const PropertyData& property)
++{
++ // ウィンドウを貼り付ける。
++ if (property.isStickWindow()) {
++ stick();
++ }
++ else {
++ unstick();
++ }
++}
++
++/**
+ * ウィンドウ削除
+ */
+ bool FusenshiMainWnd::on_delete_event(GdkEventAny* pEvent)
+@@ -118,28 +162,41 @@
+ int count = 0;
+ Gtk::Menu* pMenu = manage(new Gtk::Menu());
+
+-#define MENU_NUMBER 2
+- Glib::ustring pMenuLabels[MENU_NUMBER] = {
+- Glib::ustring(_("Property")),
+- Glib::ustring(_("Quit")),
+- };
+- SigC::Slot0<void> slots[MENU_NUMBER] = {
+- SigC::slot(*this, &FusenshiMainWnd::on_menu_property_activate),
+- SigC::slot(*this, &FusenshiMainWnd::on_menu_close_activate),
+- };
++#define MENU_NUMBER 3
++ Glib::ustring pMenuLabels[MENU_NUMBER] = {
++ Glib::ustring(_("Raise windows")),
++ Glib::ustring(_("Property")),
++ Glib::ustring(_("Quit")),
++ };
++ SigC::Slot0<void> slots[MENU_NUMBER] = {
++ SigC::slot(*this, &FusenshiMainWnd::on_menu_raise_windows),
++ SigC::slot(*this, &FusenshiMainWnd::on_menu_property_activate),
++ SigC::slot(*this, &FusenshiMainWnd::on_menu_close_activate),
++ };
++ const int sepPos[] = {
++ 1, 0 // 降順で指定する
++ };
+
+- // アイテムを構築
+- Gtk::MenuItem* pMenuItem = NULL;
+- for (count = 0; count < MENU_NUMBER; count++) {
+- pMenuItem = manage(new Gtk::MenuItem(pMenuLabels[count]));
+-
+- pMenu->append(*pMenuItem);
+-
+- pMenuItem->signal_activate().connect(slots[count]);
+- pMenuItem->show();
+- }
++ // アイテムを構築
++ Gtk::MenuItem* pMenuItem = NULL;
++ for (count = 0; count < MENU_NUMBER; count++) {
++ pMenuItem = manage(new Gtk::MenuItem(pMenuLabels[count]));
++
++ pMenu->append(*pMenuItem);
++
++ pMenuItem->signal_activate().connect(slots[count]);
++ pMenuItem->show();
++ }
+ #undef MENU_NUMBER
+
++ // セパレータを追加
++ for (count = 0; 0 < sepPos[count]; count++) {
++ pMenuItem = manage(new Gtk::MenuItem());
++
++ pMenu->insert(*pMenuItem, sepPos[count]);
++ pMenuItem->show();
++ }
++
+ pMenu->show();
+ pMenu->popup(pEvent->button, pEvent->time);
+
+@@ -150,14 +207,26 @@
+ }
+
+ /**
++ * ポップアップメニューの「最前面に表示」の応答処理
++ */
++void FusenshiMainWnd::on_menu_raise_windows()
++{
++ WndService::getInstance()->raiseFusenshiWndAll();
++}
++
++/**
+ * ポップアップメニューの「設定」の応答処理
+ */
+ void FusenshiMainWnd::on_menu_property_activate()
+ {
+- PropertyDialog dlg(WndService::getProperty());
++ PropertyDialog dlg(PropertyData::get());
+
+ if (Gtk::RESPONSE_OK == dlg.doModal()) {
+- WndService::setProperty(dlg.getNewData());
++ WndService* pInstance = WndService::getInstance();
++
++ PropertyData::set(dlg.getNewData()); // 変更を保持
++ pInstance->noticeProperty(); // I/Oへ通知
++ pInstance->updateProperty(); // ウィンドウを更新
+ }
+ }
+
+diff -urN src/wnd/fusenshimainwnd.h src/wnd/fusenshimainwnd.h
+--- src/wnd/fusenshimainwnd.h Thu Apr 1 17:53:26 2004
++++ src/wnd/fusenshimainwnd.h Wed Nov 17 22:08:41 2004
+@@ -1,10 +1,10 @@
+ /*
+- * $Id: fusenshimainwnd.h,v 1.1 2004/04/01 08:53:26 daichi Exp $
++ * $Id: fusenshimainwnd.h,v 1.5 2004/11/17 13:08:41 ozawa Exp $
+ *
+ * Copyright 2003- ONGS Inc. All rights reserved.
+ *
+ * author: Masanori OZAWA (ozawa@ongs.co.jp)
+- * version: $Revision: 1.1 $
++ * version: $Revision: 1.5 $
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+@@ -40,17 +40,37 @@
+
+ class FusenshiMainWnd : public Gtk::Window
+ {
+-public:
++private:
+ /**
+ * コンストラクタ
+ */
+ FusenshiMainWnd();
+
++public:
+ /**
+ * デストラクタ
+ */
+ virtual ~FusenshiMainWnd();
+
++public:
++ /**
++ * プロパティの変更後に必要な処理を実行します。
++ *
++ * @param property 新しいプロパティ
++ */
++ void updateProperty(const PropertyData& property);
++
++public:
++ /**
++ * ウィンドウを終了し、インスタンスを破棄します。
++ */
++ static void destroy();
++
++ /**
++ * 必要に応じてインスタンスを作成し、ウィンドウを構築します。
++ */
++ static FusenshiMainWnd* getInstance();
++
+ protected:
+ /**
+ * ボタン押下応答処理
+@@ -66,7 +86,12 @@
+ * ウィンドウ削除
+ */
+ virtual bool on_delete_event(GdkEventAny* pEvent);
+-
++
++ /**
++ * ポップアップメニューの「最前面に表示」の応答処理
++ */
++ virtual void on_menu_raise_windows();
++
+ /**
+ * ポップアップメニューの「設定」の応答処理
+ */
+@@ -82,6 +107,12 @@
+ * ボタン
+ */
+ Gtk::Button m_cButton;
++
++private:
++ /**
++ * 唯一の付箋紙メインウィンドウ
++ */
++ static FusenshiMainWnd *m_pInstance;
+ };
+
+ #endif
+diff -urN src/wnd/fusenshiwnd.cpp src/wnd/fusenshiwnd.cpp
+--- src/wnd/fusenshiwnd.cpp Thu Apr 1 17:53:26 2004
++++ src/wnd/fusenshiwnd.cpp Mon Nov 22 17:52:51 2004
+@@ -1,10 +1,10 @@
+ /*
+- * $Id: fusenshiwnd.cpp,v 1.1 2004/04/01 08:53:26 daichi Exp $
++ * $Id: fusenshiwnd.cpp,v 1.6 2004/11/17 13:08:41 ozawa Exp $
+ *
+ * Copyright 2003- ONGS Inc. All rights reserved.
+ *
+ * author: Masanori OZAWA (ozawa@ongs.co.jp)
+- * version: $Revision: 1.1 $
++ * version: $Revision: 1.6 $
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+@@ -244,10 +244,6 @@
+ // 最大化する
+ maximize();
+ }
+- else if (nStyle & GDK_WINDOW_STATE_STICKY) {
+- // 棒状にする(タイトルバーのみにする)
+- stick();
+- }
+
+ // テキストを設定
+ Glib::RefPtr<Gtk::TextBuffer> textBuffer =
+@@ -271,6 +267,7 @@
+ memset(&attributes, 0, sizeof(attributes));
+ attributes.map_state = IsUnviewable;
+
++ gdk_error_trap_push();
+ if (XGetWindowAttributes
+ (GDK_WINDOW_XDISPLAY(pWindow),
+ GDK_WINDOW_XWINDOW(pWindow), &attributes))
+@@ -282,11 +279,28 @@
+ result = window->get_state();
+ }
+ }
++ gdk_error_trap_pop();
+
+ return result;
+ }
+
+ /**
++ * プロパティの変更後に必要な処理を実行します。
++ *
++ * @param property 新しいプロパティ
++ */
++void FusenshiWnd::updateProperty(const PropertyData& property)
++{
++ // ウィンドウを貼る
++ if (property.isStickWindow()) {
++ stick();
++ }
++ else {
++ unstick();
++ }
++}
++
++/**
+ * 付箋紙ウィンドウの標準タイプを設定します。
+ *
+ * @param nWndType 付箋紙ウィンドウの標準タイプ
+@@ -303,7 +317,7 @@
+ {
+ // 付箋紙削除を確認する
+ Gtk::MessageDialog dialog
+- (_("May I delete this note?"),
++ (_("May I delete this note?"),
+ Gtk::MESSAGE_QUESTION, Gtk::BUTTONS_OK_CANCEL, true, false);
+
+ if (Gtk::RESPONSE_OK == dialog.run()) {
+@@ -388,7 +402,7 @@
+ // 送信
+ bool bSend = FusenshiClient::sendFusenshiData
+ (senddlg.getServerList(), *m_pData,
+- WndService::getProperty().getNickName());
++ PropertyData::get().getNickName());
+
+ if (!bSend) {
+ Gtk::MessageDialog msgDlg
+@@ -408,7 +422,7 @@
+ void FusenshiWnd::on_print()
+ {
+ EntryDialog dlg(_("Fusenshi - Print"));
+- PropertyData property = WndService::getProperty();
++ const PropertyData& property = PropertyData::get();
+
+ dlg.setEntryLabel(_("Print command:"));
+ dlg.setMessageLabel(_(" %1: Exchange to print file."));
+@@ -459,6 +473,16 @@
+ 5, 3, 0 // 降順で指定する
+ };
+
++ // ウィンドウ状態にあわせてメニューラベルを変更する
++ int style = getXLibWindowStyle();
++
++ if (style & GDK_WINDOW_STATE_MAXIMIZED) { // Maximize
++ pMenuLabels[3] = _("Unmaximize");
++ }
++ else if (style & GDK_WINDOW_STATE_ICONIFIED) { // Minimize
++ pMenuLabels[4] = _("Unminimize");
++ }
++
+ // 既存のアイテムを削除
+ std::list<Widget*> pList = pMenu->get_children();
+ std::list<Widget*>::iterator pIter;
+@@ -469,7 +493,7 @@
+
+ // アイテムを構築
+ Gtk::MenuItem* pMenuItem = NULL;
+- PropertyData property = WndService::getProperty();
++ const PropertyData& property = PropertyData::get();
+
+ for (count = 0; count < MENU_NUMBER; count++) {
+ pMenuItem = manage(new Gtk::MenuItem(pMenuLabels[count]));
+@@ -503,21 +527,27 @@
+ // 初期化完了フラグをチェック
+ int bInit = (int)get_data(g_cQuarkInitFlag);
+
+- if (bInit && 0 == getXLibWindowStyle()) {
+- int nX, nY, nWidth, nHeight;
+-
+- // ウィンドウポジション取得
+- get_position(nX, nY);
+-
+- // ウィンドウサイズ取得
+- get_size(nWidth, nHeight);
+-
+- // 保存を要求する
+- m_pData->setXPos(nX);
+- m_pData->setYPos(nY);
+- m_pData->setWidth(nWidth);
+- m_pData->setHeight(nHeight);
+- WndService::getInstance()->saveFusenshi(m_nFileID, m_pData);
++ if (bInit) {
++ /*
++ * ウィンドウが通常状態の場合のみ、位置とサイズを保存する。
++ * ただし、貼り付け状態は位置/サイズに影響しないため無視する。
++ */
++ if (0 == (getXLibWindowStyle() & ~Gdk::WINDOW_STATE_STICKY)) {
++ int nX, nY, nWidth, nHeight;
++
++ // ウィンドウポジション取得
++ get_position(nX, nY);
++
++ // ウィンドウサイズ取得
++ get_size(nWidth, nHeight);
++
++ // 保存を要求する
++ m_pData->setXPos(nX);
++ m_pData->setYPos(nY);
++ m_pData->setWidth(nWidth);
++ m_pData->setHeight(nHeight);
++ WndService::getInstance()->saveFusenshi(m_nFileID, m_pData);
++ }
+ }
+
+ // ウィンドウの形状を調整
+diff -urN src/wnd/fusenshiwnd.h src/wnd/fusenshiwnd.h
+--- src/wnd/fusenshiwnd.h Thu Apr 1 20:55:30 2004
++++ src/wnd/fusenshiwnd.h Fri Nov 5 17:08:30 2004
+@@ -1,10 +1,10 @@
+ /*
+- * $Id: fusenshiwnd.h,v 1.2 2004/04/01 11:55:30 daichi Exp $
++ * $Id: fusenshiwnd.h,v 1.4 2004/11/05 08:08:30 ozawa Exp $
+ *
+ * Copyright 2003- ONGS Inc. All rights reserved.
+ *
+ * author: Masanori OZAWA (ozawa@ongs.co.jp)
+- * version: $Revision: 1.2 $
++ * version: $Revision: 1.4 $
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+@@ -55,12 +55,20 @@
+
+ public:
+ /**
++ * プロパティの変更後に必要な処理を実行します。
++ *
++ * @param property 新しいプロパティ
++ */
++ void updateProperty(const PropertyData& property);
++
++public:
++ /**
+ * 付箋紙ウィンドウの標準タイプを設定します。
+ *
+ * @param pWndProp 付箋紙ウィンドウの標準タイプ
+ */
+ static void setDefaultWindowType(WND_TYPE nWndType);
+-
++
+ protected:
+ /**
+ * ウィンドウの削除要求を処理します。
+diff -urN src/wnd/propertydialog.cpp src/wnd/propertydialog.cpp
+--- src/wnd/propertydialog.cpp Thu Apr 1 17:53:26 2004
++++ src/wnd/propertydialog.cpp Mon Nov 22 17:23:37 2004
+@@ -1,10 +1,10 @@
+ /*
+- * $Id: propertydialog.cpp,v 1.1 2004/04/01 08:53:26 daichi Exp $
++ * $Id: propertydialog.cpp,v 1.3 2004/11/04 17:39:52 ozawa Exp $
+ *
+ * Copyright 2003- ONGS Inc. All rights reserved.
+ *
+ * author: Masanori OZAWA (ozawa@ongs.co.jp)
+- * version: $Revision: 1.1 $
++ * version: $Revision: 1.3 $
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+@@ -59,6 +59,7 @@
+
+ createBasePage(*pNotebook);
+ createNetworkPage(*pNotebook);
++ createWindowPage(*pNotebook);
+
+ get_action_area()->set_layout(Gtk::BUTTONBOX_END);
+
+@@ -73,26 +74,17 @@
+ set_default_response(Gtk::RESPONSE_OK);
+
+ // 既存のデータを設定
+- gchar buf[1024] = {0};
+- const guint bufsize = sizeof(buf) -1;
+-
+- memset(buf, '\0', sizeof(buf));
++ Glib::ustring buf;
+
+ // プロパティの設定
+ m_cNickName.set_text(m_cData.getNickName());
+
+ Gdk::Color bgColor((GdkColor*)m_cData.getBackground());
+- snprintf(buf, bufsize, "#%02X%02X%02X",
+- (int)rint(bgColor.get_red_p() * 0xff),
+- (int)rint(bgColor.get_green_p() * 0xff),
+- (int)rint(bgColor.get_blue_p() * 0xff));
++ color2string(bgColor.gobj(), buf);
+ m_cBackground.set_text(buf);
+
+ Gdk::Color fgColor((GdkColor*)m_cData.getForeground());
+- snprintf(buf, bufsize, "#%02X%02X%02X",
+- (int)rint(fgColor.get_red_p() * 0xff),
+- (int)rint(fgColor.get_green_p() * 0xff),
+- (int)rint(fgColor.get_blue_p() * 0xff));
++ color2string(fgColor.gobj(), buf);
+ m_cForeground.set_text(buf);
+
+ m_cFontName.set_text(m_cData.getFontName());
+@@ -109,6 +101,8 @@
+ Gtk::TreeIter treeiter = getListStore()->append();
+ treeiter->set_value(m_cColumns.BROADCAST_ADDR, *iter);
+ }
++
++ m_cStickWindow.set_active(m_cData.isStickWindow());
+ }
+
+ /**
+@@ -253,6 +247,22 @@
+ }
+
+ /**
++ * ウィンドウ設定ページを構築します。
++ */
++void PropertyDialog::createWindowPage(Gtk::Notebook& notebook)
++{
++ Gtk::Fixed* pFixed = manage(new Gtk::Fixed());
++ notebook.add(*pFixed);
++
++ notebook.set_tab_label_text
++ (*(notebook.get_nth_page(2)), _("Window"));
++
++ pFixed->put(m_cStickWindow, 10, 10);
++ m_cStickWindow.set_size_request(250, 24);
++ m_cStickWindow.set_label(_("Show on all desktops"));
++}
++
++/**
+ * リストモデルを一時的に取得します。
+ */
+ Glib::RefPtr<Gtk::ListStore> PropertyDialog::getListStore()
+@@ -335,6 +345,7 @@
+ m_cData.setFontName(m_cFontName.get_text().c_str());
+ m_cData.setEnableNetwork(m_cNetButton.get_active());
+ m_cData.setPrintCommand(m_cPrintCommand.get_text().c_str());
++ m_cData.setStickWindow(m_cStickWindow.get_active());
+
+ Gtk::TreeIter iter = getListStore()->children().begin();
+ Gtk::TreeIter enditer = getListStore()->children().end();
+@@ -366,13 +377,9 @@
+
+ if (Gtk::RESPONSE_OK == colordlg.run()) {
+ Gdk::Color newColor = colordlg.get_colorsel()->get_current_color();
+- gchar buf[1024] = {0};
++ Glib::ustring buf;
+
+- memset(buf, '\0', sizeof(buf));
+- snprintf(buf, sizeof(buf) -1, "#%02X%02X%02X",
+- (int)rint(newColor.get_red_p() * 0xff),
+- (int)rint(newColor.get_green_p() * 0xff),
+- (int)rint(newColor.get_blue_p() * 0xff));
++ color2string(newColor.gobj(), buf);
+ m_cBackground.set_text(buf);
+ }
+ }
+@@ -394,13 +401,9 @@
+
+ if (Gtk::RESPONSE_OK == colordlg.run()) {
+ Gdk::Color newColor = colordlg.get_colorsel()->get_current_color();
+- gchar buf[1024] = {0};
++ Glib::ustring buf;
+
+- memset(buf, '\0', sizeof(buf));
+- snprintf(buf, sizeof(buf) -1, "#%02X%02X%02X",
+- (int)rint(newColor.get_red_p() * 0xff),
+- (int)rint(newColor.get_green_p() * 0xff),
+- (int)rint(newColor.get_blue_p() * 0xff));
++ color2string(newColor.gobj(), buf);
+ m_cForeground.set_text(buf);
+ }
+ }
+@@ -440,8 +443,7 @@
+ msg.insert(1, addr);
+
+ Gtk::MessageDialog dialog
+- (msg, Gtk::MESSAGE_ERROR,
+- Gtk::BUTTONS_OK, true, false);
++ (msg, Gtk::MESSAGE_ERROR, Gtk::BUTTONS_OK, true, false);
+
+ dialog.set_transient_for(*this);
+
+diff -urN src/wnd/propertydialog.h src/wnd/propertydialog.h
+--- src/wnd/propertydialog.h Thu Apr 1 17:53:26 2004
++++ src/wnd/propertydialog.h Tue Nov 2 19:47:43 2004
+@@ -1,5 +1,5 @@
+ /*
+- * $Id: propertydialog.h,v 1.1 2004/04/01 08:53:26 daichi Exp $
++ * $Id: propertydialog.h,v 1.2 2004/11/02 10:47:43 ozawa Exp $
+ *
+ * Copyright 2003- ONGS Inc. All rights reserved.
+ *
+@@ -122,6 +122,11 @@
+ */
+ void createNetworkPage(Gtk::Notebook& notebook);
+
++ /**
++ * ウィンドウ設定ページを構築します。
++ */
++ void createWindowPage(Gtk::Notebook& notebook);
++
+ private:
+ /**
+ * カラム保持クラス
+@@ -200,6 +205,11 @@
+ * ツリービューのリストモデル
+ */
+ Glib::RefPtr<Gtk::ListStore> m_cListStore;
++
++ /**
++ * ウィンドウの張り付けフラグ
++ */
++ Gtk::CheckButton m_cStickWindow;
+ };
+
+ #endif
+diff -urN src/wnd/senddialog.cpp src/wnd/senddialog.cpp
+--- src/wnd/senddialog.cpp Thu Apr 1 17:53:26 2004
++++ src/wnd/senddialog.cpp Mon Nov 22 17:58:06 2004
+@@ -1,10 +1,10 @@
+ /*
+- * $Id: senddialog.cpp,v 1.1 2004/04/01 08:53:26 daichi Exp $
++ * $Id: senddialog.cpp,v 1.3 2004/11/05 08:08:30 ozawa Exp $
+ *
+ * Copyright 2003- ONGS Inc. All rights reserved.
+ *
+ * author: Masanori OZAWA (ozawa@ongs.co.jp)
+- * version: $Revision: 1.1 $
++ * version: $Revision: 1.3 $
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+@@ -172,7 +172,7 @@
+ m_nClients = 0;
+
+ // リクエストを送信
+- FusenshiClient::sendServerInfoRequest(WndService::getProperty());
++ FusenshiClient::sendServerInfoRequest(PropertyData::get());
+ }
+
+ /**
+diff -urN src/wnd/senddialog.h src/wnd/senddialog.h
+--- src/wnd/senddialog.h Thu Apr 1 17:53:26 2004
++++ src/wnd/senddialog.h Mon Nov 22 17:58:19 2004
+@@ -1,10 +1,10 @@
+ /*
+- * $Id: senddialog.h,v 1.1 2004/04/01 08:53:26 daichi Exp $
++ * $Id: senddialog.h,v 1.2 2004/11/04 17:39:52 ozawa Exp $
+ *
+ * Copyright 2003- ONGS Inc. All rights reserved.
+ *
+ * author: Masanori OZAWA (ozawa@ongs.co.jp)
+- * version: $Revision: 1.1 $
++ * version: $Revision: 1.2 $
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+diff -urN src/wnd/wnd.cpp src/wnd/wnd.cpp
+--- src/wnd/wnd.cpp Thu Apr 1 17:53:26 2004
++++ src/wnd/wnd.cpp Tue Nov 2 19:47:43 2004
+@@ -1,10 +1,10 @@
+ /*
+- * $Id: wnd.cpp,v 1.1 2004/04/01 08:53:26 daichi Exp $
++ * $Id: wnd.cpp,v 1.2 2004/11/02 10:47:43 ozawa Exp $
+ *
+ * Copyright 2003- ONGS Inc. All rights reserved.
+ *
+ * author: Masanori OZAWA (ozawa@ongs.co.jp)
+- * version: $Revision: 1.1 $
++ * version: $Revision: 1.2 $
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+@@ -75,7 +75,7 @@
+ FusenshiWnd::setDefaultWindowType(lpWndGlobalProp->wndType);
+
+ // トップレベルウィンドウの構築
+- FusenshiMainWnd *pMainWnd = new FusenshiMainWnd();
++ FusenshiMainWnd *pMainWnd = FusenshiMainWnd::getInstance();
+
+ if (!pMainWnd) {
+ throw "Can't create top level window.";
+@@ -121,8 +121,7 @@
+ g_thread_join(pThread);
+
+ // 後始末
+- delete pMainWnd;
+-
++ FusenshiMainWnd::destroy();
+ WndService::destroy();
+ FusenshiServerInfo::destroy();
+ }
+diff -urN src/wnd/wndservice.cpp src/wnd/wndservice.cpp
+--- src/wnd/wndservice.cpp Thu Apr 1 17:53:26 2004
++++ src/wnd/wndservice.cpp Mon Nov 22 18:01:15 2004
+@@ -1,10 +1,10 @@
+ /*
+- * $Id: wndservice.cpp,v 1.1 2004/04/01 08:53:26 daichi Exp $
+- *g
++ * $Id: wndservice.cpp,v 1.5 2004/11/05 08:41:20 ozawa Exp $
++ *
+ * Copyright 2003- ONGS Inc. All rights reserved.
+ *
+ * author: Masanori OZAWA (ozawa@ongs.co.jp)
+- * version: $Revision: 1.1 $
++ * version: $Revision: 1.5 $
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+@@ -35,6 +35,7 @@
+
+ #include "../include/fusenshi.h"
+ #include "wndservice.h"
++#include "fusenshimainwnd.h"
+
+ #include <sys/select.h>
+ #include <signal.h>
+@@ -132,6 +133,23 @@
+ }
+
+ /**
++ * 付箋紙ウィンドウを全て最前面に表示します。
++ */
++void WndService::raiseFusenshiWndAll()
++{
++ FusenshiWndList::iterator iter;
++
++ g_mutex_lock(m_pMutex);
++
++ iter = m_cWndList.begin();
++ for (; m_cWndList.end() != iter; iter++) {
++ (*iter)->raise();
++ }
++
++ g_mutex_unlock(m_pMutex);
++}
++
++/**
+ * 付箋紙ファイルの更新をファイルI/Oプロセスに要求します。
+ *
+ * @param nFileID ファイルID
+@@ -139,7 +157,7 @@
+ */
+ void WndService::saveFusenshi(guint nFileID, const FusenshiData* pData)
+ {
+- GString* pStrData = FusenshiData::toSerializedString(pData);
++ GString* pStrData = FusenshiData::toSerializedString(*pData);
+
+ if (pStrData) {
+ m_pCommand->addCommand(SAVE_FUSENSHI, nFileID, (gpointer)pStrData);
+@@ -319,48 +337,18 @@
+ }
+
+ /**
+- * 付箋紙の設定を取得します。
+- *
+- * @return 付箋紙の設定
+- */
+-PropertyData WndService::getProperty()
+-{
+- static bool bLoad = false;
+-
+- if (!bLoad) {
+- try {
+- WndService::m_cProperty = PropertyData::loadProperty();
+- }
+- catch (...) {
+- fprintf(stderr, "%s: Can't load property file.", APP_NAME);
+- }
+-
+- bLoad = true;
+- }
+-
+- return WndService::m_cProperty;
+-}
+-
+-/**
+- * 付箋紙の設定を設定し、直ちに保管します。
+- *
+- * @param property 付箋紙の設定
++ * プロパティの変更をファイルI/Oプロセスへ通知します。
+ */
+-void WndService::setProperty(const PropertyData& property)
++void WndService::noticeProperty()
+ {
+- if (!PropertyData::saveProperty(property)) {
+- fprintf(stderr, "%s: Can't save property file.", APP_NAME);
++ // 設定の変更を通知する
++ GString* pStrData = PropertyData::toSerializedString(PropertyData::get());
++
++ if (pStrData) {
++ m_pCommand->addCommand(PROPERTY_CHANGED, 0, pStrData);
+ }
+ else {
+- // 設定を保持
+- WndService::m_cProperty = property;
+-
+- // 設定の変更を反映
+- WndService::updateProperty();
+-
+- // 設定の変更を通知する
+- WndService *pInstance = WndService::getInstance();
+- pInstance->m_pCommand->addCommand(PROPERTY_CHANGED, 0, NULL);
++ throw "Out of Memory Error!";
+ }
+ }
+
+@@ -369,7 +357,7 @@
+ */
+ void WndService::updateProperty()
+ {
+- PropertyData property = WndService::getProperty();
++ const PropertyData& property = PropertyData::get();
+
+ #ifndef WITHOUT_NETWORK
+ // ネットワークの有効/無効の調整
+@@ -390,6 +378,25 @@
+ FusenshiServerInfo::destroy();
+ }
+ #endif
++
++ // 付箋紙メインウィンドウの状態を変更
++ FusenshiMainWnd *pMainWnd = FusenshiMainWnd::getInstance();
++
++ if (pMainWnd) {
++ pMainWnd->updateProperty(property);
++ }
++
++ // 付箋紙ウィンドウの状態を変更
++ FusenshiWndList::iterator iter;
++
++ g_mutex_lock(m_pMutex);
++
++ iter = m_cWndList.begin();
++ for (; m_cWndList.end() != iter; iter++) {
++ (*iter)->updateProperty(property);
++ }
++
++ g_mutex_unlock(m_pMutex);
+ }
+
+ /**
+@@ -401,6 +408,7 @@
+ {
+ GString* pString = NULL;
+ NetworkFusenshiData* pData = NULL;
++ PropertyData property;
+
+ switch (lpCommand->nCommandID) {
+ case CREATE_NEW_FUSENSHI_WINDOW:
+@@ -422,8 +430,11 @@
+ }
+ break;
+ case PROPERTY_CHANGED:
+- WndService::m_cProperty = PropertyData::loadProperty();
+- WndService::updateProperty();
++ pString = (GString*)lpCommand->pData;
++ property = PropertyData::buildObject(pString);
++ // 保持と更新
++ PropertyData::set(property); // 保存はI/O側で行う
++ updateProperty();
+ break;
+ default:
+ break;
+@@ -448,6 +459,10 @@
+ throw "Out of Memory Error.";
+ }
+
++ // プロパティの設定
++ const PropertyData& property = PropertyData::get();
++ pWnd->updateProperty(property);
++
+ // 表示
+ pWnd->show();
+
+@@ -531,9 +546,7 @@
+
+ // 受信の確認
+ Gtk::MessageDialog dialog
+- (buf,
+- Gtk::MESSAGE_QUESTION,
+- Gtk::BUTTONS_OK_CANCEL, true, false);
++ (buf, Gtk::MESSAGE_QUESTION, Gtk::BUTTONS_OK_CANCEL, true, false);
+
+ dialog.set_position(Gtk::WIN_POS_CENTER);
+ dialog.set_default_response(Gtk::RESPONSE_OK);
+diff -urN src/wnd/wndservice.h src/wnd/wndservice.h
+--- src/wnd/wndservice.h Thu Apr 1 17:53:26 2004
++++ src/wnd/wndservice.h Fri Nov 5 17:41:20 2004
+@@ -1,10 +1,10 @@
+ /*
+- * $Id: wndservice.h,v 1.1 2004/04/01 08:53:26 daichi Exp $
++ * $Id: wndservice.h,v 1.4 2004/11/05 08:41:20 ozawa Exp $
+ *
+ * Copyright 2003- ONGS Inc. All rights reserved.
+ *
+ * author: Masanori OZAWA (ozawa@ongs.co.jp)
+- * version: $Revision: 1.1 $
++ * version: $Revision: 1.4 $
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+@@ -80,6 +80,11 @@
+ * @param szCommand 印刷コマンド
+ */
+ void printFusenshi(guint nFileID, Glib::ustring& szCommand);
++
++ /**
++ * 付箋紙ウィンドウを全て最前面に表示します。
++ */
++ void raiseFusenshiWndAll();
+
+ /**
+ * 付箋紙ファイルの更新をファイルI/Oプロセスに要求します。
+@@ -104,6 +109,16 @@
+ */
+ void waitFor();
+
++ /**
++ * プロパティの変更をファイルI/Oプロセスへ通知します。
++ */
++ void noticeProperty();
++
++ /**
++ * プロパティの変更後に必要な処理を実行します。
++ */
++ void updateProperty();
++
+ public:
+ /**
+ * インスタンスを破棄し、アプリケーションの終了準備を
+@@ -128,20 +143,6 @@
+ */
+ static WndService* getInstance(int inFD, int outFD);
+
+- /**
+- * 付箋紙の設定を取得します。
+- *
+- * @return 付箋紙の設定
+- */
+- static PropertyData getProperty();
+-
+- /**
+- * 付箋紙の設定を設定し、直ちに保管します。
+- *
+- * @param property 付箋紙の設定
+- */
+- static void setProperty(const PropertyData& property);
+-
+ public:
+ /**
+ * デストラクタ
+@@ -182,12 +183,6 @@
+ * @return 開いても良い場合は Gtk::RESPONSE_OK を戻します。
+ */
+ gint verifyReceive(const NetworkFusenshiData* pData);
+-
+-private:
+- /**
+- * プロパティの変更後に必要な処理を実行します。
+- */
+- static void updateProperty();
+
+ private:
+ /**