Enlightenment CVS committal
Author : devilhorns
Project : e17
Module : apps/emprint
Dir : e17/apps/emprint/src/bin
Modified Files:
main.c
Log Message:
Allow using 'Escape' key for cancelling shots (grab window & grab region).
===================================================================
RCS file: /cvs/e/e17/apps/emprint/src/bin/main.c,v
retrieving revision 1.11
retrieving revision 1.12
diff -u -3 -r1.11 -r1.12
--- main.c 25 Jan 2008 01:26:23 -0000 1.11
+++ main.c 1 Feb 2008 21:15:53 -0000 1.12
@@ -42,6 +42,7 @@
static void _em_do_region(void);
static void _em_do_thumb(void *data);
static void _em_take_shot(int x, int y, int w, int h);
+static int _em_cb_key_down(void *data, int type, void *event);
static int _em_cb_mouse_move(void *data, int type, void *event);
static int _em_cb_mouse_up(void *data, int type, void *event);
static int _em_cb_mouse_down(void *data, int type, void *event);
@@ -59,6 +60,7 @@
static Ecore_Event_Handler *mouse_move_hdl = 0;
static Ecore_Event_Handler *mouse_up_hdl = 0;
static Ecore_Event_Handler *mouse_down_hdl = 0;
+static Ecore_Event_Handler *key_hdl = 0;
static Ecore_Timer *timer = NULL;
static Band *band = NULL;
static int gx = -1, gy = -1;
@@ -124,9 +126,6 @@
/* begin the ecore main loop which will keep our app running */
ecore_main_loop_begin();
- /* launch application if user wanted one */
- if (opts->app) _em_do_app();
-
/* free our option structure */
_em_free_options();
@@ -213,8 +212,7 @@
}
/* The filename, if it exists, is expected to be the last command line arg
*/
- if (optind < argc)
- o->filename = evas_stringshare_add(argv[optind]);
+ if (optind < argc) o->filename = evas_stringshare_add(argv[optind]);
}
static void
@@ -462,10 +460,17 @@
/* show the input window */
ecore_x_window_show(input_window);
+ /* grab keystrokes */
+ ecore_x_keyboard_grab(input_window);
+
/* set the mouse pointer */
if ((cursor = ecore_x_cursor_shape_get(ECORE_X_CURSOR_CROSS)))
ecore_x_window_cursor_set(input_window, cursor);
+ /* setup handler to recieve key event */
+ key_hdl = ecore_event_handler_add(ECORE_X_EVENT_KEY_DOWN,
+ _em_cb_key_down, NULL);
+
/* setup handler to recieve click event */
mouse_up_hdl = ecore_event_handler_add(ECORE_X_EVENT_MOUSE_BUTTON_UP,
_em_cb_mouse_up, NULL);
@@ -492,8 +497,17 @@
/* create a new input window to recieve click event */
input_window = ecore_x_window_input_new(root, x, y, w, h);
+
+ /* show the input window */
ecore_x_window_show(input_window);
+ /* grab keystrokes */
+ ecore_x_keyboard_grab(input_window);
+
+ /* setup handler to recieve key event */
+ key_hdl = ecore_event_handler_add(ECORE_X_EVENT_KEY_DOWN,
+ _em_cb_key_down, NULL);
+
/* setup handlers to recieve mouse events */
mouse_move_hdl = ecore_event_handler_add(ECORE_X_EVENT_MOUSE_MOVE,
_em_cb_mouse_move, NULL);
@@ -617,6 +631,41 @@
/* cleanup imlib */
imlib_context_set_image(im);
imlib_free_image_and_decache();
+
+ /* launch application if user wanted one */
+ if (opts->app) _em_do_app();
+}
+
+static int
+_em_cb_key_down(void *data, int type, void *event)
+{
+ Ecore_X_Event_Key_Down *ev;
+
+ ev = event;
+
+ /* check for correct window */
+ if (ev->win != input_window) return 1;
+
+ /* check for correct key */
+ if (!strcmp(ev->keysymbol, "Escape"))
+ {
+ /* delete the event handlers */
+ ecore_event_handler_del(key_hdl);
+ if (mouse_move_hdl) ecore_event_handler_del(mouse_move_hdl);
+ if (mouse_up_hdl) ecore_event_handler_del(mouse_up_hdl);
+ if (mouse_down_hdl) ecore_event_handler_del(mouse_down_hdl);
+
+ /* release key grab */
+ ecore_x_keyboard_ungrab();
+
+ /* delete the input window */
+ ecore_x_window_del(input_window);
+ input_window = 0;
+
+ ecore_main_loop_quit();
+ return 0;
+ }
+ return 1;
}
static int
@@ -680,8 +729,13 @@
ecore_x_pointer_last_xy_get(&x, &y);
/* delete the event handlers */
- ecore_event_handler_del(mouse_up_hdl);
- mouse_up_hdl = 0;
+ if (key_hdl) ecore_event_handler_del(key_hdl);
+ if (mouse_move_hdl) ecore_event_handler_del(mouse_move_hdl);
+ if (mouse_up_hdl) ecore_event_handler_del(mouse_up_hdl);
+ if (mouse_down_hdl) ecore_event_handler_del(mouse_down_hdl);
+
+ /* release key grab */
+ ecore_x_keyboard_ungrab();
/* delete the input window */
ecore_x_window_del(input_window);
@@ -744,7 +798,8 @@
_em_do_window();
else
_em_do_screen();
- return 0;
+
+ return 0;
}
/* tell the user we are counting down */
@@ -827,6 +882,7 @@
int x, y, w, h;
/* delete the event handlers */
+ ecore_event_handler_del(key_hdl);
ecore_event_handler_del(mouse_move_hdl);
ecore_event_handler_del(mouse_up_hdl);
ecore_event_handler_del(mouse_down_hdl);
-------------------------------------------------------------------------
This SF.net email is sponsored by: Microsoft
Defy all challenges. Microsoft(R) Visual Studio 2008.
http://clk.atdmt.com/MRT/go/vse0120000070mrt/direct/01/
_______________________________________________
enlightenment-cvs mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/enlightenment-cvs