summaryrefslogtreecommitdiff
path: root/libxklavier/xklavier_toplevel.c
diff options
context:
space:
mode:
Diffstat (limited to 'libxklavier/xklavier_toplevel.c')
-rw-r--r--libxklavier/xklavier_toplevel.c481
1 files changed, 244 insertions, 237 deletions
diff --git a/libxklavier/xklavier_toplevel.c b/libxklavier/xklavier_toplevel.c
index d8ab632..f9f31ea 100644
--- a/libxklavier/xklavier_toplevel.c
+++ b/libxklavier/xklavier_toplevel.c
@@ -9,26 +9,25 @@
Window xkl_toplevel_window_prev;
-void xkl_toplevel_window_set_transparent( Window toplevel_win,
- gboolean transparent )
+void
+xkl_toplevel_window_set_transparent(Window toplevel_win,
+ gboolean transparent)
{
- gboolean oldval;
-
- oldval = xkl_window_is_transparent( toplevel_win );
- xkl_debug( 150, "toplevel_win " WINID_FORMAT " was %stransparent\n",
- toplevel_win, oldval ? "" : "not " );
- if( transparent && !oldval )
- {
- CARD32 prop = 1;
- XChangeProperty( xkl_display, toplevel_win,
- xkl_atoms[XKLAVIER_TRANSPARENT],
- XA_INTEGER, 32, PropModeReplace,
- ( const unsigned char * ) &prop, 1 );
- } else if( !transparent && oldval )
- {
- XDeleteProperty( xkl_display, toplevel_win,
- xkl_atoms[XKLAVIER_TRANSPARENT] );
- }
+ gboolean oldval;
+
+ oldval = xkl_window_is_transparent(toplevel_win);
+ xkl_debug(150, "toplevel_win " WINID_FORMAT " was %stransparent\n",
+ toplevel_win, oldval ? "" : "not ");
+ if (transparent && !oldval) {
+ CARD32 prop = 1;
+ XChangeProperty(xkl_display, toplevel_win,
+ xkl_atoms[XKLAVIER_TRANSPARENT],
+ XA_INTEGER, 32, PropModeReplace,
+ (const unsigned char *) &prop, 1);
+ } else if (!transparent && oldval) {
+ XDeleteProperty(xkl_display, toplevel_win,
+ xkl_atoms[XKLAVIER_TRANSPARENT]);
+ }
}
/**
@@ -37,99 +36,101 @@ void xkl_toplevel_window_set_transparent( Window toplevel_win,
* and register ourselves us listeners.
* Note: User's callback is called
*/
-void xkl_toplevel_window_add( Window toplevel_win, Window parent,
- gboolean ignore_existing_state,
- XklState * init_state )
+void
+xkl_toplevel_window_add(Window toplevel_win, Window parent,
+ gboolean ignore_existing_state,
+ XklState * init_state)
{
- XklState state = *init_state;
- gint default_group_to_use = -1;
-
- if( toplevel_win == xkl_root_window )
- xkl_debug( 150, "??? root app win ???\n" );
-
- xkl_debug( 150, "Trying to add window " WINID_FORMAT "/%s with group %d\n",
- toplevel_win, xkl_window_get_debug_title( toplevel_win),
- init_state->group );
-
- if( !ignore_existing_state )
- {
- gboolean have_state = xkl_toplevel_window_get_state( toplevel_win, &state );
-
- if( have_state )
- {
- xkl_debug( 150,
- "The window " WINID_FORMAT
- " does not require to be added, it already has the xklavier state \n",
- toplevel_win );
- return;
- }
- }
-
- if( xkl_new_window_callback != NULL )
- default_group_to_use = ( *xkl_new_window_callback ) ( toplevel_win,
- parent,
- xkl_new_window_callback_data );
-
- if( default_group_to_use == -1 )
- default_group_to_use = xkl_default_group;
-
- if( default_group_to_use != -1 )
- state.group = default_group_to_use;
-
- xkl_toplevel_window_save_state( toplevel_win, &state );
- xkl_select_input_merging( toplevel_win, FocusChangeMask | PropertyChangeMask );
-
- if( default_group_to_use != -1 )
- {
- if( xkl_current_client == toplevel_win )
- {
- if( ( xkl_secondary_groups_mask & ( 1 << default_group_to_use ) ) != 0 )
- xkl_group_allow_one_switch_to_secondary();
- xkl_group_lock( default_group_to_use );
- }
- }
-
- if( parent == ( Window ) NULL )
- parent = xkl_get_registered_parent( toplevel_win );
-
- xkl_debug( 150, "done\n" );
+ XklState state = *init_state;
+ gint default_group_to_use = -1;
+
+ if (toplevel_win == xkl_root_window)
+ xkl_debug(150, "??? root app win ???\n");
+
+ xkl_debug(150,
+ "Trying to add window " WINID_FORMAT
+ "/%s with group %d\n", toplevel_win,
+ xkl_window_get_debug_title(toplevel_win),
+ init_state->group);
+
+ if (!ignore_existing_state) {
+ gboolean have_state =
+ xkl_toplevel_window_get_state(toplevel_win, &state);
+
+ if (have_state) {
+ xkl_debug(150,
+ "The window " WINID_FORMAT
+ " does not require to be added, it already has the xklavier state \n",
+ toplevel_win);
+ return;
+ }
+ }
+
+ if (xkl_new_window_callback != NULL)
+ default_group_to_use =
+ (*xkl_new_window_callback) (toplevel_win, parent,
+ xkl_new_window_callback_data);
+
+ if (default_group_to_use == -1)
+ default_group_to_use = xkl_default_group;
+
+ if (default_group_to_use != -1)
+ state.group = default_group_to_use;
+
+ xkl_toplevel_window_save_state(toplevel_win, &state);
+ xkl_select_input_merging(toplevel_win,
+ FocusChangeMask | PropertyChangeMask);
+
+ if (default_group_to_use != -1) {
+ if (xkl_current_client == toplevel_win) {
+ if ((xkl_secondary_groups_mask &
+ (1 << default_group_to_use)) != 0)
+ xkl_group_allow_one_switch_to_secondary();
+ xkl_group_lock(default_group_to_use);
+ }
+ }
+
+ if (parent == (Window) NULL)
+ parent = xkl_get_registered_parent(toplevel_win);
+
+ xkl_debug(150, "done\n");
}
/**
* Checks the window and goes up
*/
-gboolean xkl_toplevel_window_find_bottom_to_top( Window win,
- Window *toplevel_win_out )
+gboolean
+xkl_toplevel_window_find_bottom_to_top(Window win,
+ Window * toplevel_win_out)
{
- Window parent = ( Window ) NULL, rwin = ( Window ) NULL, *children = NULL;
- guint num = 0;
-
- if( win == ( Window ) NULL || win == xkl_root_window )
- {
- *toplevel_win_out = win;
- xkl_last_error_message = "The window is either 0 or root";
- return FALSE;
- }
-
- if( xkl_window_has_wm_state( win ) )
- {
- *toplevel_win_out = win;
- return TRUE;
- }
-
- xkl_last_error_code =
- xkl_status_query_tree( win, &rwin, &parent, &children, &num );
-
- if( xkl_last_error_code != Success )
- {
- *toplevel_win_out = ( Window ) NULL;
- return FALSE;
- }
-
- if( children != NULL )
- XFree( children );
-
- return xkl_toplevel_window_find_bottom_to_top( parent, toplevel_win_out );
+ Window parent = (Window) NULL, rwin = (Window) NULL, *children =
+ NULL;
+ guint num = 0;
+
+ if (win == (Window) NULL || win == xkl_root_window) {
+ *toplevel_win_out = win;
+ xkl_last_error_message = "The window is either 0 or root";
+ return FALSE;
+ }
+
+ if (xkl_window_has_wm_state(win)) {
+ *toplevel_win_out = win;
+ return TRUE;
+ }
+
+ xkl_last_error_code =
+ xkl_status_query_tree(win, &rwin, &parent, &children, &num);
+
+ if (xkl_last_error_code != Success) {
+ *toplevel_win_out = (Window) NULL;
+ return FALSE;
+ }
+
+ if (children != NULL)
+ XFree(children);
+
+ return xkl_toplevel_window_find_bottom_to_top(parent,
+ toplevel_win_out);
}
/**
@@ -139,165 +140,171 @@ gboolean xkl_toplevel_window_find_bottom_to_top( Window win,
* Then, goes to parent.
* NOTE: root window cannot be "App window" under normal circumstances
*/
-gboolean xkl_toplevel_window_find( Window win, Window * toplevel_win_out )
+gboolean
+xkl_toplevel_window_find(Window win, Window * toplevel_win_out)
{
- Window parent = ( Window ) NULL,
- rwin = ( Window ) NULL, *children = NULL, *child;
- guint num = 0;
- gboolean rv;
-
- if( win == ( Window ) NULL || win == xkl_root_window )
- {
- *toplevel_win_out = ( Window ) NULL;
- xkl_last_error_message = "The window is either 0 or root";
- xkl_debug( 150,
- "Window " WINID_FORMAT
- " is either 0 or root so could not get the app window for it\n",
- win );
- return FALSE;
- }
-
- if( xkl_window_has_wm_state( win ) )
- {
- *toplevel_win_out = win;
- return TRUE;
- }
-
- xkl_last_error_code =
- xkl_status_query_tree( win, &rwin, &parent, &children, &num );
-
- if( xkl_last_error_code != Success )
- {
- *toplevel_win_out = ( Window ) NULL;
- xkl_debug( 150,
- "Could not get tree for window " WINID_FORMAT
- " so could not get the app window for it\n", win );
- return FALSE;
- }
+ Window parent = (Window) NULL,
+ rwin = (Window) NULL, *children = NULL, *child;
+ guint num = 0;
+ gboolean rv;
+
+ if (win == (Window) NULL || win == xkl_root_window) {
+ *toplevel_win_out = (Window) NULL;
+ xkl_last_error_message = "The window is either 0 or root";
+ xkl_debug(150,
+ "Window " WINID_FORMAT
+ " is either 0 or root so could not get the app window for it\n",
+ win);
+ return FALSE;
+ }
+
+ if (xkl_window_has_wm_state(win)) {
+ *toplevel_win_out = win;
+ return TRUE;
+ }
+
+ xkl_last_error_code =
+ xkl_status_query_tree(win, &rwin, &parent, &children, &num);
+
+ if (xkl_last_error_code != Success) {
+ *toplevel_win_out = (Window) NULL;
+ xkl_debug(150,
+ "Could not get tree for window " WINID_FORMAT
+ " so could not get the app window for it\n",
+ win);
+ return FALSE;
+ }
/**
* Here we first check the children (in case win is just above some "App Window")
* and then go upstairs
*/
- child = children;
- while( num )
- {
- if( xkl_window_has_wm_state( *child ) )
- {
- *toplevel_win_out = *child;
- if( children != NULL )
- XFree( children );
- return TRUE;
- }
- child++;
- num--;
- }
-
- if( children != NULL )
- XFree( children );
-
- rv = xkl_toplevel_window_find_bottom_to_top( parent, toplevel_win_out );
-
- if( !rv )
- xkl_debug( 200, "Could not get the app window for " WINID_FORMAT "/%s\n",
- win, xkl_window_get_debug_title( win ) );
-
- return rv;
+ child = children;
+ while (num) {
+ if (xkl_window_has_wm_state(*child)) {
+ *toplevel_win_out = *child;
+ if (children != NULL)
+ XFree(children);
+ return TRUE;
+ }
+ child++;
+ num--;
+ }
+
+ if (children != NULL)
+ XFree(children);
+
+ rv = xkl_toplevel_window_find_bottom_to_top(parent,
+ toplevel_win_out);
+
+ if (!rv)
+ xkl_debug(200,
+ "Could not get the app window for " WINID_FORMAT
+ "/%s\n", win, xkl_window_get_debug_title(win));
+
+ return rv;
}
/**
* Gets the state from the window property
*/
-gboolean xkl_toplevel_window_get_state( Window toplevel_win, XklState * state_out )
+gboolean
+xkl_toplevel_window_get_state(Window toplevel_win, XklState * state_out)
{
- Atom type_ret;
- int format_ret;
- unsigned long nitems, rest;
- CARD32 *prop = NULL;
- gboolean ret = FALSE;
-
- gint grp = -1;
- guint inds = 0;
-
- if( ( XGetWindowProperty
- ( xkl_display, toplevel_win, xkl_atoms[XKLAVIER_STATE], 0L,
- XKLAVIER_STATE_PROP_LENGTH, False,
- XA_INTEGER, &type_ret, &format_ret, &nitems, &rest,
- ( unsigned char ** ) ( void * ) &prop ) == Success )
- && ( type_ret == XA_INTEGER ) && ( format_ret == 32 ) )
- {
- grp = prop[0];
- if( grp >= xkl_groups_get_num( ) || grp < 0 )
- grp = 0;
-
- inds = prop[1];
-
- if( state_out != NULL )
- {
- state_out->group = grp;
- state_out->indicators = inds;
- }
- if( prop != NULL )
- XFree( prop );
-
- ret = TRUE;
- }
-
- if( ret )
- xkl_debug( 150,
- "Appwin " WINID_FORMAT
- ", '%s' has the group %d, indicators %X\n", toplevel_win,
- xkl_window_get_debug_title( toplevel_win ), grp, inds );
- else
- xkl_debug( 150, "Appwin " WINID_FORMAT ", '%s' does not have state\n",
- toplevel_win, xkl_window_get_debug_title( toplevel_win ) );
-
- return ret;
+ Atom type_ret;
+ int format_ret;
+ unsigned long nitems, rest;
+ CARD32 *prop = NULL;
+ gboolean ret = FALSE;
+
+ gint grp = -1;
+ guint inds = 0;
+
+ if ((XGetWindowProperty
+ (xkl_display, toplevel_win, xkl_atoms[XKLAVIER_STATE], 0L,
+ XKLAVIER_STATE_PROP_LENGTH, False,
+ XA_INTEGER, &type_ret, &format_ret, &nitems, &rest,
+ (unsigned char **) (void *) &prop) == Success)
+ && (type_ret == XA_INTEGER) && (format_ret == 32)) {
+ grp = prop[0];
+ if (grp >= xkl_groups_get_num() || grp < 0)
+ grp = 0;
+
+ inds = prop[1];
+
+ if (state_out != NULL) {
+ state_out->group = grp;
+ state_out->indicators = inds;
+ }
+ if (prop != NULL)
+ XFree(prop);
+
+ ret = TRUE;
+ }
+
+ if (ret)
+ xkl_debug(150,
+ "Appwin " WINID_FORMAT
+ ", '%s' has the group %d, indicators %X\n",
+ toplevel_win,
+ xkl_window_get_debug_title(toplevel_win), grp,
+ inds);
+ else
+ xkl_debug(150,
+ "Appwin " WINID_FORMAT
+ ", '%s' does not have state\n", toplevel_win,
+ xkl_window_get_debug_title(toplevel_win));
+
+ return ret;
}
-
+
/**
* Deletes the state from the window properties
*/
-void xkl_toplevel_window_remove_state( Window toplevel_win )
+void
+xkl_toplevel_window_remove_state(Window toplevel_win)
{
- XDeleteProperty( xkl_display, toplevel_win, xkl_atoms[XKLAVIER_STATE] );
+ XDeleteProperty(xkl_display, toplevel_win,
+ xkl_atoms[XKLAVIER_STATE]);
}
/**
* Saves the state into the window properties
*/
-void xkl_toplevel_window_save_state( Window toplevel_win, XklState * state )
+void
+xkl_toplevel_window_save_state(Window toplevel_win, XklState * state)
{
- CARD32 prop[XKLAVIER_STATE_PROP_LENGTH];
+ CARD32 prop[XKLAVIER_STATE_PROP_LENGTH];
- prop[0] = state->group;
- prop[1] = state->indicators;
+ prop[0] = state->group;
+ prop[1] = state->indicators;
- XChangeProperty( xkl_display, toplevel_win, xkl_atoms[XKLAVIER_STATE],
- XA_INTEGER, 32, PropModeReplace,
- ( const unsigned char * ) prop,
- XKLAVIER_STATE_PROP_LENGTH );
+ XChangeProperty(xkl_display, toplevel_win,
+ xkl_atoms[XKLAVIER_STATE], XA_INTEGER, 32,
+ PropModeReplace, (const unsigned char *) prop,
+ XKLAVIER_STATE_PROP_LENGTH);
- xkl_debug( 160,
- "Saved the group %d, indicators %X for appwin " WINID_FORMAT "\n",
- state->group, state->indicators, toplevel_win );
+ xkl_debug(160,
+ "Saved the group %d, indicators %X for appwin "
+ WINID_FORMAT "\n", state->group, state->indicators,
+ toplevel_win);
}
-gboolean xkl_toplevel_window_is_transparent( Window toplevel_win )
+gboolean
+xkl_toplevel_window_is_transparent(Window toplevel_win)
{
- Atom type_ret;
- int format_ret;
- unsigned long nitems, rest;
- CARD32 *prop = NULL;
- if( ( XGetWindowProperty
- ( xkl_display, toplevel_win, xkl_atoms[XKLAVIER_TRANSPARENT], 0L, 1, False,
- XA_INTEGER, &type_ret, &format_ret, &nitems, &rest,
- ( unsigned char ** ) ( void * ) &prop ) == Success )
- && ( type_ret == XA_INTEGER ) && ( format_ret == 32 ) )
- {
- if( prop != NULL )
- XFree( prop );
- return TRUE;
- }
- return FALSE;
+ Atom type_ret;
+ int format_ret;
+ unsigned long nitems, rest;
+ CARD32 *prop = NULL;
+ if ((XGetWindowProperty
+ (xkl_display, toplevel_win, xkl_atoms[XKLAVIER_TRANSPARENT],
+ 0L, 1, False, XA_INTEGER, &type_ret, &format_ret, &nitems,
+ &rest, (unsigned char **) (void *) &prop) == Success)
+ && (type_ret == XA_INTEGER) && (format_ret == 32)) {
+ if (prop != NULL)
+ XFree(prop);
+ return TRUE;
+ }
+ return FALSE;
}