Let the panel windows really be re-organized at run-time
It may crash apparently though :(
This commit is contained in:
parent
7705b61aa7
commit
bccd96dff6
264
src/panel.c
264
src/panel.c
|
@ -143,13 +143,7 @@ static void _new_helper(Panel * panel, PanelPosition position,
|
||||||
static void _new_prefs(Config * config, GdkScreen * screen, PanelPrefs * prefs,
|
static void _new_prefs(Config * config, GdkScreen * screen, PanelPrefs * prefs,
|
||||||
PanelPrefs const * user);
|
PanelPrefs const * user);
|
||||||
static GtkIconSize _new_size(Panel * panel, PanelPosition position);
|
static GtkIconSize _new_size(Panel * panel, PanelPosition position);
|
||||||
static PanelWindow * _new_window(PanelPosition position,
|
|
||||||
PanelAppletHelper * helper, GdkRectangle * rect, gboolean focus,
|
|
||||||
gboolean above);
|
|
||||||
static int _new_windows(Panel * panel, GdkRectangle * rect);
|
|
||||||
/* callbacks */
|
/* callbacks */
|
||||||
static gboolean _new_on_idle(gpointer data);
|
|
||||||
static void _idle_load(Panel * panel, PanelPosition position);
|
|
||||||
static int _new_on_message(void * data, uint32_t value1, uint32_t value2,
|
static int _new_on_message(void * data, uint32_t value1, uint32_t value2,
|
||||||
uint32_t value3);
|
uint32_t value3);
|
||||||
static GdkFilterReturn _on_root_event(GdkXEvent * xevent, GdkEvent * event,
|
static GdkFilterReturn _on_root_event(GdkXEvent * xevent, GdkEvent * event,
|
||||||
|
@ -159,7 +153,6 @@ static GdkFilterReturn _event_configure_notify(Panel * panel);
|
||||||
Panel * panel_new(PanelPrefs const * prefs)
|
Panel * panel_new(PanelPrefs const * prefs)
|
||||||
{
|
{
|
||||||
Panel * panel;
|
Panel * panel;
|
||||||
GdkRectangle rect;
|
|
||||||
GtkIconSize iconsize;
|
GtkIconSize iconsize;
|
||||||
size_t i;
|
size_t i;
|
||||||
|
|
||||||
|
@ -172,7 +165,7 @@ Panel * panel_new(PanelPrefs const * prefs)
|
||||||
if(panel->prefs.iconsize != NULL)
|
if(panel->prefs.iconsize != NULL)
|
||||||
iconsize = gtk_icon_size_from_name(panel->prefs.iconsize);
|
iconsize = gtk_icon_size_from_name(panel->prefs.iconsize);
|
||||||
/* helpers */
|
/* helpers */
|
||||||
for(i = 0; i < sizeof(panel->windows) / sizeof(*panel->windows); i++)
|
for(i = 0; i < PANEL_POSITION_COUNT; i++)
|
||||||
{
|
{
|
||||||
_new_helper(panel, i, iconsize);
|
_new_helper(panel, i, iconsize);
|
||||||
panel->windows[i] = NULL;
|
panel->windows[i] = NULL;
|
||||||
|
@ -191,10 +184,9 @@ Panel * panel_new(PanelPrefs const * prefs)
|
||||||
}
|
}
|
||||||
/* root window */
|
/* root window */
|
||||||
panel->root = gdk_screen_get_root_window(panel->screen);
|
panel->root = gdk_screen_get_root_window(panel->screen);
|
||||||
_panel_reset(panel, &rect);
|
|
||||||
panel->source = 0;
|
panel->source = 0;
|
||||||
/* panel windows */
|
/* panel windows */
|
||||||
if(_new_windows(panel, &rect) != 0)
|
if(panel_reset(panel) != 0)
|
||||||
{
|
{
|
||||||
panel_error(NULL, error_get(), 0); /* XXX as above */
|
panel_error(NULL, error_get(), 0); /* XXX as above */
|
||||||
panel_delete(panel);
|
panel_delete(panel);
|
||||||
|
@ -207,8 +199,6 @@ Panel * panel_new(PanelPrefs const * prefs)
|
||||||
gdk_window_set_events(panel->root, gdk_window_get_events(panel->root)
|
gdk_window_set_events(panel->root, gdk_window_get_events(panel->root)
|
||||||
| GDK_PROPERTY_CHANGE_MASK);
|
| GDK_PROPERTY_CHANGE_MASK);
|
||||||
gdk_window_add_filter(panel->root, _on_root_event, panel);
|
gdk_window_add_filter(panel->root, _on_root_event, panel);
|
||||||
/* load applets when idle */
|
|
||||||
panel->source = g_idle_add(_new_on_idle, panel);
|
|
||||||
return panel;
|
return panel;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -334,114 +324,6 @@ static GtkIconSize _new_size(Panel * panel, PanelPosition position)
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
static PanelWindow * _new_window(PanelPosition position,
|
|
||||||
PanelAppletHelper * helper, GdkRectangle * rect, gboolean focus,
|
|
||||||
gboolean above)
|
|
||||||
{
|
|
||||||
PanelWindow * window;
|
|
||||||
|
|
||||||
if((window = panel_window_new(position, helper, rect)) == NULL)
|
|
||||||
return NULL;
|
|
||||||
panel_window_set_accept_focus(window, focus);
|
|
||||||
panel_window_set_keep_above(window, above);
|
|
||||||
return window;
|
|
||||||
}
|
|
||||||
|
|
||||||
static int _new_windows(Panel * panel, GdkRectangle * rect)
|
|
||||||
{
|
|
||||||
size_t i;
|
|
||||||
String const * p;
|
|
||||||
char const * section;
|
|
||||||
String * s;
|
|
||||||
String const * applets;
|
|
||||||
String const * enabled;
|
|
||||||
gboolean focus;
|
|
||||||
gboolean above;
|
|
||||||
|
|
||||||
focus = ((p = panel_get_config(panel, NULL, "accept_focus")) == NULL
|
|
||||||
|| strcmp(p, "1") == 0) ? TRUE : FALSE;
|
|
||||||
above = ((p = panel_get_config(panel, NULL, "keep_above")) == NULL
|
|
||||||
|| strcmp(p, "1") == 0) ? TRUE : FALSE;
|
|
||||||
for(i = 0; i < sizeof(panel->windows) / sizeof(*panel->windows); i++)
|
|
||||||
{
|
|
||||||
section = _panel_get_section(panel, i);
|
|
||||||
if((s = string_new_append("panel::", section, NULL)) == NULL)
|
|
||||||
{
|
|
||||||
panel_error(NULL, NULL, 1);
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
applets = panel_get_config(panel, s, "applets");
|
|
||||||
enabled = panel_get_config(panel, s, "enabled");
|
|
||||||
string_delete(s);
|
|
||||||
if(enabled == NULL || strtol(enabled, NULL, 0) == 0
|
|
||||||
|| applets == NULL)
|
|
||||||
continue;
|
|
||||||
if((panel->windows[i] = _new_window(i, &panel->helpers[i], rect,
|
|
||||||
focus, above)) == NULL)
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
/* create at least PANEL_POSITION_DEFAULT */
|
|
||||||
for(i = 0; i < sizeof(panel->windows) / sizeof(*panel->windows); i++)
|
|
||||||
if(panel->windows[i] != NULL)
|
|
||||||
return 0;
|
|
||||||
i = PANEL_POSITION_DEFAULT;
|
|
||||||
if((panel->windows[i] = _new_window(i, &panel->helpers[i], rect, focus,
|
|
||||||
above)) == NULL)
|
|
||||||
return -1;
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
static gboolean _new_on_idle(gpointer data)
|
|
||||||
{
|
|
||||||
Panel * panel = data;
|
|
||||||
size_t i;
|
|
||||||
|
|
||||||
panel->source = 0;
|
|
||||||
if(panel->pr_window == NULL)
|
|
||||||
panel_show_preferences(panel, FALSE);
|
|
||||||
for(i = 0; i < sizeof(panel->windows) / sizeof(*panel->windows); i++)
|
|
||||||
if(panel->windows[i] != NULL)
|
|
||||||
_idle_load(panel, i);
|
|
||||||
gtk_notebook_set_current_page(GTK_NOTEBOOK(panel->pr_notebook), 0);
|
|
||||||
return FALSE;
|
|
||||||
}
|
|
||||||
|
|
||||||
static void _idle_load(Panel * panel, PanelPosition position)
|
|
||||||
{
|
|
||||||
char const * applets;
|
|
||||||
char * p;
|
|
||||||
char * q;
|
|
||||||
size_t i;
|
|
||||||
|
|
||||||
if((applets = _panel_get_applets(panel, position)) == NULL
|
|
||||||
|| strlen(applets) == 0)
|
|
||||||
return;
|
|
||||||
if((p = string_new(applets)) == NULL)
|
|
||||||
{
|
|
||||||
panel_error(panel, error_get(), FALSE);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
for(q = p, i = 0;;)
|
|
||||||
{
|
|
||||||
if(q[i] == '\0')
|
|
||||||
{
|
|
||||||
if(panel_load(panel, position, q) != 0)
|
|
||||||
/* ignore errors */
|
|
||||||
error_print(PROGNAME);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
if(q[i++] != ',')
|
|
||||||
continue;
|
|
||||||
q[i - 1] = '\0';
|
|
||||||
if(panel_load(panel, position, q) != 0)
|
|
||||||
/* ignore errors */
|
|
||||||
error_print(PROGNAME);
|
|
||||||
q += i;
|
|
||||||
i = 0;
|
|
||||||
}
|
|
||||||
free(p);
|
|
||||||
}
|
|
||||||
|
|
||||||
static int _new_on_message(void * data, uint32_t value1, uint32_t value2,
|
static int _new_on_message(void * data, uint32_t value1, uint32_t value2,
|
||||||
uint32_t value3)
|
uint32_t value3)
|
||||||
{
|
{
|
||||||
|
@ -626,6 +508,145 @@ int panel_load(Panel * panel, PanelPosition position, char const * applet)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/* panel_reset */
|
||||||
|
static void _reset_window_delete(Panel * panel, PanelPosition position);
|
||||||
|
static int _reset_window_new(Panel * panel, PanelPosition position,
|
||||||
|
PanelAppletHelper * helper, GdkRectangle * rect,
|
||||||
|
gboolean focus, gboolean above);
|
||||||
|
/* callbacks */
|
||||||
|
static gboolean _reset_on_idle(gpointer data);
|
||||||
|
static void _reset_on_idle_load(Panel * panel, PanelPosition position);
|
||||||
|
|
||||||
|
int panel_reset(Panel * panel)
|
||||||
|
{
|
||||||
|
GdkRectangle rect;
|
||||||
|
PanelWindowPosition position;
|
||||||
|
String const * section;
|
||||||
|
gboolean focus;
|
||||||
|
gboolean above;
|
||||||
|
gboolean enabled;
|
||||||
|
String const * applets;
|
||||||
|
String const * p;
|
||||||
|
String * s;
|
||||||
|
|
||||||
|
_panel_reset(panel, &rect);
|
||||||
|
focus = ((p = panel_get_config(panel, NULL, "accept_focus")) == NULL
|
||||||
|
|| strcmp(p, "1") == 0) ? TRUE : FALSE;
|
||||||
|
above = ((p = panel_get_config(panel, NULL, "keep_above")) == NULL
|
||||||
|
|| strcmp(p, "1") == 0) ? TRUE : FALSE;
|
||||||
|
for(position = 0; position < PANEL_POSITION_COUNT; position++)
|
||||||
|
{
|
||||||
|
if((section = _panel_get_section(panel, position)) == NULL
|
||||||
|
|| (s = string_new_append("panel::", section,
|
||||||
|
NULL)) == NULL)
|
||||||
|
return -1;
|
||||||
|
enabled = ((p = panel_get_config(panel, s, "enabled"))
|
||||||
|
== NULL || strcmp(p, "1") == 0) ? TRUE : FALSE;
|
||||||
|
if((applets = panel_get_config(panel, s, "applets"))
|
||||||
|
!= NULL && string_length(applets) == 0)
|
||||||
|
applets = NULL;
|
||||||
|
fprintf(stderr, "DEBUG: %s() %u \"%s\"\n", __func__, position,
|
||||||
|
applets);
|
||||||
|
string_delete(s);
|
||||||
|
if(enabled == FALSE || applets == NULL)
|
||||||
|
{
|
||||||
|
_reset_window_delete(panel, position);
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
if(_reset_window_new(panel, position, &panel->helpers[position],
|
||||||
|
&rect, focus, above) != 0)
|
||||||
|
return -panel_error(NULL, NULL, 1);
|
||||||
|
}
|
||||||
|
/* create at least PANEL_POSITION_DEFAULT */
|
||||||
|
for(position = 0; position < PANEL_POSITION_COUNT; position++)
|
||||||
|
if(panel->windows[position] != NULL)
|
||||||
|
break;
|
||||||
|
if(position == PANEL_POSITION_COUNT)
|
||||||
|
{
|
||||||
|
position = PANEL_POSITION_DEFAULT;
|
||||||
|
if(_reset_window_new(panel, position, &panel->helpers[position],
|
||||||
|
&rect, focus, above) != 0)
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
/* load applets when idle */
|
||||||
|
if(panel->source != 0)
|
||||||
|
g_source_remove(panel->source);
|
||||||
|
panel->source = g_idle_add(_reset_on_idle, panel);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
static int _reset_window_new(Panel * panel, PanelPosition position,
|
||||||
|
PanelAppletHelper * helper, GdkRectangle * rect,
|
||||||
|
gboolean focus, gboolean above)
|
||||||
|
{
|
||||||
|
if(panel->windows[position] == NULL
|
||||||
|
&& (panel->windows[position] = panel_window_new(
|
||||||
|
position, helper, rect)) == NULL)
|
||||||
|
return -1;
|
||||||
|
panel_window_set_accept_focus(panel->windows[position], focus);
|
||||||
|
panel_window_set_keep_above(panel->windows[position], above);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
static void _reset_window_delete(Panel * panel, PanelPosition position)
|
||||||
|
{
|
||||||
|
if(panel->windows[position] != NULL)
|
||||||
|
panel_window_delete(panel->windows[position]);
|
||||||
|
panel->windows[position] = NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
static gboolean _reset_on_idle(gpointer data)
|
||||||
|
{
|
||||||
|
Panel * panel = data;
|
||||||
|
PanelPosition position;
|
||||||
|
|
||||||
|
panel->source = 0;
|
||||||
|
if(panel->pr_window == NULL)
|
||||||
|
panel_show_preferences(panel, FALSE);
|
||||||
|
for(position = 0; position < PANEL_POSITION_COUNT; position++)
|
||||||
|
if(panel->windows[position] != NULL)
|
||||||
|
_reset_on_idle_load(panel, position);
|
||||||
|
gtk_notebook_set_current_page(GTK_NOTEBOOK(panel->pr_notebook), 0);
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
static void _reset_on_idle_load(Panel * panel, PanelPosition position)
|
||||||
|
{
|
||||||
|
char const * applets;
|
||||||
|
char * p;
|
||||||
|
char * q;
|
||||||
|
size_t i;
|
||||||
|
|
||||||
|
if((applets = _panel_get_applets(panel, position)) == NULL
|
||||||
|
|| strlen(applets) == 0)
|
||||||
|
return;
|
||||||
|
if((p = string_new(applets)) == NULL)
|
||||||
|
{
|
||||||
|
panel_error(panel, error_get(), FALSE);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
for(q = p, i = 0;;)
|
||||||
|
{
|
||||||
|
if(q[i] == '\0')
|
||||||
|
{
|
||||||
|
if(panel_load(panel, position, q) != 0)
|
||||||
|
/* ignore errors */
|
||||||
|
error_print(PROGNAME);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
if(q[i++] != ',')
|
||||||
|
continue;
|
||||||
|
q[i - 1] = '\0';
|
||||||
|
if(panel_load(panel, position, q) != 0)
|
||||||
|
/* ignore errors */
|
||||||
|
error_print(PROGNAME);
|
||||||
|
q += i;
|
||||||
|
i = 0;
|
||||||
|
}
|
||||||
|
free(p);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
/* panel_show_preferences */
|
/* panel_show_preferences */
|
||||||
static void _show_preferences_window(Panel * panel);
|
static void _show_preferences_window(Panel * panel);
|
||||||
static GtkWidget * _preferences_window_general(Panel * panel);
|
static GtkWidget * _preferences_window_general(Panel * panel);
|
||||||
|
@ -1020,8 +1041,7 @@ static void _preferences_on_response_apply(gpointer data)
|
||||||
for(j = 0; j < sizeof(panel->windows) / sizeof(*panel->windows); j++)
|
for(j = 0; j < sizeof(panel->windows) / sizeof(*panel->windows); j++)
|
||||||
if(panel->windows[j] != NULL)
|
if(panel->windows[j] != NULL)
|
||||||
panel_window_remove_all(panel->windows[j]);
|
panel_window_remove_all(panel->windows[j]);
|
||||||
if(panel->source == 0)
|
panel_reset(panel);
|
||||||
panel->source = g_idle_add(_new_on_idle, panel); /* XXX */
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static void _preferences_on_response_apply_panel(Panel * panel,
|
static void _preferences_on_response_apply_panel(Panel * panel,
|
||||||
|
|
|
@ -65,6 +65,7 @@ char const * panel_get_config(Panel * panel, char const * section,
|
||||||
/* useful */
|
/* useful */
|
||||||
int panel_error(Panel * panel, char const * message, int ret);
|
int panel_error(Panel * panel, char const * message, int ret);
|
||||||
int panel_load(Panel * panel, PanelPosition position, char const * applet);
|
int panel_load(Panel * panel, PanelPosition position, char const * applet);
|
||||||
|
int panel_reset(Panel * panel);
|
||||||
|
|
||||||
void panel_show_preferences(Panel * panel, gboolean show);
|
void panel_show_preferences(Panel * panel, gboolean show);
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue
Block a user