00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031 #include <cstdio>
00032 #include <cstring>
00033 #include <sys/types.h>
00034 #include <stdlib.h>
00035 #include <unistd.h>
00036 #include <string.h>
00037 #include <gconf/gconf-client.h>
00038 #include <liberipc/eripc.h>
00039 #include <liberipc/eripc_support.h>
00040 #include <liberutils/er_error.h>
00041 #include <liberscribble/scb.h>
00042
00043 #include "config.h"
00044 #include "i18n.h"
00045 #include "log.h"
00046
00047 #include "notepad_window.h"
00048 #include "notepad_utils.h"
00049 #include "notepad_ipc.h"
00050
00051 namespace notepad
00052 {
00053
00054
00055
00056
00057 static eripc_client_context_t *eripcClient = 0;
00058 static int g_xid = 0;
00059
00060
00061 static notepad::CNotepadWindow* gInstance = 0;
00062
00063
00064 static GConfClient* gClient = 0;
00065 static PenSize gPensize = GCONF_DEFAULT_PEN_SIZE;
00066 static gchar gMountpoint[88];
00067
00068
00069
00070
00071
00072
00073
00074 static const char *MENU = "notepad_menu";
00075 static const char *ipc_menu = NULL;
00076
00077
00078
00079 static const char *GROUP_PEN_TYPE = "notepad_pen_types";
00080 static const char *ITEM_PEN = "pen";
00081 static const char *ITEM_ERASER = "eraser";
00082
00083 static const char *GROUP_PEN = "notepad_pen";
00084
00085 static const char *GROUP_PEN2 = "notepad_pen2";
00086
00087 static const char *GROUP_PEN_SIZE = "notepad_pen_size";
00088 static const char *ITEM_PEN_FINE = "pen_fine";
00089 static const char *ITEM_PEN_SMALL = "pen_small";
00090 static const char *ITEM_PEN_MEDIUM = "pen_medium";
00091 static const char *ITEM_PEN_LARGE = "pen_large";
00092 static const char *ITEM_PEN_XLARGE = "pen_xlarge";
00093
00094
00095 static const char *GROUP_ACTIONS = "notepad_actions";
00096 static const char *ITEM_ACTION_GOTOPAGE = "goto_page";
00097 static const char *ITEM_ACTION_INSERTPAGE = "insert_page";
00098 static const char *ITEM_ACTION_DELETEPAGE = "delete_page";
00099 static const char *ITEM_ACTION_CLEARPAGE = "clear_page";
00100 static const char *ITEM_ACTION_RENAME = "rename";
00101 #if MACHINE_IS_DR1000S || MACHINE_IS_DR1000SW
00102 static const char *ITEM_ACTION_CLOSE = "close";
00103 #endif
00104
00105
00106 static const char *MENU_STATE_NORMAL = "normal";
00107 static const char *MENU_STATE_SELECTED = "selected";
00108 static const char *MENU_STATE_DISABLED = "disabled";
00109
00110
00111 static const char *STYLUS_PEN = "pen";
00112 static const char *STYLUS_ERASER = "eraser";
00113
00114
00115
00116
00117
00118
00119 static void ipc_gconf_initialize(void);
00120 static void ipc_gconf_read(void);
00121 static void ipc_gconf_write(void);
00122 static void ipc_gconf_finalize(void);
00123
00124 static void ipc_menu_update_toolbar(void);
00125 static void menu_show(void);
00126 static void menu_set_text(void);
00127 static gboolean ipc_status_set_stylus( const char *state );
00128
00129
00130
00131 static void on_page_change(
00132 eripc_context_t *context,
00133 const eripc_event_info_t *info,
00134 void *user_data );
00135
00136 static void on_window_activated(
00137 eripc_context_t *context,
00138 const eripc_event_info_t *info,
00139 void *user_data );
00140
00141 static void on_window_deactivated(
00142 eripc_context_t *context,
00143 const eripc_event_info_t *info,
00144 void *user_data );
00145
00146 static void on_menu_item(
00147 eripc_context_t *context,
00148 const eripc_event_info_t *info,
00149 void *user_data );
00150
00151 static void on_changed_locale(
00152 eripc_context_t *context,
00153 const eripc_event_info_t *info,
00154 void *user_data );
00155
00156 static void on_changed_pen(
00157 eripc_context_t *context,
00158 const eripc_event_info_t *info,
00159 void *user_data );
00160
00161 static void on_prepare_unmount(
00162 eripc_context_t *context,
00163 const eripc_event_info_t *info,
00164 void *user_data );
00165
00166 static void on_volume_unmounted(
00167 eripc_context_t *context,
00168 const eripc_event_info_t *info,
00169 void *user_data );
00170
00171 static void on_prepare_standby(
00172 eripc_context_t *context,
00173 const eripc_event_info_t *info,
00174 void *user_data );
00175
00176 #if MACHINE_IS_DR800S || MACHINE_IS_DR800SG || MACHINE_IS_DR800SW
00177 static void on_sys_changed_pageturn_inverted (eripc_context_t *context,
00178 const eripc_event_info_t *info,
00179 void *user_data);
00180 #endif
00181
00182 static void on_changed_orientation(
00183 eripc_context_t *context,
00184 const eripc_event_info_t *info,
00185 void *user_data );
00186
00187
00188
00189
00190 static eripc_callback_function_t service_functions[] = {
00191 { on_menu_item, "menuItemActivated", NULL , 0 },
00192 { on_window_activated, "activatedWindow", NULL , 0 },
00193 { on_window_deactivated,"deactivatedWindow", NULL , 0 },
00194 { on_page_change, "pageChange", NULL , 0 },
00195 { on_changed_pen, "statusItemActivated", NULL , 0 },
00196 { on_changed_locale, "sysChangedLocale", DBUS_SERVICE_SYSTEM_CONTROL , 0 },
00197 { on_prepare_unmount, "sysPrepareUnmount", DBUS_SERVICE_SYSTEM_CONTROL , 0 },
00198 { on_volume_unmounted, "sysVolumeUnmounted", DBUS_SERVICE_SYSTEM_CONTROL , 0 },
00199 { on_prepare_standby, "sysPrepareStandby", DBUS_SERVICE_SYSTEM_CONTROL , 0 },
00200 #if MACHINE_IS_DR800S || MACHINE_IS_DR800SG || MACHINE_IS_DR800SW
00201 { on_sys_changed_pageturn_inverted, "sysChangedPageturnInverted", DBUS_SERVICE_SYSTEM_CONTROL , 0},
00202 #endif
00203 { on_changed_orientation, "sysChangedOrientation", DBUS_SERVICE_SYSTEM_CONTROL , 0 },
00204 { NULL, NULL, NULL, 0 }
00205 };
00206
00207
00208
00209
00210
00211
00212
00213 gboolean ipc_set_services(void)
00214 {
00215
00216 pid_t pid = getpid();
00217 char name[128];
00218 sprintf(name, "%s_%05d", DBUS_APPL_NAME, pid);
00219 char service[128];
00220 sprintf(service, "%s_%05d", DBUS_SERVICE, pid);
00221 char path[128];
00222 sprintf(path, "%s_%05d", DBUS_PATH, pid);
00223 char interface[128];
00224 sprintf(interface, "%s_%05d", DBUS_INTERFACE, pid);
00225
00226 eripcClient = eripc_client_context_new(
00227 name,
00228 "1.0",
00229 service,
00230 path,
00231 interface,
00232 service_functions);
00233 return (eripcClient != NULL);
00234 }
00235
00236
00237 void ipc_unset_services(void)
00238 {
00239 ipc_gconf_finalize();
00240 eripc_client_context_free(eripcClient, service_functions);
00241
00242 }
00243
00244 gboolean ipc_sys_busy(gboolean busy)
00245 {
00246 LOGPRINTF("entry %d", busy);
00247
00248 if (busy)
00249 {
00250 return eripc_sysd_set_busy(eripcClient, "delaydialog", NULL);
00251 }
00252 else
00253 {
00254 return eripc_sysd_reset_busy(eripcClient);
00255 }
00256 }
00257
00258 gboolean ipc_sys_bg_busy(gboolean busy)
00259 {
00260 LOGPRINTF("entry %d", busy);
00261
00262 if (busy)
00263 {
00264 return eripc_sysd_set_bg_busy(eripcClient);
00265 }
00266 else
00267 {
00268 return eripc_sysd_reset_bg_busy(eripcClient);
00269 }
00270 }
00271
00272 const char* ipc_get_mountpoint()
00273 {
00274 if (0 == g_strcmp0(gMountpoint, ""))
00275 {
00276 g_assert(eripcClient);
00277 eripc_event_info_t* reply = NULL;
00278 eripc_error_t result = eripc_send_varargs_and_wait( eripcClient->context,
00279 &reply,
00280 ERIPC_BUS_SESSION,
00281 DBUS_SERVICE_SYSTEM_CONTROL,
00282 "sysGetCardMountPoint",
00283 ERIPC_TYPE_INVALID);
00284 if (result != ERIPC_ERROR_SUCCESS)
00285 {
00286 ERRORPRINTF("%s: eripc_send_varargs returns [%d]", __func__, result);
00287 return NULL;
00288 }
00289 g_assert(reply);
00290 g_assert(reply->args);
00291 g_assert(reply->args[0].type == ERIPC_TYPE_STRING);
00292 const char* valuestr = reply->args[0].value.s;
00293 if (valuestr[0] != 0)
00294 strncpy(gMountpoint, valuestr, 88-1);
00295 LOGPRINTF("mountpoint %s", gMountpoint);
00296 eripc_event_info_free(eripcClient->context, reply);
00297 }
00298 return gMountpoint;
00299 }
00300
00301
00302 void ipc_sys_startup_complete(int xid)
00303 {
00304
00305 gMountpoint[0] = 0;
00306 gPensize = GCONF_DEFAULT_PEN_SIZE;
00307
00308 ipc_gconf_initialize();
00309 ipc_gconf_read();
00310
00311
00312 g_xid = xid;
00313 eripc_sysd_startup_complete( eripcClient, getpid(), FALSE, xid);
00314
00315
00316 menu_show();
00317 }
00318
00319 void ipc_change_filename(const gchar* filename, const gchar* label)
00320 {
00321 g_assert(g_xid);
00322 eripc_send_varargs(eripcClient->context, NULL, NULL, ERIPC_BUS_SESSION,
00323 DBUS_SERVICE_SYSTEM_CONTROL, "renameTask",
00324 ERIPC_TYPE_INT, g_xid,
00325 ERIPC_TYPE_STRING, filename,
00326 ERIPC_TYPE_STRING, label,
00327 ERIPC_TYPE_INVALID);
00328 }
00329
00330
00331 PenSize ipc_get_pensize(void)
00332 {
00333 PenSize size = gPensize;
00334 LOGPRINTF("get_pensize %d", size);
00335 if ((size < PEN_FINE) || (size > PEN_XLARGE) )
00336 {
00337 WARNPRINTF("invalid pensize setting, using default");
00338 size = GCONF_DEFAULT_PEN_SIZE;
00339 }
00340 return size;
00341 }
00342
00343
00344 void ipc_set_pensize(const PenSize new_pen_size)
00345 {
00346 if ((gPensize < PEN_FINE) || (gPensize > PEN_XLARGE) )
00347 {
00348 WARNPRINTF("invalid new pen size, using default");
00349 }
00350 else
00351 {
00352 gPensize = new_pen_size;
00353 ipc_gconf_write();
00354
00355
00356
00357
00358 }
00359 LOGPRINTF("set pensize %d", gPensize);
00360 }
00361
00362 np_rotation ipc_get_rotation(void)
00363 {
00364 LOGPRINTF("entry");
00365
00366 eripc_error_t retval;
00367 eripc_event_info_t *info = NULL;
00368 np_rotation rotation = NP_PORTRAIT;
00369
00370 retval = eripc_send_varargs_and_wait(eripcClient->context,
00371 &info,
00372 ERIPC_BUS_SESSION,
00373 DBUS_SERVICE_SYSTEM_CONTROL,
00374 "sysGetOrientation",
00375 ERIPC_TYPE_INVALID);
00376
00377 if (retval == ERIPC_ERROR_SUCCESS)
00378 {
00379 const eripc_arg_t *arg_array = info->args;
00380 if (arg_array[0].type == ERIPC_TYPE_STRING)
00381 {
00382 const char* orientation = arg_array[0].value.s;
00383 if (orientation)
00384 {
00385 if ( 0 == strcasecmp( orientation, "landscape_anticlockwise") )
00386 {
00387 rotation = NP_ANTICLOCKWISE;
00388 }
00389 else if ( 0 == strcasecmp( orientation, "landscape_clockwise") )
00390 {
00391 rotation = NP_CLOCKWISE;
00392 }
00393 else
00394 {
00395 rotation = NP_PORTRAIT;
00396 }
00397 }
00398 }
00399 }
00400
00401 LOGPRINTF("exit %d", rotation);
00402 return rotation;
00403 }
00404
00405
00406 static void ipc_menu_update_toolbar(void)
00407 {
00408 eripc_send_varargs(eripcClient->context, NULL, NULL, ERIPC_BUS_SESSION,
00409 DBUS_SERVICE_POPUP_MENU, "updatesFinished", ERIPC_TYPE_INVALID);
00410 }
00411
00412 void ipc_menu_set_pagecounter(int cur_page, int num_pages)
00413 {
00414 gboolean boundary_check = (num_pages != cur_page);
00415 eripc_menu_set_pagecounter(eripcClient, cur_page, num_pages, boundary_check);
00416 ipc_menu_update_toolbar();
00417
00418 if (num_pages == 1)
00419 {
00420 eripc_menu_set_item_state(eripcClient, ITEM_ACTION_GOTOPAGE, GROUP_ACTIONS, MENU_STATE_DISABLED );
00421 }
00422 else
00423 {
00424 eripc_menu_set_item_state(eripcClient, ITEM_ACTION_GOTOPAGE, GROUP_ACTIONS, MENU_STATE_NORMAL );
00425 }
00426 }
00427
00428 void menu_init(int pid, gpointer appwindow)
00429 {
00430 LOGPRINTF("entry");
00431 g_assert( appwindow != 0 );
00432 if (appwindow == 0)
00433 {
00434 fprintf(stderr, "menu without window\n");
00435 return;
00436 }
00437 gInstance = static_cast <notepad::CNotepadWindow*> (appwindow);
00438
00439 ipc_menu = g_strdup_printf("%s_%05d", MENU, pid);
00440
00441
00442
00443 eripc_menu_add_group(eripcClient, GROUP_PEN_TYPE, "", "pen_type" );
00444 eripc_menu_add_item(eripcClient, ITEM_PEN , GROUP_PEN_TYPE, "pen" );
00445 eripc_menu_add_item(eripcClient, ITEM_ERASER, GROUP_PEN_TYPE, "eraser" );
00446
00447
00448 eripc_menu_add_group(eripcClient, GROUP_PEN, "", "notepad_pen_menu" );
00449 eripc_menu_add_group(eripcClient, GROUP_PEN2, GROUP_PEN, "tools_drawing" );
00450
00451
00452 eripc_menu_add_group(eripcClient, GROUP_PEN_SIZE, GROUP_PEN2, "notepad_pen_size" );
00453 eripc_menu_add_item(eripcClient, ITEM_PEN_FINE, GROUP_PEN_SIZE, "stylus_1" );
00454 eripc_menu_add_item(eripcClient, ITEM_PEN_SMALL, GROUP_PEN_SIZE, "stylus_2" );
00455 eripc_menu_add_item(eripcClient, ITEM_PEN_MEDIUM, GROUP_PEN_SIZE, "stylus_3" );
00456 eripc_menu_add_item(eripcClient, ITEM_PEN_LARGE, GROUP_PEN_SIZE, "stylus_4" );
00457 eripc_menu_add_item(eripcClient, ITEM_PEN_XLARGE, GROUP_PEN_SIZE, "stylus_5" );
00458
00459
00460 eripc_menu_add_group(eripcClient, GROUP_ACTIONS, "", "notepad_actions" );
00461 eripc_menu_add_item(eripcClient, ITEM_ACTION_GOTOPAGE, GROUP_ACTIONS, "goto_page" );
00462 eripc_menu_add_item(eripcClient, ITEM_ACTION_INSERTPAGE,GROUP_ACTIONS, "insert_page" );
00463 eripc_menu_add_item(eripcClient, ITEM_ACTION_DELETEPAGE,GROUP_ACTIONS, "delete_page" );
00464 eripc_menu_add_item(eripcClient, ITEM_ACTION_CLEARPAGE, GROUP_ACTIONS, "clear_page" );
00465 eripc_menu_add_item(eripcClient, ITEM_ACTION_RENAME, GROUP_ACTIONS, "rename" );
00466 #if MACHINE_IS_DR1000S || MACHINE_IS_DR1000SW
00467 eripc_menu_add_item(eripcClient, ITEM_ACTION_CLOSE, GROUP_ACTIONS, "close" );
00468 #endif
00469
00470
00471 eripc_menu_add_menu(eripcClient, ipc_menu, GROUP_ACTIONS, GROUP_PEN, GROUP_PEN_TYPE, NULL);
00472
00473
00474 menu_set_text();
00475
00476 menu_show();
00477 LOGPRINTF("exit");
00478 }
00479
00480
00481 void menu_destroy(void)
00482 {
00483 eripc_menu_remove_menu(eripcClient, ipc_menu);
00484 }
00485
00486
00487
00488
00489
00490
00491
00492
00493 static void ipc_gconf_initialize(void)
00494 {
00495 LOGPRINTF("gconf_initialize");
00496 if (gClient == 0)
00497 {
00498 gClient = gconf_client_get_default();
00499 }
00500 }
00501
00502 static void ipc_gconf_finalize(void)
00503 {
00504 LOGPRINTF("gconf_finalize");
00505 if (gClient != 0)
00506 {
00507 g_object_unref(G_OBJECT(gClient));
00508 gClient = 0;
00509 }
00510 }
00511
00512 static void ipc_gconf_read(void)
00513 {
00514 LOGPRINTF("gconf_read");
00515 if (gClient)
00516 {
00517 gPensize = (PenSize) gconf_client_get_int(gClient, GCONF_PEN_SIZE, NULL);
00518 LOGPRINTF("getPenSize %d", gPensize);
00519 if ((gPensize < PEN_FINE) || (gPensize > PEN_XLARGE) )
00520 {
00521 WARNPRINTF("invalid pensize setting, using default");
00522 gPensize = GCONF_DEFAULT_PEN_SIZE;
00523 }
00524 }
00525 }
00526
00527 static void ipc_gconf_write(void)
00528 {
00529 LOGPRINTF("gconf_write pensize %d", gPensize);
00530 if (gClient)
00531 {
00532 (void) gconf_client_set_int(gClient, GCONF_PEN_SIZE, (gint) gPensize, NULL);
00533 }
00534 }
00535
00536
00537
00538
00539 static gboolean ipc_status_set_stylus( const char *state )
00540 {
00541 g_return_val_if_fail( (state != NULL), FALSE);
00542 return eripc_menu_set_statusitem_state(eripcClient, "statusbar_stylus", state);
00543 }
00544
00545 static void menu_set_text(void)
00546 {
00547
00548
00549
00550 eripc_menu_set_item_label(eripcClient, ITEM_PEN, GROUP_PEN_TYPE, _("Pen" ));
00551 eripc_menu_set_item_label(eripcClient, ITEM_ERASER, GROUP_PEN_TYPE, _("Eraser" ));
00552
00553
00554 eripc_menu_set_group_label(eripcClient, GROUP_PEN2, _("Pen Size"));
00555
00556
00557 eripc_menu_set_item_label(eripcClient, ITEM_PEN_FINE, GROUP_PEN_SIZE, _("Fine" ));
00558 eripc_menu_set_item_label(eripcClient, ITEM_PEN_SMALL, GROUP_PEN_SIZE, _("Small" ));
00559 eripc_menu_set_item_label(eripcClient, ITEM_PEN_MEDIUM, GROUP_PEN_SIZE, _("Medium" ));
00560 eripc_menu_set_item_label(eripcClient, ITEM_PEN_LARGE, GROUP_PEN_SIZE, _("Large" ));
00561 eripc_menu_set_item_label(eripcClient, ITEM_PEN_XLARGE, GROUP_PEN_SIZE, _("X-Large" ));
00562
00563
00564 eripc_menu_set_item_label(eripcClient, ITEM_ACTION_GOTOPAGE, GROUP_ACTIONS, _("Go to Page..."));
00565 eripc_menu_set_item_label(eripcClient, ITEM_ACTION_INSERTPAGE, GROUP_ACTIONS, _("Insert Page" ));
00566 eripc_menu_set_item_label(eripcClient, ITEM_ACTION_CLEARPAGE, GROUP_ACTIONS, _("Clear Page..." ));
00567 eripc_menu_set_item_label(eripcClient, ITEM_ACTION_DELETEPAGE, GROUP_ACTIONS, _("Delete Page..." ));
00568 eripc_menu_set_item_label(eripcClient, ITEM_ACTION_RENAME, GROUP_ACTIONS, _("Rename..." ));
00569 #if MACHINE_IS_DR1000S || MACHINE_IS_DR1000SW
00570 eripc_menu_set_item_label(eripcClient, ITEM_ACTION_CLOSE, GROUP_ACTIONS, _("Close" ));
00571 #endif
00572 }
00573
00574
00575 static void menu_show(void)
00576 {
00577 LOGPRINTF("entry");
00578
00579 gboolean scribblemode = gInstance->get_scribble_mode();
00580 if (scribblemode)
00581 {
00582 eripc_menu_set_item_state(eripcClient, ITEM_PEN, GROUP_PEN_TYPE, MENU_STATE_SELECTED );
00583 eripc_menu_set_item_state(eripcClient, ITEM_ERASER, GROUP_PEN_TYPE, MENU_STATE_NORMAL );
00584 ipc_status_set_stylus( STYLUS_PEN );
00585 eripc_send_varargs(eripcClient->context, NULL, NULL, ERIPC_BUS_SESSION,
00586 DBUS_SERVICE_POPUP_MENU, "updatesFinished", ERIPC_TYPE_INVALID);
00587 }
00588 else
00589 {
00590 eripc_menu_set_item_state(eripcClient, ITEM_ERASER, GROUP_PEN_TYPE, MENU_STATE_SELECTED );
00591 eripc_menu_set_item_state(eripcClient, ITEM_PEN, GROUP_PEN_TYPE, MENU_STATE_NORMAL );
00592 ipc_status_set_stylus( STYLUS_ERASER );
00593 eripc_send_varargs(eripcClient->context, NULL, NULL, ERIPC_BUS_SESSION,
00594 DBUS_SERVICE_POPUP_MENU, "updatesFinished", ERIPC_TYPE_INVALID);
00595 }
00596
00597 PenSize ps = ipc_get_pensize();
00598 switch (ps)
00599 {
00600 case PEN_FINE:
00601 eripc_menu_set_item_state(eripcClient, ITEM_PEN_FINE, GROUP_PEN_SIZE, MENU_STATE_SELECTED );
00602 eripc_menu_set_item_state(eripcClient, ITEM_PEN_SMALL, GROUP_PEN_SIZE, MENU_STATE_NORMAL );
00603 eripc_menu_set_item_state(eripcClient, ITEM_PEN_MEDIUM, GROUP_PEN_SIZE, MENU_STATE_NORMAL );
00604 eripc_menu_set_item_state(eripcClient, ITEM_PEN_LARGE, GROUP_PEN_SIZE, MENU_STATE_NORMAL );
00605 eripc_menu_set_item_state(eripcClient, ITEM_PEN_XLARGE, GROUP_PEN_SIZE, MENU_STATE_NORMAL );
00606 break;
00607 case PEN_SMALL:
00608 eripc_menu_set_item_state(eripcClient, ITEM_PEN_FINE, GROUP_PEN_SIZE, MENU_STATE_NORMAL );
00609 eripc_menu_set_item_state(eripcClient, ITEM_PEN_SMALL, GROUP_PEN_SIZE, MENU_STATE_SELECTED );
00610 eripc_menu_set_item_state(eripcClient, ITEM_PEN_MEDIUM, GROUP_PEN_SIZE, MENU_STATE_NORMAL );
00611 eripc_menu_set_item_state(eripcClient, ITEM_PEN_LARGE, GROUP_PEN_SIZE, MENU_STATE_NORMAL );
00612 eripc_menu_set_item_state(eripcClient, ITEM_PEN_XLARGE, GROUP_PEN_SIZE, MENU_STATE_NORMAL );
00613 break;
00614 case PEN_MEDIUM:
00615 eripc_menu_set_item_state(eripcClient, ITEM_PEN_FINE, GROUP_PEN_SIZE, MENU_STATE_NORMAL );
00616 eripc_menu_set_item_state(eripcClient, ITEM_PEN_SMALL, GROUP_PEN_SIZE, MENU_STATE_NORMAL );
00617 eripc_menu_set_item_state(eripcClient, ITEM_PEN_MEDIUM, GROUP_PEN_SIZE, MENU_STATE_SELECTED );
00618 eripc_menu_set_item_state(eripcClient, ITEM_PEN_LARGE, GROUP_PEN_SIZE, MENU_STATE_NORMAL );
00619 eripc_menu_set_item_state(eripcClient, ITEM_PEN_XLARGE, GROUP_PEN_SIZE, MENU_STATE_NORMAL );
00620 break;
00621 case PEN_LARGE:
00622 eripc_menu_set_item_state(eripcClient, ITEM_PEN_FINE, GROUP_PEN_SIZE, MENU_STATE_NORMAL );
00623 eripc_menu_set_item_state(eripcClient, ITEM_PEN_SMALL, GROUP_PEN_SIZE, MENU_STATE_NORMAL );
00624 eripc_menu_set_item_state(eripcClient, ITEM_PEN_MEDIUM, GROUP_PEN_SIZE, MENU_STATE_NORMAL );
00625 eripc_menu_set_item_state(eripcClient, ITEM_PEN_LARGE, GROUP_PEN_SIZE, MENU_STATE_SELECTED );
00626 eripc_menu_set_item_state(eripcClient, ITEM_PEN_XLARGE, GROUP_PEN_SIZE, MENU_STATE_NORMAL );
00627 break;
00628 case PEN_XLARGE:
00629 eripc_menu_set_item_state(eripcClient, ITEM_PEN_FINE, GROUP_PEN_SIZE, MENU_STATE_NORMAL );
00630 eripc_menu_set_item_state(eripcClient, ITEM_PEN_SMALL, GROUP_PEN_SIZE, MENU_STATE_NORMAL );
00631 eripc_menu_set_item_state(eripcClient, ITEM_PEN_MEDIUM, GROUP_PEN_SIZE, MENU_STATE_NORMAL );
00632 eripc_menu_set_item_state(eripcClient, ITEM_PEN_LARGE, GROUP_PEN_SIZE, MENU_STATE_NORMAL );
00633 eripc_menu_set_item_state(eripcClient, ITEM_PEN_XLARGE, GROUP_PEN_SIZE, MENU_STATE_SELECTED );
00634 break;
00635 default:
00636 WARNPRINTF("unsupported pensize\n");
00637 }
00638
00639 eripc_menu_show_menu(eripcClient, ipc_menu);
00640 gInstance->update_page_counter();
00641 ipc_menu_update_toolbar();
00642
00643 LOGPRINTF("exit");
00644 }
00645
00646 void menu_block(gboolean block)
00647 {
00648 if (block)
00649 {
00650 eripc_sysd_set_menu_state(eripcClient, "block");
00651 }
00652 else
00653 {
00654 eripc_sysd_set_menu_state(eripcClient, "unblock");
00655 }
00656 }
00657
00658
00659
00660
00661
00662
00663
00664 static void on_page_change(
00665 eripc_context_t *context,
00666 const eripc_event_info_t *info,
00667 void *user_data )
00668 {
00669 const eripc_arg_t *arg_array = info->args;
00670 g_return_if_fail(arg_array[0].type == ERIPC_TYPE_STRING);
00671 gchar* direction = arg_array[0].value.s;
00672
00673 if (strcmp(direction, "prev") == 0)
00674 {
00675 gInstance->pageflip_back();
00676 }
00677 if (strcmp(direction, "next") == 0)
00678 {
00679 gInstance->pageflip_forward();
00680 }
00681 }
00682
00683
00684 static void on_window_activated(
00685 eripc_context_t *context,
00686 const eripc_event_info_t *info,
00687 void *user_data )
00688 {
00689 LOGPRINTF("entry");
00690
00691 (void) gInstance->save();
00692 ipc_gconf_read();
00693 menu_show();
00694 gInstance->update_page_counter();
00695 ipc_menu_update_toolbar();
00696
00697 LOGPRINTF("exit");
00698 }
00699
00700
00701 static void on_window_deactivated(
00702 eripc_context_t *context,
00703 const eripc_event_info_t *info,
00704 void *user_data )
00705 {
00706 LOGPRINTF("entry");
00707
00708 (void) gInstance->save();
00709 ipc_gconf_write();
00710 #if MACHINE_IS_DR800S || MACHINE_IS_DR800SG || MACHINE_IS_DR800SW
00711 gInstance->quit();
00712 #endif
00713
00714 LOGPRINTF("exit");
00715 }
00716
00717
00718 static void on_menu_item(
00719 eripc_context_t *context,
00720 const eripc_event_info_t *info,
00721 void *user_data )
00722 {
00723 g_return_if_fail(info->args);
00724 g_return_if_fail(info->args[0].type == ERIPC_TYPE_STRING);
00725 g_return_if_fail(info->args[1].type == ERIPC_TYPE_STRING);
00726 g_return_if_fail(info->args[2].type == ERIPC_TYPE_STRING);
00727 g_return_if_fail(info->args[3].type == ERIPC_TYPE_STRING);
00728
00729 g_return_if_fail(info->args[0].value.s != 0);
00730 g_return_if_fail(info->args[1].value.s != 0);
00731 g_return_if_fail(info->args[2].value.s != 0);
00732 g_return_if_fail(info->args[3].value.s != 0);
00733
00734 const eripc_arg_t *arg_array = info->args;
00735 const char *item = arg_array[0].value.s;
00736 const char *group = arg_array[1].value.s;
00737 const char *menu = arg_array[2].value.s;
00738 const char *state = arg_array[3].value.s;
00739
00740 LOGPRINTF("entry: on_menu_item: item [%s] group [%s] menu [%s] state [%s]", item, group, menu, state);
00741
00742 if (item && group && menu && state)
00743 {
00744 if ( strcmp(group, GROUP_PEN_TYPE) == 0 )
00745 {
00746 if ( strcmp(state, MENU_STATE_NORMAL) == 0 )
00747 {
00748 if ( strcmp(item, ITEM_PEN) == 0 )
00749 {
00750 LOGPRINTF("pen");
00751 gInstance->set_scribble_mode(TRUE);
00752 }
00753 else if ( strcmp(item, ITEM_ERASER ) == 0 )
00754 {
00755 LOGPRINTF("erase");
00756 gInstance->set_scribble_mode(FALSE);
00757 }
00758 }
00759 menu_show();
00760 }
00761 else if ( strcmp(group, GROUP_PEN_SIZE) == 0 )
00762 {
00763
00764 if ( strcmp(state, MENU_STATE_NORMAL) == 0 )
00765 {
00766 if ( strcmp(item, ITEM_PEN_FINE) == 0 )
00767 {
00768 LOGPRINTF("pen_fine");
00769 ipc_set_pensize(PEN_FINE);
00770 }
00771 else if ( strcmp(item, ITEM_PEN_SMALL) == 0 )
00772 {
00773 LOGPRINTF("pen_small");
00774 ipc_set_pensize(PEN_SMALL);
00775 }
00776 else if ( strcmp(item, ITEM_PEN_MEDIUM) == 0 )
00777 {
00778 LOGPRINTF("pen_medium");
00779 ipc_set_pensize(PEN_MEDIUM);
00780 }
00781 else if ( strcmp(item, ITEM_PEN_LARGE) == 0 )
00782 {
00783 LOGPRINTF("pen_large");
00784 ipc_set_pensize(PEN_LARGE);
00785 }
00786 else if ( strcmp(item, ITEM_PEN_XLARGE) == 0 )
00787 {
00788 LOGPRINTF("pen_xlarge");
00789 ipc_set_pensize(PEN_XLARGE);
00790 }
00791 }
00792
00793 gInstance->set_scribble_mode(TRUE);
00794 menu_show();
00795 }
00796 else if ( strcmp(group, GROUP_ACTIONS) == 0 )
00797 {
00798 if ( strcmp(state, MENU_STATE_NORMAL) == 0 )
00799 {
00800 if ( strcmp(item, ITEM_ACTION_RENAME ) == 0 )
00801 {
00802 LOGPRINTF("rename");
00803 gInstance->rename();
00804 }
00805 #if MACHINE_IS_DR1000S || MACHINE_IS_DR1000SW
00806 else if ( strcmp(item, ITEM_ACTION_CLOSE ) == 0 )
00807 {
00808 LOGPRINTF("close");
00809 (void) gInstance->save();
00810 gInstance->quit();
00811 }
00812 #endif
00813 else if ( strcmp(item, ITEM_ACTION_GOTOPAGE ) == 0 )
00814 {
00815 LOGPRINTF("gotopage");
00816 gInstance->goto_page();
00817 }
00818 else if ( strcmp(item, ITEM_ACTION_INSERTPAGE ) == 0 )
00819 {
00820 LOGPRINTF("insertpage");
00821 gInstance->insert_page();
00822 }
00823 else if ( strcmp(item, ITEM_ACTION_CLEARPAGE ) == 0 )
00824 {
00825 LOGPRINTF("clearpage");
00826 gInstance->clear_current_page();
00827 }
00828 else if ( strcmp(item, ITEM_ACTION_DELETEPAGE ) == 0 )
00829 {
00830 LOGPRINTF("deletepage");
00831 gInstance->delete_current_page();
00832 }
00833 else
00834 {
00835 fprintf(stderr, "ignore state [%s] item [%s][%s]", state, item, group);
00836 }
00837 }
00838 else
00839 {
00840 fprintf(stderr, "unexpected menu group [%s]", group);
00841 }
00842 }
00843 ipc_menu_update_toolbar();
00844 }
00845 }
00846
00847 static void on_changed_locale(
00848 eripc_context_t *context,
00849 const eripc_event_info_t *info,
00850 void *user_data )
00851 {
00852 menu_set_text();
00853 }
00854
00855 static void on_changed_pen(
00856 eripc_context_t *context,
00857 const eripc_event_info_t *info,
00858 void *user_data )
00859 {
00860 g_return_if_fail(info->args);
00861 g_return_if_fail(info->args[0].type == ERIPC_TYPE_STRING);
00862
00863 const eripc_arg_t *arg_array = info->args;
00864 const char *item = arg_array[0].value.s;
00865 const char *value = arg_array[1].value.s;
00866
00867 LOGPRINTF("entry: on_changed_pen: item [%s] value [%s]", item, value);
00868 if ( strcmp(item, "statusbar_stylus") == 0 )
00869 {
00870 if ( strcmp(value, STYLUS_PEN) == 0 )
00871 {
00872 LOGPRINTF("pen");
00873 gInstance->set_scribble_mode(FALSE);
00874 menu_show();
00875 }
00876 else if ( strcmp(value, STYLUS_ERASER ) == 0 )
00877 {
00878 LOGPRINTF("erase");
00879 gInstance->set_scribble_mode(TRUE);
00880 menu_show();
00881 }
00882 }
00883 }
00884
00885 static void on_prepare_unmount(
00886 eripc_context_t *context,
00887 const eripc_event_info_t *info,
00888 void *user_data )
00889 {
00890 LOGPRINTF("entry");
00891 (void) gInstance->save(true);
00892 gInstance->quit();
00893 LOGPRINTF("exit");
00894 }
00895
00896 static void on_volume_unmounted(
00897 eripc_context_t *context,
00898 const eripc_event_info_t *info,
00899 void *user_data )
00900 {
00901 LOGPRINTF("entry");
00902 gInstance->quit();
00903 LOGPRINTF("exit");
00904 }
00905
00906 static void on_prepare_standby(
00907 eripc_context_t *context,
00908 const eripc_event_info_t *info,
00909 void *user_data )
00910 {
00911 LOGPRINTF("entry");
00912 (void) gInstance->save();
00913 LOGPRINTF("exit");
00914 }
00915
00916
00917
00918
00919
00920
00921
00922
00923 static void on_changed_orientation(
00924 eripc_context_t *context,
00925 const eripc_event_info_t *info,
00926 void *user_data )
00927 {
00928 LOGPRINTF("entry");
00929
00930 const eripc_arg_t *arg_array = info->args;
00931 if (arg_array[0].type == ERIPC_TYPE_STRING)
00932 {
00933 const char* orientation = arg_array[0].value.s;
00934 if (orientation)
00935 {
00936 if ( strcmp(orientation, "portrait") == 0)
00937 {
00938 #if MACHINE_IS_DR800S || MACHINE_IS_DR800SG || MACHINE_IS_DR800SW
00939 gboolean is_inverted = ipc_sys_is_pageturn_inverted();
00940 (void) gInstance->set_pageturn_inverted(is_inverted);
00941 #else
00942 ;
00943 #endif
00944 }
00945 else
00946 {
00947
00948 #if MACHINE_IS_DR800S || MACHINE_IS_DR800SG || MACHINE_IS_DR800SW
00949 (void) gInstance->set_pageturn_inverted(FALSE);
00950 #else
00951 ;
00952 #endif
00953 }
00954
00955
00956 }
00957 }
00958 LOGPRINTF("exit");
00959 }
00960
00961
00962 #if MACHINE_IS_DR800S || MACHINE_IS_DR800SG || MACHINE_IS_DR800SW
00963 static void on_sys_changed_pageturn_inverted( eripc_context_t *context,
00964 const eripc_event_info_t *info,
00965 void *user_data)
00966 {
00967 LOGPRINTF("entry");
00968
00969 const eripc_arg_t *arg_array = info->args;
00970
00971 if (arg_array[0].type == ERIPC_TYPE_BOOL)
00972 {
00973 gboolean is_inverted = arg_array[0].value.b;
00974 if ( ipc_sys_is_in_portrait_mode() )
00975 {
00976 (void) gInstance->set_pageturn_inverted(is_inverted);
00977 }
00978 }
00979 }
00980 #endif
00981
00982
00983
00984
00985
00986
00987
00988
00989
00990
00991
00992 gboolean ipc_sys_is_pageturn_inverted()
00993 {
00994 gboolean result = FALSE;
00995 #if MACHINE_IS_DR800S || MACHINE_IS_DR800SG || MACHINE_IS_DR800SW
00996 eripc_error_t retval;
00997 eripc_event_info_t* info = NULL;
00998
00999 LOGPRINTF("entry");
01000
01001 retval = eripc_send_varargs_and_wait(eripcClient->context,
01002 &info,
01003 ERIPC_BUS_SESSION,
01004 DBUS_SERVICE_SYSTEM_CONTROL,
01005 "sysGetPageturnInverted",
01006 ERIPC_TYPE_INVALID);
01007
01008 if (retval != ERIPC_ERROR_SUCCESS)
01009 {
01010 ERRORPRINTF("Error launching eripc handler");
01011 }
01012 else if (info == NULL || info->args == NULL)
01013 {
01014 ERRORPRINTF("sysd returns OK but no reply structure");
01015 }
01016 else
01017 {
01018 const eripc_arg_t *arg_array = info->args;
01019
01020 if (arg_array[0].type == ERIPC_TYPE_BOOL)
01021 {
01022 result = (gboolean) arg_array[0].value.b;
01023 }
01024 else
01025 {
01026 result = FALSE ;
01027 }
01028 }
01029
01030 eripc_event_info_free(eripcClient->context, info);
01031 #endif
01032 return result;
01033 }
01034
01035
01036
01037
01038
01039
01040 gboolean ipc_sys_is_in_portrait_mode(void)
01041 {
01042
01043 gboolean result = TRUE;
01044
01045 eripc_error_t retval;
01046 eripc_event_info_t* info = NULL;
01047
01048 LOGPRINTF("entry");
01049
01050 retval = eripc_send_varargs_and_wait(eripcClient->context,
01051 &info,
01052 ERIPC_BUS_SESSION,
01053 DBUS_SERVICE_SYSTEM_CONTROL,
01054 "sysGetOrientation",
01055 ERIPC_TYPE_INVALID);
01056
01057 if (retval != ERIPC_ERROR_SUCCESS)
01058 {
01059 ERRORPRINTF("Error launching eripc handler");
01060 }
01061 else if (info == NULL || info->args == NULL)
01062 {
01063 ERRORPRINTF("sysd returns OK but no reply structure");
01064 }
01065 else
01066 {
01067 const eripc_arg_t *arg_array = info->args;
01068
01069 if (arg_array[0].type == ERIPC_TYPE_STRING)
01070 {
01071 if ( strcmp("portrait", arg_array[0].value.s) == 0 )
01072 {
01073 result = TRUE;
01074 }
01075 else
01076 {
01077 result = FALSE;
01078 }
01079 }
01080 else
01081 {
01082 result = FALSE ;
01083 }
01084 }
01085 eripc_event_info_free(eripcClient->context, info);
01086 return result;
01087 }
01088
01089 }