desktop-shell: Add beginning of pop-up menu to panel
authorKristian Høgsberg <krh@bitplanet.net>
Wed, 12 Oct 2011 04:36:16 +0000 (00:36 -0400)
committerKristian Høgsberg <krh@bitplanet.net>
Wed, 12 Oct 2011 04:36:16 +0000 (00:36 -0400)
clients/desktop-shell.c
clients/window.c
clients/window.h

index 496d0d1..7ad6f02 100644 (file)
@@ -46,6 +46,7 @@ struct desktop {
 
 struct panel {
        struct window *window;
+       struct window *menu;
 };
 
 struct panel_item {
@@ -67,6 +68,21 @@ sigchild_handler(int s)
 }
 
 static void
+show_menu(struct panel *panel, struct input *input)
+{
+       int32_t x, y, width = 200, height = 200;
+       struct display *display;
+
+       input_get_position(input, &x, &y);
+       display = window_get_display(panel->window);
+       panel->menu = window_create_transient(display, panel->window,
+                                             x - 10, y - 10, width, height);
+
+       window_draw(panel->menu);
+       window_flush(panel->menu);
+}
+
+static void
 panel_activate_item(struct panel *panel, struct panel_item *item)
 {
        pid_t pid;
@@ -164,6 +180,11 @@ panel_button_handler(struct window *window,
                window_schedule_redraw(panel->window);
                if (state == 0)
                        panel_activate_item(panel, pi);
+       } else if (button == BTN_RIGHT) {
+               if (state)
+                       show_menu(panel, input);
+               else
+                       window_destroy(panel->menu);
        }
 }
 
index 3bb4cb7..57e27b8 100644 (file)
@@ -862,6 +862,12 @@ window_resize_cairo_window_surface(struct window *window)
 }
 #endif
 
+struct display *
+window_get_display(struct window *window)
+{
+       return window->display;
+}
+
 void
 window_create_surface(struct window *window)
 {
index 6a4ce9f..290c6b9 100644 (file)
@@ -179,6 +179,8 @@ window_for_each_item(struct window *window, item_func_t func, void *data);
 
 struct item *
 window_get_focus_item(struct window *window);
+struct display *
+window_get_display(struct window *window);
 
 void
 window_move(struct window *window, struct input *input, uint32_t time);