X-Git-Url: http://pileus.org/git/?p=aweather;a=blobdiff_plain;f=src%2Faweather-gui.c;h=93fad72c03214e05f7192c06d2984ac0d56f9090;hp=1b50efed5d87e016f595f3de652ab80ad9d0d0ab;hb=e14ed01dd0d4966d1a906486dbd01d577a27634f;hpb=305f0e28e899563fc90d2fe392470f82588b1b33 diff --git a/src/aweather-gui.c b/src/aweather-gui.c index 1b50efe..93fad72 100644 --- a/src/aweather-gui.c +++ b/src/aweather-gui.c @@ -26,6 +26,50 @@ #include "aweather-gui.h" #include "aweather-location.h" +/* Autohide */ +typedef struct { + GtkWidget *widget; + GtkWidget *window; + GtkPositionType position; + gulong handler; +} GtkAutohideData; +static gboolean _gtk_widget_autohide_cb(GtkWidget *win, + GdkEventMotion *event, GtkAutohideData *data) +{ + GtkAllocation alloc; + gtk_widget_get_allocation(data->window, &alloc); + if (data->position == GTK_POS_BOTTOM) + g_debug("GtkWidget: autohide_cb - y=%lf, h=%d", event->y, alloc.height); + gint position = -1; + if (event->x < 20) position = GTK_POS_LEFT; + if (event->y < 20) position = GTK_POS_TOP; + if (event->x > alloc.width - 20) position = GTK_POS_RIGHT; + if (event->y > alloc.height - 20) position = GTK_POS_BOTTOM; + if (position == data->position) + gtk_widget_show(data->widget); + else + gtk_widget_hide(data->widget); + return FALSE; +} +static void _gtk_widget_autohide(GtkWidget *widget, GtkWidget *viewer, + GtkPositionType position) +{ + GtkAutohideData *data = g_new0(GtkAutohideData, 1); + data->widget = widget; + data->position = position; + data->window = viewer; + data->handler = g_signal_connect(data->window, "motion-notify-event", + G_CALLBACK(_gtk_widget_autohide_cb), data); + g_object_set_data(G_OBJECT(widget), "autohidedata", data); + gtk_widget_hide(widget); +} +static void _gtk_widget_autoshow(GtkWidget *widget) +{ + GtkAutohideData *data = g_object_get_data(G_OBJECT(widget), "autohidedata"); + g_signal_handler_disconnect(data->window, data->handler); + g_free(data); + gtk_widget_show(widget); +} /************* * Callbacks * @@ -116,15 +160,22 @@ G_MODULE_EXPORT void on_zoomout(GtkAction *action, AWeatherGui *self) G_MODULE_EXPORT void on_fullscreen(GtkToggleAction *action, AWeatherGui *self) { - gchar *hide[] = {"main_menu", "main_sidebar", "main_tabs"}; + GtkWidget *menu = aweather_gui_get_widget(self, "main_menu"); + GtkWidget *toolbar = aweather_gui_get_widget(self, "main_toolbar"); + GtkWidget *sidebar = aweather_gui_get_widget(self, "main_sidebar"); + GtkWidget *tabs = aweather_gui_get_widget(self, "main_tabs"); if (gtk_toggle_action_get_active(action)) { gtk_window_fullscreen(GTK_WINDOW(self)); - for (int i = 0; i < G_N_ELEMENTS(hide); i++) - gtk_widget_hide(aweather_gui_get_widget(self, hide[i])); + gtk_widget_hide(menu); + _gtk_widget_autohide(toolbar, GTK_WIDGET(self->viewer), GTK_POS_TOP); + _gtk_widget_autohide(sidebar, GTK_WIDGET(self->viewer), GTK_POS_RIGHT); + _gtk_widget_autohide(tabs, GTK_WIDGET(self->viewer), GTK_POS_BOTTOM); } else { gtk_window_unfullscreen(GTK_WINDOW(self)); - for (int i = 0; i < G_N_ELEMENTS(hide); i++) - gtk_widget_show(aweather_gui_get_widget(self, hide[i])); + gtk_widget_show(menu); + _gtk_widget_autoshow(toolbar); + _gtk_widget_autoshow(sidebar); + _gtk_widget_autoshow(tabs); } } @@ -455,6 +506,24 @@ void aweather_gui_deattach_plugin(AWeatherGui *self, const gchar *name) grits_plugins_disable(self->plugins, name); gtk_widget_queue_draw(GTK_WIDGET(self->viewer)); } +void aweather_gui_load_plugins(AWeatherGui *self) +{ + g_debug("AWeatherGui: load_plugins"); + GtkTreeIter iter; + self->gtk_plugins = GTK_LIST_STORE(aweather_gui_get_object(self, "plugins")); + for (GList *cur = grits_plugins_available(self->plugins); cur; cur = cur->next) { + gchar *name = cur->data; + GError *error = NULL; + gboolean enabled = grits_prefs_get_boolean_v(self->prefs, "plugins", cur->data, &error); + if (error && error->code == G_KEY_FILE_ERROR_GROUP_NOT_FOUND) + enabled = TRUE; + gtk_list_store_append(self->gtk_plugins, &iter); + gtk_list_store_set(self->gtk_plugins, &iter, 0, name, 1, enabled, -1); + if (enabled) + aweather_gui_attach_plugin(self, name); + } +} + /**************** @@ -476,21 +545,6 @@ static void aweather_gui_parser_finished(GtkBuildable *_self, GtkBuilder *builde g_free(config); g_free(defaults); - /* Plugins */ - GtkTreeIter iter; - self->gtk_plugins = GTK_LIST_STORE(aweather_gui_get_object(self, "plugins")); - for (GList *cur = grits_plugins_available(self->plugins); cur; cur = cur->next) { - gchar *name = cur->data; - GError *error = NULL; - gboolean enabled = grits_prefs_get_boolean_v(self->prefs, "plugins", cur->data, &error); - if (error && error->code == G_KEY_FILE_ERROR_GROUP_NOT_FOUND) - enabled = TRUE; - gtk_list_store_append(self->gtk_plugins, &iter); - gtk_list_store_set(self->gtk_plugins, &iter, 0, name, 1, enabled, -1); - if (enabled) - aweather_gui_attach_plugin(self, name); - } - /* Misc, helpers */ site_setup(self); time_setup(self); @@ -503,6 +557,8 @@ static void aweather_gui_parser_finished(GtkBuildable *_self, GtkBuilder *builde g_signal_connect_swapped(self->viewer, "offline", G_CALLBACK(gtk_toggle_action_set_active), aweather_gui_get_object(self, "offline")); + g_signal_connect_swapped(self->viewer, "realize", + G_CALLBACK(aweather_gui_load_plugins), self); } static void aweather_gui_buildable_init(GtkBuildableIface *iface) {