Fix position of hidden panel, placed at screen edge with upper coordinate (usually...
[window-docker.git] / panel.c
blobbb3235f15b9048ebb460859301084352dfdc6087
1 #include "panel.h"
2 #include <stdlib.h>
4 static PanelWindow defaults = {
5 .win = NULL,
6 .container = NULL,
7 .orig = { .x = 0, .y = 0 },
9 .size = 0,
10 .pos = {
11 .x = 0, .y = 0,
12 .hidden = { .x = 0, .y = 0 }
15 .docking = {
16 .side = SIDE_NONE,
17 .pos = 0.0,
18 .border = 1,
19 .visible = TRUE,
20 .timeout = { .show = 10, .hide = 10, .id = 0},
21 .autohiding = FALSE
24 .enter_cb_id = 0,
25 .leave_cb_id = 0
28 #include "panel-int-mod.h"
30 /**
31 * Public API
34 #define panel_win (GTK_WINDOW (PANEL_WINDOW (data)->win))
35 static gboolean on_init (gpointer data)
37 //gtk_window_get_size (panel_win);
39 /* Resize testing */
40 gtk_window_resize (panel_win, 100, 40);
41 return FALSE;
43 #undef panel_win
45 PanelWindow * panelWindow_Alloc (void)
46 { return malloc (sizeof (PanelWindow)); }
48 void panelWindow_Init (PanelWindow * panel)
50 *panel = defaults;
52 GdkScreen * screen;
53 screen = gdk_screen_get_default ();
54 panel->scr.h = gdk_screen_get_height (screen);
55 panel->scr.w = gdk_screen_get_width (screen);
57 panel->win = gtk_window_new (GTK_WINDOW_TOPLEVEL);
59 gtk_window_set_type_hint (GTK_WINDOW (panel->win), GDK_WINDOW_TYPE_HINT_DOCK);
60 gtk_window_set_decorated (GTK_WINDOW (panel->win), FALSE);
62 gtk_widget_set_events (panel->win, GDK_ALL_EVENTS_MASK);
63 gtk_window_set_accept_focus (GTK_WINDOW (panel->win), TRUE);
64 gtk_widget_set_can_focus (panel->win, TRUE);
66 set_Gravity (panel);
67 gtk_window_set_position (GTK_WINDOW (panel->win), GTK_WIN_POS_NONE);
69 /* Auto-hiding */
70 g_signal_connect (G_OBJECT (panel->win), "size-allocate", G_CALLBACK (on_resize), panel);
71 g_signal_connect (G_OBJECT (panel->win), "size-request", G_CALLBACK (on_size_request), panel);
73 panel->enter_cb_id = g_signal_connect (G_OBJECT (panel->win), "enter-notify-event", G_CALLBACK (on_enter), panel);
74 panel->leave_cb_id = g_signal_connect (G_OBJECT (panel->win), "leave-notify-event", G_CALLBACK (on_leave), panel);
75 g_timeout_add (2000, on_init, panel);
78 void panelWindow_Side_Set (PanelWindow * panel, side_t side)
80 panel->docking.side = side;
81 update_pos (panel);
82 update_window_pos (panel);
85 void panelWindow_Pos_Set (PanelWindow * panel, double pos)
87 panel->docking.pos = pos;
88 update_pos (panel);
89 update_window_pos (panel);
92 void panelWindow_AH_Toggle (PanelWindow * panel, gboolean enabled)
94 if (panel->docking.autohiding == enabled) return;
95 panel->docking.autohiding = enabled;
97 if (enabled) hide (panel);
98 else show (panel);
101 void panelWindow_AH_ShowDuration_Set (PanelWindow * panel, double sec)
102 { panel->docking.timeout.show = 1 + sec * 1000; }
104 void panelWindow_AH_HideDuration_Set (PanelWindow * panel, double sec)
105 { panel->docking.timeout.hide = 1 + sec * 1000; }
107 void panelWindow_AH_Border_Set (PanelWindow * panel, guint thickness)
109 panel->docking.border = thickness;
110 update_pos (panel);
111 if (panel->docking.visible)
112 update_window_pos (panel);