5 #include <Ecore_Evas.h>
7 #include <Elementary.h>
10 #define SPECTATOR_MODE 1//in spectator mode messages are send as signals
17 #define BUS_NAME_SERVER "com.profusion.benchmak.server"
18 #define PATH_NAME_SERVER "/com/profusion/benchmak/server"
19 #define IFACE_NAME_SERVER "com.profusion.benchmak.server.game"
21 #define BUS_NAME_CLIENT "com.profusion.benchmark.client"
22 #define PATH_NAME_CLIENT "/com/profusion/benchmak/client"
23 #define IFACE_NAME_CLIENT "com.profusion.benchmark.client.game"
25 #define MOVEMENT_DELAY 0.01//10ms between movements
26 #define MOVEMENT_Y 5//increment/decrement ship movement
28 #define MOVEMENT_BULLET 10
29 #define BULLET_SIZE_W 100
30 #define BULLET_SIZE_H 50
34 E_DBus_Connection *conn;
35 E_DBus_Object *obj_path;
36 Evas_Object *client_ship, *server_ship;
42 int action;//1 up, 2 down
46 typedef struct _bullet
55 typedef struct _EDBus_Method
59 char *reply_signature;
60 E_DBus_Method_Cb func;
65 typedef struct _EDBus_Signal
73 static void obj_register(char *path_name, char *iface_name, EDBus_Method *methods, EDBus_Signal *signals);
75 static Eina_Bool _move_bullet(void *context)
79 if (b->direction == '+')
81 b->x += MOVEMENT_BULLET;
82 evas_object_move(b->o, b->x, b->y);
83 if ((b->x + MOVEMENT_BULLET) < SIZE_W)
84 return ECORE_CALLBACK_RENEW;
88 b->x -= MOVEMENT_BULLET;
89 evas_object_move(b->o, b->x, b->y);
90 if ((b->x - MOVEMENT_BULLET) > 0)
91 return ECORE_CALLBACK_RENEW;
94 evas_object_hide(b->o);
95 evas_object_del(b->o);
97 return ECORE_CALLBACK_CANCEL;
101 _shoot(char _player, int x, int y)
103 bullet *b = malloc(sizeof(bullet));
105 if (_player == 1) b->direction = '+';
106 else b->direction = '-';
111 b->o = elm_progressbar_add(win);
112 elm_progressbar_pulse(b->o, TRUE);
113 evas_object_resize(b->o, BULLET_SIZE_W, BULLET_SIZE_H);
114 evas_object_move(b->o, x, y);
116 evas_object_show(b->o);
118 ecore_timer_add(0.2, _move_bullet, b);
122 _dbus_error_check(DBusError *error)
124 if (dbus_error_is_set(error))
126 printf("dbus error\nName: %s\nDescription: %s\n", error->name,
133 create_ship(Evas_Object **_obj, Evas *canvas, char _player)
137 o = evas_object_polygon_add(canvas);
141 evas_object_polygon_point_add(o, 0, SIZE_H - SHIP_SIZE);
142 evas_object_polygon_point_add(o, SHIP_SIZE / 2, SIZE_H - (SHIP_SIZE / 2));
143 evas_object_polygon_point_add(o, 0, SIZE_H);
145 evas_object_color_set(o, 255, 0, 0, 255);
149 evas_object_polygon_point_add(o, SIZE_W, 0);
150 evas_object_polygon_point_add(o, SIZE_W - (SHIP_SIZE / 2), SHIP_SIZE / 2);
151 evas_object_polygon_point_add(o, SIZE_W, SHIP_SIZE);
153 evas_object_color_set(o, 0, 0, 255, 255);
161 update(char _player, int x, int y)
164 evas_object_move(server_ship, x, y);
166 evas_object_move(client_ship, x, y);
170 _cb_move_ack(void *data, DBusMessage *msg, DBusError *error)
172 _dbus_error_check(error);
175 #if SPECTATOR_MODE == 1
182 msg = dbus_message_new_signal(PATH_NAME_SERVER, IFACE_NAME_SERVER,
185 msg = dbus_message_new_signal(PATH_NAME_CLIENT, IFACE_NAME_CLIENT,
188 dbus_message_append_args(msg, DBUS_TYPE_INT32, &player_x, DBUS_TYPE_INT32,
189 &player_y_start, DBUS_TYPE_INVALID);
190 e_dbus_message_send(conn, msg, _cb_move_ack, TIMEOUT, NULL);
191 dbus_message_unref(msg);
200 msg = dbus_message_new_method_call(BUS_NAME_CLIENT, PATH_NAME_CLIENT,
201 IFACE_NAME_CLIENT, "moveOfServer");
203 msg = dbus_message_new_method_call(BUS_NAME_SERVER, PATH_NAME_SERVER,
204 IFACE_NAME_SERVER, "moveOfClient");
206 dbus_message_append_args(msg, DBUS_TYPE_INT32, &player_x, DBUS_TYPE_INT32,
207 &player_y_start, DBUS_TYPE_INVALID);
208 e_dbus_message_send(conn, msg, _cb_move_ack, TIMEOUT, NULL);
209 dbus_message_unref(msg);
214 _movement(void *data)
218 if ((player_y_start - MOVEMENT_Y) >= 0)
220 player_y_start -= MOVEMENT_Y;
221 player_y_end = player_y_start + SHIP_SIZE;
223 update(player, player_x, player_y_start);
224 if ((rand() % 6) == 5)
225 _shoot(player, player_x, player_y_start);
226 return ECORE_CALLBACK_RENEW;
231 return _movement(NULL);
236 if ((player_y_end + MOVEMENT_Y) <= SIZE_H)
238 player_y_end += MOVEMENT_Y;
239 player_y_start = player_y_end - SHIP_SIZE;
241 update(player, player_x, player_y_start);
242 if ((rand() % 6) == 5)
243 _shoot(player, player_x, player_y_start);
244 return ECORE_CALLBACK_RENEW;
249 return _movement(NULL);
255 create_auto_move_event(char p)
259 player_y_end = SHIP_SIZE;
264 player_y_start = SIZE_H - SHIP_SIZE;
265 player_y_end = SIZE_H;
269 player_x = SIZE_W - (SHIP_SIZE / 2);
270 player_y_start = SIZE_H - SHIP_SIZE;
271 player_y_end = SIZE_H;
274 player_y_end = SHIP_SIZE;
277 ecore_timer_add(MOVEMENT_DELAY, _movement, NULL);
281 _move_(Evas_Object *ship, E_DBus_Object *_obj, DBusMessage *msg)
283 DBusMessage *reply = dbus_message_new_method_return(msg);
287 dbus_error_init(&new_err);
288 dbus_message_get_args(msg, &new_err, DBUS_TYPE_INT32, &x, DBUS_TYPE_INT32,
289 &y, DBUS_TYPE_INVALID);
290 _dbus_error_check(&new_err);
292 evas_object_move(ship, x, y);
297 #if SPECTATOR_MODE == 1
299 _move_client(void *context, DBusMessage *msg)
301 _move_(client_ship, NULL, msg);
305 _move_server(void *context, DBusMessage *msg)
307 _move_(server_ship, NULL, msg);
311 _move_client(E_DBus_Object *obj, DBusMessage *msg)
313 return _move_(client_ship, obj, msg);
317 _move_server(E_DBus_Object *obj, DBusMessage *msg)
319 return _move_(server_ship, obj, msg);
324 _can_join(E_DBus_Object *_obj, DBusMessage *msg)
326 DBusMessage *reply = dbus_message_new_method_return(msg);
330 dbus_message_append_args(reply, DBUS_TYPE_BOOLEAN, &can_join,
334 #if SPECTATOR_MODE == 1
335 e_dbus_signal_handler_add(conn, BUS_NAME_CLIENT, PATH_NAME_CLIENT,
336 IFACE_NAME_CLIENT, "moveOfClient",
340 create_auto_move_event(1);
341 printf("game started\n");
345 dbus_message_append_args(reply, DBUS_TYPE_BOOLEAN, &can_join,
353 _cb_dbus_request_name_client(void *context, DBusMessage *msg, DBusError *err)
357 _dbus_error_check(err);
359 dbus_error_init(&new_err);
360 dbus_message_get_args(msg, &new_err, DBUS_TYPE_UINT32, &flag,
363 if (flag == DBUS_REQUEST_NAME_REPLY_PRIMARY_OWNER)
365 EDBus_Method table_methods[] =
367 #if SPECTATOR_MODE == 0
368 { "moveOfServer", "ii", "", _move_server, "move_server", 0},
370 { NULL, NULL, NULL, NULL, NULL, 0 }
373 EDBus_Signal table_signal[] =
375 #if SPECTATOR_MODE == 1
376 { "moveOfClient", "ii", "move_client", 0 },
378 { NULL, NULL, NULL, 0 }
381 /*e_dbus_interface_register(conn, PATH_NAME_CLIENT, IFACE_NAME_CLIENT,
382 table, table_signal, NULL, NULL);*/
383 obj_register(PATH_NAME_CLIENT, IFACE_NAME_CLIENT, table_methods, table_signal);
385 #if SPECTATOR_MODE == 1
386 e_dbus_signal_handler_add(conn, BUS_NAME_SERVER, PATH_NAME_SERVER,
387 IFACE_NAME_SERVER, "moveOfServer",
391 create_auto_move_event(2);
392 printf("game started\n");
394 else printf("dbus_request_name fail, the client name was already in use.\n");
398 _cb_can_join(void *data, DBusMessage *msg, DBusError *error)
403 _dbus_error_check(error);
405 dbus_error_init(&new_err);
406 dbus_message_get_args(msg, &new_err, DBUS_TYPE_BOOLEAN, &bool,
408 _dbus_error_check(&new_err);
412 e_dbus_request_name(conn, BUS_NAME_CLIENT, DBUS_NAME_FLAG_DO_NOT_QUEUE,
413 _cb_dbus_request_name_client, NULL);
417 #if SPECTATOR_MODE == 1
418 printf("Spectator mode\n");
419 e_dbus_signal_handler_add(conn, BUS_NAME_SERVER, PATH_NAME_SERVER,
420 IFACE_NAME_SERVER, "moveOfServer",
422 e_dbus_signal_handler_add(conn, BUS_NAME_CLIENT, PATH_NAME_CLIENT,
423 IFACE_NAME_CLIENT, "moveOfClient",
426 printf("server full, try later!\n");
436 dbus_message_new_method_call(BUS_NAME_SERVER, PATH_NAME_SERVER,
437 IFACE_NAME_SERVER, "canJoin");
438 e_dbus_message_send(conn, msg, _cb_can_join, -1, NULL);
439 dbus_message_unref(msg);
443 _cb_dbus_request_name_server(void *context, DBusMessage *msg, DBusError *err)
447 _dbus_error_check(err);
449 dbus_error_init(&new_err);
450 dbus_message_get_args(msg, &new_err, DBUS_TYPE_UINT32, &flag,
453 if (flag == DBUS_REQUEST_NAME_REPLY_PRIMARY_OWNER)
455 EDBus_Method table_methods[] =
457 { "canJoin", "", "b", _can_join, "can_join", 0 },
458 #if SPECTATOR_MODE == 0
459 { "moveOfClient", "ii", "", _move_client, "move_client", 0},
461 { NULL, NULL, NULL, NULL, NULL, 0 }
464 EDBus_Signal table_signal[] =
466 #if SPECTATOR_MODE == 1
467 { "moveOfServer", "ii", "move_server", 0 },
469 { NULL, NULL, NULL, 0 }
472 /*e_dbus_interface_register(conn, PATH_NAME_SERVER, IFACE_NAME_SERVER,
473 table, table_signal, NULL, NULL);*/
474 obj_register(PATH_NAME_SERVER, IFACE_NAME_SERVER, table_methods, table_signal);
476 printf("Waiting for another player\n");
479 else _ask_if_can_join();
483 obj_register(char *path_name, char *iface_name, EDBus_Method *methods, EDBus_Signal *signals)
485 obj_path = e_dbus_object_add(conn, path_name, NULL);
486 E_DBus_Interface *iface = e_dbus_interface_new(iface_name);
487 const EDBus_Method *_method;
488 const EDBus_Signal *_signal;
490 e_dbus_object_interface_attach(obj_path, iface);
491 e_dbus_interface_unref(iface);
493 for (_method = methods; _method != NULL && _method->member != NULL; _method++)
494 e_dbus_interface_method_add(iface, _method->member,
496 _method->reply_signature,
499 for (_signal = signals; _signal != NULL && _signal->name != NULL; _signal++)
500 e_dbus_interface_signal_add(iface, _signal->name, _signal->signature);
506 if (!obj_path) return;
507 e_dbus_object_free(obj_path);
511 _mouse_handler(void *data, Evas *e, Evas_Object *_obj, void *event_info)
513 Evas_Event_Mouse_Move *mouse_info = event_info;
514 Evas_Object *square = data;
516 evas_object_move(square, mouse_info->cur.canvas.x, mouse_info->cur.canvas.y);
520 on_done(void *data, Evas_Object *_obj, void *event_info)
526 elm_main(int argc, char **argv)
529 Evas_Object *bg, *square;
534 win = elm_win_add(NULL, "bg-plain", ELM_WIN_BASIC);
535 elm_win_title_set(win, "Benchmark");
536 evas_object_smart_callback_add(win, "delete,request", on_done, NULL);
537 elm_win_autodel_set(win, EINA_TRUE);
538 evas_object_resize(win, SIZE_W, SIZE_H);
539 canvas = evas_object_evas_get(win);
541 bg = elm_bg_add(win);
542 evas_object_size_hint_weight_set(bg, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
543 elm_win_resize_object_add(win, bg);
544 elm_bg_color_set(bg, 255, 255, 255);
545 evas_object_show(bg);
547 square = evas_object_rectangle_add(canvas);
548 evas_object_resize(square, 30, 30);
549 evas_object_color_set(square, 0, 255, 0, 255);
550 evas_object_show(square);
551 evas_object_event_callback_add(bg, EVAS_CALLBACK_MOUSE_MOVE, _mouse_handler,
554 create_ship(&client_ship, canvas, 2);
555 create_ship(&server_ship, canvas, 1);
557 conn = e_dbus_bus_get(DBUS_BUS_SESSION);
559 e_dbus_request_name(conn, BUS_NAME_SERVER, DBUS_NAME_FLAG_DO_NOT_QUEUE,
560 _cb_dbus_request_name_server, NULL);
562 evas_object_show(win);
566 /*e_dbus_interface_unregister(conn, PATH_NAME_CLIENT);
567 e_dbus_interface_unregister(conn, PATH_NAME_SERVER);*/