4 Copyright (c) 2011 Samsung Electronics Co., Ltd All Rights Reserved
6 Licensed under the Apache License, Version 2.0 (the "License");
7 you may not use this file except in compliance with the License.
8 You may obtain a copy of the License at
10 http://www.apache.org/licenses/LICENSE-2.0
12 Unless required by applicable law or agreed to in writing, software
13 distributed under the License is distributed on an "AS IS" BASIS,
14 WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15 See the License for the specific language governing permissions and
16 limitations under the License.
26 #include <X11/Xatom.h>
34 #define UTILX_TRACE printf
36 #define UTILX_TRACE(...)
39 static Atom _atom_grab_key = None;
40 static Atom _atom_grab_excl_win = None;
41 static Atom _atom_grab_or_excl_win = None;
43 static Atom _atom_notification_level = None;
44 static Atom _atom_indicator_visible_state = None;
46 static Atom _atom_comp_effect_state = None;
47 static Atom _atom_comp_fake_launch = None;
48 static Atom _atom_comp_fake_launch_image = None;
50 static Atom _atom_comp_window_effect_type = None;
51 static Atom _atom_comp_effect_default = None;
52 static Atom _atom_comp_effect_none = None;
53 static Atom _atom_comp_effect_custom0 = None;
54 static Atom _atom_comp_effect_custom1 = None;
55 static Atom _atom_comp_effect_custom2 = None;
56 static Atom _atom_comp_effect_custom3 = None;
57 static Atom _atom_comp_effect_custom4 = None;
58 static Atom _atom_comp_effect_custom5 = None;
59 static Atom _atom_comp_effect_custom6 = None;
60 static Atom _atom_comp_effect_custom7 = None;
61 static Atom _atom_comp_effect_custom8 = None;
62 static Atom _atom_comp_effect_custom9 = None;
64 static Atom _atom_window_opaque = None;
66 static Atom _atom_screen_capture_disable = None;
68 static Atom _atom_comp_capture_effect = None;
70 const unsigned long maxlen = 1024l;
72 static void _utilx_set_window_property (Display* dpy, Window win, Atom atom, Atom type, unsigned int *val, unsigned int num);
73 static int _utilx_get_window_property (Display* dpy, Window win, Atom atom, Atom type, unsigned int *val, unsigned int len);
75 static void _utilx_effect_atom_check( Display* dpy );
76 static Atom _utilx_convert_style_to_atom( Display* dpy, Utilx_Effect_Style style );
77 static Utilx_Effect_Style _utilx_convert_atom_to_style( Display* dpy, Atom style );
79 API void utilx_set_system_notification_level (Display* dpy, Window win, Utilx_Notification_Level level)
81 UTILX_TRACE ("[UTILX] utilx_set_system_notification_level... win = %x, level = %d\n", win, level);
87 fprintf (stderr, "[UTILX] Error.. Invald Display.. %s (%d)\n", __func__, __LINE__);
93 case UTILX_NOTIFICATION_LEVEL_LOW:
97 case UTILX_NOTIFICATION_LEVEL_NORMAL:
101 case UTILX_NOTIFICATION_LEVEL_HIGH:
110 if (!_atom_notification_level)
112 _atom_notification_level = XInternAtom (dpy, "_E_ILLUME_NOTIFICATION_LEVEL", False);
113 if (!_atom_notification_level)
115 fprintf (stderr, "[UTILX] Error.. Cannot create _E_ILLUME_NOTIFICATION_LEVEL atom.. %s (%d)\n", __func__, __LINE__);
120 _utilx_set_window_property (dpy, win, _atom_notification_level, XA_CARDINAL,
121 (unsigned int *)¬i_level, 1);
125 API Utilx_Notification_Level utilx_get_system_notification_level (Display* dpy, Window win)
127 UTILX_TRACE ("[UTILX] utilx_get_system_notification_level... win = %x\n", win);
129 Utilx_Notification_Level noti_level;
133 noti_level = UTILX_NOTIFICATION_LEVEL_LOW;
137 fprintf (stderr, "[UTILX] Error.. Invald Display.. %s (%d)\n", __func__, __LINE__);
141 if (!_atom_notification_level)
143 _atom_notification_level = XInternAtom (dpy, "_E_ILLUME_NOTIFICATION_LEVEL", False);
144 if (!_atom_notification_level)
146 fprintf (stderr, "[UTILX] Error.. Cannot create _E_ILLUME_NOTIFICATION_LEVEL atom.. %s (%d)\n", __func__, __LINE__);
151 ret = _utilx_get_window_property (dpy, win, _atom_notification_level, XA_CARDINAL,
152 (unsigned int *)&level, 1);
159 noti_level = UTILX_NOTIFICATION_LEVEL_LOW;
163 noti_level = UTILX_NOTIFICATION_LEVEL_NORMAL;
167 noti_level = UTILX_NOTIFICATION_LEVEL_HIGH;
171 noti_level = UTILX_NOTIFICATION_LEVEL_LOW;
177 noti_level = UTILX_NOTIFICATION_LEVEL_LOW;
185 API void utilx_enable_indicator (Display* dpy, Window win, int enable)
187 UTILX_TRACE ("[UTILX] utilx_indicator_set_visible_state... win = %x, show_state = %d\n", win, enable);
191 fprintf (stderr, "[UTILX] Error.. Invald Display.. %s (%d)\n", __func__, __LINE__);
195 if (!_atom_indicator_visible_state)
197 _atom_indicator_visible_state = XInternAtom (dpy, "_E_ILLUME_INDICATOR_STATE", False);
198 if (!_atom_indicator_visible_state)
200 fprintf (stderr, "[UTILX] Error.. Cannot create _E_ILLUME_INDICATOR_STATE atom.. %s (%d)\n", __func__, __LINE__);
205 _utilx_set_window_property (dpy, win, _atom_indicator_visible_state, XA_CARDINAL,
206 (unsigned int *)&enable, 1);
210 API int utilx_get_indicator_state (Display* dpy, Window win)
212 UTILX_TRACE ("[UTILX] utilx_indicator_set_visible_state... win = %x, show_state = %d\n", win, enable);
219 fprintf (stderr, "[UTILX] Error.. Invald Display.. %s (%d)\n", __func__, __LINE__);
223 if (!_atom_indicator_visible_state)
225 _atom_indicator_visible_state = XInternAtom (dpy, "_E_ILLUME_INDICATOR_STATE", False);
226 if (!_atom_indicator_visible_state)
228 fprintf (stderr, "[UTILX] Error.. Cannot create _E_ILLUME_INDICATOR_STATE atom.. %s (%d)\n", __func__, __LINE__);
233 ret = _utilx_get_window_property (dpy, win, _atom_indicator_visible_state, XA_CARDINAL,
234 (unsigned int *)&state, 1);
243 _utilx_set_window_property (Display* dpy, Window win, Atom atom, Atom type, unsigned int *val, unsigned int num)
245 XChangeProperty (dpy, win, atom, type, 32, PropModeReplace, (unsigned char *)val, num);
251 _utilx_get_window_property (Display* dpy, Window win, Atom atom, Atom type, unsigned int *val, unsigned int len)
253 unsigned char* prop_ret;
255 unsigned long bytes_after, num_ret;
261 if (XGetWindowProperty(dpy, win, atom, 0, 0x7fffffff, False,
262 type, &type_ret, &format_ret, &num_ret,
263 &bytes_after, &prop_ret) != Success)
268 if (type_ret != type || format_ret != 32)
272 else if (num_ret == 0 || !prop_ret)
280 for (i = 0; i < len; i++)
282 val[i] = ((unsigned long *)prop_ret)[i];
295 static unsigned long _get_list_of_grabbed_key (Display *disp, Window win, int **key_list)
299 unsigned long nr_item;
300 unsigned long sz_remains_data;
302 if (XGetWindowProperty(disp, win,
303 _atom_grab_key, 0, 0x7fffffff, False, XA_CARDINAL,
304 &ret_type, &ret_format, &nr_item,
305 &sz_remains_data, (unsigned char**)key_list) != Success)
310 // fprintf(stderr, "
\e[31m%d - %lu
\e[0m\n", ret_format, nr_item);
316 static void _free_list_of_grabbed_key (int *key_list)
324 static void _free_new_list_of_grabbed_key (int *new_key_list)
332 static int _search_grabbed_key (int *key_list, int key, unsigned long cnt)
336 for (i = cnt - 1; i >= 0; i --) {
337 if (key_list[i] == key) break;
344 static int *_del_grabbed_key (int *key_list, int i, unsigned long *cnt)
346 int *new_key_list = NULL;
348 // Only one element is exists in the list of grabbed key
351 if (*cnt == 0) return NULL;
354 new_key_list = malloc((*cnt) * sizeof(int));
355 if (new_key_list == NULL) {
362 memcpy(new_key_list, key_list, sizeof(int) * i);
366 if ((*cnt) - i > 0) {
367 memcpy(new_key_list + i,
369 sizeof(int) * ((*cnt) - i)
376 static void _set_exclusive_grab_info_to_root (Display *disp, int keycode, Window win, int grab_mode)
379 int *key_list = NULL;
383 unsigned long nr_item;
384 unsigned long sz_remains_data;
387 if( grab_mode == EXCLUSIVE_GRAB )
389 if( _atom_grab_excl_win == None )
390 _atom_grab_excl_win = XInternAtom(disp, STR_ATOM_GRAB_EXCL_WIN, False);
391 ex_grabwin = _atom_grab_excl_win;
393 else if( grab_mode == OR_EXCLUSIVE_GRAB )
395 if( _atom_grab_or_excl_win == None )
396 _atom_grab_or_excl_win = XInternAtom(disp, STR_ATOM_GRAB_OR_EXCL_WIN, False);
397 ex_grabwin = _atom_grab_or_excl_win;
402 if (XGetWindowProperty(disp, DefaultRootWindow(disp),
403 ex_grabwin, 0, 0x7fffffff, False, XA_CARDINAL,
404 &ret_type, &ret_format, &nr_item,
405 &sz_remains_data, (unsigned char**)&key_list) != Success)
407 fprintf(stderr, "[utilX][%s] Fail to get root window property !\n", __FUNCTION__);
412 printf("[%s] keycode = %d\n", __FUNCTION__, keycode);
415 for( i=0 ; i < nr_item ; i++ )
417 if( key_list && (key_list[i] == keycode) )
421 XChangeProperty(disp, DefaultRootWindow(disp), ex_grabwin, XA_CARDINAL, 32,
422 nr_item ? PropModeAppend : PropModeReplace, (unsigned char *)&keycode, 1);
430 static void _unset_exclusive_grab_info_to_root (Display *disp, int keycode, int grab_mode)
433 unsigned long cnt = 0;
434 int *key_list = NULL;
435 int *new_key_list = NULL;
439 unsigned long nr_item;
440 unsigned long sz_remains_data;
443 if( grab_mode == EXCLUSIVE_GRAB )
445 if( _atom_grab_excl_win == None )
446 _atom_grab_excl_win = XInternAtom(disp, STR_ATOM_GRAB_EXCL_WIN, False);
447 ex_grabwin = _atom_grab_excl_win;
449 else if( grab_mode == OR_EXCLUSIVE_GRAB )
451 if( _atom_grab_or_excl_win == None )
452 _atom_grab_or_excl_win = XInternAtom(disp, STR_ATOM_GRAB_OR_EXCL_WIN, False);
453 ex_grabwin = _atom_grab_or_excl_win;
458 if (XGetWindowProperty(disp, DefaultRootWindow(disp),
459 ex_grabwin, 0, 0x7fffffff, False, XA_CARDINAL,
460 &ret_type, &ret_format, &nr_item,
461 &sz_remains_data, (unsigned char**)&key_list) != Success)
468 fprintf(stderr, "
\e[32m[utilX][%s] keycode = %d
\e[0m\n", __FUNCTION__, keycode);
472 for( i=0 ; i < nr_item ; i++ )
474 if( key_list[i] == keycode )//&& grab_mode == EXCLUSIVE_GRAB )
482 fprintf(stderr, "[utilX][%s] cnt = %d, nr_item = %d\n", __FUNCTION__, cnt, nr_item);
487 new_key_list = malloc(sizeof(int)*cnt);
495 //fprintf(stderr, "
\e[32m[utilX][%s] Fail to allocation memory for new_key_list !
\e[0m\n", __FUNCTION__);
496 XDeleteProperty(disp, DefaultRootWindow(disp), ex_grabwin);
501 for( i=0 ; i < nr_item ; i++ )
503 if( key_list[i] == keycode )//&& grab_mode == EXCLUSIVE_GRAB )
508 new_key_list[cnt++] = key_list[i];
512 XChangeProperty(disp, DefaultRootWindow(disp), ex_grabwin, XA_CARDINAL, 32,
513 PropModeReplace, (unsigned char *)new_key_list, cnt);
516 XDeleteProperty(disp, DefaultRootWindow(disp), ex_grabwin);
528 static int _is_grabbed_key_exclusively (Display* disp, int keycode, int grab_mode)
531 int *key_list = NULL;
535 unsigned long nr_item;
536 unsigned long sz_remains_data;
539 if( grab_mode == EXCLUSIVE_GRAB )
541 if( _atom_grab_excl_win == None )
542 _atom_grab_excl_win = XInternAtom(disp, STR_ATOM_GRAB_EXCL_WIN, False);
543 ex_grabwin = _atom_grab_excl_win;
545 else if( grab_mode == OR_EXCLUSIVE_GRAB )
547 if( _atom_grab_or_excl_win == None )
548 _atom_grab_or_excl_win = XInternAtom(disp, STR_ATOM_GRAB_OR_EXCL_WIN, False);
549 ex_grabwin = _atom_grab_or_excl_win;
554 if (XGetWindowProperty(disp, DefaultRootWindow(disp),
555 ex_grabwin, 0, 0x7fffffff, False, XA_CARDINAL,
556 &ret_type, &ret_format, &nr_item,
557 &sz_remains_data, (unsigned char**)&key_list) != Success)
559 fprintf(stderr, "[%s] Fail to get root window property !\n", __FUNCTION__);
563 for( i=0 ; i < nr_item ; i++ )
565 if( key_list[i] == keycode )
566 return EXCLUSIVE_GRABBED_ALREADY;
573 API int utilx_grab_key (Display* disp, Window win, const char* key, int grab_mode)
576 int *key_list = NULL;
584 fprintf(stderr, "[%s] Display is NULL\n", __FUNCTION__);
588 if (_atom_grab_key == None) {
589 _atom_grab_key = XInternAtom(disp, STR_ATOM_GRAB_KEY, False);
592 if (!strncmp(key, "Keycode-", 8)) {
593 keycode = atoi(key + 8);
595 keysym = XStringToKeysym(key);
596 if (keysym == NoSymbol) goto out;
597 keycode = XKeysymToKeycode(disp, XStringToKeysym(key));
599 if (keycode == 0) goto out;
601 if( grab_mode == EXCLUSIVE_GRAB )
604 result = _is_grabbed_key_exclusively(disp, keycode, grab_mode);
607 printf("[%s] _is_grabbed_key_exclusively returns result = %d\n", __FUNCTION__, result);
612 fprintf(stderr, "[%s] keycode(%d) was already grabbed exclusively (grab_mode=0x%X) !\n", __FUNCTION__, keycode, grab_mode);
616 else if( grab_mode == OR_EXCLUSIVE_GRAB )
618 result = _is_grabbed_key_exclusively(disp, keycode, grab_mode);
622 fprintf(stderr, "[%s] Keycode(%d) was already grabbed with overridable exclusive mode (grab_mode=0x%x)\n", __FUNCTION__, keycode, grab_mode);
623 fprintf(stderr, "[%s] Now it will be overridden by a new window(0x%x) !\n", __FUNCTION__, win);
624 utilx_ungrab_key(disp, win, key);
628 keycode |= grab_mode;
630 cnt = _get_list_of_grabbed_key(disp, win, &key_list);
632 i = _search_grabbed_key(key_list, keycode, cnt);
633 _free_list_of_grabbed_key(key_list);
635 if( grab_mode == OR_EXCLUSIVE_GRAB )
637 utilx_ungrab_key(disp, win, key);
641 fprintf(stderr, "Key is already grabbed\n");
647 XChangeProperty(disp, win, _atom_grab_key, XA_CARDINAL, 32,
648 cnt ? PropModeAppend : PropModeReplace, (unsigned char *)&keycode, 1);
650 keycode = keycode & (~GRAB_MODE_MASK);
652 printf("[%s] keycode = %d\n", __FUNCTION__, keycode);
655 if( EXCLUSIVE_GRAB == grab_mode || OR_EXCLUSIVE_GRAB == grab_mode )
656 _set_exclusive_grab_info_to_root(disp, keycode, win, grab_mode);
666 API int utilx_ungrab_key (Display* disp, Window win, const char* key)
670 int *key_list = NULL;
671 int *new_key_list = NULL;
679 fprintf(stderr, "[%s] Display is NULL\n", __FUNCTION__);
683 if (_atom_grab_key == None) {
684 _atom_grab_key = XInternAtom(disp, STR_ATOM_GRAB_KEY, False);
687 if (!strncmp(key, "Keycode-", 8)) {
688 keycode = atoi(key + 8);
690 keysym = XStringToKeysym(key);
691 if (keysym == NoSymbol) goto out;
692 keycode = XKeysymToKeycode(disp, XStringToKeysym(key));
694 if (keycode == 0) goto out;
696 cnt = _get_list_of_grabbed_key(disp, win, &key_list);
697 if (cnt == 0) goto out;
700 i = _search_grabbed_key(key_list, keycode | EXCLUSIVE_GRAB, cnt);
705 i = _search_grabbed_key(key_list, keycode | OR_EXCLUSIVE_GRAB, cnt);
710 i = _search_grabbed_key(key_list, keycode | TOP_POSITION_GRAB, cnt);
715 i = _search_grabbed_key(key_list, keycode | SHARED_GRAB, cnt);
719 _free_list_of_grabbed_key(key_list);
726 _unset_exclusive_grab_info_to_root(disp, keycode, OR_EXCLUSIVE_GRAB);
731 _unset_exclusive_grab_info_to_root(disp, keycode, EXCLUSIVE_GRAB);
734 new_key_list = _del_grabbed_key(key_list, i, &cnt);
735 _free_list_of_grabbed_key(key_list);
738 XChangeProperty(disp, win, _atom_grab_key, XA_CARDINAL, 32,
739 PropModeReplace, (unsigned char *)new_key_list, cnt);
742 XDeleteProperty(disp, win, _atom_grab_key);
746 _free_new_list_of_grabbed_key(new_key_list);
755 API Utilx_Key_Status utilx_get_key_status(Display* dpy, char *key_name)
757 unsigned char keymap[32];
758 static unsigned int masktable[8] = { 0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80 };
759 Utilx_Key_Status status = UTILX_KEY_STATUS_UNKNOWN;
761 if( !strncmp(key_name, KEY_VOLUMEDOWN, LEN_KEY_VOLUMEDOWN) ||
762 !strncmp(key_name, KEY_VOLUMEUP, LEN_KEY_VOLUMEUP) ||
763 !strncmp(key_name, KEY_PAUSE, LEN_KEY_PAUSE) ||
764 !strncmp(key_name, KEY_SEND, LEN_KEY_SEND) ||
765 !strncmp(key_name, KEY_SELECT, LEN_KEY_VOLUMEDOWN) ||
766 !strncmp(key_name, KEY_END, LEN_KEY_END) ||
767 !strncmp(key_name, KEY_POWER, LEN_KEY_POWER) ||
768 !strncmp(key_name, KEY_CAMERA, LEN_KEY_CAMERA) ||
769 !strncmp(key_name, KEY_CONFIG, LEN_KEY_CONFIG) ||
770 !strncmp(key_name, KEY_PLAYCD, LEN_KEY_PLAYCD) ||
771 !strncmp(key_name, KEY_STOPCD, LEN_KEY_STOPCD) ||
772 !strncmp(key_name, KEY_PAUSECD, LEN_KEY_PAUSECD) ||
773 !strncmp(key_name, KEY_NEXTSONG, LEN_KEY_NEXTSONG) ||
774 !strncmp(key_name, KEY_PREVIOUSSONG, LEN_KEY_PREVIOUSSONG) ||
775 !strncmp(key_name, KEY_REWIND, LEN_KEY_REWIND) ||
776 !strncmp(key_name, KEY_FASTFORWARD, LEN_KEY_FASTFORWARD) ||
777 !strncmp(key_name, KEY_MEDIA, LEN_KEY_MEDIA) )
779 KeySym ks = XStringToKeysym(key_name);
780 KeyCode kc = XKeysymToKeycode(dpy, ks);
784 XQueryKeymap(dpy, (char *)keymap);
785 if( keymap[kc >> 3] & masktable[kc & 7] )
786 status = UTILX_KEY_STATUS_PRESSED;
788 status = UTILX_KEY_STATUS_RELEASED;
795 API void utilx_set_window_effect_state(Display* dpy, Window win, int state)
799 fprintf (stderr, "[UTILX] Error.. Invald Display.. %s (%d)\n", __func__, __LINE__);
802 if( !_atom_comp_effect_state)
803 _atom_comp_effect_state = XInternAtom(dpy, "_NET_CM_WINDOW_EFFECT_ENABLE",False);
805 _utilx_set_window_property(dpy, win, _atom_comp_effect_state, XA_CARDINAL, (unsigned int *)&state, 1);
810 API int utilx_get_window_effect_state(Display* dpy, Window win)
813 if( !_atom_comp_effect_state)
814 _atom_comp_effect_state = XInternAtom(dpy, "_NET_CM_WINDOW_EFFECT_ENABLE",False);
815 _utilx_get_window_property(dpy, win, _atom_comp_effect_state, XA_CARDINAL, (unsigned int *)&state, 1);
820 _utilx_string_set_window_property( Display *dpy, Window win, Atom atom, char *val, unsigned int num)
822 XChangeProperty( dpy, win, atom, XA_STRING, 8, PropModeReplace, (unsigned char*)val, val ? strlen(val):0 );
825 API void utilx_set_fake_launch_img(Display* dpy, Window win, char *file_name)
827 //UTILX_TRACE ("[UTILX] utilx_set_effect_state... win = %x, show_state = %d\n", win, enable);
831 fprintf (stderr, "[UTILX] Error.. Invald Display.. %s (%d)\n", __func__, __LINE__);
834 if( !_atom_comp_fake_launch_image)
835 _atom_comp_fake_launch_image = XInternAtom(dpy, "_E_COMP_FAKE_LAUNCH_IMAGE",False);
837 _utilx_string_set_window_property(dpy, win, _atom_comp_fake_launch_image, file_name, 1);
840 API void utilx_show_fake_effect( Display *dpy, Window win, char *fake_image_file )
844 _atom_comp_fake_launch = XInternAtom( dpy, "_E_COMP_FAKE_LAUNCH", False );
846 if( !_atom_comp_fake_launch )
848 fprintf( stderr, "XInternAtom(_E_COMP_FAKE_LAUNCH) failed.\n" );
852 utilx_set_fake_launch_img(dpy, win, fake_image_file);
856 // send fake client message
857 xev.xclient.type = ClientMessage;
858 xev.xclient.display = dpy;
859 xev.xclient.window = win;
860 xev.xclient.message_type = _atom_comp_fake_launch;
861 xev.xclient.format = 32;
862 xev.xclient.data.l[0] = 1; // 1 : start effect , 0 : end effect
863 xev.xclient.data.l[1] = 0;
864 xev.xclient.data.l[2] = 0;
865 xev.xclient.data.l[3] = 0;
866 xev.xclient.data.l[4] = 0;
868 XSendEvent( dpy, win, False,
869 SubstructureRedirectMask | SubstructureNotifyMask,
876 API void utilx_hide_fake_effect( Display *dpy, Window win)
880 _atom_comp_fake_launch = XInternAtom( dpy, "_E_COMP_FAKE_LAUNCH", False );
881 if( !_atom_comp_fake_launch )
883 fprintf( stderr, "XInternAtom(_E_COMP_FAKE_LAUNCH) failed.\n" );
887 // send fake client message
888 xev.xclient.type = ClientMessage;
889 xev.xclient.display = dpy;
890 xev.xclient.window = win;
891 xev.xclient.message_type = _atom_comp_fake_launch;
892 xev.xclient.format = 32;
893 xev.xclient.data.l[0] = 0; // 1 : start effect , 0 : end effect
894 xev.xclient.data.l[1] = 0;
895 xev.xclient.data.l[2] = 0;
896 xev.xclient.data.l[3] = 0;
897 xev.xclient.data.l[4] = 0;
899 XSendEvent( dpy, win, False,
900 SubstructureRedirectMask | SubstructureNotifyMask,
905 static void _utilx_effect_atom_check( Display* dpy )
909 fprintf (stderr, "[UTILX] Error.. Invald Display.. %s (%d)\n", __func__, __LINE__);
913 if( !_atom_comp_window_effect_type)
914 _atom_comp_window_effect_type = XInternAtom(dpy, "_NET_CM_WINDOW_EFFECT_TYPE",False);
915 if( !_atom_comp_effect_default )
916 _atom_comp_effect_default = XInternAtom(dpy, "_NET_CM_EFFECT_DEFAULT",False);
917 if( !_atom_comp_effect_none )
918 _atom_comp_effect_none = XInternAtom(dpy, "_NET_CM_EFFECT_NONE",False);
919 if( !_atom_comp_effect_custom0 )
920 _atom_comp_effect_custom0 = XInternAtom(dpy, "_NET_CM_EFFECT_CUSTOM0",False);
921 if( !_atom_comp_effect_custom1 )
922 _atom_comp_effect_custom1 = XInternAtom(dpy, "_NET_CM_EFFECT_CUSTOM1",False);
923 if( !_atom_comp_effect_custom2 )
924 _atom_comp_effect_custom2 = XInternAtom(dpy, "_NET_CM_EFFECT_CUSTOM2",False);
925 if( !_atom_comp_effect_custom3 )
926 _atom_comp_effect_custom3 = XInternAtom(dpy, "_NET_CM_EFFECT_CUSTOM3",False);
927 if( !_atom_comp_effect_custom4 )
928 _atom_comp_effect_custom4 = XInternAtom(dpy, "_NET_CM_EFFECT_CUSTOM4",False);
929 if( !_atom_comp_effect_custom5 )
930 _atom_comp_effect_custom5 = XInternAtom(dpy, "_NET_CM_EFFECT_CUSTOM5",False);
931 if( !_atom_comp_effect_custom6 )
932 _atom_comp_effect_custom6 = XInternAtom(dpy, "_NET_CM_EFFECT_CUSTOM6",False);
933 if( !_atom_comp_effect_custom7 )
934 _atom_comp_effect_custom7 = XInternAtom(dpy, "_NET_CM_EFFECT_CUSTOM7",False);
935 if( !_atom_comp_effect_custom8 )
936 _atom_comp_effect_custom8 = XInternAtom(dpy, "_NET_CM_EFFECT_CUSTOM8",False);
937 if( !_atom_comp_effect_custom9 )
938 _atom_comp_effect_custom9 = XInternAtom(dpy, "_NET_CM_EFFECT_CUSTOM9",False);
941 static Atom _utilx_convert_style_to_atom( Display* dpy, Utilx_Effect_Style style )
945 fprintf (stderr, "[UTILX] Error.. Invald Display.. %s (%d)\n", __func__, __LINE__);
946 return _atom_comp_effect_none;
948 _utilx_effect_atom_check(dpy);
950 if ( style == UTILX_EFFECT_STYLE_DEFAULT ) return _atom_comp_effect_default;
951 else if ( style == UTILX_EFFECT_STYLE_NONE ) return _atom_comp_effect_none;
952 else if ( style == UTILX_EFFECT_STYLE_CUSTOM0 ) return _atom_comp_effect_custom0;
953 else if ( style == UTILX_EFFECT_STYLE_CUSTOM1 ) return _atom_comp_effect_custom1;
954 else if ( style == UTILX_EFFECT_STYLE_CUSTOM2 ) return _atom_comp_effect_custom2;
955 else if ( style == UTILX_EFFECT_STYLE_CUSTOM3 ) return _atom_comp_effect_custom3;
956 else if ( style == UTILX_EFFECT_STYLE_CUSTOM4 ) return _atom_comp_effect_custom4;
957 else if ( style == UTILX_EFFECT_STYLE_CUSTOM5 ) return _atom_comp_effect_custom5;
958 else if ( style == UTILX_EFFECT_STYLE_CUSTOM6 ) return _atom_comp_effect_custom6;
959 else if ( style == UTILX_EFFECT_STYLE_CUSTOM7 ) return _atom_comp_effect_custom7;
960 else if ( style == UTILX_EFFECT_STYLE_CUSTOM8 ) return _atom_comp_effect_custom8;
961 else if ( style == UTILX_EFFECT_STYLE_CUSTOM9 ) return _atom_comp_effect_custom9;
962 else return _atom_comp_effect_none;
966 static Utilx_Effect_Style _utilx_convert_atom_to_style( Display* dpy, Atom style )
970 fprintf (stderr, "[UTILX] Error.. Invald Display.. %s (%d)\n", __func__, __LINE__);
971 return UTILX_EFFECT_STYLE_NONE;
973 _utilx_effect_atom_check(dpy);
975 if ( style == _atom_comp_effect_default ) return UTILX_EFFECT_STYLE_DEFAULT;
976 else if ( style == _atom_comp_effect_none ) return UTILX_EFFECT_STYLE_NONE;
977 else if ( style == _atom_comp_effect_custom0 ) return UTILX_EFFECT_STYLE_CUSTOM0;
978 else if ( style == _atom_comp_effect_custom1 ) return UTILX_EFFECT_STYLE_CUSTOM1;
979 else if ( style == _atom_comp_effect_custom2 ) return UTILX_EFFECT_STYLE_CUSTOM2;
980 else if ( style == _atom_comp_effect_custom3 ) return UTILX_EFFECT_STYLE_CUSTOM3;
981 else if ( style == _atom_comp_effect_custom4 ) return UTILX_EFFECT_STYLE_CUSTOM4;
982 else if ( style == _atom_comp_effect_custom5 ) return UTILX_EFFECT_STYLE_CUSTOM5;
983 else if ( style == _atom_comp_effect_custom6 ) return UTILX_EFFECT_STYLE_CUSTOM6;
984 else if ( style == _atom_comp_effect_custom7 ) return UTILX_EFFECT_STYLE_CUSTOM7;
985 else if ( style == _atom_comp_effect_custom8 ) return UTILX_EFFECT_STYLE_CUSTOM8;
986 else if ( style == _atom_comp_effect_custom9 ) return UTILX_EFFECT_STYLE_CUSTOM9;
987 else return UTILX_EFFECT_STYLE_DEFAULT;
990 API void utilx_set_window_effect_style(Display* dpy, Window win, Utilx_Effect_Type type, Utilx_Effect_Style style)
992 Atom *window_effect_type_list = NULL;
995 fprintf (stderr, "[UTILX] Error.. Invald Display.. %s (%d)\n", __func__, __LINE__);
998 _utilx_effect_atom_check(dpy);
1000 window_effect_type_list = (Atom *)malloc(sizeof(Atom) * 6);
1002 if ( !window_effect_type_list )
1004 fprintf (stderr, "[UTILX] Error.. malloc().. %s (%d)\n", __func__, __LINE__);
1008 window_effect_type_list[0] = _atom_comp_effect_default;
1009 window_effect_type_list[1] = _atom_comp_effect_default;
1010 window_effect_type_list[2] = _atom_comp_effect_default;
1011 window_effect_type_list[3] = _atom_comp_effect_default;
1012 window_effect_type_list[4] = _atom_comp_effect_default;
1013 window_effect_type_list[5] = _atom_comp_effect_default;
1015 _utilx_get_window_property(dpy, win, _atom_comp_window_effect_type, XA_ATOM, (unsigned int *)window_effect_type_list, 6);
1017 if ( type == UTILX_EFFECT_TYPE_MAP ) window_effect_type_list[0] = _utilx_convert_style_to_atom(dpy, style);
1018 else if ( type == UTILX_EFFECT_TYPE_UNMAP ) window_effect_type_list[1] = _utilx_convert_style_to_atom(dpy, style);
1019 else if ( type == UTILX_EFFECT_TYPE_RAISEABOVE ) window_effect_type_list[2] = _utilx_convert_style_to_atom(dpy, style);
1020 else if ( type == UTILX_EFFECT_TYPE_ROTATION ) window_effect_type_list[3] = _utilx_convert_style_to_atom(dpy, style);
1021 else if ( type == UTILX_EFFECT_TYPE_FOCUSIN ) window_effect_type_list[4] = _utilx_convert_style_to_atom(dpy, style);
1022 else if ( type == UTILX_EFFECT_TYPE_FOCUSOUT ) window_effect_type_list[5] = _utilx_convert_style_to_atom(dpy, style);
1024 _utilx_set_window_property(dpy, win, _atom_comp_window_effect_type, XA_ATOM, (unsigned int *)window_effect_type_list, 6);
1027 free(window_effect_type_list);
1030 API Utilx_Effect_Style utilx_get_window_effect_style(Display* dpy, Window win, Utilx_Effect_Type type)
1032 Atom *window_effect_type_list = NULL;
1033 Utilx_Effect_Style style = UTILX_EFFECT_STYLE_DEFAULT;
1037 fprintf (stderr, "[UTILX] Error.. Invald Display.. %s (%d)\n", __func__, __LINE__);
1038 return UTILX_EFFECT_STYLE_NONE;
1040 _utilx_effect_atom_check(dpy);
1042 window_effect_type_list = (Atom *)malloc(sizeof(Atom) * 6);
1044 if ( !window_effect_type_list )
1046 fprintf (stderr, "[UTILX] Error.. malloc().. %s (%d)\n", __func__, __LINE__);
1047 return UTILX_EFFECT_STYLE_NONE;
1050 if ( _utilx_get_window_property(dpy, win, _atom_comp_window_effect_type, XA_ATOM, (unsigned int *)window_effect_type_list, 6) != 6 )
1052 fprintf (stderr, "[UTILX] Error.. get property failed!.. %s (%d)\n", __func__, __LINE__);
1053 free(window_effect_type_list);
1054 return UTILX_EFFECT_STYLE_NONE;
1057 if ( type == UTILX_EFFECT_TYPE_MAP ) style = _utilx_convert_atom_to_style(dpy, window_effect_type_list[0]);
1058 else if ( type == UTILX_EFFECT_TYPE_UNMAP ) style = _utilx_convert_atom_to_style(dpy, window_effect_type_list[1]);
1059 else if ( type == UTILX_EFFECT_TYPE_RAISEABOVE ) style = _utilx_convert_atom_to_style(dpy, window_effect_type_list[2]);
1060 else if ( type == UTILX_EFFECT_TYPE_ROTATION ) style = _utilx_convert_atom_to_style(dpy, window_effect_type_list[3]);
1061 else if ( type == UTILX_EFFECT_TYPE_FOCUSIN ) style = _utilx_convert_atom_to_style(dpy, window_effect_type_list[4]);
1062 else if ( type == UTILX_EFFECT_TYPE_FOCUSOUT ) style = _utilx_convert_atom_to_style(dpy, window_effect_type_list[5]);
1065 free(window_effect_type_list);
1069 API int utilx_set_window_opaque_state (Display* dpy, Window win, Utilx_Opaque_State state)
1071 UTILX_TRACE ("[UTILX] utilx_set_window_opaque_state... win = %x, show_state = %d\n", win, state);
1073 unsigned int is_opaque;
1077 fprintf (stderr, "[UTILX] Error.. Invald Display.. %s (%d)\n", __func__, __LINE__);
1083 case UTILX_OPAQUE_STATE_OFF:
1087 case UTILX_OPAQUE_STATE_ON:
1092 fprintf (stderr, "[UTILX] Error.. Invald State.. %s (%d)\n", __func__, __LINE__);
1096 if (!_atom_window_opaque)
1098 _atom_window_opaque = XInternAtom (dpy, "_E_ILLUME_WINDOW_REGION_OPAQUE", False);
1099 if (!_atom_window_opaque)
1101 fprintf (stderr, "[UTILX] Error.. Cannot create _E_ILLUME_WINDOW_REGION_OPAQUE atom.. %s (%d)\n", __func__, __LINE__);
1106 _utilx_set_window_property (dpy, win, _atom_window_opaque, XA_CARDINAL,
1107 (unsigned int *)&is_opaque, 1);
1113 _utilx_screen_capture_atom_ensure (Display* dpy)
1115 if (_atom_screen_capture_disable)
1118 _atom_screen_capture_disable = XInternAtom (dpy, "_CB_SCREEN_CAPTURE_DISABLE", False);
1119 if (_atom_screen_capture_disable)
1122 fprintf (stderr, "[UTILX] Error.. Cannot create _CB_SCREEN_CAPTURE_DISABLE atom.. %s (%d)\n", __func__, __LINE__);
1126 utilx_set_screen_capture(Display* dpy, int enable)
1133 fprintf (stderr, "[UTILX] Error.. dpy is NULL %s (%d)\n", __func__, __LINE__);
1137 root = RootWindow (dpy, DefaultScreen(dpy));
1138 disable = (enable) ? 0 : 1;
1140 _utilx_screen_capture_atom_ensure (dpy);
1142 _utilx_set_window_property (dpy, root, _atom_screen_capture_disable, XA_CARDINAL, (unsigned int *)&disable, 1);
1148 utilx_get_screen_capture(Display* dpy)
1155 fprintf (stderr, "[UTILX] Error.. dpy is NULL %s (%d)\n", __func__, __LINE__);
1159 root = RootWindow (dpy, DefaultScreen(dpy));
1161 _utilx_screen_capture_atom_ensure (dpy);
1163 _utilx_get_window_property(dpy, root, _atom_screen_capture_disable, XA_CARDINAL,
1164 (unsigned int *)&disable, 1);
1166 return (disable) ? 0 : 1;
1169 API void utilx_set_window_cardinal_property(Display* dpy, Window win, Atom atom, unsigned int *value)
1171 _utilx_set_window_property(dpy, win, atom, XA_CARDINAL, value, 1);
1174 API int utilx_get_window_cardinal_property (Display* dpy, Window win, Atom atom, unsigned int *value)
1176 return _utilx_get_window_property(dpy, win, atom, XA_CARDINAL, value, 1);
1179 API void utilx_show_capture_effect( Display *dpy, Window win)
1183 _atom_comp_capture_effect = XInternAtom( dpy, "_E_COMP_CAPTURE_EFFECT", False );
1184 if( !_atom_comp_capture_effect )
1186 fprintf( stderr, "XInternAtom(_E_COMP_CAPTURE_EFFECT) failed.\n" );
1190 // send capture effect client message
1191 xev.xclient.type = ClientMessage;
1192 xev.xclient.display = dpy;
1193 xev.xclient.window = win;
1194 xev.xclient.message_type = _atom_comp_capture_effect;
1195 xev.xclient.format = 32;
1196 xev.xclient.data.l[0] = 0;
1197 xev.xclient.data.l[1] = 0;
1198 xev.xclient.data.l[2] = 0;
1199 xev.xclient.data.l[3] = 0;
1200 xev.xclient.data.l[4] = 0;
1202 XSendEvent( dpy, win, False,
1203 SubstructureRedirectMask | SubstructureNotifyMask,