use GLibs main_loop (x11 part)
this is WIP since the dbus part is missing
This commit is contained in:
		
							parent
							
								
									74bae9ee0b
								
							
						
					
					
						commit
						e6125914ab
					
				
							
								
								
									
										203
									
								
								dunst.c
									
									
									
									
									
								
							
							
						
						
									
										203
									
								
								dunst.c
									
									
									
									
									
								
							| @ -1,6 +1,8 @@ | ||||
| /* copyright 2013 Sascha Kruse and contributors (see LICENSE for licensing information) */ | ||||
| 
 | ||||
| #define _GNU_SOURCE | ||||
| #define XLIB_ILLEGAL_ACCESS | ||||
| 
 | ||||
| #include <assert.h> | ||||
| #include <unistd.h> | ||||
| #include <time.h> | ||||
| @ -51,6 +53,12 @@ | ||||
| #define INFO 2 | ||||
| #define DEBUG 3 | ||||
| 
 | ||||
| typedef struct _x11_source { | ||||
|         GSource source; | ||||
|         Display *dpy; | ||||
|         Window w; | ||||
| } x11_source_t; | ||||
| 
 | ||||
| /* global variables */ | ||||
| 
 | ||||
| #include "config.h" | ||||
| @ -99,7 +107,6 @@ void handleXEvents(void); | ||||
| void history_pop(void); | ||||
| void initrule(rule_t *r); | ||||
| bool is_idle(void); | ||||
| void run(void); | ||||
| void setup(void); | ||||
| void update_screen_info(); | ||||
| void usage(int exit_status); | ||||
| @ -114,6 +121,82 @@ void run_script(notification *n); | ||||
| void init_shortcut(keyboard_shortcut * shortcut); | ||||
| KeySym string_to_mask(char *str); | ||||
| 
 | ||||
| /*******
 | ||||
|  * | ||||
|  * MainLoop functions for xlib | ||||
|  */ | ||||
| 
 | ||||
| static gboolean x11_fd_prepare(GSource *source, gint *timeout) | ||||
| { | ||||
|         *timeout = -1; | ||||
|         return false; | ||||
| } | ||||
| 
 | ||||
| static gboolean x11_fd_check(GSource *source) | ||||
| { | ||||
|         return XPending(dc->dpy) > 0; | ||||
| } | ||||
| 
 | ||||
| static gboolean | ||||
| x11_fd_dispatch(GSource *source, GSourceFunc callback, gpointer user_data) | ||||
| { | ||||
|         Display *dpy = ((x11_source_t*)source)->dpy; | ||||
|         Window win = ((x11_source_t*)source)->w; | ||||
| 
 | ||||
| 
 | ||||
|         XEvent ev; | ||||
|         while (XPending(dpy) > 0) { | ||||
|                 printf("in while\n"); | ||||
|                 XNextEvent(dpy, &ev); | ||||
|                 switch (ev.type) { | ||||
|                 case Expose: | ||||
|                         if (ev.xexpose.count == 0 && visible) { | ||||
|                                 force_redraw = true; | ||||
|                         } | ||||
|                         break; | ||||
|                 case SelectionNotify: | ||||
|                         if (ev.xselection.property == utf8) | ||||
|                                 break; | ||||
|                 case VisibilityNotify: | ||||
|                         if (ev.xvisibility.state != VisibilityUnobscured) | ||||
|                                 XRaiseWindow(dpy, win); | ||||
|                         break; | ||||
|                 case ButtonPress: | ||||
|                         if (ev.xbutton.window == win) { | ||||
|                                 handle_mouse_click(ev); | ||||
|                                 force_redraw = true; | ||||
|                         } | ||||
|                         break; | ||||
|                 case KeyPress: | ||||
|                         if (close_ks.str | ||||
|                             && XLookupKeysym(&ev.xkey, 0) == close_ks.sym | ||||
|                             && close_ks.mask == ev.xkey.state) { | ||||
|                                 if (displayed) { | ||||
|                                         close_notification(g_queue_peek_head_link(displayed)->data, 2); | ||||
|                                 } | ||||
|                         } | ||||
|                         if (history_ks.str | ||||
|                             && XLookupKeysym(&ev.xkey, 0) == history_ks.sym | ||||
|                             && history_ks.mask == ev.xkey.state) { | ||||
|                                 history_pop(); | ||||
|                         } | ||||
|                         if (close_all_ks.str | ||||
|                             && XLookupKeysym(&ev.xkey, 0) == close_all_ks.sym | ||||
|                             && close_all_ks.mask == ev.xkey.state) { | ||||
|                                 move_all_to_history(); | ||||
|                         } | ||||
|                         if (context_ks.str | ||||
|                             && XLookupKeysym(&ev.xkey, 0) == context_ks.sym | ||||
|                             && context_ks.mask == ev.xkey.state) { | ||||
|                                 context_menu(); | ||||
|                         } | ||||
|                         force_redraw = true; | ||||
|                         break; | ||||
|                 } | ||||
|         } | ||||
|         return true; | ||||
| } | ||||
| 
 | ||||
| int cmp_notification(const void *va, const void *vb) | ||||
| { | ||||
|         notification *a = (notification*) va; | ||||
| @ -938,58 +1021,6 @@ void handle_mouse_click(XEvent ev) | ||||
|         } | ||||
| } | ||||
| 
 | ||||
| void handleXEvents(void) | ||||
| { | ||||
|         XEvent ev; | ||||
|         while (XPending(dc->dpy) > 0) { | ||||
|                 XNextEvent(dc->dpy, &ev); | ||||
|                 switch (ev.type) { | ||||
|                 case Expose: | ||||
|                         if (ev.xexpose.count == 0 && visible) { | ||||
|                                 force_redraw = true; | ||||
|                         } | ||||
|                         break; | ||||
|                 case SelectionNotify: | ||||
|                         if (ev.xselection.property == utf8) | ||||
|                                 break; | ||||
|                 case VisibilityNotify: | ||||
|                         if (ev.xvisibility.state != VisibilityUnobscured) | ||||
|                                 XRaiseWindow(dc->dpy, win); | ||||
|                         break; | ||||
|                 case ButtonPress: | ||||
|                         if (ev.xbutton.window == win) { | ||||
|                                 handle_mouse_click(ev); | ||||
|                                 force_redraw = true; | ||||
|                         } | ||||
|                         break; | ||||
|                 case KeyPress: | ||||
|                         if (close_ks.str | ||||
|                             && XLookupKeysym(&ev.xkey, 0) == close_ks.sym | ||||
|                             && close_ks.mask == ev.xkey.state) { | ||||
|                                 if (displayed) { | ||||
|                                         close_notification(g_queue_peek_head_link(displayed)->data, 2); | ||||
|                                 } | ||||
|                         } | ||||
|                         if (history_ks.str | ||||
|                             && XLookupKeysym(&ev.xkey, 0) == history_ks.sym | ||||
|                             && history_ks.mask == ev.xkey.state) { | ||||
|                                 history_pop(); | ||||
|                         } | ||||
|                         if (close_all_ks.str | ||||
|                             && XLookupKeysym(&ev.xkey, 0) == close_all_ks.sym | ||||
|                             && close_all_ks.mask == ev.xkey.state) { | ||||
|                                 move_all_to_history(); | ||||
|                         } | ||||
|                         if (context_ks.str | ||||
|                             && XLookupKeysym(&ev.xkey, 0) == context_ks.sym | ||||
|                             && context_ks.mask == ev.xkey.state) { | ||||
|                                 context_menu(); | ||||
|                         } | ||||
|                         force_redraw = true; | ||||
|                         break; | ||||
|                 } | ||||
|         } | ||||
| } | ||||
| 
 | ||||
| void move_all_to_history() | ||||
| { | ||||
| @ -1303,32 +1334,28 @@ bool is_idle(void) | ||||
|         return screensaver_info->idle / 1000 > idle_threshold; | ||||
| } | ||||
| 
 | ||||
| void run(void) | ||||
| static gboolean run(gpointer data) | ||||
| { | ||||
|         printf("running\n"); | ||||
|         time_t last_time = time(&last_time); | ||||
|         while (true) { | ||||
|                 if (visible) { | ||||
|                         dbus_poll(50); | ||||
|                 } else { | ||||
|                         dbus_poll(200); | ||||
|                 } | ||||
|                 now = time(&now); | ||||
|                 time_t delta = now - last_time; | ||||
|                 last_time = now; | ||||
|         dbus_poll(1); | ||||
| 
 | ||||
|                 /* move messages from notification_queue to displayed_notifications */ | ||||
|                 update_lists(); | ||||
|                 if (displayed->length > 0 && ! visible) | ||||
|                         map_win(); | ||||
|                 if (displayed->length == 0 && visible) | ||||
|                         hide_win(); | ||||
|         now = time(&now); | ||||
|         time_t delta = now - last_time; | ||||
|         last_time = now; | ||||
| 
 | ||||
|                 handleXEvents(); | ||||
|         /* move messages from notification_queue to displayed_notifications */ | ||||
|         update_lists(); | ||||
|         if (displayed->length > 0 && ! visible) | ||||
|                 map_win(); | ||||
|         if (displayed->length == 0 && visible) | ||||
|                 hide_win(); | ||||
| 
 | ||||
|                 if (visible && (force_redraw || delta > 0)) | ||||
|                         draw_win(); | ||||
|                 force_redraw = false; | ||||
|         } | ||||
|         if (visible && (force_redraw || delta > 0)) | ||||
|                 draw_win(); | ||||
|         force_redraw = false; | ||||
| 
 | ||||
|         return true; | ||||
| } | ||||
| 
 | ||||
| void hide_win() | ||||
| @ -1889,7 +1916,33 @@ int main(int argc, char *argv[]) | ||||
|                 init_notification(n, 0); | ||||
|         } | ||||
| 
 | ||||
|         run(); | ||||
|         GMainLoop *mainloop = NULL; | ||||
|         mainloop = g_main_loop_new(NULL, FALSE); | ||||
| 
 | ||||
|         /* FIXME */ | ||||
|         g_timeout_add(5000, run, mainloop); | ||||
| 
 | ||||
|         GPollFD dpy_pollfd = {dc->dpy->fd, | ||||
|                 G_IO_IN | G_IO_HUP | G_IO_ERR, 0 }; | ||||
| 
 | ||||
|         GSourceFuncs x11_source_funcs = { | ||||
|                 x11_fd_prepare, | ||||
|                 x11_fd_check, | ||||
|                 x11_fd_dispatch, | ||||
|                 NULL, | ||||
|                 NULL, | ||||
|                 NULL }; | ||||
| 
 | ||||
|         GSource *x11_source = | ||||
|                 g_source_new(&x11_source_funcs, sizeof(x11_source_t)); | ||||
|                 ((x11_source_t*)x11_source)->dpy = dc->dpy; | ||||
|                 ((x11_source_t*)x11_source)->w = win; | ||||
|                 g_source_add_poll(x11_source, &dpy_pollfd); | ||||
| 
 | ||||
|       g_source_attach(x11_source, NULL); | ||||
| 
 | ||||
|       g_main_loop_run(mainloop); | ||||
| 
 | ||||
|         return 0; | ||||
| } | ||||
| 
 | ||||
|  | ||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user
	 Sascha Kruse
						Sascha Kruse