From: Jan Djärv Date: Sun, 4 Apr 2010 10:47:12 +0000 (+0200) Subject: Set WM_CLIENT_MACHINE and _NET_WM_PID properties (Bug#5828). X-Git-Tag: emacs-pretest-24.0.90~104^2~275^2~438^2~588 X-Git-Url: http://git.eshelyaron.com/gitweb/?a=commitdiff_plain;h=3e6bec3b8cd377d078fedc514b26747e60b19ff0;p=emacs.git Set WM_CLIENT_MACHINE and _NET_WM_PID properties (Bug#5828). * xfns.c (set_machine_and_pid_properties): New function. (Fx_create_frame): Call set_machine_and_pid_properties. --- diff --git a/src/ChangeLog b/src/ChangeLog index 6629a29ed9e..218ea86b84b 100644 --- a/src/ChangeLog +++ b/src/ChangeLog @@ -1,3 +1,8 @@ +2010-04-04 Jan Djärv + + * xfns.c (set_machine_and_pid_properties): New function. + (Fx_create_frame): Call set_machine_and_pid_properties. + 2010-04-03 Eli Zaretskii * bidi.c (bidi_resolve_explicit, bidi_level_of_next_char): Check diff --git a/src/xfns.c b/src/xfns.c index ae5858ccfb5..8a0e43bcb48 100644 --- a/src/xfns.c +++ b/src/xfns.c @@ -203,6 +203,10 @@ Lisp_Object Qfont_param; extern Lisp_Object Vwindow_system_version; +/* In editfns.c */ + +extern Lisp_Object Vsystem_name; + /* The below are defined in frame.c. */ #if GLYPH_DEBUG @@ -3145,6 +3149,37 @@ If FRAME is nil, use the selected frame. */) return Qnil; } +static void +set_machine_and_pid_properties (struct frame *f) +{ + /* See the above comment "Note: Encoding strategy". */ + XTextProperty text; + int bytes, stringp; + int do_free_text_value = 0; + + text.value = x_encode_text (Vsystem_name, + Qcompound_text, 0, &bytes, &stringp, + &do_free_text_value); + text.encoding = (stringp ? XA_STRING + : FRAME_X_DISPLAY_INFO (f)->Xatom_COMPOUND_TEXT); + text.format = 8; + text.nitems = bytes; + XSetWMClientMachine (FRAME_X_DISPLAY (f), + FRAME_OUTER_WINDOW (f), + &text); + if (do_free_text_value) + xfree (text.value); + + long pid = (long)getpid(); + XChangeProperty (FRAME_X_DISPLAY (f), + FRAME_OUTER_WINDOW (f), + XInternAtom (FRAME_X_DISPLAY (f), + "_NET_WM_PID", + False), + XA_CARDINAL, 32, PropModeReplace, + (unsigned char *) &pid, 1); +} + DEFUN ("x-create-frame", Fx_create_frame, Sx_create_frame, 1, 1, 0, doc: /* Make a new X window, which is called a "frame" in Emacs terms. @@ -3531,19 +3566,24 @@ This function is an internal primitive--use `make-frame' instead. */) ; } + BLOCK_INPUT; + + /* Set machine name and pid for the purpose of window managers. */ + set_machine_and_pid_properties(f); + /* Set the WM leader property. GTK does this itself, so this is not needed when using GTK. */ if (dpyinfo->client_leader_window != 0) { - BLOCK_INPUT; XChangeProperty (FRAME_X_DISPLAY (f), FRAME_OUTER_WINDOW (f), dpyinfo->Xatom_wm_client_leader, XA_WINDOW, 32, PropModeReplace, (unsigned char *) &dpyinfo->client_leader_window, 1); - UNBLOCK_INPUT; } + UNBLOCK_INPUT; + /* Initialize `default-minibuffer-frame' in case this is the first frame on this terminal. */ if (FRAME_HAS_MINIBUF_P (f)